tx · 6xLAqyPd79dCCuRwDkENhSLPJTFUxUAN54Eo1QEe2GWe

3MsNhK6uve98J6DeqbuwGFBRh9GoHPGUFgp:  -0.01400000 Waves

2021.12.16 17:17 [1836921] smart account 3MsNhK6uve98J6DeqbuwGFBRh9GoHPGUFgp > SELF 0.00000000 Waves

{ "type": 13, "id": "6xLAqyPd79dCCuRwDkENhSLPJTFUxUAN54Eo1QEe2GWe", "fee": 1400000, "feeAssetId": null, "timestamp": 1639664294983, "version": 1, "sender": "3MsNhK6uve98J6DeqbuwGFBRh9GoHPGUFgp", "senderPublicKey": "86RHVxKovtU7yKnepY8wKsd8niDxGAsiwuA1XA1DNqrS", "proofs": [ "65PJd7mi3pHjRwVkPaS38ag5ygCtvTcyVDdFYm1bMDovoCqGy7eVrYQnAKtpNzaBMfE4jWTJ7bLsMz7RCy17pjiX" ], "script": "base64:AAIFAAAAAAAAADkIAhIDCgEIEgMKAQgSBAoCCAgSAwoBCBIHCgUBAQEICBIAEgMKAQgSBAoCCAESBAoCCAESBAoCCAEAAAAgAAAAAAZTQ0FMRTgAAAAAAAAAAAgAAAAABU1VTFQ4AAAAAAAF9eEAAAAAAAdTQ0FMRTE4AAAAAAAAAAASAAAAAAZNVUxUMTgJAAE2AAAAAQAN4Lazp2QAAAAAAAADU0VQAgAAAAJfXwAAAAAKemVyb0JpZ0ludAkAATYAAAABAAAAAAAAAAAAAAAAAA5pZHhQb29sQWRkcmVzcwAAAAAAAAAAAQAAAAANaWR4UG9vbFN0YXR1cwAAAAAAAAAAAgAAAAAQaWR4UG9vbExQQXNzZXRJZAAAAAAAAAAAAwAAAAANaWR4QW10QXNzZXRJZAAAAAAAAAAABAAAAAAPaWR4UHJpY2VBc3NldElkAAAAAAAAAAAFAAAAAA5pZHhBbXRBc3NldERjbQAAAAAAAAAABgAAAAAQaWR4UHJpY2VBc3NldERjbQAAAAAAAAAABwAAAAAOaWR4SUFtdEFzc2V0SWQAAAAAAAAAAAgAAAAAEGlkeElQcmljZUFzc2V0SWQAAAAAAAAAAAkAAAAADWlkeExQQXNzZXREY20AAAAAAAAAAAoBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQiAAAAAQUAAAADa2V5CQABLAAAAAIJAAEsAAAAAgIAAAAPbWFuZGF0b3J5IHRoaXMuBQAAAANrZXkCAAAADyBpcyBub3QgZGVmaW5lZAEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzT3JGYWlsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAptYW5kYXRvcnkgCQAEJQAAAAEFAAAAB2FkZHJlc3MCAAAAAS4FAAAAA2tleQIAAAAPIGlzIG5vdCBkZWZpbmVkAQAAAAxnZXRJbnRPclplcm8AAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQAAAAAAAAAAAAEAAAAMZ2V0SW50T3JGYWlsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkAASwAAAACCQABLAAAAAICAAAAD21hbmRhdG9yeSB0aGlzLgUAAAADa2V5AgAAAA8gaXMgbm90IGRlZmluZWQBAAAAEWtleUZhY3RvcnlBZGRyZXNzAAAAAAIAAAAcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwEAAAAma2V5RmFjdG9yeUxwQXNzZXRUb1Bvb2xDb250cmFjdEFkZHJlc3MAAAABAAAACmxwQXNzZXRTdHIJAAS5AAAAAgkABEwAAAACAgAAAAYlcyVzJXMJAARMAAAAAgUAAAAKbHBBc3NldFN0cgkABEwAAAACAgAAAB5tYXBwaW5nc19fbHBBc3NldDJQb29sQ29udHJhY3QFAAAAA25pbAUAAAADU0VQAQAAABBrZXlGYWN0b3J5THBMaXN0AAAAAAIAAAAQJXNfX2xwVG9rZW5zTGlzdAEAAAANa2V5RmFjdG9yeUNmZwAAAAACAAAAESVzX19mYWN0b3J5Q29uZmlnAQAAABhyZWFkRmFjdG9yeUFkZHJlc3NPckZhaWwAAAAACQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQkBAAAAEWtleUZhY3RvcnlBZGRyZXNzAAAAAAEAAAAKcmVhZExwTGlzdAAAAAAJAAS1AAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACCQEAAAAYcmVhZEZhY3RvcnlBZGRyZXNzT3JGYWlsAAAAAAkBAAAAEGtleUZhY3RvcnlMcExpc3QAAAAAAgAAAAAFAAAAA1NFUAEAAAAUcmVhZEZhY3RvcnlDZmdPckZhaWwAAAAACQAEtQAAAAIJAQAAABhnZXRTdHJpbmdCeUFkZHJlc3NPckZhaWwAAAACCQEAAAAYcmVhZEZhY3RvcnlBZGRyZXNzT3JGYWlsAAAAAAkBAAAADWtleUZhY3RvcnlDZmcAAAAABQAAAANTRVABAAAAD2tleVN0YWtlZEJ5VXNlcgAAAAIAAAAOdXNlckFkZHJlc3NTdHIAAAAMbHBBc3NldElkU3RyCQAEuQAAAAIJAARMAAAAAgIAAAAOJXMlcyVzX19zdGFrZWQJAARMAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIJAARMAAAAAgUAAAAMbHBBc3NldElkU3RyBQAAAANuaWwFAAAAA1NFUAEAAAAOa2V5U3Rha2VkVG90YWwAAAABAAAADGxwQXNzZXRJZFN0cgkAASwAAAACAgAAABclcyVzJXNfX3N0YWtlZF9fdG90YWxfXwUAAAAMbHBBc3NldElkU3RyAQAAAA1rZXlQb29sV2VpZ2h0AAAAAQAAAA9jb250cmFjdEFkZHJlc3MJAAS5AAAAAgkABEwAAAACAgAAAAQlcyVzCQAETAAAAAICAAAACnBvb2xXZWlnaHQJAARMAAAAAgUAAAAPY29udHJhY3RBZGRyZXNzBQAAAANuaWwFAAAAA1NFUAEAAAAXZ2V0U3Rha2luZ0FkZHJlc3NPckZhaWwAAAABAAAACmZhY3RvcnlDZmcJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAKZmFjdG9yeUNmZwAAAAAAAAAAAQEAAAAZaW50ZXJuYWxDdXJyZW50UmV3YXJkUmF0ZQAAAAIAAAAPc3Rha2luZ0NvbnRyYWN0AAAACWxwQXNzZXRJZAQAAAASd3hFbWlzc2lvblBlckJsb2NrAAAAAAAAAAAABAAAAAltYXhGYWN0b3IJAABoAAAAAgAAAAAAAAAAAQUAAAAFTVVMVDgEAAAADXRvdGFsTHBTdGFrZWQJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAA9zdGFraW5nQ29udHJhY3QJAQAAAA5rZXlTdGFrZWRUb3RhbAAAAAEFAAAACWxwQXNzZXRJZAkABEwAAAACBQAAABJ3eEVtaXNzaW9uUGVyQmxvY2sJAARMAAAAAgUAAAAJbWF4RmFjdG9yCQAETAAAAAIFAAAADXRvdGFsTHBTdGFrZWQFAAAAA25pbAAAAAoAAAABaQEAAAALY29uc3RydWN0b3IAAAABAAAADmZhY3RvcnlBZGRyZXNzAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAADm5vdCBhdXRob3JpemVkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFrZXlGYWN0b3J5QWRkcmVzcwAAAAAFAAAADmZhY3RvcnlBZGRyZXNzBQAAAANuaWwAAAABaQEAAAAZY3VycmVudFJld2FyZFJhdGVSRUFET05MWQAAAAEAAAAJbHBBc3NldElkBAAAAA9mYWN0b3J5Q2ZnQXJyYXkJAQAAABRyZWFkRmFjdG9yeUNmZ09yRmFpbAAAAAAEAAAAD3N0YWtpbmdDb250cmFjdAkBAAAAF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsAAAAAQUAAAAPZmFjdG9yeUNmZ0FycmF5BAAAAApyZXdhcmREYXRhCQEAAAAZaW50ZXJuYWxDdXJyZW50UmV3YXJkUmF0ZQAAAAIFAAAAD3N0YWtpbmdDb250cmFjdAUAAAAJbHBBc3NldElkBAAAABJ3eEVtaXNzaW9uUGVyQmxvY2sJAAGRAAAAAgUAAAAKcmV3YXJkRGF0YQAAAAAAAAAAAAQAAAAJbWF4RmFjdG9yCQABkQAAAAIFAAAACnJld2FyZERhdGEAAAAAAAAAAAEEAAAADXRvdGFsTHBTdGFrZWQJAAGRAAAAAgUAAAAKcmV3YXJkRGF0YQAAAAAAAAAAAgkABRQAAAACBQAAAANuaWwJAAS5AAAAAgkABEwAAAACAgAAAAYlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAABJ3eEVtaXNzaW9uUGVyQmxvY2sJAARMAAAAAgkAAaQAAAABBQAAAAltYXhGYWN0b3IJAARMAAAAAgkAAaQAAAABBQAAAA10b3RhbExwU3Rha2VkBQAAAANuaWwFAAAAA1NFUAAAAAFpAQAAAB1jdXJyZW50VXNlclJld2FyZFJhdGVSRUFET05MWQAAAAIAAAAJbHBBc3NldElkAAAAC3VzZXJBZGRyZXNzBAAAAA9mYWN0b3J5Q2ZnQXJyYXkJAQAAABRyZWFkRmFjdG9yeUNmZ09yRmFpbAAAAAAEAAAAD3N0YWtpbmdDb250cmFjdAkBAAAAF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsAAAAAQUAAAAPZmFjdG9yeUNmZ0FycmF5BAAAAApyZXdhcmREYXRhCQEAAAAZaW50ZXJuYWxD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", "chainId": 84, "height": 1836921, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 75MEsd3Xz2X7qBYrWY9896LBndxyczy1xq1QZ8ZFDWC5 Next: HVoxBJz4wP62UuToXH3PDuMN2vgfcisuLwzWy5n5Vzf Diff:
OldNewDifferences
1111
1212 let SEP = "__"
1313
14-let POOLWEIGHTMULT = MULT8
14+let zeroBigInt = toBigInt(0)
1515
1616 let idxPoolAddress = 1
1717
4545 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
4646
4747
48-func asAnyList (val) = match val {
49- case valAnyLyst: List[Any] =>
50- valAnyLyst
51- case _ =>
52- throw("fail to cast into List[Any]")
53-}
54-
55-
56-func asInt (val) = match val {
57- case valInt: Int =>
58- valInt
59- case _ =>
60- throw("fail to cast into Int")
61-}
62-
63-
64-func asString (val) = match val {
65- case valStr: String =>
66- valStr
67- case _ =>
68- throw("fail to cast into String")
69-}
70-
71-
7248 func keyFactoryAddress () = "%s%s__config__factoryAddress"
7349
7450
75-let IdxFactoryCfgStakingDapp = 1
76-
77-let IdxFactoryCfgBoostingDapp = 2
78-
79-let IdxFactoryCfgIdoDapp = 3
80-
81-let IdxFactoryCfgTeamDapp = 4
82-
83-let IdxFactoryCfgEmissionDapp = 5
84-
85-let IdxFactoryCfgRestDapp = 6
86-
87-let IdxFactoryCfgSlippageDapp = 7
88-
89-let IdxFactoryCfgGwxRewardDapp = 8
90-
91-func keyFactoryCfg () = "%s__factoryConfig"
92-
93-
94-func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
51+func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
9552
9653
9754 func keyFactoryLpList () = "%s__lpTokensList"
9855
9956
100-func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
101-
102-
103-func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
57+func keyFactoryCfg () = "%s__factoryConfig"
10458
10559
10660 func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(keyFactoryAddress()))
10963 func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
11064
11165
112-func readFactoryCfgOrFail (factory) = split(getStringByAddressOrFail(factory, keyFactoryCfg()), SEP)
113-
114-
115-func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
116-
117-
118-func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
119-
120-
121-func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
122-
123-
124-func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue("3PH83bJCZraJoEzFefz4p8UXZD9YazNnj1n")
125-
126-
127-func keyBoostCfg () = "%s__config"
128-
129-
130-func keyBoostingLockParamTotalAmount () = "%s%s__stats__activeTotalLocked"
131-
132-
133-func keyBoostingStatsLocksDurationSumInBlocks () = "%s%s__stats__locksDurationSumInBlocks"
134-
135-
136-func keyBoostingStatsLocksCount () = "%s%s__stats__locksCount"
137-
138-
139-func keyBoostingStatsUsersCount () = "%s%s__stats__activeUsersCount"
140-
141-
142-func keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", userAddress], SEP)
143-
144-
145-func keyNum2UserMapping (num) = makeString(["%s%s%s__mapping__num2user", num], SEP)
146-
147-
148-func keyLockParamUserAmount (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "amount"], SEP)
149-
150-
151-func keyLockParamStartBlock (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "start"], SEP)
152-
153-
154-func keyLockParamDuration (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "duration"], SEP)
155-
156-
157-func keyLockParamK (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "k"], SEP)
158-
159-
160-func keyLockParamB (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "b"], SEP)
161-
162-
163-func keyLockParamByPeriodK (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "k", period], SEP)
164-
165-
166-func keyLockParamByPeriodB (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "b", period], SEP)
167-
168-
169-func keyUserBoostEmissionLastINTEGRAL (userNum) = makeString(["%s%d__userBoostEmissionLastInt", userNum], SEP)
170-
171-
172-func keyUserMaxBoostINTEGRAL (userNum) = makeString(["%s%d__maxBoostInt", userNum], SEP)
173-
174-
175-func keyTotalMaxBoostINTEGRAL () = "%s%s__maxBoostInt__total"
176-
177-
178-func keyUserBoostAvalaibleToClaimTotal (userNum) = makeString(["%s%d__userBoostAvaliableToClaimTotal", userNum], SEP)
179-
180-
181-func keyUserBoostClaimed (userNum) = makeString(["%s%d__userBoostClaimed", userNum], SEP)
182-
183-
184-func keyTotalCachedGwx () = "%s%s__gwxCached__total"
66+func readFactoryCfgOrFail () = split(getStringByAddressOrFail(readFactoryAddressOrFail(), keyFactoryCfg()), SEP)
18567
18668
18769 func keyStakedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__staked", userAddressStr, lpAssetIdStr], SEP)
19072 func keyStakedTotal (lpAssetIdStr) = ("%s%s%s__staked__total__" + lpAssetIdStr)
19173
19274
193-func keyClaimedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
75+func keyPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
19476
19577
196-func keyClaimedByUserMinReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedMinReward", userAddressStr, lpAssetIdStr], SEP)
78+func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[1])
19779
19880
199-func keyClaimedByUserBoostReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedBoostReward", userAddressStr, lpAssetIdStr], SEP)
200-
201-
202-func readStaked (stakingDapp,key) = valueOrElse(getInteger(stakingDapp, key), 0)
203-
204-
205-func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
206-
207-
208-func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
209-
210-
211-func keyEmissionStartBlock () = "%s%s__emission__startBlock"
212-
213-
214-func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
215-
216-
217-func keyEmissionEndBlock () = "%s%s__emission__endBlock"
218-
219-
220-func internalCurrentRewardRate (factoryContract,stakingContract,emissionContract,lpAssetId) = {
221- let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetId))
222- let poolWeightMult = MULT8
223- let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
224- let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
225- let wxEmissionPerBlockMax = getIntOrFail(emissionContract, keyEmissionRatePerBlockMaxCurrent())
226- let boostMaxCoeff = 3
227- let poolWxEmissionPerBlock = (fraction(wxEmissionPerBlock, poolWeight, poolWeightMult) / boostMaxCoeff)
228- let poolWxEmissionPerBlockMax = fraction(wxEmissionPerBlockMax, poolWeight, poolWeightMult)
229- let maxFactor = (boostMaxCoeff * MULT8)
81+func internalCurrentRewardRate (stakingContract,lpAssetId) = {
82+ let wxEmissionPerBlock = 0
83+ let maxFactor = (1 * MULT8)
23084 let totalLpStaked = getIntOrZero(stakingContract, keyStakedTotal(lpAssetId))
231-[poolWxEmissionPerBlock, maxFactor, totalLpStaked]
232- }
233-
234-
235-func calcGwxAmountStartREADONLY (lockAmount,lockDuration,maxLockDuration) = {
236- let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
237- let gWxAmountStart = fraction(lockAmount, coeffX8, MULT8)
238-[gWxAmountStart]
85+[wxEmissionPerBlock, maxFactor, totalLpStaked]
23986 }
24087
24188
24895
24996 @Callable(i)
25097 func currentRewardRateREADONLY (lpAssetId) = {
251- let factoryContract = readFactoryAddressOrFail()
252- let factoryCfg = readFactoryCfgOrFail(factoryContract)
253- let stakingContract = getStakingAddressOrFail(factoryCfg)
254- let emissionContract = getEmissionAddressOrFail(factoryCfg)
255- let rewardData = internalCurrentRewardRate(factoryContract, stakingContract, emissionContract, lpAssetId)
98+ let factoryCfgArray = readFactoryCfgOrFail()
99+ let stakingContract = getStakingAddressOrFail(factoryCfgArray)
100+ let rewardData = internalCurrentRewardRate(stakingContract, lpAssetId)
256101 let wxEmissionPerBlock = rewardData[0]
257102 let maxFactor = rewardData[1]
258103 let totalLpStaked = rewardData[2]
263108
264109 @Callable(i)
265110 func currentUserRewardRateREADONLY (lpAssetId,userAddress) = {
266- let factoryContract = readFactoryAddressOrFail()
267- let factoryCfg = readFactoryCfgOrFail(factoryContract)
268- let stakingContract = getStakingAddressOrFail(factoryCfg)
269- let emissionContract = getEmissionAddressOrFail(factoryCfg)
270- let rewardData = internalCurrentRewardRate(factoryContract, stakingContract, emissionContract, lpAssetId)
111+ let factoryCfgArray = readFactoryCfgOrFail()
112+ let stakingContract = getStakingAddressOrFail(factoryCfgArray)
113+ let rewardData = internalCurrentRewardRate(stakingContract, lpAssetId)
271114 let wxEmissionPerBlock = rewardData[0]
272115 let maxFactor = rewardData[1]
273116 let totalLpStaked = rewardData[2]
274117 let lpStakedByUser = getIntOrZero(stakingContract, keyStakedByUser(userAddress, lpAssetId))
275- let userClaimInfo = split(asString(invoke(stakingContract, "claimWxREADONLY", [lpAssetId, userAddress], nil)), SEP)
276- let minRewardPart = valueOrErrorMessage(parseInt(userClaimInfo[5]), "couldn't parse minRewardPart")
277- let boostRewardPart = valueOrErrorMessage(parseInt(userClaimInfo[6]), "couldn't parse boostRewardPart")
278- let debug = userClaimInfo[7]
279- let boostingPower = if ((boostRewardPart == 0))
280- then (1 * MULT8)
281- else fraction((minRewardPart + boostRewardPart), MULT8, minRewardPart)
282- $Tuple2(nil, makeString(["%d%d%d%d%d%s", toString(wxEmissionPerBlock), toString(maxFactor), toString(totalLpStaked), toString(lpStakedByUser), toString(boostingPower), debug], SEP))
118+ let boostingPower = (1 * MULT8)
119+ $Tuple2(nil, makeString(["%d%d%d", toString(wxEmissionPerBlock), toString(maxFactor), toString(totalLpStaked), toString(lpStakedByUser), toString(boostingPower)], SEP))
283120 }
284121
285122
286123
287124 @Callable(i)
288125 func claimedRewardREADONLY (userAddress) = {
289- let factoryContract = readFactoryAddressOrFail()
290- let factoryCfg = readFactoryCfgOrFail(factoryContract)
291- let stakingContract = getStakingAddressOrFail(factoryCfg)
292126 let lpList = readLpList()
293127 let prefix = "%s%d%d%d%s"
294128 func claimedRewardByLpAggregator (resultStr,nextLp) = {
295- let claimedByUserMinRewardKEY = keyClaimedByUserMinReward(nextLp, userAddress)
296- let claimedByUserBoostRewardKEY = keyClaimedByUserBoostReward(nextLp, userAddress)
297- let minRewardClaimed = valueOrElse(getInteger(stakingContract, claimedByUserMinRewardKEY), 0)
298- let boostRewardClaimed = valueOrElse(getInteger(stakingContract, claimedByUserBoostRewardKEY), 0)
129+ let rand = ((toInt(fromBase58String(nextLp)) % 100000) + (toInt(toBytes(userAddress)) % 100000))
130+ let absRand = if ((0 > rand))
131+ then -(rand)
132+ else rand
133+ let val = (((absRand % 100) * MULT8) + (absRand * (MULT8 / 100000)))
134+ let minRewardClaimed = 0
135+ let boostRewardClaimed = 0
299136 let gFeeClaimed = 0
300137 makeString([(prefix + resultStr), nextLp, toString(minRewardClaimed), toString(boostRewardClaimed), toString(gFeeClaimed), "end"], SEP)
301138 }
304141 let $l = lpList
305142 let $s = size($l)
306143 let $acc0 = "%s"
307- func 1 ($a,$i) = if (($i >= $s))
144+ func $f0_1 ($a,$i) = if (($i >= $s))
308145 then $a
309146 else claimedRewardByLpAggregator($a, $l[$i])
310147
311- func 2 ($a,$i) = if (($i >= $s))
148+ func $f0_2 ($a,$i) = if (($i >= $s))
312149 then $a
313150 else throw("List size exceeds 10")
314151
315- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
152+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
316153 }
317154 $Tuple2(nil, ((result + SEP) + userAddress))
318155 }
321158
322159 @Callable(i)
323160 func calcBoostREADONLY (deltaWxAmount,deltaLockPeriodInBlocks,deltaLpAmount,lpAssetIdOpt,userAddressOpt) = {
324- let factoryContract = readFactoryAddressOrFail()
325- let factoryCfg = readFactoryCfgOrFail(factoryContract)
326- let boostingContract = getBoostingAddressOrFail(factoryCfg)
327- let mathContract = getGwxRewardAddressOrFail(factoryCfg)
328- let emissionContract = getEmissionAddressOrFail(factoryCfg)
329- let stakingContract = getStakingAddressOrFail(factoryCfg)
330- let EMPTYSTR = "empty"
331- let maxLockDurationInBlocks = parseIntValue(split(getStringByAddressOrFail(boostingContract, keyBoostCfg()), SEP)[4])
332- let lpAssetIdStr = if ((lpAssetIdOpt == ""))
333- then EMPTYSTR
334- else lpAssetIdOpt
335- let userAddressStr = if ((userAddressOpt == ""))
336- then EMPTYSTR
337- else userAddressOpt
338- let userNumStr = valueOrElse(getString(boostingContract, keyUser2NumMapping(userAddressOpt)), EMPTYSTR)
339- let userAmount = valueOrElse(getInteger(boostingContract, keyLockParamUserAmount(userNumStr)), 0)
340- let lockStart = valueOrElse(getInteger(boostingContract, keyLockParamStartBlock(userNumStr)), height)
341- let lockDuration = valueOrElse(getInteger(boostingContract, keyLockParamDuration(userNumStr)), 0)
342- let lockEnd = (lockStart + lockDuration)
343- let remainingDuration = max([(lockEnd - height), 0])
344- let userAmountNew = (userAmount + deltaWxAmount)
345- let lockDurationNew = min([(remainingDuration + deltaLockPeriodInBlocks), maxLockDurationInBlocks])
346- let userCurrgWxAmount = asInt(asAnyList(invoke(boostingContract, "gwxUserInfoREADONLY", [userAddressStr], nil))[0])
347- let gWxAmountStartNew = calcGwxAmountStartREADONLY(userAmountNew, lockDurationNew, maxLockDurationInBlocks)[0]
348- let gWxParamsResultList = asAnyList(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStartNew, height, lockDurationNew], nil))
349- let gWxAmountDiff = (gWxAmountStartNew - userCurrgWxAmount)
350- let k = asInt(gWxParamsResultList[0])
351- let b = asInt(gWxParamsResultList[1])
352- let period = toString(asInt(gWxParamsResultList[2]))
353- let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
354- let totalCachedGwxKEY = keyTotalCachedGwx()
355- let userMaxBoostIntNew = ((gWxAmountStartNew * lockDurationNew) / 2)
356- let totalMaxBoostInt = getIntOrZero(boostingContract, totalMaxBoostIntegralKEY)
357- let totalCachedGwx = valueOrElse(getInteger(boostingContract, totalCachedGwxKEY), 0)
358- let MULT3 = 1000
359- let wxEmissionPerBlockX3 = (getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent()) * MULT3)
360- let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
361- let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
362- let stakedByUser = readStaked(stakingContract, stakedByUserKEY)
363- let stakedTotal = readStaked(stakingContract, stakedTotalKEY)
364- let stakedByUserNew = (stakedByUser + deltaLpAmount)
365- let stakedTotalNew = (stakedTotal + deltaLpAmount)
366- let poolWeight = if ((lpAssetIdStr != EMPTYSTR))
367- then {
368- let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
369- getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
370- }
371- else 0
372- let poolWxEmissionPerBlockX3 = fraction(wxEmissionPerBlockX3, poolWeight, (POOLWEIGHTMULT * 3))
373- let wxPerLpX3 = if ((stakedTotalNew != 0))
374- then fraction(poolWxEmissionPerBlockX3, MULT8, stakedTotalNew)
375- else 0
376- let userWxPerBlockX3 = fraction(wxPerLpX3, stakedByUserNew, MULT8)
377- let boostEmissionPerBlockX3 = (poolWxEmissionPerBlockX3 * 2)
378- let tmpUserBoostPerBlockX3 = fraction(gWxAmountStartNew, boostEmissionPerBlockX3, (totalCachedGwx + gWxAmountDiff))
379- let userBoostPerBlockX3 = min([tmpUserBoostPerBlockX3, (userWxPerBlockX3 * 2)])
380- let boostCoeff = if ((userWxPerBlockX3 == 0))
381- then (1 * MULT8)
382- else fraction((userBoostPerBlockX3 + userWxPerBlockX3), MULT8, userWxPerBlockX3)
383- let debug = makeString([("lpAssetIdStr=" + lpAssetIdStr), ("userAddressStr=" + userAddressStr), ("userNumStr=" + userNumStr), ("userAmount=" + toString(userAmount)), ("userAmountNew=" + toString(userAmountNew)), ("lockDurationNew=" + toString(lockDurationNew)), ("gWxAmountStart=" + toString(gWxAmountStartNew)), ("tmpUserBoostPerBlockX3=" + toString(tmpUserBoostPerBlockX3)), ("stakedByUserNew=" + toString(stakedByUserNew)), ("stakedTotalNew=" + toString(stakedTotalNew)), ("poolWeight=" + toString(poolWeight)), ("wxPerLpX3=" + toString(wxPerLpX3)), ("poolWxEmissionPerBlockX3=" + toString(poolWxEmissionPerBlockX3)), ("userWxPerBlockX3=" + toString(userWxPerBlockX3)), ("gWxAmountDiff=" + toString(gWxAmountDiff)), ("totalCachedGwx=" + toString(totalCachedGwx)), ("userCurrgWxAmount=" + toString(userCurrgWxAmount))], "::")
384- $Tuple2(nil, makeString(["%d%d%s", toString(gWxAmountStartNew), toString(boostCoeff), debug], SEP))
161+ let boost = if ((userAddressOpt != ""))
162+ then (3 * MULT8)
163+ else (1 * MULT8)
164+ let monthes18 = fraction(toBigInt(deltaLockPeriodInBlocks), MULT18, toBigInt((30 * 1440)))
165+ let coeff18 = (pow(monthes18, SCALE18, toBigInt(2), 0, SCALE18, HALFUP) / toBigInt(100))
166+ let gWxAmount = fraction(toBigInt(deltaWxAmount), coeff18, MULT18)
167+ $Tuple2(nil, makeString(["%d%d", toString(toInt(gWxAmount)), toString(boost)], SEP))
385168 }
386169
387170
390173 func wxEmissionStatsREADONLY () = {
391174 let ONEMULT = toString(MULT8)
392175 let ONE = "1"
393- let factoryContract = readFactoryAddressOrFail()
394- let factoryCfg = readFactoryCfgOrFail(factoryContract)
395- let boostingContract = getBoostingAddressOrFail(factoryCfg)
396- let emissionContract = getEmissionAddressOrFail(factoryCfg)
397- let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
398- let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
399- let passedBlocks = if ((emissionStartBlock > height))
400- then 0
401- else (height - emissionStartBlock)
402- let teamEmDuration = (1440 * 365)
403- let teamEmMax = (201000000 * MULT8)
404- let teamEm = if ((passedBlocks > teamEmDuration))
405- then teamEmMax
406- else fraction(teamEmMax, passedBlocks, teamEmDuration)
407- let totalWxReleased = ((wxEmissionPerBlock * passedBlocks) + teamEm)
408- let totalWxLocked = getIntOrZero(boostingContract, keyBoostingLockParamTotalAmount())
409- let locksDurationSumInBlocks = getIntOrZero(boostingContract, keyBoostingStatsLocksDurationSumInBlocks())
410- let locksCount = getIntOrZero(boostingContract, keyBoostingStatsLocksCount())
176+ let totalWxReleased = 0
177+ let totalWxLocked = 0
178+ let locksDurationSumInBlocks = 0
179+ let locksCount = 0
411180 $Tuple2(nil, makeString(["%d%d%d%d", toString(totalWxReleased), toString(totalWxLocked), toString(locksDurationSumInBlocks), toString(locksCount)], SEP))
412181 }
413182
414183
415184
416185 @Callable(i)
417-func lpStatsREADONLY (lpAsset) = {
186+func poolStatsREADONLY (lpAsset) = {
418187 let factoryAddress = readFactoryAddressOrFail()
419188 let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryAddress, keyFactoryLpAssetToPoolContractAddress(lpAsset)))
420- let cfg = if ($isInstanceOf(invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil), "List[Any]"))
421- then invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil)
422- else throw("Couldn't cast Any to List[Any]")
423- let lpAssetId = fromBase58String(if ($isInstanceOf(cfg[idxPoolLPAssetId], "String"))
424- then cfg[idxPoolLPAssetId]
425- else throw("Couldn't cast Any to String"))
426- let amtAssetId = if ($isInstanceOf(cfg[idxAmtAssetId], "String"))
427- then cfg[idxAmtAssetId]
428- else throw("Couldn't cast Any to String")
429- let priceAssetId = if ($isInstanceOf(cfg[idxPriceAssetId], "String"))
430- then cfg[idxPriceAssetId]
431- else throw("Couldn't cast Any to String")
432- let iAmtAssetId = if ($isInstanceOf(cfg[idxIAmtAssetId], "String"))
433- then cfg[idxIAmtAssetId]
434- else throw("Couldn't cast Any to String")
435- let iPriceAssetId = if ($isInstanceOf(cfg[idxIPriceAssetId], "String"))
436- then cfg[idxIPriceAssetId]
437- else throw("Couldn't cast Any to String")
438- let amtAssetDcm = parseIntValue(if ($isInstanceOf(cfg[idxAmtAssetDcm], "String"))
439- then cfg[idxAmtAssetDcm]
440- else throw("Couldn't cast Any to String"))
441- let priceAssetDcm = parseIntValue(if ($isInstanceOf(cfg[idxPriceAssetDcm], "String"))
442- then cfg[idxPriceAssetDcm]
443- else throw("Couldn't cast Any to String"))
189+ let cfg = {
190+ let @ = invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil)
191+ if ($isInstanceOf(@, "List[Any]"))
192+ then @
193+ else throw("Couldn't cast Any to List[Any]")
194+ }
195+ let lpAssetId = fromBase58String({
196+ let @ = cfg[idxPoolLPAssetId]
197+ if ($isInstanceOf(@, "String"))
198+ then @
199+ else throw("Couldn't cast Any to String")
200+ })
201+ let amtAssetId = {
202+ let @ = cfg[idxAmtAssetId]
203+ if ($isInstanceOf(@, "String"))
204+ then @
205+ else throw("Couldn't cast Any to String")
206+ }
207+ let priceAssetId = {
208+ let @ = cfg[idxPriceAssetId]
209+ if ($isInstanceOf(@, "String"))
210+ then @
211+ else throw("Couldn't cast Any to String")
212+ }
213+ let iAmtAssetId = {
214+ let @ = cfg[idxIAmtAssetId]
215+ if ($isInstanceOf(@, "String"))
216+ then @
217+ else throw("Couldn't cast Any to String")
218+ }
219+ let iPriceAssetId = {
220+ let @ = cfg[idxIPriceAssetId]
221+ if ($isInstanceOf(@, "String"))
222+ then @
223+ else throw("Couldn't cast Any to String")
224+ }
225+ let amtAssetDcm = parseIntValue({
226+ let @ = cfg[idxAmtAssetDcm]
227+ if ($isInstanceOf(@, "String"))
228+ then @
229+ else throw("Couldn't cast Any to String")
230+ })
231+ let priceAssetDcm = parseIntValue({
232+ let @ = cfg[idxPriceAssetDcm]
233+ if ($isInstanceOf(@, "String"))
234+ then @
235+ else throw("Couldn't cast Any to String")
236+ })
444237 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
445- let accAmtAssetBalance = if ($isInstanceOf(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amtAssetId], nil), "Int"))
446- then invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amtAssetId], nil)
447- else throw("Couldn't cast Any to Int")
448- let accPriceAssetBalance = if ($isInstanceOf(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [priceAssetId], nil), "Int"))
449- then invoke(poolAddress, "getAccBalanceWrapperREADONLY", [priceAssetId], nil)
450- else throw("Couldn't cast Any to Int")
451- let pricesList = if ($isInstanceOf(invoke(poolAddress, "calcPricesWrapperREADONLY", [accAmtAssetBalance, accPriceAssetBalance, poolLPBalance], nil), "List[Any]"))
452- then invoke(poolAddress, "calcPricesWrapperREADONLY", [accAmtAssetBalance, accPriceAssetBalance, poolLPBalance], nil)
453- else throw("Couldn't cast Any to List[Any]")
238+ let accAmtAssetBalance = {
239+ let @ = invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amtAssetId], nil)
240+ if ($isInstanceOf(@, "Int"))
241+ then @
242+ else throw("Couldn't cast Any to Int")
243+ }
244+ let accPriceAssetBalance = {
245+ let @ = invoke(poolAddress, "getAccBalanceWrapperREADONLY", [priceAssetId], nil)
246+ if ($isInstanceOf(@, "Int"))
247+ then @
248+ else throw("Couldn't cast Any to Int")
249+ }
250+ let pricesList = {
251+ let @ = invoke(poolAddress, "calcPricesWrapperREADONLY", [accAmtAssetBalance, accPriceAssetBalance, poolLPBalance], nil)
252+ if ($isInstanceOf(@, "List[Any]"))
253+ then @
254+ else throw("Couldn't cast Any to List[Any]")
255+ }
454256 let curPrice = 0
455- let lpAmtAssetShare = if ($isInstanceOf(invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[1], MULT8], nil), "Int"))
456- then invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[1], MULT8], nil)
457- else throw("Couldn't cast Any to Int")
458- let lpPriceAssetShare = if ($isInstanceOf(invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[2], MULT8], nil), "Int"))
459- then invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[2], MULT8], nil)
460- else throw("Couldn't cast Any to Int")
461- let poolWeight = getIntegerValue(factoryAddress, keyFactoryPoolWeight(toString(poolAddress)))
257+ let lpAmtAssetShare = {
258+ let @ = invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[1], MULT8], nil)
259+ if ($isInstanceOf(@, "Int"))
260+ then @
261+ else throw("Couldn't cast Any to Int")
262+ }
263+ let lpPriceAssetShare = {
264+ let @ = invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[2], MULT8], nil)
265+ if ($isInstanceOf(@, "Int"))
266+ then @
267+ else throw("Couldn't cast Any to Int")
268+ }
269+ let poolWeight = getIntegerValue(readFactoryAddressOrFail(), keyPoolWeight(toString(poolAddress)))
462270 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(accAmtAssetBalance), toString(accPriceAssetBalance), toString(poolLPBalance), toString(curPrice), toString(lpAmtAssetShare), toString(lpPriceAssetShare), toString(poolWeight)], SEP))
463271 }
464272
465273
466274
467275 @Callable(i)
468-func gwxUserInfoREADONLY (userAddress) = {
469- let factoryContract = readFactoryAddressOrFail()
470- let factoryCfg = readFactoryCfgOrFail(factoryContract)
471- let boostingContract = getBoostingAddressOrFail(factoryCfg)
472- let gwxUserInfoLIST = if ($isInstanceOf(invoke(boostingContract, "gwxUserInfoREADONLY", [userAddress], nil), "List[Any]"))
473- then invoke(boostingContract, "gwxUserInfoREADONLY", [userAddress], nil)
474- else throw("Couldn't cast Any to List[Any]")
475- let gwxAmount = if ($isInstanceOf(gwxUserInfoLIST[0], "Int"))
476- then gwxUserInfoLIST[0]
477- else throw("Couldn't cast Any to Int")
478- $Tuple2(nil, makeString(["%d", toString(gwxAmount)], SEP))
276+func poolEvaluatePutByAmountAssetREADONLY (lpAsset,inAmAssetAmt) = {
277+ let factoryAddress = readFactoryAddressOrFail()
278+ let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryAddress, keyFactoryLpAssetToPoolContractAddress(lpAsset)))
279+ let cfg = {
280+ let @ = invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil)
281+ if ($isInstanceOf(@, "List[Any]"))
282+ then @
283+ else throw("Couldn't cast Any to List[Any]")
284+ }
285+ let lpAssetId = fromBase58String({
286+ let @ = cfg[idxPoolLPAssetId]
287+ if ($isInstanceOf(@, "String"))
288+ then @
289+ else throw("Couldn't cast Any to String")
290+ })
291+ let amAssetIdStr = {
292+ let @ = cfg[idxAmtAssetId]
293+ if ($isInstanceOf(@, "String"))
294+ then @
295+ else throw("Couldn't cast Any to String")
296+ }
297+ let amAssetId = fromBase58String(amAssetIdStr)
298+ let prAssetIdStr = {
299+ let @ = cfg[idxPriceAssetId]
300+ if ($isInstanceOf(@, "String"))
301+ then @
302+ else throw("Couldn't cast Any to String")
303+ }
304+ let prAssetId = fromBase58String(prAssetIdStr)
305+ let amtAssetDcm = parseIntValue({
306+ let @ = cfg[idxAmtAssetDcm]
307+ if ($isInstanceOf(@, "String"))
308+ then @
309+ else throw("Couldn't cast Any to String")
310+ })
311+ let priceAssetDcm = parseIntValue({
312+ let @ = cfg[idxPriceAssetDcm]
313+ if ($isInstanceOf(@, "String"))
314+ then @
315+ else throw("Couldn't cast Any to String")
316+ })
317+ let poolStatus = {
318+ let @ = cfg[idxPoolStatus]
319+ if ($isInstanceOf(@, "String"))
320+ then @
321+ else throw("Couldn't cast Any to String")
322+ }
323+ let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
324+ let accAmtAssetBalance = {
325+ let @ = invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amAssetIdStr], nil)
326+ if ($isInstanceOf(@, "Int"))
327+ then @
328+ else throw("Couldn't cast Any to Int")
329+ }
330+ let accPriceAssetBalance = {
331+ let @ = invoke(poolAddress, "getAccBalanceWrapperREADONLY", [prAssetIdStr], nil)
332+ if ($isInstanceOf(@, "Int"))
333+ then @
334+ else throw("Couldn't cast Any to Int")
335+ }
336+ let amtAssetAmtX18 = parseBigIntValue({
337+ let @ = invoke(poolAddress, "toX18WrapperREADONLY", [accAmtAssetBalance, amtAssetDcm], nil)
338+ if ($isInstanceOf(@, "String"))
339+ then @
340+ else throw("Couldn't cast Any to String")
341+ })
342+ let priceAssetAmtX18 = parseBigIntValue({
343+ let @ = invoke(poolAddress, "toX18WrapperREADONLY", [accPriceAssetBalance, priceAssetDcm], nil)
344+ if ($isInstanceOf(@, "String"))
345+ then @
346+ else throw("Couldn't cast Any to String")
347+ })
348+ let curPriceX18 = if ((poolLPBalance == 0))
349+ then zeroBigInt
350+ else parseBigIntValue({
351+ let @ = invoke(poolAddress, "calcPriceBigIntWrapperREADONLY", [toString(priceAssetAmtX18), toString(amtAssetAmtX18)], nil)
352+ if ($isInstanceOf(@, "String"))
353+ then @
354+ else throw("Couldn't cast Any to String")
355+ })
356+ let curPrice = {
357+ let @ = invoke(poolAddress, "fromX18WrapperREADONLY", [toString(curPriceX18), MULT8], nil)
358+ if ($isInstanceOf(@, "Int"))
359+ then @
360+ else throw("Couldn't cast Any to Int")
361+ }
362+ let inAmAssetAmtX18 = parseBigIntValue({
363+ let @ = invoke(poolAddress, "toX18WrapperREADONLY", [inAmAssetAmt, amtAssetDcm], nil)
364+ if ($isInstanceOf(@, "String"))
365+ then @
366+ else throw("Couldn't cast Any to String")
367+ })
368+ let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, MULT18)
369+ let inPrAssetAmt = {
370+ let @ = invoke(poolAddress, "fromX18WrapperREADONLY", [toString(inPrAssetAmtX18), priceAssetDcm], nil)
371+ if ($isInstanceOf(@, "Int"))
372+ then @
373+ else throw("Couldn't cast Any to Int")
374+ }
375+ let res = invoke(poolAddress, "estimatePutOperationWrapperREADONLY", ["", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false], nil)
376+ let $t01090111254 = match res {
377+ case _ =>
378+ if (if ($isInstanceOf($match0._1, "Int"))
379+ then if ($isInstanceOf($match0._3, "Int"))
380+ then if ($isInstanceOf($match0._4, "Int"))
381+ then if ($isInstanceOf($match0._5, "Int"))
382+ then $isInstanceOf($match0._6, "Int")
383+ else false
384+ else false
385+ else false
386+ else false)
387+ then {
388+ let calcLpAmt = $match0._1
389+ let curPriceCalc = $match0._3
390+ let amBalance = $match0._4
391+ let prBalance = $match0._5
392+ let lpEmission = $match0._6
393+ $Tuple5(calcLpAmt, curPriceCalc, amBalance, prBalance, lpEmission)
394+ }
395+ else throw("Couldn't cast types")
396+ }
397+ let calcLpAmt = $t01090111254._1
398+ let curPriceCalc = $t01090111254._2
399+ let amBalance = $t01090111254._3
400+ let prBalance = $t01090111254._4
401+ let lpEmission = $t01090111254._5
402+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(curPrice), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
403+ }
404+
405+
406+
407+@Callable(i)
408+func poolEvaluatePutByPriceAssetREADONLY (lpAsset,inPrAssetAmt) = {
409+ let factoryAddress = readFactoryAddressOrFail()
410+ let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryAddress, keyFactoryLpAssetToPoolContractAddress(lpAsset)))
411+ let cfg = {
412+ let @ = invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil)
413+ if ($isInstanceOf(@, "List[Any]"))
414+ then @
415+ else throw("Couldn't cast Any to List[Any]")
416+ }
417+ let lpAssetId = fromBase58String({
418+ let @ = cfg[idxPoolLPAssetId]
419+ if ($isInstanceOf(@, "String"))
420+ then @
421+ else throw("Couldn't cast Any to String")
422+ })
423+ let amAssetIdStr = {
424+ let @ = cfg[idxAmtAssetId]
425+ if ($isInstanceOf(@, "String"))
426+ then @
427+ else throw("Couldn't cast Any to String")
428+ }
429+ let amAssetId = fromBase58String(amAssetIdStr)
430+ let prAssetIdStr = {
431+ let @ = cfg[idxPriceAssetId]
432+ if ($isInstanceOf(@, "String"))
433+ then @
434+ else throw("Couldn't cast Any to String")
435+ }
436+ let prAssetId = fromBase58String(prAssetIdStr)
437+ let amtAssetDcm = parseIntValue({
438+ let @ = cfg[idxAmtAssetDcm]
439+ if ($isInstanceOf(@, "String"))
440+ then @
441+ else throw("Couldn't cast Any to String")
442+ })
443+ let priceAssetDcm = parseIntValue({
444+ let @ = cfg[idxPriceAssetDcm]
445+ if ($isInstanceOf(@, "String"))
446+ then @
447+ else throw("Couldn't cast Any to String")
448+ })
449+ let poolStatus = {
450+ let @ = cfg[idxPoolStatus]
451+ if ($isInstanceOf(@, "String"))
452+ then @
453+ else throw("Couldn't cast Any to String")
454+ }
455+ let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
456+ let amBalanceRaw = {
457+ let @ = invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amAssetIdStr], nil)
458+ if ($isInstanceOf(@, "Int"))
459+ then @
460+ else throw("Couldn't cast Any to Int")
461+ }
462+ let prBalanceRaw = {
463+ let @ = invoke(poolAddress, "getAccBalanceWrapperREADONLY", [prAssetIdStr], nil)
464+ if ($isInstanceOf(@, "Int"))
465+ then @
466+ else throw("Couldn't cast Any to Int")
467+ }
468+ let amBalanceRawX18 = parseBigIntValue({
469+ let @ = invoke(poolAddress, "toX18WrapperREADONLY", [amBalanceRaw, amtAssetDcm], nil)
470+ if ($isInstanceOf(@, "String"))
471+ then @
472+ else throw("Couldn't cast Any to String")
473+ })
474+ let prBalanceRawX18 = parseBigIntValue({
475+ let @ = invoke(poolAddress, "toX18WrapperREADONLY", [prBalanceRaw, priceAssetDcm], nil)
476+ if ($isInstanceOf(@, "String"))
477+ then @
478+ else throw("Couldn't cast Any to String")
479+ })
480+ let curPriceX18 = if ((poolLPBalance == 0))
481+ then zeroBigInt
482+ else parseBigIntValue({
483+ let @ = invoke(poolAddress, "calcPriceBigIntWrapperREADONLY", [toString(prBalanceRawX18), toString(amBalanceRawX18)], nil)
484+ if ($isInstanceOf(@, "String"))
485+ then @
486+ else throw("Couldn't cast Any to String")
487+ })
488+ let curPrice = {
489+ let @ = invoke(poolAddress, "fromX18WrapperREADONLY", [toString(curPriceX18), MULT8], nil)
490+ if ($isInstanceOf(@, "Int"))
491+ then @
492+ else throw("Couldn't cast Any to Int")
493+ }
494+ let inPrAssetAmtX18 = parseBigIntValue({
495+ let @ = invoke(poolAddress, "toX18WrapperREADONLY", [inPrAssetAmt, priceAssetDcm], nil)
496+ if ($isInstanceOf(@, "String"))
497+ then @
498+ else throw("Couldn't cast Any to String")
499+ })
500+ let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, MULT18, curPriceX18)
501+ let inAmAssetAmt = {
502+ let @ = invoke(poolAddress, "fromX18WrapperREADONLY", [toString(inAmAssetAmtX18), amtAssetDcm], nil)
503+ if ($isInstanceOf(@, "Int"))
504+ then @
505+ else throw("Couldn't cast Any to Int")
506+ }
507+ let res = invoke(poolAddress, "estimatePutOperationWrapperREADONLY", ["", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false], nil)
508+ let $t01395714310 = match res {
509+ case _ =>
510+ if (if ($isInstanceOf($match0._1, "Int"))
511+ then if ($isInstanceOf($match0._3, "Int"))
512+ then if ($isInstanceOf($match0._4, "Int"))
513+ then if ($isInstanceOf($match0._5, "Int"))
514+ then $isInstanceOf($match0._6, "Int")
515+ else false
516+ else false
517+ else false
518+ else false)
519+ then {
520+ let calcLpAmt = $match0._1
521+ let curPriceCalc = $match0._3
522+ let amBalance = $match0._4
523+ let prBalance = $match0._5
524+ let lpEmission = $match0._6
525+ $Tuple5(calcLpAmt, curPriceCalc, amBalance, prBalance, lpEmission)
526+ }
527+ else throw("Couldn't cast types")
528+ }
529+ let calcLpAmt = $t01395714310._1
530+ let curPriceCalc = $t01395714310._2
531+ let amBalance = $t01395714310._3
532+ let prBalance = $t01395714310._4
533+ let lpEmission = $t01395714310._5
534+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(curPrice), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
535+ }
536+
537+
538+
539+@Callable(i)
540+func poolEvaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = {
541+ let factoryAddress = readFactoryAddressOrFail()
542+ let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryAddress, keyFactoryLpAssetToPoolContractAddress(paymentLpAssetId)))
543+ let res = invoke(poolAddress, "estimateGetOperationWrapperREADONLY", ["", paymentLpAssetId, paymentLpAmt, toString(poolAddress)], nil)
544+ let $t01505815475 = match res {
545+ case _ =>
546+ if (if ($isInstanceOf($match0._1, "Int"))
547+ then if ($isInstanceOf($match0._2, "Int"))
548+ then if ($isInstanceOf($match0._5, "Int"))
549+ then if ($isInstanceOf($match0._6, "Int"))
550+ then if ($isInstanceOf($match0._7, "Int"))
551+ then if ($isInstanceOf($match0._8, "String"))
552+ then $isInstanceOf($match0._9, "String")
553+ else false
554+ else false
555+ else false
556+ else false
557+ else false
558+ else false)
559+ then {
560+ let outAmAmt = $match0._1
561+ let outPrAmt = $match0._2
562+ let amBalance = $match0._5
563+ let prBalance = $match0._6
564+ let lpEmission = $match0._7
565+ let curPrice = $match0._8
566+ let poolStatus = $match0._9
567+ $Tuple7(outAmAmt, outPrAmt, amBalance, prBalance, lpEmission, curPrice, poolStatus)
568+ }
569+ else throw("Couldn't cast types")
570+ }
571+ let outAmAmt = $t01505815475._1
572+ let outPrAmt = $t01505815475._2
573+ let amBalance = $t01505815475._3
574+ let prBalance = $t01505815475._4
575+ let lpEmission = $t01505815475._5
576+ let curPrice = $t01505815475._6
577+ let poolStatus = $t01505815475._7
578+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmAmt), toString(outPrAmt), toString(amBalance), toString(prBalance), toString(lpEmission), curPrice, poolStatus], SEP))
479579 }
480580
481581
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SCALE8 = 8
55
66 let MULT8 = 100000000
77
88 let SCALE18 = 18
99
1010 let MULT18 = toBigInt(1000000000000000000)
1111
1212 let SEP = "__"
1313
14-let POOLWEIGHTMULT = MULT8
14+let zeroBigInt = toBigInt(0)
1515
1616 let idxPoolAddress = 1
1717
1818 let idxPoolStatus = 2
1919
2020 let idxPoolLPAssetId = 3
2121
2222 let idxAmtAssetId = 4
2323
2424 let idxPriceAssetId = 5
2525
2626 let idxAmtAssetDcm = 6
2727
2828 let idxPriceAssetDcm = 7
2929
3030 let idxIAmtAssetId = 8
3131
3232 let idxIPriceAssetId = 9
3333
3434 let idxLPAssetDcm = 10
3535
3636 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
3737
3838
3939 func getStringByAddressOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
4040
4141
4242 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
4343
4444
4545 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
4646
4747
48-func asAnyList (val) = match val {
49- case valAnyLyst: List[Any] =>
50- valAnyLyst
51- case _ =>
52- throw("fail to cast into List[Any]")
53-}
54-
55-
56-func asInt (val) = match val {
57- case valInt: Int =>
58- valInt
59- case _ =>
60- throw("fail to cast into Int")
61-}
62-
63-
64-func asString (val) = match val {
65- case valStr: String =>
66- valStr
67- case _ =>
68- throw("fail to cast into String")
69-}
70-
71-
7248 func keyFactoryAddress () = "%s%s__config__factoryAddress"
7349
7450
75-let IdxFactoryCfgStakingDapp = 1
76-
77-let IdxFactoryCfgBoostingDapp = 2
78-
79-let IdxFactoryCfgIdoDapp = 3
80-
81-let IdxFactoryCfgTeamDapp = 4
82-
83-let IdxFactoryCfgEmissionDapp = 5
84-
85-let IdxFactoryCfgRestDapp = 6
86-
87-let IdxFactoryCfgSlippageDapp = 7
88-
89-let IdxFactoryCfgGwxRewardDapp = 8
90-
91-func keyFactoryCfg () = "%s__factoryConfig"
92-
93-
94-func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
51+func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
9552
9653
9754 func keyFactoryLpList () = "%s__lpTokensList"
9855
9956
100-func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
101-
102-
103-func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
57+func keyFactoryCfg () = "%s__factoryConfig"
10458
10559
10660 func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(keyFactoryAddress()))
10761
10862
10963 func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
11064
11165
112-func readFactoryCfgOrFail (factory) = split(getStringByAddressOrFail(factory, keyFactoryCfg()), SEP)
113-
114-
115-func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
116-
117-
118-func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
119-
120-
121-func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
122-
123-
124-func getGwxRewardAddressOrFail (factoryCfg) = addressFromStringValue("3PH83bJCZraJoEzFefz4p8UXZD9YazNnj1n")
125-
126-
127-func keyBoostCfg () = "%s__config"
128-
129-
130-func keyBoostingLockParamTotalAmount () = "%s%s__stats__activeTotalLocked"
131-
132-
133-func keyBoostingStatsLocksDurationSumInBlocks () = "%s%s__stats__locksDurationSumInBlocks"
134-
135-
136-func keyBoostingStatsLocksCount () = "%s%s__stats__locksCount"
137-
138-
139-func keyBoostingStatsUsersCount () = "%s%s__stats__activeUsersCount"
140-
141-
142-func keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", userAddress], SEP)
143-
144-
145-func keyNum2UserMapping (num) = makeString(["%s%s%s__mapping__num2user", num], SEP)
146-
147-
148-func keyLockParamUserAmount (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "amount"], SEP)
149-
150-
151-func keyLockParamStartBlock (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "start"], SEP)
152-
153-
154-func keyLockParamDuration (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "duration"], SEP)
155-
156-
157-func keyLockParamK (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "k"], SEP)
158-
159-
160-func keyLockParamB (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "b"], SEP)
161-
162-
163-func keyLockParamByPeriodK (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "k", period], SEP)
164-
165-
166-func keyLockParamByPeriodB (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "b", period], SEP)
167-
168-
169-func keyUserBoostEmissionLastINTEGRAL (userNum) = makeString(["%s%d__userBoostEmissionLastInt", userNum], SEP)
170-
171-
172-func keyUserMaxBoostINTEGRAL (userNum) = makeString(["%s%d__maxBoostInt", userNum], SEP)
173-
174-
175-func keyTotalMaxBoostINTEGRAL () = "%s%s__maxBoostInt__total"
176-
177-
178-func keyUserBoostAvalaibleToClaimTotal (userNum) = makeString(["%s%d__userBoostAvaliableToClaimTotal", userNum], SEP)
179-
180-
181-func keyUserBoostClaimed (userNum) = makeString(["%s%d__userBoostClaimed", userNum], SEP)
182-
183-
184-func keyTotalCachedGwx () = "%s%s__gwxCached__total"
66+func readFactoryCfgOrFail () = split(getStringByAddressOrFail(readFactoryAddressOrFail(), keyFactoryCfg()), SEP)
18567
18668
18769 func keyStakedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__staked", userAddressStr, lpAssetIdStr], SEP)
18870
18971
19072 func keyStakedTotal (lpAssetIdStr) = ("%s%s%s__staked__total__" + lpAssetIdStr)
19173
19274
193-func keyClaimedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
75+func keyPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
19476
19577
196-func keyClaimedByUserMinReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedMinReward", userAddressStr, lpAssetIdStr], SEP)
78+func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[1])
19779
19880
199-func keyClaimedByUserBoostReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedBoostReward", userAddressStr, lpAssetIdStr], SEP)
200-
201-
202-func readStaked (stakingDapp,key) = valueOrElse(getInteger(stakingDapp, key), 0)
203-
204-
205-func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
206-
207-
208-func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
209-
210-
211-func keyEmissionStartBlock () = "%s%s__emission__startBlock"
212-
213-
214-func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
215-
216-
217-func keyEmissionEndBlock () = "%s%s__emission__endBlock"
218-
219-
220-func internalCurrentRewardRate (factoryContract,stakingContract,emissionContract,lpAssetId) = {
221- let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetId))
222- let poolWeightMult = MULT8
223- let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
224- let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
225- let wxEmissionPerBlockMax = getIntOrFail(emissionContract, keyEmissionRatePerBlockMaxCurrent())
226- let boostMaxCoeff = 3
227- let poolWxEmissionPerBlock = (fraction(wxEmissionPerBlock, poolWeight, poolWeightMult) / boostMaxCoeff)
228- let poolWxEmissionPerBlockMax = fraction(wxEmissionPerBlockMax, poolWeight, poolWeightMult)
229- let maxFactor = (boostMaxCoeff * MULT8)
81+func internalCurrentRewardRate (stakingContract,lpAssetId) = {
82+ let wxEmissionPerBlock = 0
83+ let maxFactor = (1 * MULT8)
23084 let totalLpStaked = getIntOrZero(stakingContract, keyStakedTotal(lpAssetId))
231-[poolWxEmissionPerBlock, maxFactor, totalLpStaked]
232- }
233-
234-
235-func calcGwxAmountStartREADONLY (lockAmount,lockDuration,maxLockDuration) = {
236- let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
237- let gWxAmountStart = fraction(lockAmount, coeffX8, MULT8)
238-[gWxAmountStart]
85+[wxEmissionPerBlock, maxFactor, totalLpStaked]
23986 }
24087
24188
24289 @Callable(i)
24390 func constructor (factoryAddress) = if ((i.caller != this))
24491 then throw("not authorized")
24592 else [StringEntry(keyFactoryAddress(), factoryAddress)]
24693
24794
24895
24996 @Callable(i)
25097 func currentRewardRateREADONLY (lpAssetId) = {
251- let factoryContract = readFactoryAddressOrFail()
252- let factoryCfg = readFactoryCfgOrFail(factoryContract)
253- let stakingContract = getStakingAddressOrFail(factoryCfg)
254- let emissionContract = getEmissionAddressOrFail(factoryCfg)
255- let rewardData = internalCurrentRewardRate(factoryContract, stakingContract, emissionContract, lpAssetId)
98+ let factoryCfgArray = readFactoryCfgOrFail()
99+ let stakingContract = getStakingAddressOrFail(factoryCfgArray)
100+ let rewardData = internalCurrentRewardRate(stakingContract, lpAssetId)
256101 let wxEmissionPerBlock = rewardData[0]
257102 let maxFactor = rewardData[1]
258103 let totalLpStaked = rewardData[2]
259104 $Tuple2(nil, makeString(["%d%d%d", toString(wxEmissionPerBlock), toString(maxFactor), toString(totalLpStaked)], SEP))
260105 }
261106
262107
263108
264109 @Callable(i)
265110 func currentUserRewardRateREADONLY (lpAssetId,userAddress) = {
266- let factoryContract = readFactoryAddressOrFail()
267- let factoryCfg = readFactoryCfgOrFail(factoryContract)
268- let stakingContract = getStakingAddressOrFail(factoryCfg)
269- let emissionContract = getEmissionAddressOrFail(factoryCfg)
270- let rewardData = internalCurrentRewardRate(factoryContract, stakingContract, emissionContract, lpAssetId)
111+ let factoryCfgArray = readFactoryCfgOrFail()
112+ let stakingContract = getStakingAddressOrFail(factoryCfgArray)
113+ let rewardData = internalCurrentRewardRate(stakingContract, lpAssetId)
271114 let wxEmissionPerBlock = rewardData[0]
272115 let maxFactor = rewardData[1]
273116 let totalLpStaked = rewardData[2]
274117 let lpStakedByUser = getIntOrZero(stakingContract, keyStakedByUser(userAddress, lpAssetId))
275- let userClaimInfo = split(asString(invoke(stakingContract, "claimWxREADONLY", [lpAssetId, userAddress], nil)), SEP)
276- let minRewardPart = valueOrErrorMessage(parseInt(userClaimInfo[5]), "couldn't parse minRewardPart")
277- let boostRewardPart = valueOrErrorMessage(parseInt(userClaimInfo[6]), "couldn't parse boostRewardPart")
278- let debug = userClaimInfo[7]
279- let boostingPower = if ((boostRewardPart == 0))
280- then (1 * MULT8)
281- else fraction((minRewardPart + boostRewardPart), MULT8, minRewardPart)
282- $Tuple2(nil, makeString(["%d%d%d%d%d%s", toString(wxEmissionPerBlock), toString(maxFactor), toString(totalLpStaked), toString(lpStakedByUser), toString(boostingPower), debug], SEP))
118+ let boostingPower = (1 * MULT8)
119+ $Tuple2(nil, makeString(["%d%d%d", toString(wxEmissionPerBlock), toString(maxFactor), toString(totalLpStaked), toString(lpStakedByUser), toString(boostingPower)], SEP))
283120 }
284121
285122
286123
287124 @Callable(i)
288125 func claimedRewardREADONLY (userAddress) = {
289- let factoryContract = readFactoryAddressOrFail()
290- let factoryCfg = readFactoryCfgOrFail(factoryContract)
291- let stakingContract = getStakingAddressOrFail(factoryCfg)
292126 let lpList = readLpList()
293127 let prefix = "%s%d%d%d%s"
294128 func claimedRewardByLpAggregator (resultStr,nextLp) = {
295- let claimedByUserMinRewardKEY = keyClaimedByUserMinReward(nextLp, userAddress)
296- let claimedByUserBoostRewardKEY = keyClaimedByUserBoostReward(nextLp, userAddress)
297- let minRewardClaimed = valueOrElse(getInteger(stakingContract, claimedByUserMinRewardKEY), 0)
298- let boostRewardClaimed = valueOrElse(getInteger(stakingContract, claimedByUserBoostRewardKEY), 0)
129+ let rand = ((toInt(fromBase58String(nextLp)) % 100000) + (toInt(toBytes(userAddress)) % 100000))
130+ let absRand = if ((0 > rand))
131+ then -(rand)
132+ else rand
133+ let val = (((absRand % 100) * MULT8) + (absRand * (MULT8 / 100000)))
134+ let minRewardClaimed = 0
135+ let boostRewardClaimed = 0
299136 let gFeeClaimed = 0
300137 makeString([(prefix + resultStr), nextLp, toString(minRewardClaimed), toString(boostRewardClaimed), toString(gFeeClaimed), "end"], SEP)
301138 }
302139
303140 let result = {
304141 let $l = lpList
305142 let $s = size($l)
306143 let $acc0 = "%s"
307- func 1 ($a,$i) = if (($i >= $s))
144+ func $f0_1 ($a,$i) = if (($i >= $s))
308145 then $a
309146 else claimedRewardByLpAggregator($a, $l[$i])
310147
311- func 2 ($a,$i) = if (($i >= $s))
148+ func $f0_2 ($a,$i) = if (($i >= $s))
312149 then $a
313150 else throw("List size exceeds 10")
314151
315- 2(1(1(1(1(1(1(1(1(1(1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
152+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
316153 }
317154 $Tuple2(nil, ((result + SEP) + userAddress))
318155 }
319156
320157
321158
322159 @Callable(i)
323160 func calcBoostREADONLY (deltaWxAmount,deltaLockPeriodInBlocks,deltaLpAmount,lpAssetIdOpt,userAddressOpt) = {
324- let factoryContract = readFactoryAddressOrFail()
325- let factoryCfg = readFactoryCfgOrFail(factoryContract)
326- let boostingContract = getBoostingAddressOrFail(factoryCfg)
327- let mathContract = getGwxRewardAddressOrFail(factoryCfg)
328- let emissionContract = getEmissionAddressOrFail(factoryCfg)
329- let stakingContract = getStakingAddressOrFail(factoryCfg)
330- let EMPTYSTR = "empty"
331- let maxLockDurationInBlocks = parseIntValue(split(getStringByAddressOrFail(boostingContract, keyBoostCfg()), SEP)[4])
332- let lpAssetIdStr = if ((lpAssetIdOpt == ""))
333- then EMPTYSTR
334- else lpAssetIdOpt
335- let userAddressStr = if ((userAddressOpt == ""))
336- then EMPTYSTR
337- else userAddressOpt
338- let userNumStr = valueOrElse(getString(boostingContract, keyUser2NumMapping(userAddressOpt)), EMPTYSTR)
339- let userAmount = valueOrElse(getInteger(boostingContract, keyLockParamUserAmount(userNumStr)), 0)
340- let lockStart = valueOrElse(getInteger(boostingContract, keyLockParamStartBlock(userNumStr)), height)
341- let lockDuration = valueOrElse(getInteger(boostingContract, keyLockParamDuration(userNumStr)), 0)
342- let lockEnd = (lockStart + lockDuration)
343- let remainingDuration = max([(lockEnd - height), 0])
344- let userAmountNew = (userAmount + deltaWxAmount)
345- let lockDurationNew = min([(remainingDuration + deltaLockPeriodInBlocks), maxLockDurationInBlocks])
346- let userCurrgWxAmount = asInt(asAnyList(invoke(boostingContract, "gwxUserInfoREADONLY", [userAddressStr], nil))[0])
347- let gWxAmountStartNew = calcGwxAmountStartREADONLY(userAmountNew, lockDurationNew, maxLockDurationInBlocks)[0]
348- let gWxParamsResultList = asAnyList(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStartNew, height, lockDurationNew], nil))
349- let gWxAmountDiff = (gWxAmountStartNew - userCurrgWxAmount)
350- let k = asInt(gWxParamsResultList[0])
351- let b = asInt(gWxParamsResultList[1])
352- let period = toString(asInt(gWxParamsResultList[2]))
353- let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
354- let totalCachedGwxKEY = keyTotalCachedGwx()
355- let userMaxBoostIntNew = ((gWxAmountStartNew * lockDurationNew) / 2)
356- let totalMaxBoostInt = getIntOrZero(boostingContract, totalMaxBoostIntegralKEY)
357- let totalCachedGwx = valueOrElse(getInteger(boostingContract, totalCachedGwxKEY), 0)
358- let MULT3 = 1000
359- let wxEmissionPerBlockX3 = (getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent()) * MULT3)
360- let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
361- let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
362- let stakedByUser = readStaked(stakingContract, stakedByUserKEY)
363- let stakedTotal = readStaked(stakingContract, stakedTotalKEY)
364- let stakedByUserNew = (stakedByUser + deltaLpAmount)
365- let stakedTotalNew = (stakedTotal + deltaLpAmount)
366- let poolWeight = if ((lpAssetIdStr != EMPTYSTR))
367- then {
368- let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
369- getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
370- }
371- else 0
372- let poolWxEmissionPerBlockX3 = fraction(wxEmissionPerBlockX3, poolWeight, (POOLWEIGHTMULT * 3))
373- let wxPerLpX3 = if ((stakedTotalNew != 0))
374- then fraction(poolWxEmissionPerBlockX3, MULT8, stakedTotalNew)
375- else 0
376- let userWxPerBlockX3 = fraction(wxPerLpX3, stakedByUserNew, MULT8)
377- let boostEmissionPerBlockX3 = (poolWxEmissionPerBlockX3 * 2)
378- let tmpUserBoostPerBlockX3 = fraction(gWxAmountStartNew, boostEmissionPerBlockX3, (totalCachedGwx + gWxAmountDiff))
379- let userBoostPerBlockX3 = min([tmpUserBoostPerBlockX3, (userWxPerBlockX3 * 2)])
380- let boostCoeff = if ((userWxPerBlockX3 == 0))
381- then (1 * MULT8)
382- else fraction((userBoostPerBlockX3 + userWxPerBlockX3), MULT8, userWxPerBlockX3)
383- let debug = makeString([("lpAssetIdStr=" + lpAssetIdStr), ("userAddressStr=" + userAddressStr), ("userNumStr=" + userNumStr), ("userAmount=" + toString(userAmount)), ("userAmountNew=" + toString(userAmountNew)), ("lockDurationNew=" + toString(lockDurationNew)), ("gWxAmountStart=" + toString(gWxAmountStartNew)), ("tmpUserBoostPerBlockX3=" + toString(tmpUserBoostPerBlockX3)), ("stakedByUserNew=" + toString(stakedByUserNew)), ("stakedTotalNew=" + toString(stakedTotalNew)), ("poolWeight=" + toString(poolWeight)), ("wxPerLpX3=" + toString(wxPerLpX3)), ("poolWxEmissionPerBlockX3=" + toString(poolWxEmissionPerBlockX3)), ("userWxPerBlockX3=" + toString(userWxPerBlockX3)), ("gWxAmountDiff=" + toString(gWxAmountDiff)), ("totalCachedGwx=" + toString(totalCachedGwx)), ("userCurrgWxAmount=" + toString(userCurrgWxAmount))], "::")
384- $Tuple2(nil, makeString(["%d%d%s", toString(gWxAmountStartNew), toString(boostCoeff), debug], SEP))
161+ let boost = if ((userAddressOpt != ""))
162+ then (3 * MULT8)
163+ else (1 * MULT8)
164+ let monthes18 = fraction(toBigInt(deltaLockPeriodInBlocks), MULT18, toBigInt((30 * 1440)))
165+ let coeff18 = (pow(monthes18, SCALE18, toBigInt(2), 0, SCALE18, HALFUP) / toBigInt(100))
166+ let gWxAmount = fraction(toBigInt(deltaWxAmount), coeff18, MULT18)
167+ $Tuple2(nil, makeString(["%d%d", toString(toInt(gWxAmount)), toString(boost)], SEP))
385168 }
386169
387170
388171
389172 @Callable(i)
390173 func wxEmissionStatsREADONLY () = {
391174 let ONEMULT = toString(MULT8)
392175 let ONE = "1"
393- let factoryContract = readFactoryAddressOrFail()
394- let factoryCfg = readFactoryCfgOrFail(factoryContract)
395- let boostingContract = getBoostingAddressOrFail(factoryCfg)
396- let emissionContract = getEmissionAddressOrFail(factoryCfg)
397- let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
398- let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
399- let passedBlocks = if ((emissionStartBlock > height))
400- then 0
401- else (height - emissionStartBlock)
402- let teamEmDuration = (1440 * 365)
403- let teamEmMax = (201000000 * MULT8)
404- let teamEm = if ((passedBlocks > teamEmDuration))
405- then teamEmMax
406- else fraction(teamEmMax, passedBlocks, teamEmDuration)
407- let totalWxReleased = ((wxEmissionPerBlock * passedBlocks) + teamEm)
408- let totalWxLocked = getIntOrZero(boostingContract, keyBoostingLockParamTotalAmount())
409- let locksDurationSumInBlocks = getIntOrZero(boostingContract, keyBoostingStatsLocksDurationSumInBlocks())
410- let locksCount = getIntOrZero(boostingContract, keyBoostingStatsLocksCount())
176+ let totalWxReleased = 0
177+ let totalWxLocked = 0
178+ let locksDurationSumInBlocks = 0
179+ let locksCount = 0
411180 $Tuple2(nil, makeString(["%d%d%d%d", toString(totalWxReleased), toString(totalWxLocked), toString(locksDurationSumInBlocks), toString(locksCount)], SEP))
412181 }
413182
414183
415184
416185 @Callable(i)
417-func lpStatsREADONLY (lpAsset) = {
186+func poolStatsREADONLY (lpAsset) = {
418187 let factoryAddress = readFactoryAddressOrFail()
419188 let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryAddress, keyFactoryLpAssetToPoolContractAddress(lpAsset)))
420- let cfg = if ($isInstanceOf(invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil), "List[Any]"))
421- then invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil)
422- else throw("Couldn't cast Any to List[Any]")
423- let lpAssetId = fromBase58String(if ($isInstanceOf(cfg[idxPoolLPAssetId], "String"))
424- then cfg[idxPoolLPAssetId]
425- else throw("Couldn't cast Any to String"))
426- let amtAssetId = if ($isInstanceOf(cfg[idxAmtAssetId], "String"))
427- then cfg[idxAmtAssetId]
428- else throw("Couldn't cast Any to String")
429- let priceAssetId = if ($isInstanceOf(cfg[idxPriceAssetId], "String"))
430- then cfg[idxPriceAssetId]
431- else throw("Couldn't cast Any to String")
432- let iAmtAssetId = if ($isInstanceOf(cfg[idxIAmtAssetId], "String"))
433- then cfg[idxIAmtAssetId]
434- else throw("Couldn't cast Any to String")
435- let iPriceAssetId = if ($isInstanceOf(cfg[idxIPriceAssetId], "String"))
436- then cfg[idxIPriceAssetId]
437- else throw("Couldn't cast Any to String")
438- let amtAssetDcm = parseIntValue(if ($isInstanceOf(cfg[idxAmtAssetDcm], "String"))
439- then cfg[idxAmtAssetDcm]
440- else throw("Couldn't cast Any to String"))
441- let priceAssetDcm = parseIntValue(if ($isInstanceOf(cfg[idxPriceAssetDcm], "String"))
442- then cfg[idxPriceAssetDcm]
443- else throw("Couldn't cast Any to String"))
189+ let cfg = {
190+ let @ = invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil)
191+ if ($isInstanceOf(@, "List[Any]"))
192+ then @
193+ else throw("Couldn't cast Any to List[Any]")
194+ }
195+ let lpAssetId = fromBase58String({
196+ let @ = cfg[idxPoolLPAssetId]
197+ if ($isInstanceOf(@, "String"))
198+ then @
199+ else throw("Couldn't cast Any to String")
200+ })
201+ let amtAssetId = {
202+ let @ = cfg[idxAmtAssetId]
203+ if ($isInstanceOf(@, "String"))
204+ then @
205+ else throw("Couldn't cast Any to String")
206+ }
207+ let priceAssetId = {
208+ let @ = cfg[idxPriceAssetId]
209+ if ($isInstanceOf(@, "String"))
210+ then @
211+ else throw("Couldn't cast Any to String")
212+ }
213+ let iAmtAssetId = {
214+ let @ = cfg[idxIAmtAssetId]
215+ if ($isInstanceOf(@, "String"))
216+ then @
217+ else throw("Couldn't cast Any to String")
218+ }
219+ let iPriceAssetId = {
220+ let @ = cfg[idxIPriceAssetId]
221+ if ($isInstanceOf(@, "String"))
222+ then @
223+ else throw("Couldn't cast Any to String")
224+ }
225+ let amtAssetDcm = parseIntValue({
226+ let @ = cfg[idxAmtAssetDcm]
227+ if ($isInstanceOf(@, "String"))
228+ then @
229+ else throw("Couldn't cast Any to String")
230+ })
231+ let priceAssetDcm = parseIntValue({
232+ let @ = cfg[idxPriceAssetDcm]
233+ if ($isInstanceOf(@, "String"))
234+ then @
235+ else throw("Couldn't cast Any to String")
236+ })
444237 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
445- let accAmtAssetBalance = if ($isInstanceOf(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amtAssetId], nil), "Int"))
446- then invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amtAssetId], nil)
447- else throw("Couldn't cast Any to Int")
448- let accPriceAssetBalance = if ($isInstanceOf(invoke(poolAddress, "getAccBalanceWrapperREADONLY", [priceAssetId], nil), "Int"))
449- then invoke(poolAddress, "getAccBalanceWrapperREADONLY", [priceAssetId], nil)
450- else throw("Couldn't cast Any to Int")
451- let pricesList = if ($isInstanceOf(invoke(poolAddress, "calcPricesWrapperREADONLY", [accAmtAssetBalance, accPriceAssetBalance, poolLPBalance], nil), "List[Any]"))
452- then invoke(poolAddress, "calcPricesWrapperREADONLY", [accAmtAssetBalance, accPriceAssetBalance, poolLPBalance], nil)
453- else throw("Couldn't cast Any to List[Any]")
238+ let accAmtAssetBalance = {
239+ let @ = invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amtAssetId], nil)
240+ if ($isInstanceOf(@, "Int"))
241+ then @
242+ else throw("Couldn't cast Any to Int")
243+ }
244+ let accPriceAssetBalance = {
245+ let @ = invoke(poolAddress, "getAccBalanceWrapperREADONLY", [priceAssetId], nil)
246+ if ($isInstanceOf(@, "Int"))
247+ then @
248+ else throw("Couldn't cast Any to Int")
249+ }
250+ let pricesList = {
251+ let @ = invoke(poolAddress, "calcPricesWrapperREADONLY", [accAmtAssetBalance, accPriceAssetBalance, poolLPBalance], nil)
252+ if ($isInstanceOf(@, "List[Any]"))
253+ then @
254+ else throw("Couldn't cast Any to List[Any]")
255+ }
454256 let curPrice = 0
455- let lpAmtAssetShare = if ($isInstanceOf(invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[1], MULT8], nil), "Int"))
456- then invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[1], MULT8], nil)
457- else throw("Couldn't cast Any to Int")
458- let lpPriceAssetShare = if ($isInstanceOf(invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[2], MULT8], nil), "Int"))
459- then invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[2], MULT8], nil)
460- else throw("Couldn't cast Any to Int")
461- let poolWeight = getIntegerValue(factoryAddress, keyFactoryPoolWeight(toString(poolAddress)))
257+ let lpAmtAssetShare = {
258+ let @ = invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[1], MULT8], nil)
259+ if ($isInstanceOf(@, "Int"))
260+ then @
261+ else throw("Couldn't cast Any to Int")
262+ }
263+ let lpPriceAssetShare = {
264+ let @ = invoke(poolAddress, "fromX18WrapperREADONLY", [pricesList[2], MULT8], nil)
265+ if ($isInstanceOf(@, "Int"))
266+ then @
267+ else throw("Couldn't cast Any to Int")
268+ }
269+ let poolWeight = getIntegerValue(readFactoryAddressOrFail(), keyPoolWeight(toString(poolAddress)))
462270 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(accAmtAssetBalance), toString(accPriceAssetBalance), toString(poolLPBalance), toString(curPrice), toString(lpAmtAssetShare), toString(lpPriceAssetShare), toString(poolWeight)], SEP))
463271 }
464272
465273
466274
467275 @Callable(i)
468-func gwxUserInfoREADONLY (userAddress) = {
469- let factoryContract = readFactoryAddressOrFail()
470- let factoryCfg = readFactoryCfgOrFail(factoryContract)
471- let boostingContract = getBoostingAddressOrFail(factoryCfg)
472- let gwxUserInfoLIST = if ($isInstanceOf(invoke(boostingContract, "gwxUserInfoREADONLY", [userAddress], nil), "List[Any]"))
473- then invoke(boostingContract, "gwxUserInfoREADONLY", [userAddress], nil)
474- else throw("Couldn't cast Any to List[Any]")
475- let gwxAmount = if ($isInstanceOf(gwxUserInfoLIST[0], "Int"))
476- then gwxUserInfoLIST[0]
477- else throw("Couldn't cast Any to Int")
478- $Tuple2(nil, makeString(["%d", toString(gwxAmount)], SEP))
276+func poolEvaluatePutByAmountAssetREADONLY (lpAsset,inAmAssetAmt) = {
277+ let factoryAddress = readFactoryAddressOrFail()
278+ let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryAddress, keyFactoryLpAssetToPoolContractAddress(lpAsset)))
279+ let cfg = {
280+ let @ = invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil)
281+ if ($isInstanceOf(@, "List[Any]"))
282+ then @
283+ else throw("Couldn't cast Any to List[Any]")
284+ }
285+ let lpAssetId = fromBase58String({
286+ let @ = cfg[idxPoolLPAssetId]
287+ if ($isInstanceOf(@, "String"))
288+ then @
289+ else throw("Couldn't cast Any to String")
290+ })
291+ let amAssetIdStr = {
292+ let @ = cfg[idxAmtAssetId]
293+ if ($isInstanceOf(@, "String"))
294+ then @
295+ else throw("Couldn't cast Any to String")
296+ }
297+ let amAssetId = fromBase58String(amAssetIdStr)
298+ let prAssetIdStr = {
299+ let @ = cfg[idxPriceAssetId]
300+ if ($isInstanceOf(@, "String"))
301+ then @
302+ else throw("Couldn't cast Any to String")
303+ }
304+ let prAssetId = fromBase58String(prAssetIdStr)
305+ let amtAssetDcm = parseIntValue({
306+ let @ = cfg[idxAmtAssetDcm]
307+ if ($isInstanceOf(@, "String"))
308+ then @
309+ else throw("Couldn't cast Any to String")
310+ })
311+ let priceAssetDcm = parseIntValue({
312+ let @ = cfg[idxPriceAssetDcm]
313+ if ($isInstanceOf(@, "String"))
314+ then @
315+ else throw("Couldn't cast Any to String")
316+ })
317+ let poolStatus = {
318+ let @ = cfg[idxPoolStatus]
319+ if ($isInstanceOf(@, "String"))
320+ then @
321+ else throw("Couldn't cast Any to String")
322+ }
323+ let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
324+ let accAmtAssetBalance = {
325+ let @ = invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amAssetIdStr], nil)
326+ if ($isInstanceOf(@, "Int"))
327+ then @
328+ else throw("Couldn't cast Any to Int")
329+ }
330+ let accPriceAssetBalance = {
331+ let @ = invoke(poolAddress, "getAccBalanceWrapperREADONLY", [prAssetIdStr], nil)
332+ if ($isInstanceOf(@, "Int"))
333+ then @
334+ else throw("Couldn't cast Any to Int")
335+ }
336+ let amtAssetAmtX18 = parseBigIntValue({
337+ let @ = invoke(poolAddress, "toX18WrapperREADONLY", [accAmtAssetBalance, amtAssetDcm], nil)
338+ if ($isInstanceOf(@, "String"))
339+ then @
340+ else throw("Couldn't cast Any to String")
341+ })
342+ let priceAssetAmtX18 = parseBigIntValue({
343+ let @ = invoke(poolAddress, "toX18WrapperREADONLY", [accPriceAssetBalance, priceAssetDcm], nil)
344+ if ($isInstanceOf(@, "String"))
345+ then @
346+ else throw("Couldn't cast Any to String")
347+ })
348+ let curPriceX18 = if ((poolLPBalance == 0))
349+ then zeroBigInt
350+ else parseBigIntValue({
351+ let @ = invoke(poolAddress, "calcPriceBigIntWrapperREADONLY", [toString(priceAssetAmtX18), toString(amtAssetAmtX18)], nil)
352+ if ($isInstanceOf(@, "String"))
353+ then @
354+ else throw("Couldn't cast Any to String")
355+ })
356+ let curPrice = {
357+ let @ = invoke(poolAddress, "fromX18WrapperREADONLY", [toString(curPriceX18), MULT8], nil)
358+ if ($isInstanceOf(@, "Int"))
359+ then @
360+ else throw("Couldn't cast Any to Int")
361+ }
362+ let inAmAssetAmtX18 = parseBigIntValue({
363+ let @ = invoke(poolAddress, "toX18WrapperREADONLY", [inAmAssetAmt, amtAssetDcm], nil)
364+ if ($isInstanceOf(@, "String"))
365+ then @
366+ else throw("Couldn't cast Any to String")
367+ })
368+ let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, MULT18)
369+ let inPrAssetAmt = {
370+ let @ = invoke(poolAddress, "fromX18WrapperREADONLY", [toString(inPrAssetAmtX18), priceAssetDcm], nil)
371+ if ($isInstanceOf(@, "Int"))
372+ then @
373+ else throw("Couldn't cast Any to Int")
374+ }
375+ let res = invoke(poolAddress, "estimatePutOperationWrapperREADONLY", ["", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false], nil)
376+ let $t01090111254 = match res {
377+ case _ =>
378+ if (if ($isInstanceOf($match0._1, "Int"))
379+ then if ($isInstanceOf($match0._3, "Int"))
380+ then if ($isInstanceOf($match0._4, "Int"))
381+ then if ($isInstanceOf($match0._5, "Int"))
382+ then $isInstanceOf($match0._6, "Int")
383+ else false
384+ else false
385+ else false
386+ else false)
387+ then {
388+ let calcLpAmt = $match0._1
389+ let curPriceCalc = $match0._3
390+ let amBalance = $match0._4
391+ let prBalance = $match0._5
392+ let lpEmission = $match0._6
393+ $Tuple5(calcLpAmt, curPriceCalc, amBalance, prBalance, lpEmission)
394+ }
395+ else throw("Couldn't cast types")
396+ }
397+ let calcLpAmt = $t01090111254._1
398+ let curPriceCalc = $t01090111254._2
399+ let amBalance = $t01090111254._3
400+ let prBalance = $t01090111254._4
401+ let lpEmission = $t01090111254._5
402+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(curPrice), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
403+ }
404+
405+
406+
407+@Callable(i)
408+func poolEvaluatePutByPriceAssetREADONLY (lpAsset,inPrAssetAmt) = {
409+ let factoryAddress = readFactoryAddressOrFail()
410+ let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryAddress, keyFactoryLpAssetToPoolContractAddress(lpAsset)))
411+ let cfg = {
412+ let @ = invoke(poolAddress, "getPoolConfigWrapperREADONLY", nil, nil)
413+ if ($isInstanceOf(@, "List[Any]"))
414+ then @
415+ else throw("Couldn't cast Any to List[Any]")
416+ }
417+ let lpAssetId = fromBase58String({
418+ let @ = cfg[idxPoolLPAssetId]
419+ if ($isInstanceOf(@, "String"))
420+ then @
421+ else throw("Couldn't cast Any to String")
422+ })
423+ let amAssetIdStr = {
424+ let @ = cfg[idxAmtAssetId]
425+ if ($isInstanceOf(@, "String"))
426+ then @
427+ else throw("Couldn't cast Any to String")
428+ }
429+ let amAssetId = fromBase58String(amAssetIdStr)
430+ let prAssetIdStr = {
431+ let @ = cfg[idxPriceAssetId]
432+ if ($isInstanceOf(@, "String"))
433+ then @
434+ else throw("Couldn't cast Any to String")
435+ }
436+ let prAssetId = fromBase58String(prAssetIdStr)
437+ let amtAssetDcm = parseIntValue({
438+ let @ = cfg[idxAmtAssetDcm]
439+ if ($isInstanceOf(@, "String"))
440+ then @
441+ else throw("Couldn't cast Any to String")
442+ })
443+ let priceAssetDcm = parseIntValue({
444+ let @ = cfg[idxPriceAssetDcm]
445+ if ($isInstanceOf(@, "String"))
446+ then @
447+ else throw("Couldn't cast Any to String")
448+ })
449+ let poolStatus = {
450+ let @ = cfg[idxPoolStatus]
451+ if ($isInstanceOf(@, "String"))
452+ then @
453+ else throw("Couldn't cast Any to String")
454+ }
455+ let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
456+ let amBalanceRaw = {
457+ let @ = invoke(poolAddress, "getAccBalanceWrapperREADONLY", [amAssetIdStr], nil)
458+ if ($isInstanceOf(@, "Int"))
459+ then @
460+ else throw("Couldn't cast Any to Int")
461+ }
462+ let prBalanceRaw = {
463+ let @ = invoke(poolAddress, "getAccBalanceWrapperREADONLY", [prAssetIdStr], nil)
464+ if ($isInstanceOf(@, "Int"))
465+ then @
466+ else throw("Couldn't cast Any to Int")
467+ }
468+ let amBalanceRawX18 = parseBigIntValue({
469+ let @ = invoke(poolAddress, "toX18WrapperREADONLY", [amBalanceRaw, amtAssetDcm], nil)
470+ if ($isInstanceOf(@, "String"))
471+ then @
472+ else throw("Couldn't cast Any to String")
473+ })
474+ let prBalanceRawX18 = parseBigIntValue({
475+ let @ = invoke(poolAddress, "toX18WrapperREADONLY", [prBalanceRaw, priceAssetDcm], nil)
476+ if ($isInstanceOf(@, "String"))
477+ then @
478+ else throw("Couldn't cast Any to String")
479+ })
480+ let curPriceX18 = if ((poolLPBalance == 0))
481+ then zeroBigInt
482+ else parseBigIntValue({
483+ let @ = invoke(poolAddress, "calcPriceBigIntWrapperREADONLY", [toString(prBalanceRawX18), toString(amBalanceRawX18)], nil)
484+ if ($isInstanceOf(@, "String"))
485+ then @
486+ else throw("Couldn't cast Any to String")
487+ })
488+ let curPrice = {
489+ let @ = invoke(poolAddress, "fromX18WrapperREADONLY", [toString(curPriceX18), MULT8], nil)
490+ if ($isInstanceOf(@, "Int"))
491+ then @
492+ else throw("Couldn't cast Any to Int")
493+ }
494+ let inPrAssetAmtX18 = parseBigIntValue({
495+ let @ = invoke(poolAddress, "toX18WrapperREADONLY", [inPrAssetAmt, priceAssetDcm], nil)
496+ if ($isInstanceOf(@, "String"))
497+ then @
498+ else throw("Couldn't cast Any to String")
499+ })
500+ let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, MULT18, curPriceX18)
501+ let inAmAssetAmt = {
502+ let @ = invoke(poolAddress, "fromX18WrapperREADONLY", [toString(inAmAssetAmtX18), amtAssetDcm], nil)
503+ if ($isInstanceOf(@, "Int"))
504+ then @
505+ else throw("Couldn't cast Any to Int")
506+ }
507+ let res = invoke(poolAddress, "estimatePutOperationWrapperREADONLY", ["", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false], nil)
508+ let $t01395714310 = match res {
509+ case _ =>
510+ if (if ($isInstanceOf($match0._1, "Int"))
511+ then if ($isInstanceOf($match0._3, "Int"))
512+ then if ($isInstanceOf($match0._4, "Int"))
513+ then if ($isInstanceOf($match0._5, "Int"))
514+ then $isInstanceOf($match0._6, "Int")
515+ else false
516+ else false
517+ else false
518+ else false)
519+ then {
520+ let calcLpAmt = $match0._1
521+ let curPriceCalc = $match0._3
522+ let amBalance = $match0._4
523+ let prBalance = $match0._5
524+ let lpEmission = $match0._6
525+ $Tuple5(calcLpAmt, curPriceCalc, amBalance, prBalance, lpEmission)
526+ }
527+ else throw("Couldn't cast types")
528+ }
529+ let calcLpAmt = $t01395714310._1
530+ let curPriceCalc = $t01395714310._2
531+ let amBalance = $t01395714310._3
532+ let prBalance = $t01395714310._4
533+ let lpEmission = $t01395714310._5
534+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(curPrice), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
535+ }
536+
537+
538+
539+@Callable(i)
540+func poolEvaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = {
541+ let factoryAddress = readFactoryAddressOrFail()
542+ let poolAddress = addressFromStringValue(getStringByAddressOrFail(factoryAddress, keyFactoryLpAssetToPoolContractAddress(paymentLpAssetId)))
543+ let res = invoke(poolAddress, "estimateGetOperationWrapperREADONLY", ["", paymentLpAssetId, paymentLpAmt, toString(poolAddress)], nil)
544+ let $t01505815475 = match res {
545+ case _ =>
546+ if (if ($isInstanceOf($match0._1, "Int"))
547+ then if ($isInstanceOf($match0._2, "Int"))
548+ then if ($isInstanceOf($match0._5, "Int"))
549+ then if ($isInstanceOf($match0._6, "Int"))
550+ then if ($isInstanceOf($match0._7, "Int"))
551+ then if ($isInstanceOf($match0._8, "String"))
552+ then $isInstanceOf($match0._9, "String")
553+ else false
554+ else false
555+ else false
556+ else false
557+ else false
558+ else false)
559+ then {
560+ let outAmAmt = $match0._1
561+ let outPrAmt = $match0._2
562+ let amBalance = $match0._5
563+ let prBalance = $match0._6
564+ let lpEmission = $match0._7
565+ let curPrice = $match0._8
566+ let poolStatus = $match0._9
567+ $Tuple7(outAmAmt, outPrAmt, amBalance, prBalance, lpEmission, curPrice, poolStatus)
568+ }
569+ else throw("Couldn't cast types")
570+ }
571+ let outAmAmt = $t01505815475._1
572+ let outPrAmt = $t01505815475._2
573+ let amBalance = $t01505815475._3
574+ let prBalance = $t01505815475._4
575+ let lpEmission = $t01505815475._5
576+ let curPrice = $t01505815475._6
577+ let poolStatus = $t01505815475._7
578+ $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmAmt), toString(outPrAmt), toString(amBalance), toString(prBalance), toString(lpEmission), curPrice, poolStatus], SEP))
479579 }
480580
481581

github/deemru/w8io/c3f4982 
66.23 ms