tx · 2tKcENXTEz1CgBPtamwvv9abFE1mpMevbo6NsJ3H1p66 3P4v7QaMk6us7PdxSuoR5LmZmemv5ruD6oj: -0.01400000 Waves 2022.05.08 15:35 [3108192] smart account 3P4v7QaMk6us7PdxSuoR5LmZmemv5ruD6oj > SELF 0.00000000 Waves
{ "type": 13, "id": "2tKcENXTEz1CgBPtamwvv9abFE1mpMevbo6NsJ3H1p66", "fee": 1400000, "feeAssetId": null, "timestamp": 1652013293504, "version": 2, "chainId": 87, "sender": "3P4v7QaMk6us7PdxSuoR5LmZmemv5ruD6oj", "senderPublicKey": "8WdPBryKG4xqQQJU9Vt5ehDfjjgaXBQTbBCCriYGisHs", "proofs": [ "", "4LxLURjTwh2LLGSVGb7S2KDguVNB1iX99kq5ajMiWKJAVXtuTgJqBT6YMTzGdEjUWkA5Fa4skQ1arXF5sFGLkWp8", "CuQtQuCWbbk2eYYUSGXdoGzdPAAuv7wLCJavezJJ7Z6A3jgqn71qesYHoGQboc2ovvHbo8aCJMVhBrjV15zVhXh" ], "script": "base64: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b2tlblBheQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkAAZEAAAACBQAAAApleGNoYW5nZXJzAAAAAAAAAAABCQABkQAAAAIFAAAAEXJvdXRpbmdBc3NldHNLZXlzAAAAAAAAAAACBAAAAA1kQXBwMlRva2VuR2V0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmV4Y2hhbmdlcnMAAAAAAAAAAAEJAAGRAAAAAgUAAAARcm91dGluZ0Fzc2V0c0tleXMAAAAAAAAAAAMEAAAAFGdldEZyb20xVHJhZGVXaXRoRmVlAwkAAAAAAAACCQABkQAAAAIFAAAADmV4Y2hhbmdlcnNUeXBlAAAAAAAAAAAAAgAAAARjcG1tBAAAABdnZXRGcm9tMVRyYWRlV2l0aG91dEZlZQkAAGsAAAADBQAAAA1kQXBwMVRva2VuR2V0BQAAAAlwbXRBbW91bnQJAABkAAAAAgUAAAAJcG10QW1vdW50BQAAAA1kQXBwMVRva2VuUGF5CQAAawAAAAMFAAAAF2dldEZyb20xVHJhZGVXaXRob3V0RmVlCQAAZQAAAAIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAKY29tbWlzc2lvbgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyAwkAAAAAAAACCQABkQAAAAIFAAAADmV4Y2hhbmdlcnNUeXBlAAAAAAAAAAAAAgAAAARmbGF0BAAAAAlpbnZhcmlhbnQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAANZEFwcDFUb2tlblBheQUAAAANZEFwcDFUb2tlbkdldAQAAAATbWluQW1vdW50VG9SZWNlaXZlMQkAAZEAAAACBQAAAAVhcmdzMgAAAAAAAAAAAAQAAAAMaW52YXJpYW50TmV3CQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAANZEFwcDFUb2tlblBheQUAAAAJcG10QW1vdW50CQAAZQAAAAIFAAAADWRBcHAxVG9rZW5HZXQFAAAAE21pbkFtb3VudFRvUmVjZWl2ZTEDCQAAZwAAAAIFAAAADGludmFyaWFudE5ldwUAAAAJaW52YXJpYW50BQAAABNtaW5BbW91bnRUb1JlY2VpdmUxCQAAAgAAAAECAAAAJ0ZsYXQgY29udHJhY3Q6IGludmFyaWFudE5ldyA8IGludmFyaWFudAkAAAIAAAABAgAAABdJbmNvcnJlY3QgZXhjaGFuZ2UgdHlwZQQAAAAUZ2V0RnJvbTJUcmFkZVdpdGhGZWUDCQAAAAAAAAIJAAGRAAAAAgUAAAAOZXhjaGFuZ2Vyc1R5cGUAAAAAAAAAAAECAAAABGNwbW0EAAAAF2dldEZyb20yVHJhZGVXaXRob3V0RmVlCQAAawAAAAMFAAAADWRBcHAyVG9rZW5HZXQFAAAAFGdldEZyb20xVHJhZGVXaXRoRmVlCQAAZAAAAAIFAAAAFGdldEZyb20xVHJhZGVXaXRoRmVlBQAAAA1kQXBwMlRva2VuUGF5CQAAawAAAAMFAAAAF2dldEZyb20yVHJhZGVXaXRob3V0RmVlCQAAZQAAAAIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAKY29tbWlzc2lvbgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyAwkAAAAAAAACCQABkQAAAAIFAAAADmV4Y2hhbmdlcnNUeXBlAAAAAAAAAAABAgAAAARmbGF0BAAAAAlpbnZhcmlhbnQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAANZEFwcDJUb2tlblBheQUAAAANZEFwcDJUb2tlbkdldAQAAAATbWluQW1vdW50VG9SZWNlaXZlMgkAAZEAAAACBQAAAAVhcmdzMgAAAAAAAAAAAQQAAAAMaW52YXJpYW50TmV3CQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAANZEFwcDJUb2tlblBheQUAAAAUZ2V0RnJvbTFUcmFkZVdpdGhGZWUJAABlAAAAAgUAAAANZEFwcDJUb2tlbkdldAUAAAATbWluQW1vdW50VG9SZWNlaXZlMgMJAABnAAAAAgUAAAAMaW52YXJpYW50TmV3BQAAAAlpbnZhcmlhbnQFAAAAE21pbkFtb3VudFRvUmVjZWl2ZTIJAAACAAAAAQIAAAAnRmxhdCBjb250cmFjdDogaW52YXJpYW50TmV3IDwgaW52YXJpYW50CQAAAgAAAAECAAAAF0luY29ycmVjdCBleGNoYW5nZSB0eXBlCQAAZwAAAAIFAAAAFGdldEZyb20yVHJhZGVXaXRoRmVlBQAAABJtaW5BbW91bnRUb1JlY2VpdmUAAAADAAAAAWkBAAAADHJvdXRpbmdUcmFkZQAAAAYAAAAKZXhjaGFuZ2VycwAAAA5leGNoYW5nZXJzVHlwZQAAAAVhcmdzMQAAAAVhcmdzMgAAABFyb3V0aW5nQXNzZXRzS2V5cwAAABJtaW5BbW91bnRUb1JlY2VpdmUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAAhpc0FjdGl2ZQAAAAAEAAAACyR0MDUyODk1MzYzCQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAALJHQwNTI4OTUzNjMAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAAskdDA1Mjg5NTM2MwAAAAJfMgMJAQAAAAEhAAAAAQkBAAAAEGNoZWNrUG9zc2liaWxpdHkAAAAHBQAAAAlwbXRBbW91bnQFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAKZXhjaGFuZ2VycwUAAAAOZXhjaGFuZ2Vyc1R5cGUFAAAAEXJvdXRpbmdBc3NldHNLZXlzBQAAAAVhcmdzMQUAAAAFYXJnczIJAAACAAAAAQIAAAAmQ2hlY2sgdHJhbnNhY3Rpb24gcG9zc2liaWx0eTogZGVjbGluZWQDAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAZvcmFjbGUJAAEsAAAAAgUAAAANa1Bvb2xJbk9yYWNsZQkAAZEAAAACBQAAAApleGNoYW5nZXJzAAAAAAAAAAAABgkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQkABB0AAAACBQAAAAZvcmFjbGUJAAEsAAAAAgUAAAANa1Bvb2xJbk9yYWNsZQkAAZEAAAACBQAAAApleGNoYW5nZXJzAAAAAAAAAAABCQAAAgAAAAECAAAAFVBvb2wgaXMgbm90IGluIG9yYWNsZQQAAAALcm91dGluZ1NpemUJAAGQAAAAAQUAAAAKZXhjaGFuZ2VycwoBAAAADGV4Y2hhbmdlRm9sZAAAAAIAAAALYWNjdW11bGF0ZWQAAAAJZXhjaGFuZ2VyBAAAAAskdDA1ODY3NTkzMgUAAAALYWNjdW11bGF0ZWQEAAAAD2V4Y2hhbmdlQ291bnRlcggFAAAACyR0MDU4Njc1OTMyAAAAAl8xBAAAAA5hbW91bnRzV2l0aEZlZQgFAAAACyR0MDU4Njc1OTMyAAAAAl8yBAAAAAxhc3NldHNJZFNlbmQIBQAAAAskdDA1ODY3NTkzMgAAAAJfMwQAAAALJHQwNTk0NTYxNDMDCQAAAAAAAAIFAAAAD2V4Y2hhbmdlQ291bnRlcgAAAAAAAAAAAAkABRQAAAACBQAAAApwbXRBc3NldElkBQAAAAlwbXRBbW91bnQJAAUUAAAAAgUAAAAMYXNzZXRzSWRTZW5kBQAAAA5hbW91bnRzV2l0aEZlZQQAAAAOcG10QXNzZXRJZFJvdXQIBQAAAAskdDA1OTQ1NjE0MwAAAAJfMQQAAAANcG10QW1vdW50Um91dAgFAAAACyR0MDU5NDU2MTQzAAAAAl8yAwkAAAAAAAACAwkAAGcAAAACBQAAAA9leGNoYW5nZUNvdW50ZXIAAAAAAAAAAAAJAABmAAAAAgUAAAALcm91dGluZ1NpemUFAAAAD2V4Y2hhbmdlQ291bnRlcgcGBAAAABBleGNoYW5nZXJBZGRyZXNzCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAlleGNoYW5nZXIEAAAAA2ludgMJAAAAAAAAAgkAAZEAAAACBQAAAA5leGNoYW5nZXJzVHlwZQUAAAAPZXhjaGFuZ2VDb3VudGVyAgAAAARjcG1tCQAD/AAAAAQFAAAAEGV4Y2hhbmdlckFkZHJlc3MCAAAACGV4Y2hhbmdlCQAETAAAAAIJAAGRAAAAAgUAAAAFYXJnczEFAAAAD2V4Y2hhbmdlQ291bnRlcgUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAA5wbXRBc3NldElkUm91dAUAAAANcG10QW1vdW50Um91dAUAAAADbmlsAwkAAAAAAAACCQABkQAAAAIFAAAADmV4Y2hhbmdlcnNU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", "height": 3108192, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: G9e1MvXT3n9ndjqQt3LCM9Njo9L8U4pfEQ3BbEAEmfWc Next: 9ZHPqkVkXupvvstyeAUQCQqPHSWpjQBsgkocdQeoud1j Diff:
Old | New | Differences | |
---|---|---|---|
156 | 156 | else throw("Incorrect exchange type") | |
157 | 157 | if ((inv == inv)) | |
158 | 158 | then match inv { | |
159 | - | case inv: (Int, ByteVector) => | |
160 | - | let $ | |
161 | - | let amountWithFee = $ | |
162 | - | let assetIdSend = $ | |
159 | + | case inv: (Int, Unit)|(Int, ByteVector) => | |
160 | + | let $t069917029 = inv | |
161 | + | let amountWithFee = $t069917029._1 | |
162 | + | let assetIdSend = $t069917029._2 | |
163 | 163 | $Tuple3((exchangeCounter + 1), amountWithFee, assetIdSend) | |
164 | 164 | case _ => | |
165 | 165 | throw("Incorrect invoke result: expected amountWithFee and assetsIdSend") | |
169 | 169 | else accumulated | |
170 | 170 | } | |
171 | 171 | ||
172 | - | let $ | |
172 | + | let $t073097415 = { | |
173 | 173 | let $l = exchangers | |
174 | 174 | let $s = size($l) | |
175 | 175 | let $acc0 = $Tuple3(0, 0, base58'') | |
183 | 183 | ||
184 | 184 | $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3) | |
185 | 185 | } | |
186 | - | let exchangeCounter = $ | |
187 | - | let amountWithoutFee = $ | |
188 | - | let assetIdSend = $ | |
186 | + | let exchangeCounter = $t073097415._1 | |
187 | + | let amountWithoutFee = $t073097415._2 | |
188 | + | let assetIdSend = $t073097415._3 | |
189 | 189 | let amountWithFee = fraction(amountWithoutFee, (feeScale6 - routingFee), feeScale6) | |
190 | 190 | if (if ((exchangeCounter == routingSize)) | |
191 | 191 | then (amountWithFee >= minAmountToReceive) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let kActive = "active" | |
5 | 5 | ||
6 | 6 | let kCause = "shutdown_cause" | |
7 | 7 | ||
8 | 8 | let kRoutingFee = "routing_fee" | |
9 | 9 | ||
10 | 10 | let kAdminPubKey1 = "admin_pub_1" | |
11 | 11 | ||
12 | 12 | let kAdminPubKey2 = "admin_pub_2" | |
13 | 13 | ||
14 | 14 | let kAdminPubKey3 = "admin_pub_3" | |
15 | 15 | ||
16 | 16 | let kMoneyBoxAddress = "money_box_address" | |
17 | 17 | ||
18 | 18 | let kPoolInOracle = "pool_" | |
19 | 19 | ||
20 | 20 | let digits8 = 8 | |
21 | 21 | ||
22 | 22 | let scale8 = 100000000 | |
23 | 23 | ||
24 | 24 | let scale16 = 10000000000000000 | |
25 | 25 | ||
26 | 26 | let alpha = 50 | |
27 | 27 | ||
28 | 28 | let alphaDigits = 2 | |
29 | 29 | ||
30 | 30 | let beta = 4600000000000000 | |
31 | 31 | ||
32 | 32 | let commission = 3000 | |
33 | 33 | ||
34 | 34 | let commissionScaleDelimiter = 1000000 | |
35 | 35 | ||
36 | 36 | let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom') | |
37 | 37 | ||
38 | 38 | func getBase58FromOracle (key) = match getString(oracle, key) { | |
39 | 39 | case string: String => | |
40 | 40 | fromBase58String(string) | |
41 | 41 | case nothing => | |
42 | 42 | throw((key + "is empty")) | |
43 | 43 | } | |
44 | 44 | ||
45 | 45 | ||
46 | 46 | let adminPubKey1 = getBase58FromOracle(kAdminPubKey1) | |
47 | 47 | ||
48 | 48 | let adminPubKey2 = getBase58FromOracle(kAdminPubKey2) | |
49 | 49 | ||
50 | 50 | let adminPubKey3 = getBase58FromOracle(kAdminPubKey3) | |
51 | 51 | ||
52 | 52 | let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress)) | |
53 | 53 | ||
54 | 54 | let active = valueOrElse(getBoolean(this, kActive), true) | |
55 | 55 | ||
56 | 56 | let routingFee = valueOrErrorMessage(getInteger(oracle, kRoutingFee), "routing_fee is empty") | |
57 | 57 | ||
58 | 58 | let feeScale6 = 1000000 | |
59 | 59 | ||
60 | 60 | func isActive () = if (active) | |
61 | 61 | then unit | |
62 | 62 | else throw("DApp is inactive at this moment") | |
63 | 63 | ||
64 | 64 | ||
65 | 65 | func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)) | |
66 | 66 | then unit | |
67 | 67 | else throw("Only admin can call this function") | |
68 | 68 | ||
69 | 69 | ||
70 | 70 | func throwIsActive () = throw("DApp is already active") | |
71 | 71 | ||
72 | 72 | ||
73 | 73 | func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)] | |
74 | 74 | ||
75 | 75 | ||
76 | 76 | func skewness (x,y) = ((fraction(scale16, x, y) + fraction(scale16, y, x)) / 2) | |
77 | 77 | ||
78 | 78 | ||
79 | 79 | func invariantCalc (x,y) = { | |
80 | 80 | let sk = skewness(x, y) | |
81 | 81 | (fraction((x + y), scale16, pow(sk, digits8, alpha, alphaDigits, digits8, CEILING)) + (2 * fraction(toInt(pow(fraction(toBigInt(x), toBigInt(y), toBigInt(scale8)), 0, toBigInt(5), 1, (digits8 / 2), DOWN)), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8))) | |
82 | 82 | } | |
83 | 83 | ||
84 | 84 | ||
85 | 85 | func checkPossibility (pmtAmount,minAmountToReceive,exchangers,exchangersType,routingAssetsKeys,args1,args2) = { | |
86 | 86 | let dApp1TokenPay = getIntegerValue(addressFromStringValue(exchangers[0]), routingAssetsKeys[0]) | |
87 | 87 | let dApp1TokenGet = getIntegerValue(addressFromStringValue(exchangers[0]), routingAssetsKeys[1]) | |
88 | 88 | let dApp2TokenPay = getIntegerValue(addressFromStringValue(exchangers[1]), routingAssetsKeys[2]) | |
89 | 89 | let dApp2TokenGet = getIntegerValue(addressFromStringValue(exchangers[1]), routingAssetsKeys[3]) | |
90 | 90 | let getFrom1TradeWithFee = if ((exchangersType[0] == "cpmm")) | |
91 | 91 | then { | |
92 | 92 | let getFrom1TradeWithoutFee = fraction(dApp1TokenGet, pmtAmount, (pmtAmount + dApp1TokenPay)) | |
93 | 93 | fraction(getFrom1TradeWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter) | |
94 | 94 | } | |
95 | 95 | else if ((exchangersType[0] == "flat")) | |
96 | 96 | then { | |
97 | 97 | let invariant = invariantCalc(dApp1TokenPay, dApp1TokenGet) | |
98 | 98 | let minAmountToReceive1 = args2[0] | |
99 | 99 | let invariantNew = invariantCalc((dApp1TokenPay + pmtAmount), (dApp1TokenGet - minAmountToReceive1)) | |
100 | 100 | if ((invariantNew >= invariant)) | |
101 | 101 | then minAmountToReceive1 | |
102 | 102 | else throw("Flat contract: invariantNew < invariant") | |
103 | 103 | } | |
104 | 104 | else throw("Incorrect exchange type") | |
105 | 105 | let getFrom2TradeWithFee = if ((exchangersType[1] == "cpmm")) | |
106 | 106 | then { | |
107 | 107 | let getFrom2TradeWithoutFee = fraction(dApp2TokenGet, getFrom1TradeWithFee, (getFrom1TradeWithFee + dApp2TokenPay)) | |
108 | 108 | fraction(getFrom2TradeWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter) | |
109 | 109 | } | |
110 | 110 | else if ((exchangersType[1] == "flat")) | |
111 | 111 | then { | |
112 | 112 | let invariant = invariantCalc(dApp2TokenPay, dApp2TokenGet) | |
113 | 113 | let minAmountToReceive2 = args2[1] | |
114 | 114 | let invariantNew = invariantCalc((dApp2TokenPay + getFrom1TradeWithFee), (dApp2TokenGet - minAmountToReceive2)) | |
115 | 115 | if ((invariantNew >= invariant)) | |
116 | 116 | then minAmountToReceive2 | |
117 | 117 | else throw("Flat contract: invariantNew < invariant") | |
118 | 118 | } | |
119 | 119 | else throw("Incorrect exchange type") | |
120 | 120 | (getFrom2TradeWithFee >= minAmountToReceive) | |
121 | 121 | } | |
122 | 122 | ||
123 | 123 | ||
124 | 124 | @Callable(i) | |
125 | 125 | func routingTrade (exchangers,exchangersType,args1,args2,routingAssetsKeys,minAmountToReceive) = valueOrElse(isActive(), { | |
126 | 126 | let $t052895363 = $Tuple2(i.payments[0].amount, i.payments[0].assetId) | |
127 | 127 | let pmtAmount = $t052895363._1 | |
128 | 128 | let pmtAssetId = $t052895363._2 | |
129 | 129 | if (!(checkPossibility(pmtAmount, minAmountToReceive, exchangers, exchangersType, routingAssetsKeys, args1, args2))) | |
130 | 130 | then throw("Check transaction possibilty: declined") | |
131 | 131 | else if (if (!(isDefined(getString(oracle, (kPoolInOracle + exchangers[0]))))) | |
132 | 132 | then true | |
133 | 133 | else !(isDefined(getString(oracle, (kPoolInOracle + exchangers[1]))))) | |
134 | 134 | then throw("Pool is not in oracle") | |
135 | 135 | else { | |
136 | 136 | let routingSize = size(exchangers) | |
137 | 137 | func exchangeFold (accumulated,exchanger) = { | |
138 | 138 | let $t058675932 = accumulated | |
139 | 139 | let exchangeCounter = $t058675932._1 | |
140 | 140 | let amountsWithFee = $t058675932._2 | |
141 | 141 | let assetsIdSend = $t058675932._3 | |
142 | 142 | let $t059456143 = if ((exchangeCounter == 0)) | |
143 | 143 | then $Tuple2(pmtAssetId, pmtAmount) | |
144 | 144 | else $Tuple2(assetsIdSend, amountsWithFee) | |
145 | 145 | let pmtAssetIdRout = $t059456143._1 | |
146 | 146 | let pmtAmountRout = $t059456143._2 | |
147 | 147 | if (((if ((exchangeCounter >= 0)) | |
148 | 148 | then (routingSize > exchangeCounter) | |
149 | 149 | else false) == true)) | |
150 | 150 | then { | |
151 | 151 | let exchangerAddress = addressFromStringValue(exchanger) | |
152 | 152 | let inv = if ((exchangersType[exchangeCounter] == "cpmm")) | |
153 | 153 | then invoke(exchangerAddress, "exchange", [args1[exchangeCounter]], [AttachedPayment(pmtAssetIdRout, pmtAmountRout)]) | |
154 | 154 | else if ((exchangersType[exchangeCounter] == "flat")) | |
155 | 155 | then invoke(exchangerAddress, "exchange", [args1[exchangeCounter], args2[exchangeCounter]], [AttachedPayment(pmtAssetIdRout, pmtAmountRout)]) | |
156 | 156 | else throw("Incorrect exchange type") | |
157 | 157 | if ((inv == inv)) | |
158 | 158 | then match inv { | |
159 | - | case inv: (Int, ByteVector) => | |
160 | - | let $ | |
161 | - | let amountWithFee = $ | |
162 | - | let assetIdSend = $ | |
159 | + | case inv: (Int, Unit)|(Int, ByteVector) => | |
160 | + | let $t069917029 = inv | |
161 | + | let amountWithFee = $t069917029._1 | |
162 | + | let assetIdSend = $t069917029._2 | |
163 | 163 | $Tuple3((exchangeCounter + 1), amountWithFee, assetIdSend) | |
164 | 164 | case _ => | |
165 | 165 | throw("Incorrect invoke result: expected amountWithFee and assetsIdSend") | |
166 | 166 | } | |
167 | 167 | else throw("Strict value is not equal to itself.") | |
168 | 168 | } | |
169 | 169 | else accumulated | |
170 | 170 | } | |
171 | 171 | ||
172 | - | let $ | |
172 | + | let $t073097415 = { | |
173 | 173 | let $l = exchangers | |
174 | 174 | let $s = size($l) | |
175 | 175 | let $acc0 = $Tuple3(0, 0, base58'') | |
176 | 176 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
177 | 177 | then $a | |
178 | 178 | else exchangeFold($a, $l[$i]) | |
179 | 179 | ||
180 | 180 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
181 | 181 | then $a | |
182 | 182 | else throw("List size exceeds 3") | |
183 | 183 | ||
184 | 184 | $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3) | |
185 | 185 | } | |
186 | - | let exchangeCounter = $ | |
187 | - | let amountWithoutFee = $ | |
188 | - | let assetIdSend = $ | |
186 | + | let exchangeCounter = $t073097415._1 | |
187 | + | let amountWithoutFee = $t073097415._2 | |
188 | + | let assetIdSend = $t073097415._3 | |
189 | 189 | let amountWithFee = fraction(amountWithoutFee, (feeScale6 - routingFee), feeScale6) | |
190 | 190 | if (if ((exchangeCounter == routingSize)) | |
191 | 191 | then (amountWithFee >= minAmountToReceive) | |
192 | 192 | else false) | |
193 | 193 | then [ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(moneyBoxAddress, (amountWithoutFee - amountWithFee), assetIdSend)] | |
194 | 194 | else throw("routing != routingSize or amountToRecieve < minAmountToReceive") | |
195 | 195 | } | |
196 | 196 | }) | |
197 | 197 | ||
198 | 198 | ||
199 | 199 | ||
200 | 200 | @Callable(i) | |
201 | 201 | func shutdown () = valueOrElse(isAdminCall(i), if (!(active)) | |
202 | 202 | then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified"))) | |
203 | 203 | else suspend("Paused by admin")) | |
204 | 204 | ||
205 | 205 | ||
206 | 206 | ||
207 | 207 | @Callable(i) | |
208 | 208 | func activate () = valueOrElse(isAdminCall(i), if (active) | |
209 | 209 | then throwIsActive() | |
210 | 210 | else [BooleanEntry(kActive, true), DeleteEntry(kCause)]) | |
211 | 211 | ||
212 | 212 | ||
213 | 213 | @Verifier(tx) | |
214 | 214 | func verify () = { | |
215 | 215 | let multiSignedByAdmins = { | |
216 | 216 | let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1)) | |
217 | 217 | then 1 | |
218 | 218 | else 0 | |
219 | 219 | let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2)) | |
220 | 220 | then 1 | |
221 | 221 | else 0 | |
222 | 222 | let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3)) | |
223 | 223 | then 1 | |
224 | 224 | else 0 | |
225 | 225 | (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2) | |
226 | 226 | } | |
227 | 227 | match tx { | |
228 | 228 | case _ => | |
229 | 229 | multiSignedByAdmins | |
230 | 230 | } | |
231 | 231 | } | |
232 | 232 |
github/deemru/w8io/0e76f2f 112.98 ms ◑