tx · GXuyXQA1EGj5jnSya5ytKE4vQAEfiXwBM6rxMsKyHTUQ

3PDUqa5qmnhPJfKPnBzUd5PisA42iawV6W7:  -0.01400000 Waves

2020.09.06 06:02 [2228553] smart account 3PDUqa5qmnhPJfKPnBzUd5PisA42iawV6W7 > SELF 0.00000000 Waves

{ "type": 13, "id": "GXuyXQA1EGj5jnSya5ytKE4vQAEfiXwBM6rxMsKyHTUQ", "fee": 1400000, "feeAssetId": null, "timestamp": 1599361365630, "version": 1, "sender": "3PDUqa5qmnhPJfKPnBzUd5PisA42iawV6W7", "senderPublicKey": "7S371VYZXa9KW7x4AJBpEjaBU2BcrhPYVgAs5nCvbbtj", "proofs": [ "x7tALCNUBbXgBadZ6o6FN96FMHexLn2cTHHnQru651nBJbydCQkF5m1N4KHjfjWDthvcCkysScBhBopdBo7ZNeR", "2vGi2rB1QX2kaacdTp3QXKD6cooFtpiRzvQZ8QtJr6V1K4NymaNrvZVwQKewNxoAcXZZdMTTQG8uCCdm1DHbC1hZ" ], "script": "base64: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ASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAPcHJvdGVjdGVkQXNzZXRzCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAPQnVyblRyYW5zYWN0aW9uBAAAAAFiBQAAAAckbWF0Y2gwAwUAAAAMaXNWYWxpZE93bmVyCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA9wcm90ZWN0ZWRBc3NldHMIBQAAAAFiAAAAB2Fzc2V0SWQHAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABZDcmVhdGVBbGlhc1RyYW5zYWN0aW9uBQAAAAxpc1ZhbGlkT3duZXIDAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABZMZWFzZUNhbmNlbFRyYW5zYWN0aW9uBgkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABBMZWFzZVRyYW5zYWN0aW9uAwUAAAAMaXNWYWxpZE1NQm90BgUAAAARaXNWYWxpZEd1YXJhbnRvcnMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAE1RyYW5zZmVyVHJhbnNhY3Rpb24EAAAAAXQFAAAAByRtYXRjaDADAwUAAAAMaXNWYWxpZE1NQm90BgUAAAARaXNWYWxpZEd1YXJhbnRvcnMJAAAAAAAAAgkABCQAAAABCAUAAAABdAAAAAlyZWNpcGllbnQFAAAADGZkYXBwQWRkcmVzcwcDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAFFNldFNjcmlwdFRyYW5zYWN0aW9uAwUAAAAMaXNWYWxpZEFkbWluBQAAABFpc1ZhbGlkR3VhcmFudG9ycwcHv+OwNA==", "chainId": 87, "height": 2228553, "spentComplexity": 0 } View: original | compacted Prev: 4WVwPskBxPxfQBmSiWu1UBVHJQzCxCW5hhBVkUQnFKFM Next: BNNCqkzoTvLV7zT1uSJA5aSwchCbHPxPCbtuBYhAgtQi Diff:
OldNewDifferences
33 {-# CONTENT_TYPE DAPP #-}
44 let versionKey = "scriptVersion"
55
6-let scriptVersion = "1.04 (2020-09-01)"
6+let scriptVersion = "1.05 (2020-09-06)"
77
8-let managementKeys = [base58'62KBavoHK4TtCYmURFVeNC8j3gL8Jo7WwcrweoBLWofc', base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k', base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k']
8+let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
9+
10+let mmbotPublicKey = base58'62KBavoHK4TtCYmURFVeNC8j3gL8Jo7WwcrweoBLWofc'
11+
12+let guarantorPublicKeys = [base58'', base58'', base58'']
13+
14+let guarantorsSize = (size(guarantorPublicKeys) - 3)
915
1016 let payoutsKey = "teamPayouts"
1117
1319
1420 let teamPercent = 1000
1521
16-let btcAssetId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
22+let fmmtAssetId = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7'
1723
18-let ethAssetId = base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu'
19-
20-let usdtAssetId = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
21-
22-let fmmtAssetId = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7'
24+let protectedAssets = [fmmtAssetId, base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa']
2325
2426 let teamAddress = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
2527
2628 let fdappAddress = Address(base58'3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL')
27-
28-let timestamp = lastBlock.timestamp
2929
3030 let hedgeFunds = (value(assetInfo(fmmtAssetId)).quantity - ((assetBalance(this, fmmtAssetId) + assetBalance(teamAddress, fmmtAssetId)) + assetBalance(fdappAddress, fmmtAssetId)))
3131
4545 }
4646
4747
48+func containsElement (list,element) = match element {
49+ case val: ByteVector =>
50+ if (if (if (if (if (if (if (if (if ((list[0] == val))
51+ then true
52+ else (list[1] == val))
53+ then true
54+ else (list[2] == val))
55+ then true
56+ else (list[3] == val))
57+ then true
58+ else (list[4] == val))
59+ then true
60+ else (list[5] == val))
61+ then true
62+ else (list[6] == val))
63+ then true
64+ else (list[7] == val))
65+ then true
66+ else (list[8] == val))
67+ then true
68+ else (list[9] == val)
69+ case _ =>
70+ false
71+}
72+
73+
4874 @Callable(i)
49-func getTeamPayouts () = if (if ((i.caller != teamAddress))
50- then (i.callerPublicKey != managementKeys[0])
75+func getTeamPayouts () = if (if (if ((i.caller != teamAddress))
76+ then (i.callerPublicKey != adminPublicKey)
77+ else false)
78+ then (i.callerPublicKey != mmbotPublicKey)
5179 else false)
5280 then throw("Only the administrator can make payments!")
5381 else {
5482 let oldPayouts = integerOrElse(getInteger(this, payoutsKey), 0)
55- let newPayouts = (fraction(hedgeFunds, teamPercent, (100 * 100)) - oldPayouts)
83+ let newPayouts = (fraction(hedgeFunds, teamPercent, 10000) - oldPayouts)
5684 if ((newPayouts > 0))
57- then ScriptResult(WriteSet([DataEntry(payoutsKey, (oldPayouts + newPayouts)), DataEntry(timestampKey, timestamp)]), TransferSet([ScriptTransfer(teamAddress, newPayouts, fmmtAssetId)]))
85+ then ScriptResult(WriteSet([DataEntry(payoutsKey, (oldPayouts + newPayouts)), DataEntry(timestampKey, lastBlock.timestamp)]), TransferSet([ScriptTransfer(teamAddress, newPayouts, fmmtAssetId)]))
5886 else throw("No payments available. Wait for investments...")
5987 }
6088
6492 func setScriptVersion () = {
6593 let oldVersion = stringOrElse(getString(this, versionKey), "")
6694 if ((oldVersion != scriptVersion))
67- then WriteSet([DataEntry(versionKey, scriptVersion), DataEntry(timestampKey, timestamp)])
95+ then WriteSet([DataEntry(versionKey, scriptVersion), DataEntry(timestampKey, lastBlock.timestamp)])
6896 else throw("The script version has already been updated!")
6997 }
7098
7199
72100 @Verifier(tx)
73101 func verify () = {
74- let isValidSender = if (sigVerify(tx.bodyBytes, tx.proofs[0], managementKeys[0]))
102+ let isValidOwner = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPublicKey))
75103 then true
76104 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
77- let isValidGuarantor = if (sigVerify(tx.bodyBytes, tx.proofs[1], managementKeys[1]))
105+ let isValidMMBot = if (sigVerify(tx.bodyBytes, tx.proofs[0], mmbotPublicKey))
78106 then true
79- else sigVerify(tx.bodyBytes, tx.proofs[1], managementKeys[2])
107+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
108+ let isValidAdmin = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPublicKey))
109+ then true
110+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
111+ let isValidGuarantors = ((((if (sigVerify(tx.bodyBytes, tx.proofs[1], guarantorPublicKeys[0]))
112+ then 1
113+ else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], guarantorPublicKeys[1]))
114+ then 1
115+ else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], guarantorPublicKeys[2]))
116+ then 1
117+ else 0)) >= ((guarantorsSize / 2) + (guarantorsSize % 2)))
80118 match tx {
81119 case o: Order =>
82- if (if (if (isValidSender)
83- then (o.matcherFeeAssetId != fmmtAssetId)
120+ if (if (if (isValidOwner)
121+ then (o.orderType == Sell)
84122 else false)
85- then (o.assetPair.priceAsset != fmmtAssetId)
123+ then isDefined(o.assetPair.amountAsset)
86124 else false)
87- then (o.assetPair.amountAsset != fmmtAssetId)
125+ then !(containsElement(protectedAssets, o.assetPair.amountAsset))
88126 else false
89127 case b: BurnTransaction =>
90- if (if (if (if (isValidSender)
91- then (b.assetId != btcAssetId)
92- else false)
93- then (b.assetId != fmmtAssetId)
94- else false)
95- then (b.assetId != ethAssetId)
96- else false)
97- then (b.assetId != usdtAssetId)
128+ if (isValidOwner)
129+ then !(containsElement(protectedAssets, b.assetId))
98130 else false
131+ case _: CreateAliasTransaction =>
132+ isValidOwner
133+ case _: LeaseCancelTransaction|LeaseTransaction =>
134+ if (isValidMMBot)
135+ then true
136+ else isValidGuarantors
99137 case t: TransferTransaction =>
100- if (isValidSender)
101- then if ((t.assetId != fmmtAssetId))
102- then true
103- else (addressFromRecipient(t.recipient) == fdappAddress)
138+ if (if (isValidMMBot)
139+ then true
140+ else isValidGuarantors)
141+ then (addressFromRecipient(t.recipient) == fdappAddress)
104142 else false
105- case s: SetScriptTransaction =>
106- if (isValidSender)
107- then isValidGuarantor
143+ case _: SetScriptTransaction =>
144+ if (isValidAdmin)
145+ then isValidGuarantors
108146 else false
109147 case _ =>
110148 false
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let versionKey = "scriptVersion"
55
6-let scriptVersion = "1.04 (2020-09-01)"
6+let scriptVersion = "1.05 (2020-09-06)"
77
8-let managementKeys = [base58'62KBavoHK4TtCYmURFVeNC8j3gL8Jo7WwcrweoBLWofc', base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k', base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k']
8+let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
9+
10+let mmbotPublicKey = base58'62KBavoHK4TtCYmURFVeNC8j3gL8Jo7WwcrweoBLWofc'
11+
12+let guarantorPublicKeys = [base58'', base58'', base58'']
13+
14+let guarantorsSize = (size(guarantorPublicKeys) - 3)
915
1016 let payoutsKey = "teamPayouts"
1117
1218 let timestampKey = "lastUpdated"
1319
1420 let teamPercent = 1000
1521
16-let btcAssetId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
22+let fmmtAssetId = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7'
1723
18-let ethAssetId = base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu'
19-
20-let usdtAssetId = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
21-
22-let fmmtAssetId = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7'
24+let protectedAssets = [fmmtAssetId, base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa']
2325
2426 let teamAddress = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
2527
2628 let fdappAddress = Address(base58'3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL')
27-
28-let timestamp = lastBlock.timestamp
2929
3030 let hedgeFunds = (value(assetInfo(fmmtAssetId)).quantity - ((assetBalance(this, fmmtAssetId) + assetBalance(teamAddress, fmmtAssetId)) + assetBalance(fdappAddress, fmmtAssetId)))
3131
3232 func integerOrElse (val,alt) = match val {
3333 case x: Int =>
3434 x
3535 case _ =>
3636 alt
3737 }
3838
3939
4040 func stringOrElse (val,alt) = match val {
4141 case x: String =>
4242 x
4343 case _ =>
4444 alt
4545 }
4646
4747
48+func containsElement (list,element) = match element {
49+ case val: ByteVector =>
50+ if (if (if (if (if (if (if (if (if ((list[0] == val))
51+ then true
52+ else (list[1] == val))
53+ then true
54+ else (list[2] == val))
55+ then true
56+ else (list[3] == val))
57+ then true
58+ else (list[4] == val))
59+ then true
60+ else (list[5] == val))
61+ then true
62+ else (list[6] == val))
63+ then true
64+ else (list[7] == val))
65+ then true
66+ else (list[8] == val))
67+ then true
68+ else (list[9] == val)
69+ case _ =>
70+ false
71+}
72+
73+
4874 @Callable(i)
49-func getTeamPayouts () = if (if ((i.caller != teamAddress))
50- then (i.callerPublicKey != managementKeys[0])
75+func getTeamPayouts () = if (if (if ((i.caller != teamAddress))
76+ then (i.callerPublicKey != adminPublicKey)
77+ else false)
78+ then (i.callerPublicKey != mmbotPublicKey)
5179 else false)
5280 then throw("Only the administrator can make payments!")
5381 else {
5482 let oldPayouts = integerOrElse(getInteger(this, payoutsKey), 0)
55- let newPayouts = (fraction(hedgeFunds, teamPercent, (100 * 100)) - oldPayouts)
83+ let newPayouts = (fraction(hedgeFunds, teamPercent, 10000) - oldPayouts)
5684 if ((newPayouts > 0))
57- then ScriptResult(WriteSet([DataEntry(payoutsKey, (oldPayouts + newPayouts)), DataEntry(timestampKey, timestamp)]), TransferSet([ScriptTransfer(teamAddress, newPayouts, fmmtAssetId)]))
85+ then ScriptResult(WriteSet([DataEntry(payoutsKey, (oldPayouts + newPayouts)), DataEntry(timestampKey, lastBlock.timestamp)]), TransferSet([ScriptTransfer(teamAddress, newPayouts, fmmtAssetId)]))
5886 else throw("No payments available. Wait for investments...")
5987 }
6088
6189
6290
6391 @Callable(i)
6492 func setScriptVersion () = {
6593 let oldVersion = stringOrElse(getString(this, versionKey), "")
6694 if ((oldVersion != scriptVersion))
67- then WriteSet([DataEntry(versionKey, scriptVersion), DataEntry(timestampKey, timestamp)])
95+ then WriteSet([DataEntry(versionKey, scriptVersion), DataEntry(timestampKey, lastBlock.timestamp)])
6896 else throw("The script version has already been updated!")
6997 }
7098
7199
72100 @Verifier(tx)
73101 func verify () = {
74- let isValidSender = if (sigVerify(tx.bodyBytes, tx.proofs[0], managementKeys[0]))
102+ let isValidOwner = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPublicKey))
75103 then true
76104 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
77- let isValidGuarantor = if (sigVerify(tx.bodyBytes, tx.proofs[1], managementKeys[1]))
105+ let isValidMMBot = if (sigVerify(tx.bodyBytes, tx.proofs[0], mmbotPublicKey))
78106 then true
79- else sigVerify(tx.bodyBytes, tx.proofs[1], managementKeys[2])
107+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
108+ let isValidAdmin = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPublicKey))
109+ then true
110+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
111+ let isValidGuarantors = ((((if (sigVerify(tx.bodyBytes, tx.proofs[1], guarantorPublicKeys[0]))
112+ then 1
113+ else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], guarantorPublicKeys[1]))
114+ then 1
115+ else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], guarantorPublicKeys[2]))
116+ then 1
117+ else 0)) >= ((guarantorsSize / 2) + (guarantorsSize % 2)))
80118 match tx {
81119 case o: Order =>
82- if (if (if (isValidSender)
83- then (o.matcherFeeAssetId != fmmtAssetId)
120+ if (if (if (isValidOwner)
121+ then (o.orderType == Sell)
84122 else false)
85- then (o.assetPair.priceAsset != fmmtAssetId)
123+ then isDefined(o.assetPair.amountAsset)
86124 else false)
87- then (o.assetPair.amountAsset != fmmtAssetId)
125+ then !(containsElement(protectedAssets, o.assetPair.amountAsset))
88126 else false
89127 case b: BurnTransaction =>
90- if (if (if (if (isValidSender)
91- then (b.assetId != btcAssetId)
92- else false)
93- then (b.assetId != fmmtAssetId)
94- else false)
95- then (b.assetId != ethAssetId)
96- else false)
97- then (b.assetId != usdtAssetId)
128+ if (isValidOwner)
129+ then !(containsElement(protectedAssets, b.assetId))
98130 else false
131+ case _: CreateAliasTransaction =>
132+ isValidOwner
133+ case _: LeaseCancelTransaction|LeaseTransaction =>
134+ if (isValidMMBot)
135+ then true
136+ else isValidGuarantors
99137 case t: TransferTransaction =>
100- if (isValidSender)
101- then if ((t.assetId != fmmtAssetId))
102- then true
103- else (addressFromRecipient(t.recipient) == fdappAddress)
138+ if (if (isValidMMBot)
139+ then true
140+ else isValidGuarantors)
141+ then (addressFromRecipient(t.recipient) == fdappAddress)
104142 else false
105- case s: SetScriptTransaction =>
106- if (isValidSender)
107- then isValidGuarantor
143+ case _: SetScriptTransaction =>
144+ if (isValidAdmin)
145+ then isValidGuarantors
108146 else false
109147 case _ =>
110148 false
111149 }
112150 }
113151

github/deemru/w8io/3ef1775 
61.95 ms