tx · CTKcuQ3Z4pWbi6FtfG1c6ywP42Nu7JegFofSGotiy7s1

3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA:  -0.01400000 Waves

2020.12.21 00:15 [2381237] smart account 3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA > SELF 0.00000000 Waves

{ "type": 13, "id": "CTKcuQ3Z4pWbi6FtfG1c6ywP42Nu7JegFofSGotiy7s1", "fee": 1400000, "feeAssetId": null, "timestamp": 1608498879479, "version": 1, "sender": "3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA", "senderPublicKey": "5gGSWjBNTQGAMZViHK3qbn35JUNmbzqboicpdMuweapK", "proofs": [ "5wkmsH6WDbiY9r7ja3sqzuhYvcU18m5W375R6R9aNARrPrBJjXvCqboT4zTXV412YJqWqeGsMHziDPgPbpstfw3", "3CrEtKpuSdbKgZb6ip3LXsG6KJb9T6cYASphaVdYvKUhfXgWYDiKV4xq2dxrWT1rBJqzsiC2XAXrtxnu3RSLs94S" ], "script": "base64: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ABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAACXJlY2lwaWVudAkBAAAAEXJlYmFsYW5jaW5nQW1vdW50AAAAAQkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAcJAAGRAAAAAgUAAAAJcG9ydGZvbGlvAAAAAAAAAAAHBAAAABFsb2dFbnRyeURhdGFWYWx1ZQkAASwAAAACAgAAAC5EZUZpIEZyYW5rbGluIChGTU1UKTogYXV0b1JlYmFsYW5jZSAoKSA9PiB0eDogCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQDCQAAAAAAAAIJAAGQAAAAAQUAAAAPc2NyaXB0VHJhbnNmZXJzAAAAAAAAAAAACQAAAgAAAAECAAAAK1RoZXJlIGFyZSBjdXJyZW50bHkgbm8gdHJhbnNmZXJzIGF2YWlsYWJsZS4JAARNAAAAAgkABE0AAAACCQAETgAAAAIJAAROAAAAAgUAAAAPc2NyaXB0VHJhbnNmZXJzCQEAAAARZ2V0U2NyaXB0VHJhbnNmZXIAAAADBQAAAAlyZWNpcGllbnQFAAAACmZtbXRBbW91bnQFAAAACWZtbXRBc3NldAkBAAAAEWdldFNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAp4ZmVlQW1vdW50BQAAAAl4ZmVlQXNzZXQJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAD2xvZ0VudHJ5RGF0YUtleQUAAAARbG9nRW50cnlEYXRhVmFsdWUJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABB0aW1lc3RhbXBEYXRhS2V5CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAAAAAFpAQAAABBzZXRTY3JpcHRWZXJzaW9uAAAAAAMJAQAAAAIhPQAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAOYWRtaW5QdWJsaWNLZXkJAAACAAAAAQIAAAA2VGhpcyBhY3Rpb24gY2FuIG9ubHkgYmUgcGVyZm9ybWVkIGJ5IGFuIGFkbWluaXN0cmF0b3IhAwkAAGYAAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAACQAAAgAAAAECAAAAM0Rvbid0IGF0dGFjaCBwYXlt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", "chainId": 87, "height": 2381237, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AqZXJWFqaS4ZfGgKVhkWiaapyrj2sdAiHHr9FfucoXvK Next: EUwAixTSTWCqtEa53dZJ7EJZwZUJj9A4wrJNBW4hhS9x Diff:
OldNewDifferences
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scriptVersion = "v7.05_20201220"
5-
6-let txFee = 500000
7-
8-let fdappSupply = (1000 * 100000)
9-
10-let fsaleSupply = (10000 * 100000)
115
126 let percent = 100000
137
3529
3630 let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk'
3731
32+let supplyDataKey = "7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7_supply"
33+
34+let profitDataKey = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ_profit"
35+
3836 let portfolio = ([base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa'] :+ fmmtAsset)
3937
4038 let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
4341
4442 let fcold = Address(base58'3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA')
4543
46-let fsale = Address(base58'3PDKVpNDPg7Ztcp31DvmKmDbzA9uUjs914Y')
44+let maxSupply = getIntegerValue(admin, supplyDataKey)
4745
48-let circSupply = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(fdapp, fmmtAsset) + assetBalance(this, fmmtAsset))) - fsaleSupply)
46+let spreadPercent = getIntegerValue(this, "halfSpread")
4947
50-let fteamFunds = assetBalance(admin, fmmtAsset)
51-
52-let investments = max([0, (circSupply - fteamFunds)])
48+let investments = (value(assetInfo(fmmtAsset)).quantity - ((assetBalance(fdapp, fmmtAsset) + assetBalance(fcold, fmmtAsset)) + assetBalance(admin, fmmtAsset)))
5349
5450 let logEntryDataKey = "logEntry"
5551
5652 let timestampDataKey = "timestamp"
5753
58-let payoutsDataKey = "teamPayouts"
54+let rewardDataKey = "teamPayouts"
5955
6056 let versionDataKey = "scriptVersion"
6157
6965 else maxValue
7066
7167
72-func isAssetDisabled (assetId) = !(valueOrElse(getBoolean(admin, toBase58String(assetId)), false))
68+func isAssetDisabled (assetId) = !(getBooleanValue(admin, toBase58String(assetId)))
7369
7470
7571 func toFloatString (num,dec) = if ((num == 0))
8783
8884 func rebalancingAmount (assetId) = if (isAssetDisabled(assetId))
8985 then assetBalance(this, assetId)
90- else difference(assetBalance(fdapp, assetId), assetBalance(this, assetId))
91-
92-
93-func airdropBalance (assetId) = if (containsElement(portfolio, assetId))
94- then throw(("Delete asset ID: " + toBase58String(assetId)))
95- else if ((assetId == base58''))
96- then 0
97- else assetBalance(this, assetId)
86+ else difference(assetBalance(fdapp, assetId), assetBalance(fcold, assetId))
9887
9988
10089 func getScriptTransfer (address,amount,assetId) = if ((0 >= amount))
10291 else [ScriptTransfer(address, amount, assetId)]
10392
10493
94+func airdropBalance (assetId) = if (containsElement((portfolio :+ xfeeAsset), assetId))
95+ then throw(("Delete asset ID: " + toBase58String(assetId)))
96+ else if ((assetId == base58''))
97+ then 0
98+ else assetBalance(this, assetId)
99+
100+
105101 @Callable(i)
106-func teamPayouts () = if (if ((i.callerPublicKey != adminPublicKey))
102+func teamRewards () = if (if ((i.callerPublicKey != adminPublicKey))
107103 then (i.callerPublicKey != mmbotPublicKey)
108104 else false)
109105 then throw("This action can only be performed by an administrator!")
110106 else if ((size(i.payments) > 0))
111107 then throw("Don't attach payment when calling this function ...")
112108 else {
113- let oldPayouts = valueOrElse(getInteger(this, payoutsDataKey), 0)
114- let teamPayouts = fraction(investments, feePercent, (percent - feePercent))
115- let amount = validate((teamPayouts - oldPayouts), 0)
116- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): teamPayouts () =>", "amount:", toFloatString(amount, 100000), "FMMT"], " ")
109+ let payouts = fraction(investments, feePercent, (percent - feePercent))
110+ let oldPayouts = getIntegerValue(this, rewardDataKey)
111+ let amount = validate((payouts - oldPayouts), 0)
112+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): teamRewards () =>", "amount:", toFloatString(amount, 100000), "FMMT"], " ")
117113 if ((0 >= amount))
118114 then throw("There are currently no payments available.")
119- else [ScriptTransfer(admin, amount, fmmtAsset), IntegerEntry(payoutsDataKey, teamPayouts), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
115+ else [ScriptTransfer(admin, amount, fmmtAsset), IntegerEntry(rewardDataKey, payouts), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
120116 }
121117
122118
132128 then throw("Don't attach payment when calling this function ...")
133129 else {
134130 let recipient = fdapp
135- let xfeeAmount = valueOrMaximum(txFee, assetBalance(this, xfeeAsset))
136- let fmmtRebalancingAmount = (fdappSupply - assetBalance(fdapp, fmmtAsset))
137- let scriptTransfers = ((((((((getScriptTransfer(recipient, fmmtRebalancingAmount, fmmtAsset) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[0]), portfolio[0])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[1]), portfolio[1])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[2]), portfolio[2])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[3]), portfolio[3])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[4]), portfolio[4])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[5]), portfolio[5])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[6]), portfolio[6])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[7]), portfolio[7]))
131+ let fmmtAmount = if (isAssetDisabled(fmmtAsset))
132+ then 0
133+ else (maxSupply - assetBalance(fdapp, fmmtAsset))
134+ let xfeeAmount = valueOrMaximum(500000, assetBalance(this, xfeeAsset))
135+ let scriptTransfers = (((((((getScriptTransfer(recipient, rebalancingAmount(portfolio[0]), portfolio[0]) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[1]), portfolio[1])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[2]), portfolio[2])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[3]), portfolio[3])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[4]), portfolio[4])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[5]), portfolio[5])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[6]), portfolio[6])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[7]), portfolio[7]))
138136 let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId))
139137 if ((size(scriptTransfers) == 0))
140138 then throw("There are currently no transfers available.")
141- else (((scriptTransfers ++ getScriptTransfer(i.caller, xfeeAmount, xfeeAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
139+ else ((((scriptTransfers ++ getScriptTransfer(recipient, fmmtAmount, fmmtAsset)) ++ getScriptTransfer(i.caller, xfeeAmount, xfeeAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
140+ }
141+
142+
143+
144+@Callable(i)
145+func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey))
146+ then throw("This action can only be performed by an administrator!")
147+ else if ((size(i.payments) > 0))
148+ then throw("Don't attach payment when calling this function ...")
149+ else {
150+ let version = scriptVersion
151+ let oldVersion = getStringValue(this, versionDataKey)
152+ let versionList = split(drop(version, 1), "_")
153+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): setScriptVersion () =>", "version:", (versionList[0] + ";"), "updated:", makeString([take(versionList[1], 4), take(drop(versionList[1], 4), 2), drop(versionList[1], 6)], "-")], " ")
154+ if ((version == oldVersion))
155+ then throw(("The script version has already been updated: " + oldVersion))
156+ else [StringEntry(versionDataKey, version), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
142157 }
143158
144159
157172 }
158173
159174
160-
161-@Callable(i)
162-func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey))
163- then throw("This action can only be performed by an administrator!")
164- else if ((size(i.payments) > 0))
165- then throw("Don't attach payment when calling this function ...")
166- else {
167- let oldVersion = valueOrElse(getString(this, versionDataKey), "")
168- let versionList = split(drop(scriptVersion, 1), "_")
169- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): setScriptVersion () =>", "version:", (versionList[0] + ";"), "updated:", makeString([take(versionList[1], 4), take(drop(versionList[1], 4), 2), drop(versionList[1], 6)], "-")], " ")
170- if ((oldVersion == scriptVersion))
171- then throw(("The script version has already been updated: " + scriptVersion))
172- else [StringEntry(versionDataKey, scriptVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
173- }
174-
175-
176175 @Verifier(tx)
177176 func verify () = {
178- let fmmtSupply = assetBalance(fsale, fmmtAsset)
179- let maxSendAmount = validate((fsaleSupply - fmmtSupply), 0)
180177 let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
181178 let isValidMMBot = if (isValidOwner)
182179 then true
195192 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[5], guarantors[4]))
196193 then 1
197194 else 0)) >= minSignatures)
195+ let maxAmount = validate((maxSupply - assetBalance(fdapp, fmmtAsset)), 0)
198196 match tx {
199197 case b: BurnTransaction =>
200198 if (if (isValidOwner)
205203 case l: LeaseCancelTransaction|LeaseTransaction =>
206204 isValidOwner
207205 case o: Order =>
208- if (if (if (isValidMMBot)
206+ if (if (if (if (if (isValidMMBot)
207+ then (o.matcherPublicKey == wavesMatcher)
208+ else false)
209+ then (o.assetPair.priceAsset != fmmtAsset)
210+ else false)
211+ then (o.assetPair.amountAsset != fmmtAsset)
212+ else false)
209213 then if (if (if ((o.orderType == Buy))
210214 then (o.assetPair.priceAsset != xfeeAsset)
211215 else false)
221225 then if (!(isDefined(o.matcherFeeAssetId)))
222226 then true
223227 else (o.matcherFeeAssetId == o.assetPair.priceAsset)
224- else false)
225- then (o.matcherPublicKey == wavesMatcher)
226228 else false
227229 case t: TransferTransaction =>
228- if (if (if (if (if (isValidOwner)
230+ if (if (if (isValidOwner)
229231 then !(containsElement(portfolio, t.assetId))
230232 else false)
231233 then !(containsElement(portfolio, t.feeAssetId))
232234 else false)
233235 then true
234- else if (isValidAdmin)
235- then (addressFromRecipient(t.recipient) == fcold)
236- else false)
237- then true
238- else if (if (isValidAdmin)
236+ else if (if (if (isValidAdmin)
239237 then true
240238 else isValidGuarantors)
241239 then (addressFromRecipient(t.recipient) == fdapp)
242240 else false)
243- then true
244- else if (if (if (if (isValidAdmin)
245- then true
246- else isValidGuarantors)
247- then (t.assetId == fmmtAsset)
248- else false)
249- then (maxSendAmount >= t.amount)
250- else false)
251- then (addressFromRecipient(t.recipient) == fsale)
241+ then if ((t.assetId != fmmtAsset))
242+ then true
243+ else (maxAmount >= t.amount)
252244 else false
253245 case _: SetScriptTransaction|MassTransferTransaction|DataTransaction =>
254246 if (isValidAdmin)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scriptVersion = "v7.05_20201220"
5-
6-let txFee = 500000
7-
8-let fdappSupply = (1000 * 100000)
9-
10-let fsaleSupply = (10000 * 100000)
115
126 let percent = 100000
137
148 let decimal = 100000000
159
1610 let feePercent = 10000
1711
1812 let fdappPercent = 30000
1913
2014 let wavesMatcher = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5'
2115
2216 let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2317
2418 let mmbotPublicKey = base58'62KBavoHK4TtCYmURFVeNC8j3gL8Jo7WwcrweoBLWofc'
2519
2620 let guarantors = ([valueOrElse(getBinary(this, "guarantor1"), base58''), valueOrElse(getBinary(this, "guarantor2"), base58''), valueOrElse(getBinary(this, "guarantor3"), base58''), valueOrElse(getBinary(this, "guarantor4"), base58''), valueOrElse(getBinary(this, "guarantor5"), base58'')] :+ base58'')
2721
2822 let actualSize = value(indexOf(guarantors, base58''))
2923
3024 let minSignatures = ((actualSize / 2) + (actualSize % 2))
3125
3226 let fmmtAsset = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7'
3327
3428 let usdtAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
3529
3630 let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk'
3731
32+let supplyDataKey = "7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7_supply"
33+
34+let profitDataKey = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ_profit"
35+
3836 let portfolio = ([base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa'] :+ fmmtAsset)
3937
4038 let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
4139
4240 let fdapp = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL')
4341
4442 let fcold = Address(base58'3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA')
4543
46-let fsale = Address(base58'3PDKVpNDPg7Ztcp31DvmKmDbzA9uUjs914Y')
44+let maxSupply = getIntegerValue(admin, supplyDataKey)
4745
48-let circSupply = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(fdapp, fmmtAsset) + assetBalance(this, fmmtAsset))) - fsaleSupply)
46+let spreadPercent = getIntegerValue(this, "halfSpread")
4947
50-let fteamFunds = assetBalance(admin, fmmtAsset)
51-
52-let investments = max([0, (circSupply - fteamFunds)])
48+let investments = (value(assetInfo(fmmtAsset)).quantity - ((assetBalance(fdapp, fmmtAsset) + assetBalance(fcold, fmmtAsset)) + assetBalance(admin, fmmtAsset)))
5349
5450 let logEntryDataKey = "logEntry"
5551
5652 let timestampDataKey = "timestamp"
5753
58-let payoutsDataKey = "teamPayouts"
54+let rewardDataKey = "teamPayouts"
5955
6056 let versionDataKey = "scriptVersion"
6157
6258 func validate (intValue,minValue) = if ((minValue > intValue))
6359 then 0
6460 else intValue
6561
6662
6763 func valueOrMaximum (intValue,maxValue) = if ((maxValue > intValue))
6864 then intValue
6965 else maxValue
7066
7167
72-func isAssetDisabled (assetId) = !(valueOrElse(getBoolean(admin, toBase58String(assetId)), false))
68+func isAssetDisabled (assetId) = !(getBooleanValue(admin, toBase58String(assetId)))
7369
7470
7571 func toFloatString (num,dec) = if ((num == 0))
7672 then "0"
7773 else if ((num > 0))
7874 then toUtf8String(((toBytes(toString((num / dec))) + base58'o') + drop(toBytes(toString(((num % dec) + dec))), 1)))
7975 else throw("Negative amounts are not allowed!")
8076
8177
8278 func difference (fdappFunds,fcoldFunds) = {
8379 let total = (fdappFunds + fcoldFunds)
8480 validate((fraction(total, fdappPercent, percent) - fdappFunds), (total / 100))
8581 }
8682
8783
8884 func rebalancingAmount (assetId) = if (isAssetDisabled(assetId))
8985 then assetBalance(this, assetId)
90- else difference(assetBalance(fdapp, assetId), assetBalance(this, assetId))
91-
92-
93-func airdropBalance (assetId) = if (containsElement(portfolio, assetId))
94- then throw(("Delete asset ID: " + toBase58String(assetId)))
95- else if ((assetId == base58''))
96- then 0
97- else assetBalance(this, assetId)
86+ else difference(assetBalance(fdapp, assetId), assetBalance(fcold, assetId))
9887
9988
10089 func getScriptTransfer (address,amount,assetId) = if ((0 >= amount))
10190 then nil
10291 else [ScriptTransfer(address, amount, assetId)]
10392
10493
94+func airdropBalance (assetId) = if (containsElement((portfolio :+ xfeeAsset), assetId))
95+ then throw(("Delete asset ID: " + toBase58String(assetId)))
96+ else if ((assetId == base58''))
97+ then 0
98+ else assetBalance(this, assetId)
99+
100+
105101 @Callable(i)
106-func teamPayouts () = if (if ((i.callerPublicKey != adminPublicKey))
102+func teamRewards () = if (if ((i.callerPublicKey != adminPublicKey))
107103 then (i.callerPublicKey != mmbotPublicKey)
108104 else false)
109105 then throw("This action can only be performed by an administrator!")
110106 else if ((size(i.payments) > 0))
111107 then throw("Don't attach payment when calling this function ...")
112108 else {
113- let oldPayouts = valueOrElse(getInteger(this, payoutsDataKey), 0)
114- let teamPayouts = fraction(investments, feePercent, (percent - feePercent))
115- let amount = validate((teamPayouts - oldPayouts), 0)
116- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): teamPayouts () =>", "amount:", toFloatString(amount, 100000), "FMMT"], " ")
109+ let payouts = fraction(investments, feePercent, (percent - feePercent))
110+ let oldPayouts = getIntegerValue(this, rewardDataKey)
111+ let amount = validate((payouts - oldPayouts), 0)
112+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): teamRewards () =>", "amount:", toFloatString(amount, 100000), "FMMT"], " ")
117113 if ((0 >= amount))
118114 then throw("There are currently no payments available.")
119- else [ScriptTransfer(admin, amount, fmmtAsset), IntegerEntry(payoutsDataKey, teamPayouts), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
115+ else [ScriptTransfer(admin, amount, fmmtAsset), IntegerEntry(rewardDataKey, payouts), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
120116 }
121117
122118
123119
124120 @Callable(i)
125121 func autoRebalance () = if (if (if ((i.callerPublicKey != adminPublicKey))
126122 then (i.callerPublicKey != mmbotPublicKey)
127123 else false)
128124 then !(containsElement(guarantors, i.callerPublicKey))
129125 else false)
130126 then throw("This action can only be performed by an administrator or guarantor!")
131127 else if ((size(i.payments) > 0))
132128 then throw("Don't attach payment when calling this function ...")
133129 else {
134130 let recipient = fdapp
135- let xfeeAmount = valueOrMaximum(txFee, assetBalance(this, xfeeAsset))
136- let fmmtRebalancingAmount = (fdappSupply - assetBalance(fdapp, fmmtAsset))
137- let scriptTransfers = ((((((((getScriptTransfer(recipient, fmmtRebalancingAmount, fmmtAsset) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[0]), portfolio[0])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[1]), portfolio[1])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[2]), portfolio[2])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[3]), portfolio[3])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[4]), portfolio[4])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[5]), portfolio[5])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[6]), portfolio[6])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[7]), portfolio[7]))
131+ let fmmtAmount = if (isAssetDisabled(fmmtAsset))
132+ then 0
133+ else (maxSupply - assetBalance(fdapp, fmmtAsset))
134+ let xfeeAmount = valueOrMaximum(500000, assetBalance(this, xfeeAsset))
135+ let scriptTransfers = (((((((getScriptTransfer(recipient, rebalancingAmount(portfolio[0]), portfolio[0]) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[1]), portfolio[1])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[2]), portfolio[2])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[3]), portfolio[3])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[4]), portfolio[4])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[5]), portfolio[5])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[6]), portfolio[6])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[7]), portfolio[7]))
138136 let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId))
139137 if ((size(scriptTransfers) == 0))
140138 then throw("There are currently no transfers available.")
141- else (((scriptTransfers ++ getScriptTransfer(i.caller, xfeeAmount, xfeeAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
139+ else ((((scriptTransfers ++ getScriptTransfer(recipient, fmmtAmount, fmmtAsset)) ++ getScriptTransfer(i.caller, xfeeAmount, xfeeAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
140+ }
141+
142+
143+
144+@Callable(i)
145+func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey))
146+ then throw("This action can only be performed by an administrator!")
147+ else if ((size(i.payments) > 0))
148+ then throw("Don't attach payment when calling this function ...")
149+ else {
150+ let version = scriptVersion
151+ let oldVersion = getStringValue(this, versionDataKey)
152+ let versionList = split(drop(version, 1), "_")
153+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): setScriptVersion () =>", "version:", (versionList[0] + ";"), "updated:", makeString([take(versionList[1], 4), take(drop(versionList[1], 4), 2), drop(versionList[1], 6)], "-")], " ")
154+ if ((version == oldVersion))
155+ then throw(("The script version has already been updated: " + oldVersion))
156+ else [StringEntry(versionDataKey, version), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
142157 }
143158
144159
145160
146161 @Callable(i)
147162 func airdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((i.callerPublicKey != adminPublicKey))
148163 then throw("This action can only be performed by an administrator!")
149164 else if ((size(i.payments) > 0))
150165 then throw("Don't attach payment when calling this function ...")
151166 else {
152167 let scriptTransfers = (((((((((getScriptTransfer(admin, airdropBalance(id0), id0) ++ getScriptTransfer(admin, airdropBalance(id1), id1)) ++ getScriptTransfer(admin, airdropBalance(id2), id2)) ++ getScriptTransfer(admin, airdropBalance(id3), id3)) ++ getScriptTransfer(admin, airdropBalance(id4), id4)) ++ getScriptTransfer(admin, airdropBalance(id5), id5)) ++ getScriptTransfer(admin, airdropBalance(id6), id6)) ++ getScriptTransfer(admin, airdropBalance(id7), id7)) ++ getScriptTransfer(admin, airdropBalance(id8), id8)) ++ getScriptTransfer(admin, airdropBalance(id9), id9))
153168 let logEntryDataValue = ("DeFi Franklin (FMMT): airdropWasher () => tx: " + toBase58String(i.transactionId))
154169 if ((size(scriptTransfers) == 0))
155170 then throw("There are currently no transfers available.")
156171 else ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
157172 }
158173
159174
160-
161-@Callable(i)
162-func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey))
163- then throw("This action can only be performed by an administrator!")
164- else if ((size(i.payments) > 0))
165- then throw("Don't attach payment when calling this function ...")
166- else {
167- let oldVersion = valueOrElse(getString(this, versionDataKey), "")
168- let versionList = split(drop(scriptVersion, 1), "_")
169- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): setScriptVersion () =>", "version:", (versionList[0] + ";"), "updated:", makeString([take(versionList[1], 4), take(drop(versionList[1], 4), 2), drop(versionList[1], 6)], "-")], " ")
170- if ((oldVersion == scriptVersion))
171- then throw(("The script version has already been updated: " + scriptVersion))
172- else [StringEntry(versionDataKey, scriptVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
173- }
174-
175-
176175 @Verifier(tx)
177176 func verify () = {
178- let fmmtSupply = assetBalance(fsale, fmmtAsset)
179- let maxSendAmount = validate((fsaleSupply - fmmtSupply), 0)
180177 let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
181178 let isValidMMBot = if (isValidOwner)
182179 then true
183180 else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], mmbotPublicKey)
184181 let isValidAdmin = if (isValidOwner)
185182 then true
186183 else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey)
187184 let isValidGuarantors = ((((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
188185 then 1
189186 else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1]))
190187 then 1
191188 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2]))
192189 then 1
193190 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[4], guarantors[3]))
194191 then 1
195192 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[5], guarantors[4]))
196193 then 1
197194 else 0)) >= minSignatures)
195+ let maxAmount = validate((maxSupply - assetBalance(fdapp, fmmtAsset)), 0)
198196 match tx {
199197 case b: BurnTransaction =>
200198 if (if (isValidOwner)
201199 then (b.assetId != xfeeAsset)
202200 else false)
203201 then !(containsElement(portfolio, b.assetId))
204202 else false
205203 case l: LeaseCancelTransaction|LeaseTransaction =>
206204 isValidOwner
207205 case o: Order =>
208- if (if (if (isValidMMBot)
206+ if (if (if (if (if (isValidMMBot)
207+ then (o.matcherPublicKey == wavesMatcher)
208+ else false)
209+ then (o.assetPair.priceAsset != fmmtAsset)
210+ else false)
211+ then (o.assetPair.amountAsset != fmmtAsset)
212+ else false)
209213 then if (if (if ((o.orderType == Buy))
210214 then (o.assetPair.priceAsset != xfeeAsset)
211215 else false)
212216 then !(containsElement(portfolio, o.assetPair.priceAsset))
213217 else false)
214218 then true
215219 else if (if ((o.orderType == Sell))
216220 then (o.assetPair.amountAsset != xfeeAsset)
217221 else false)
218222 then !(containsElement(portfolio, o.assetPair.amountAsset))
219223 else false
220224 else false)
221225 then if (!(isDefined(o.matcherFeeAssetId)))
222226 then true
223227 else (o.matcherFeeAssetId == o.assetPair.priceAsset)
224- else false)
225- then (o.matcherPublicKey == wavesMatcher)
226228 else false
227229 case t: TransferTransaction =>
228- if (if (if (if (if (isValidOwner)
230+ if (if (if (isValidOwner)
229231 then !(containsElement(portfolio, t.assetId))
230232 else false)
231233 then !(containsElement(portfolio, t.feeAssetId))
232234 else false)
233235 then true
234- else if (isValidAdmin)
235- then (addressFromRecipient(t.recipient) == fcold)
236- else false)
237- then true
238- else if (if (isValidAdmin)
236+ else if (if (if (isValidAdmin)
239237 then true
240238 else isValidGuarantors)
241239 then (addressFromRecipient(t.recipient) == fdapp)
242240 else false)
243- then true
244- else if (if (if (if (isValidAdmin)
245- then true
246- else isValidGuarantors)
247- then (t.assetId == fmmtAsset)
248- else false)
249- then (maxSendAmount >= t.amount)
250- else false)
251- then (addressFromRecipient(t.recipient) == fsale)
241+ then if ((t.assetId != fmmtAsset))
242+ then true
243+ else (maxAmount >= t.amount)
252244 else false
253245 case _: SetScriptTransaction|MassTransferTransaction|DataTransaction =>
254246 if (isValidAdmin)
255247 then isValidGuarantors
256248 else false
257249 case _ =>
258250 false
259251 }
260252 }
261253

github/deemru/w8io/3ef1775 
66.42 ms