tx · AhLxLVNgmAcjnNSAZwZecxNjLifeB6WWDZyKkyN4zX43

3Mr8CBWocYcR7J1vfiJ97XULsrUshXt4cij:  -0.01000000 Waves

2021.11.16 10:44 [1793305] smart account 3Mr8CBWocYcR7J1vfiJ97XULsrUshXt4cij > SELF 0.00000000 Waves

{ "type": 13, "id": "AhLxLVNgmAcjnNSAZwZecxNjLifeB6WWDZyKkyN4zX43", "fee": 1000000, "feeAssetId": null, "timestamp": 1637048674565, "version": 1, "sender": "3Mr8CBWocYcR7J1vfiJ97XULsrUshXt4cij", "senderPublicKey": "GkGGPCFmuPxFJzxMuvyg6Robv5TzDwRPk5LkuWnSTemf", "proofs": [ "4C3tQ2jTgYRK9sV5Qzki4X7pWEqSWzXZAS9jTcVenHf39Yqx6iYLsPfJSa2m2EAY7GmeQQX3GsbLkCbYkEcCt4wM" ], "script": "base64:AAIFAAAAAAAAAAwIAhIICgYIAQEBAQEAAAAUAAAAAANTRVACAAAAAl9fAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQABLAAAAAIJAAEsAAAAAgIAAAAPbWFuZGF0b3J5IHRoaXMuBQAAAANrZXkCAAAADyBpcyBub3QgZGVmaW5lZAEAAAARa2V5RmFjdG9yeUFkZHJlc3MAAAAAAgAAABwlcyVzX19jb25maWdfX2ZhY3RvcnlBZGRyZXNzAAAAABhJZHhGYWN0b3J5Q2ZnU3Rha2luZ0RhcHAAAAAAAAAAAAEAAAAAGUlkeEZhY3RvcnlDZmdCb29zdGluZ0RhcHAAAAAAAAAAAAIAAAAAFElkeEZhY3RvcnlDZmdJZG9EYXBwAAAAAAAAAAADAAAAABVJZHhGYWN0b3J5Q2ZnVGVhbURhcHAAAAAAAAAAAAQAAAAAGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHAAAAAAAAAAAAUAAAAAFUlkeEZhY3RvcnlDZmdSZXN0RGFwcAAAAAAAAAAABgAAAAAZSWR4RmFjdG9yeUNmZ1NsaXBwYWdlRGFwcAAAAAAAAAAABwEAAAAQa2V5RmFjdG9yeUNvbmZpZwAAAAACAAAAESVzX19mYWN0b3J5Q29uZmlnAQAAABprZXlGYWN0b3J5THAyQXNzZXRzTWFwcGluZwAAAAEAAAAKbHBBc3NldFN0cgkABLkAAAACCQAETAAAAAICAAAABiVzJXMlcwkABEwAAAACBQAAAApscEFzc2V0U3RyCQAETAAAAAICAAAAHm1hcHBpbmdzX19scEFzc2V0MlBvb2xDb250cmFjdAUAAAADbmlsBQAAAANTRVABAAAAGHJlYWRGYWN0b3J5QWRkcmVzc09yRmFpbAAAAAAJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAR0aGlzCQEAAAARa2V5RmFjdG9yeUFkZHJlc3MAAAAAAQAAABlrZXlSYXRlUGVyQmxvY2tNYXhDdXJyZW50AAAAAAIAAAAeJXMlc19fcmF0ZVBlckJsb2NrTWF4X19jdXJyZW50AQAAABtrZXlSYXRlUGVyQmxvY2tNYXhTdGFydEZyb20AAAACAAAACXRpbWVzdGFtcAAAAAVibG9jawkABLkAAAACCQAETAAAAAICAAAAHCVzJXNfX3JhdGVQZXJCbG9ja01heF9fc3RhcnQJAARMAAAAAgkAAaQAAAABBQAAAAl0aW1lc3RhbXAJAARMAAAAAgkAAaQAAAABBQAAAAVibG9jawUAAAADbmlsBQAAAANTRVABAAAAFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQAAAAAAgAAABslcyVzX19yYXRlUGVyQmxvY2tfX2N1cnJlbnQBAAAAGGtleVJhdGVQZXJCbG9ja1N0YXJ0RnJvbQAAAAIAAAAJdGltZXN0YW1wAAAABWJsb2NrCQAEuQAAAAIJAARMAAAAAgIAAAAZJXMlc19fcmF0ZVBlckJsb2NrX19zdGFydAkABEwAAAACCQABpAAAAAEFAAAACXRpbWVzdGFtcAkABEwAAAACCQABpAAAAAEFAAAABWJsb2NrBQAAAANuaWwFAAAAA1NFUAEAAAAVa2V5RW1pc3Npb25TdGFydEJsb2NrAAAAAAIAAAAaJXMlc19fZW1pc3Npb25fX3N0YXJ0QmxvY2sBAAAAG2tleUVtaXNzaW9uRHVyYXRpb25JbkJsb2NrcwAAAAACAAAAGCVzJXNfX2VtaXNzaW9uX19kdXJhdGlvbgEAAAATa2V5RW1pc3Npb25FbmRCbG9jawAAAAACAAAAGCVzJXNfX2VtaXNzaW9uX19lbmRCbG9jawAAAAEAAAABaQEAAAALY29uc3RydWN0b3IAAAAGAAAADmZhY3RvcnlBZGRyZXNzAAAAD3JhdGVQZXJCbG9ja01heAAAAAxyYXRlUGVyQmxvY2sAAAASZW1pc3Npb25TdGFydEJsb2NrAAAAEGVtaXNzaW9uRHVyYXRpb24AAAAWZW1pc3Npb25TdGFydFRpbWVzdGFtcAMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAABJwZXJtaXNzaW9ucyBkZW5pZWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABtrZXlSYXRlUGVyQmxvY2tNYXhTdGFydEZyb20AAAACBQAAABZlbWlzc2lvblN0YXJ0VGltZXN0YW1wBQAAABJlbWlzc2lvblN0YXJ0QmxvY2sFAAAAD3JhdGVQZXJCbG9ja01heAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAGWtleVJhdGVQZXJCbG9ja01heEN1cnJlbnQAAAAABQAAAA9yYXRlUGVyQmxvY2tNYXgJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABhrZXlSYXRlUGVyQmxvY2tTdGFydEZyb20AAAACBQAAABZlbWlzc2lvblN0YXJ0VGltZXN0YW1wBQAAABJlbWlzc2lvblN0YXJ0QmxvY2sFAAAADHJhdGVQZXJCbG9jawkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQAAAAABQAAAAxyYXRlUGVyQmxvY2sJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABVrZXlFbWlzc2lvblN0YXJ0QmxvY2sAAAAABQAAABJlbWlzc2lvblN0YXJ0QmxvY2sJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABtrZXlFbWlzc2lvbkR1cmF0aW9uSW5CbG9ja3MAAAAABQAAABBlbWlzc2lvbkR1cmF0aW9uCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAATa2V5RW1pc3Npb25FbmRCbG9jawAAAAAJAABkAAAAAgUAAAASZW1pc3Npb25TdGFydEJsb2NrBQAAABBlbWlzc2lvbkR1cmF0aW9uCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFrZXlGYWN0b3J5QWRkcmVzcwAAAAAFAAAADmZhY3RvcnlBZGRyZXNzBQAAAANuaWwAAAAAoWoHiA==", "chainId": 84, "height": 1793305, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3SYgxAPcHftXywAVm9LJrUzwGgyc8UZyTt2yRDfR7Ju9 Next: 2wup88xDcsc3M1VM25enyDLBmeyNEZhQpRXMKStEDaHt Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let separator = "__"
4+let SEP = "__"
55
6-func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
6+func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (("mandatory this." + key) + " is not defined"))
77
88
9-let keyStart = makeString(["%s", "start"], separator)
10-
11-let keyDuration = makeString(["%s", "duration"], separator)
12-
13-let keyAsset = makeString(["%s", "asset"], separator)
14-
15-let keyIsDataReady = makeString(["%s", "isDataReady"], separator)
16-
17-func keyUserRewardInfo (address) = makeString(["%s%s", "userRewardInfo", toString(address)], separator)
9+func keyFactoryAddress () = "%s%s__config__factoryAddress"
1810
1911
20-func keyClaimHistoryRecord (address,txId) = makeString(["%s%s%s", "claimHistoryRecord", toString(address), toBase58String(txId)], separator)
12+let IdxFactoryCfgStakingDapp = 1
13+
14+let IdxFactoryCfgBoostingDapp = 2
15+
16+let IdxFactoryCfgIdoDapp = 3
17+
18+let IdxFactoryCfgTeamDapp = 4
19+
20+let IdxFactoryCfgEmissionDapp = 5
21+
22+let IdxFactoryCfgRestDapp = 6
23+
24+let IdxFactoryCfgSlippageDapp = 7
25+
26+func keyFactoryConfig () = "%s__factoryConfig"
2127
2228
23-func formatHistoryRecord (amount) = makeString(["%d%d%d", toString(height), toString(lastBlock.timestamp), toString(amount)], separator)
29+func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
2430
2531
26-func dataUserRewardInfo (totalAmt,claimedAmt) = makeString(["%d%d", toString(totalAmt), toString(claimedAmt)], separator)
32+func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(this, keyFactoryAddress()))
2733
2834
29-func readUserRewardInfo (userAddr) = split(getStringOrFail(this, keyUserRewardInfo(userAddr)), separator)
35+func keyRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
3036
3137
32-func checkIfDataIsReady () = {
33- let isDataReady = valueOrElse(getBoolean(this, keyIsDataReady), false)
34- if (isDataReady)
35- then true
36- else throw("Data is not ready")
37- }
38+func keyRatePerBlockMaxStartFrom (timestamp,block) = makeString(["%s%s__ratePerBlockMax__start", toString(timestamp), toString(block)], SEP)
3839
3940
40-func getUserRewards (address) = {
41- let start = valueOrErrorMessage(getInteger(this, keyStart), "Start block is not specified")
42- let duration = valueOrErrorMessage(getInteger(this, keyDuration), "Duration is not specified")
43- let userRewardInfo = readUserRewardInfo(address)
44- let total = parseIntValue(userRewardInfo[1])
45- let claimed = parseIntValue(userRewardInfo[2])
46- let availableTotal = fraction(total, min([duration, max([0, (height - start)])]), duration)
47- let available = max([0, (availableTotal - claimed)])
48- $Tuple3(total, claimed, available)
49- }
41+func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
42+
43+
44+func keyRatePerBlockStartFrom (timestamp,block) = makeString(["%s%s__ratePerBlock__start", toString(timestamp), toString(block)], SEP)
45+
46+
47+func keyEmissionStartBlock () = "%s%s__emission__startBlock"
48+
49+
50+func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
51+
52+
53+func keyEmissionEndBlock () = "%s%s__emission__endBlock"
5054
5155
5256 @Callable(i)
53-func constructor (start,duration,assetId) = {
54- let checks = [if ((i.caller == this))
55- then true
56- else throw("Access denied")]
57- if ((checks == checks))
58- then [IntegerEntry(keyStart, start), IntegerEntry(keyDuration, duration), StringEntry(keyAsset, assetId), BooleanEntry(keyIsDataReady, false)]
59- else throw("Strict value is not equal to itself.")
60- }
61-
62-
63-
64-@Callable(i)
65-func claim () = {
66- let $t024322491 = getUserRewards(i.caller)
67- let total = $t024322491._1
68- let claimed = $t024322491._2
69- let available = $t024322491._3
70- let asset = fromBase58String(getStringOrFail(this, keyAsset))
71- let balance = assetBalance(this, asset)
72- let checks = [checkIfDataIsReady(), if ((available > 0))
73- then true
74- else throw("No reward available"), if ((balance >= available))
75- then true
76- else throw("Insufficient funds. Contact support")]
77- if ((checks == checks))
78- then [ScriptTransfer(i.caller, available, asset), StringEntry(keyUserRewardInfo(i.caller), dataUserRewardInfo(total, (claimed + available))), StringEntry(keyClaimHistoryRecord(i.caller, i.transactionId), formatHistoryRecord(available))]
79- else throw("Strict value is not equal to itself.")
80- }
81-
82-
83-
84-@Callable(i)
85-func getUserRewardsREADONLY (address) = {
86- let checks = [checkIfDataIsReady()]
87- if ((checks == checks))
88- then {
89- let $t031703253 = getUserRewards(addressFromStringValue(address))
90- let total = $t031703253._1
91- let claimed = $t031703253._2
92- let available = $t031703253._3
93- $Tuple2(nil, makeString(["%d%d%d", toString(total), toString(claimed), toString(available)], separator))
94- }
95- else throw("Strict value is not equal to itself.")
96- }
57+func constructor (factoryAddress,ratePerBlockMax,ratePerBlock,emissionStartBlock,emissionDuration,emissionStartTimestamp) = if ((i.caller != this))
58+ then throw("permissions denied")
59+ else [IntegerEntry(keyRatePerBlockMaxStartFrom(emissionStartTimestamp, emissionStartBlock), ratePerBlockMax), IntegerEntry(keyRatePerBlockMaxCurrent(), ratePerBlockMax), IntegerEntry(keyRatePerBlockStartFrom(emissionStartTimestamp, emissionStartBlock), ratePerBlock), IntegerEntry(keyRatePerBlockCurrent(), ratePerBlock), IntegerEntry(keyEmissionStartBlock(), emissionStartBlock), IntegerEntry(keyEmissionDurationInBlocks(), emissionDuration), IntegerEntry(keyEmissionEndBlock(), (emissionStartBlock + emissionDuration)), StringEntry(keyFactoryAddress(), factoryAddress)]
9760
9861

github/deemru/w8io/169f3d6 
33.52 ms