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:
Old | New | | Differences |
---|
3 | 3 | | {-# CONTENT_TYPE DAPP #-} |
---|
4 | 4 | | let versionKey = "scriptVersion" |
---|
5 | 5 | | |
---|
6 | | - | let scriptVersion = "1.04 (2020-09-01)" |
---|
| 6 | + | let scriptVersion = "1.05 (2020-09-06)" |
---|
7 | 7 | | |
---|
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) |
---|
9 | 15 | | |
---|
10 | 16 | | let payoutsKey = "teamPayouts" |
---|
11 | 17 | | |
---|
|
13 | 19 | | |
---|
14 | 20 | | let teamPercent = 1000 |
---|
15 | 21 | | |
---|
16 | | - | let btcAssetId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS' |
---|
| 22 | + | let fmmtAssetId = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7' |
---|
17 | 23 | | |
---|
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'] |
---|
23 | 25 | | |
---|
24 | 26 | | let teamAddress = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x') |
---|
25 | 27 | | |
---|
26 | 28 | | let fdappAddress = Address(base58'3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL') |
---|
27 | | - | |
---|
28 | | - | let timestamp = lastBlock.timestamp |
---|
29 | 29 | | |
---|
30 | 30 | | let hedgeFunds = (value(assetInfo(fmmtAssetId)).quantity - ((assetBalance(this, fmmtAssetId) + assetBalance(teamAddress, fmmtAssetId)) + assetBalance(fdappAddress, fmmtAssetId))) |
---|
31 | 31 | | |
---|
|
45 | 45 | | } |
---|
46 | 46 | | |
---|
47 | 47 | | |
---|
| 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 | + | |
---|
48 | 74 | | @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) |
---|
51 | 79 | | else false) |
---|
52 | 80 | | then throw("Only the administrator can make payments!") |
---|
53 | 81 | | else { |
---|
54 | 82 | | let oldPayouts = integerOrElse(getInteger(this, payoutsKey), 0) |
---|
55 | | - | let newPayouts = (fraction(hedgeFunds, teamPercent, (100 * 100)) - oldPayouts) |
---|
| 83 | + | let newPayouts = (fraction(hedgeFunds, teamPercent, 10000) - oldPayouts) |
---|
56 | 84 | | 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)])) |
---|
58 | 86 | | else throw("No payments available. Wait for investments...") |
---|
59 | 87 | | } |
---|
60 | 88 | | |
---|
|
64 | 92 | | func setScriptVersion () = { |
---|
65 | 93 | | let oldVersion = stringOrElse(getString(this, versionKey), "") |
---|
66 | 94 | | if ((oldVersion != scriptVersion)) |
---|
67 | | - | then WriteSet([DataEntry(versionKey, scriptVersion), DataEntry(timestampKey, timestamp)]) |
---|
| 95 | + | then WriteSet([DataEntry(versionKey, scriptVersion), DataEntry(timestampKey, lastBlock.timestamp)]) |
---|
68 | 96 | | else throw("The script version has already been updated!") |
---|
69 | 97 | | } |
---|
70 | 98 | | |
---|
71 | 99 | | |
---|
72 | 100 | | @Verifier(tx) |
---|
73 | 101 | | 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)) |
---|
75 | 103 | | then true |
---|
76 | 104 | | 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)) |
---|
78 | 106 | | 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))) |
---|
80 | 118 | | match tx { |
---|
81 | 119 | | case o: Order => |
---|
82 | | - | if (if (if (isValidSender) |
---|
83 | | - | then (o.matcherFeeAssetId != fmmtAssetId) |
---|
| 120 | + | if (if (if (isValidOwner) |
---|
| 121 | + | then (o.orderType == Sell) |
---|
84 | 122 | | else false) |
---|
85 | | - | then (o.assetPair.priceAsset != fmmtAssetId) |
---|
| 123 | + | then isDefined(o.assetPair.amountAsset) |
---|
86 | 124 | | else false) |
---|
87 | | - | then (o.assetPair.amountAsset != fmmtAssetId) |
---|
| 125 | + | then !(containsElement(protectedAssets, o.assetPair.amountAsset)) |
---|
88 | 126 | | else false |
---|
89 | 127 | | 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)) |
---|
98 | 130 | | else false |
---|
| 131 | + | case _: CreateAliasTransaction => |
---|
| 132 | + | isValidOwner |
---|
| 133 | + | case _: LeaseCancelTransaction|LeaseTransaction => |
---|
| 134 | + | if (isValidMMBot) |
---|
| 135 | + | then true |
---|
| 136 | + | else isValidGuarantors |
---|
99 | 137 | | 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) |
---|
104 | 142 | | else false |
---|
105 | | - | case s: SetScriptTransaction => |
---|
106 | | - | if (isValidSender) |
---|
107 | | - | then isValidGuarantor |
---|
| 143 | + | case _: SetScriptTransaction => |
---|
| 144 | + | if (isValidAdmin) |
---|
| 145 | + | then isValidGuarantors |
---|
108 | 146 | | else false |
---|
109 | 147 | | case _ => |
---|
110 | 148 | | false |
---|
Full:
Old | New | | Differences |
---|
1 | 1 | | {-# STDLIB_VERSION 3 #-} |
---|
2 | 2 | | {-# SCRIPT_TYPE ACCOUNT #-} |
---|
3 | 3 | | {-# CONTENT_TYPE DAPP #-} |
---|
4 | 4 | | let versionKey = "scriptVersion" |
---|
5 | 5 | | |
---|
6 | | - | let scriptVersion = "1.04 (2020-09-01)" |
---|
| 6 | + | let scriptVersion = "1.05 (2020-09-06)" |
---|
7 | 7 | | |
---|
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) |
---|
9 | 15 | | |
---|
10 | 16 | | let payoutsKey = "teamPayouts" |
---|
11 | 17 | | |
---|
12 | 18 | | let timestampKey = "lastUpdated" |
---|
13 | 19 | | |
---|
14 | 20 | | let teamPercent = 1000 |
---|
15 | 21 | | |
---|
16 | | - | let btcAssetId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS' |
---|
| 22 | + | let fmmtAssetId = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7' |
---|
17 | 23 | | |
---|
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'] |
---|
23 | 25 | | |
---|
24 | 26 | | let teamAddress = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x') |
---|
25 | 27 | | |
---|
26 | 28 | | let fdappAddress = Address(base58'3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL') |
---|
27 | | - | |
---|
28 | | - | let timestamp = lastBlock.timestamp |
---|
29 | 29 | | |
---|
30 | 30 | | let hedgeFunds = (value(assetInfo(fmmtAssetId)).quantity - ((assetBalance(this, fmmtAssetId) + assetBalance(teamAddress, fmmtAssetId)) + assetBalance(fdappAddress, fmmtAssetId))) |
---|
31 | 31 | | |
---|
32 | 32 | | func integerOrElse (val,alt) = match val { |
---|
33 | 33 | | case x: Int => |
---|
34 | 34 | | x |
---|
35 | 35 | | case _ => |
---|
36 | 36 | | alt |
---|
37 | 37 | | } |
---|
38 | 38 | | |
---|
39 | 39 | | |
---|
40 | 40 | | func stringOrElse (val,alt) = match val { |
---|
41 | 41 | | case x: String => |
---|
42 | 42 | | x |
---|
43 | 43 | | case _ => |
---|
44 | 44 | | alt |
---|
45 | 45 | | } |
---|
46 | 46 | | |
---|
47 | 47 | | |
---|
| 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 | + | |
---|
48 | 74 | | @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) |
---|
51 | 79 | | else false) |
---|
52 | 80 | | then throw("Only the administrator can make payments!") |
---|
53 | 81 | | else { |
---|
54 | 82 | | let oldPayouts = integerOrElse(getInteger(this, payoutsKey), 0) |
---|
55 | | - | let newPayouts = (fraction(hedgeFunds, teamPercent, (100 * 100)) - oldPayouts) |
---|
| 83 | + | let newPayouts = (fraction(hedgeFunds, teamPercent, 10000) - oldPayouts) |
---|
56 | 84 | | 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)])) |
---|
58 | 86 | | else throw("No payments available. Wait for investments...") |
---|
59 | 87 | | } |
---|
60 | 88 | | |
---|
61 | 89 | | |
---|
62 | 90 | | |
---|
63 | 91 | | @Callable(i) |
---|
64 | 92 | | func setScriptVersion () = { |
---|
65 | 93 | | let oldVersion = stringOrElse(getString(this, versionKey), "") |
---|
66 | 94 | | if ((oldVersion != scriptVersion)) |
---|
67 | | - | then WriteSet([DataEntry(versionKey, scriptVersion), DataEntry(timestampKey, timestamp)]) |
---|
| 95 | + | then WriteSet([DataEntry(versionKey, scriptVersion), DataEntry(timestampKey, lastBlock.timestamp)]) |
---|
68 | 96 | | else throw("The script version has already been updated!") |
---|
69 | 97 | | } |
---|
70 | 98 | | |
---|
71 | 99 | | |
---|
72 | 100 | | @Verifier(tx) |
---|
73 | 101 | | 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)) |
---|
75 | 103 | | then true |
---|
76 | 104 | | 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)) |
---|
78 | 106 | | 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))) |
---|
80 | 118 | | match tx { |
---|
81 | 119 | | case o: Order => |
---|
82 | | - | if (if (if (isValidSender) |
---|
83 | | - | then (o.matcherFeeAssetId != fmmtAssetId) |
---|
| 120 | + | if (if (if (isValidOwner) |
---|
| 121 | + | then (o.orderType == Sell) |
---|
84 | 122 | | else false) |
---|
85 | | - | then (o.assetPair.priceAsset != fmmtAssetId) |
---|
| 123 | + | then isDefined(o.assetPair.amountAsset) |
---|
86 | 124 | | else false) |
---|
87 | | - | then (o.assetPair.amountAsset != fmmtAssetId) |
---|
| 125 | + | then !(containsElement(protectedAssets, o.assetPair.amountAsset)) |
---|
88 | 126 | | else false |
---|
89 | 127 | | 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)) |
---|
98 | 130 | | else false |
---|
| 131 | + | case _: CreateAliasTransaction => |
---|
| 132 | + | isValidOwner |
---|
| 133 | + | case _: LeaseCancelTransaction|LeaseTransaction => |
---|
| 134 | + | if (isValidMMBot) |
---|
| 135 | + | then true |
---|
| 136 | + | else isValidGuarantors |
---|
99 | 137 | | 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) |
---|
104 | 142 | | else false |
---|
105 | | - | case s: SetScriptTransaction => |
---|
106 | | - | if (isValidSender) |
---|
107 | | - | then isValidGuarantor |
---|
| 143 | + | case _: SetScriptTransaction => |
---|
| 144 | + | if (isValidAdmin) |
---|
| 145 | + | then isValidGuarantors |
---|
108 | 146 | | else false |
---|
109 | 147 | | case _ => |
---|
110 | 148 | | false |
---|
111 | 149 | | } |
---|
112 | 150 | | } |
---|
113 | 151 | | |
---|