tx · Atgvew6nHbrC47uhC9rna4ewnLKsZgApztsrZJtffgUk

3N1gYrLxKY1WTnLBxFPSAbGcBuGDFGPuREn:  -0.01000000 Waves

2024.05.14 11:48 [3105468] smart account 3N1gYrLxKY1WTnLBxFPSAbGcBuGDFGPuREn > SELF 0.00000000 Waves

{ "type": 13, "id": "Atgvew6nHbrC47uhC9rna4ewnLKsZgApztsrZJtffgUk", "fee": 1000000, "feeAssetId": null, "timestamp": 1715676492647, "version": 2, "chainId": 84, "sender": "3N1gYrLxKY1WTnLBxFPSAbGcBuGDFGPuREn", "senderPublicKey": "6eAVPQzWpDNYUvtoz6z1ksyeXMrSwfchuL2cDaB3gAwh", "proofs": [ "21Apk4VMqk36JMTmvgktWcA8ZxPWRMhqM3Vf8NeT666MeVCSnWU8m2g8Da3xpR86jKpp3qspk6K9khJzyhzi8RJD" ], "script": "base64:BwJTCAISBgoECAgCARIECgIICBIECgIIARIECgIIBBIECgIIAhIDCgEIEgUKAwIBBBIECgICARIFCgMCAQISBQoDAhIREgQKAgIBEgQKAggYEgMKAQgYAAlzZXBhcmF0b3ICAl9fAAdjaGFpbklkCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAAhjaGFpbklkVwEBVwAQY29udHJhY3RGaWxlbmFtZQIUZnV0dXJlc19mYWN0b3J5LnJpZGUACWtNdWx0aXNpZwIMJXNfX211bHRpc2lnAQdrU3RhdHVzAgRkYXBwBHR4SWQJALkJAgkAzAgCAgolc19fc3RhdHVzCQDMCAIFBGRhcHAJAMwIAgUEdHhJZAUDbmlsBQlzZXBhcmF0b3IACWtTaHV0ZG93bgIMJXNfX3NodXRkb3duAAhzaHV0ZG93bgkBC3ZhbHVlT3JFbHNlAgkAoAgBBQlrU2h1dGRvd24HAQ92YWxpZGF0ZUFkZHJlc3MBB2FkZHJlc3MJAQlpc0RlZmluZWQBCQCmCAEFB2FkZHJlc3MBB3dyYXBFcnIBAXMJAKwCAgkArAICBRBjb250cmFjdEZpbGVuYW1lAgI6IAUBcwEIdGhyb3dFcnIBAXMJAAIBCQEHd3JhcEVycgEFAXMAEWtNYXRjaGVyUHVibGljS2V5AhQlc19fbWF0Y2hlclB1YmxpY0tleQASa0NhbGN1bGF0b3JBZGRyZXNzAhUlc19fY2FsY3VsYXRvckFkZHJlc3MAF2NhbGN1bGF0b3JBZGRyZXNzT3B0aW9uBAckbWF0Y2gwCQCdCAIFBHRoaXMFEmtDYWxjdWxhdG9yQWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAEWNhbGN1bGF0b3JBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIFF2NhbGN1bGF0b3JBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECGmludmFsaWQgY2FsY3VsYXRvciBhZGRyZXNzAA5rQWNjb3VudFNjcmlwdAIRJXNfX2FjY291bnRTY3JpcHQADWtSZXdhcmRBbW91bnQCECVzX19yZXdhcmRBbW91bnQBC211c3RBZGRyZXNzAgFpB2FkZHJlc3MDCQAAAggFAWkGY2FsbGVyBQdhZGRyZXNzBgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQBCG11c3RUaGlzAQFpCQELbXVzdEFkZHJlc3MCBQFpBQR0aGlzAQ5tdXN0Q2FsY3VsYXRvcgEBaQkBC211c3RBZGRyZXNzAgUBaQURY2FsY3VsYXRvckFkZHJlc3MAC3dhdmVzU3RyaW5nAgVXQVZFUwANcXVldWVJdGVtU2l6ZQAgAQxwYXJzZUFzc2V0SWQBBWlucHV0AwkAAAIFBWlucHV0BQt3YXZlc1N0cmluZwUEdW5pdAkA2QQBBQVpbnB1dAEPYXNzZXRJZFRvU3RyaW5nAQVpbnB1dAMJAAACBQVpbnB1dAUEdW5pdAULd2F2ZXNTdHJpbmcJANgEAQkBBXZhbHVlAQUFaW5wdXQNAWkBBGluaXQEFGNhbGN1bGF0b3JBZGRyZXNzU3RyE21hdGNoZXJQdWJsaWNLZXlTdHINYWNjb3VudFNjcmlwdAxyZXdhcmRBbW91bnQEC2NoZWNrQ2FsbGVyCQEIbXVzdFRoaXMBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFEmtDYWxjdWxhdG9yQWRkcmVzcwUUY2FsY3VsYXRvckFkZHJlc3NTdHIJAMwIAgkBC1N0cmluZ0VudHJ5AgURa01hdGNoZXJQdWJsaWNLZXkFE21hdGNoZXJQdWJsaWNLZXlTdHIJAMwIAgkBC0JpbmFyeUVudHJ5AgUOa0FjY291bnRTY3JpcHQFDWFjY291bnRTY3JpcHQJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtSZXdhcmRBbW91bnQFDHJld2FyZEFtb3VudAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3N0cmluZ0VudHJ5AgNrZXkDdmFsAwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUDa2V5BQN2YWwFA25pbAUDa2V5CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQxpbnRlZ2VyRW50cnkCA2tleQN2YWwDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQN2YWwFA25pbAUDa2V5CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQxib29sZWFuRW50cnkCA2tleQN2YWwDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUDa2V5BQN2YWwFA25pbAUDa2V5CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQtiaW5hcnlFbnRyeQIDa2V5A3ZhbAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQtCaW5hcnlFbnRyeQIFA2tleQUDdmFsBQNuaWwFA2tleQkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQELZGVsZXRlRW50cnkBA2tleQMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQtEZWxldGVFbnRyeQEFA2tleQUDbmlsBQNrZXkJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBB3JlaXNzdWUDB2Fzc2V0SWQGYW1vdW50CnJlaXNzdWFibGUDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQEHUmVpc3N1ZQMFB2Fzc2V0SWQFBmFtb3VudAUKcmVpc3N1YWJsZQUDbmlsBQZhbW91bnQJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBBGJ1cm4CB2Fzc2V0SWQGYW1vdW50AwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBBEJ1cm4CBQdhc3NldElkBQZhbW91bnQFA25pbAUGYW1vdW50CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQ10cmFuc2ZlckFzc2V0Aw5yZWNpcGllbnRCeXRlcwZhbW91bnQHYXNzZXRJZAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUOcmVjaXBpZW50Qnl0ZXMFBmFtb3VudAUHYXNzZXRJZAUDbmlsBQZhbW91bnQJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBDnRyYW5zZmVyQXNzZXRzAw5yZWNpcGllbnRCeXRlcwphc3NldHNMaXN0C2Ftb3VudHNMaXN0AwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCgEOYWRkTmV3VHJhbnNmZXICA2FjYwtuZXh0QXNzZXRJZAQLJHQwMzY2OTM2OTMFA2FjYwQJdHJhbnNmZXJzCAULJHQwMzY2OTM2OTMCXzEEAWoIBQskdDAzNjY5MzY5MwJfMgQLbmV3VHJhbnNmZXIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUOcmVjaXBpZW50Qnl0ZXMJAJEDAgULYW1vdW50c0xpc3QFAWoJAJEDAgUKYXNzZXRzTGlzdAUBagQQdXBkYXRlZFRyYW5zZmVycwkAzQgCBQl0cmFuc2ZlcnMFC25ld1RyYW5zZmVyCQCUCgIFEHVwZGF0ZWRUcmFuc2ZlcnMJAGQCBQFqAAEECyR0MDM5MTk0MDAwCgACJGwFCmFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ5hZGROZXdUcmFuc2ZlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQPYXNzZXRzVHJhbnNmZXJzCAULJHQwMzkxOTQwMDACXzEECl9sYXN0SW5kZXgIBQskdDAzOTE5NDAwMAJfMgkAlAoCBQ9hc3NldHNUcmFuc2ZlcnMFBHVuaXQJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBDXRyYW5zZmVyV2F2ZXMCDnJlY2lwaWVudEJ5dGVzBmFtb3VudAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUOcmVjaXBpZW50Qnl0ZXMFBmFtb3VudAUEdW5pdAUDbmlsBQZhbW91bnQJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBBGNhbGwCCGZ1bmN0aW9uBGFyZ3MEBnJlc3VsdAkA/QcEBRFjYWxjdWxhdG9yQWRkcmVzcwUIZnVuY3Rpb24JAMwIAggFAWkPY2FsbGVyUHVibGljS2V5CQDMCAIFBGFyZ3MFA25pbAgFAWkIcGF5bWVudHMJAJQKAgUDbmlsBQZyZXN1bHQBaQELc2V0TXVsdGlzaWcBCG11bHRpc2lnBAZjaGVja3MJAMwIAgkBCG11c3RUaGlzAQUBaQkAzAgCAwkBD3ZhbGlkYXRlQWRkcmVzcwEFCG11bHRpc2lnBgkBCHRocm93RXJyAQIlc2V0TXVsdGlzaWc6IGludmFsaWQgbXVsdGlzaWcgYWRkcmVzcwUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa011bHRpc2lnBQhtdWx0aXNpZwUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAkAoggBBQlrTXVsdGlzaWcDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAhtdWx0aXNpZwUHJG1hdGNoMAQJc3RhdHVzS2V5CQEHa1N0YXR1cwIJAKUIAQUEdGhpcwkA2AQBCAUCdHgCaWQEBnN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhtdWx0aXNpZwUJc3RhdHVzS2V5BwUGc3RhdHVzCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5vF9G2Q==", "height": 3105468, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: JCRZY8Vfvc6LkBzLKKMJwkvRQYqVNZWQEy1qvNZDaS5V Next: BvkTx9Ze5yHuBRgu25y5LGjHfdGtnsASzz3jVLyQ46A Diff:
OldNewDifferences
88 let chainIdW = base58'2W'
99
1010 let contractFilename = "futures_factory.ride"
11+
12+let kMultisig = "%s__multisig"
13+
14+func kStatus (dapp,txId) = makeString(["%s__status", dapp, txId], separator)
15+
16+
17+let kShutdown = "%s__shutdown"
18+
19+let shutdown = valueOrElse(getBoolean(kShutdown), false)
20+
21+func validateAddress (address) = isDefined(addressFromString(address))
22+
1123
1224 func wrapErr (s) = ((contractFilename + ": ") + s)
1325
7082
7183
7284 @Callable(i)
73-func stringEntry (key,val) = if (mustCalculator(i))
85+func stringEntry (key,val) = if (if (!(shutdown))
86+ then mustCalculator(i)
87+ else false)
7488 then $Tuple2([StringEntry(key, val)], key)
75- else $Tuple2(nil, unit)
89+ else throwErr("not allowed")
7690
7791
7892
7993 @Callable(i)
80-func integerEntry (key,val) = if (mustCalculator(i))
94+func integerEntry (key,val) = if (if (!(shutdown))
95+ then mustCalculator(i)
96+ else false)
8197 then $Tuple2([IntegerEntry(key, val)], key)
82- else $Tuple2(nil, unit)
98+ else throwErr("not allowed")
8399
84100
85101
86102 @Callable(i)
87-func booleanEntry (key,val) = if (mustCalculator(i))
103+func booleanEntry (key,val) = if (if (!(shutdown))
104+ then mustCalculator(i)
105+ else false)
88106 then $Tuple2([BooleanEntry(key, val)], key)
89- else $Tuple2(nil, unit)
107+ else throwErr("not allowed")
90108
91109
92110
93111 @Callable(i)
94-func binaryEntry (key,val) = if (mustCalculator(i))
112+func binaryEntry (key,val) = if (if (!(shutdown))
113+ then mustCalculator(i)
114+ else false)
95115 then $Tuple2([BinaryEntry(key, val)], key)
96- else $Tuple2(nil, unit)
116+ else throwErr("not allowed")
97117
98118
99119
100120 @Callable(i)
101-func deleteEntry (key) = if (mustCalculator(i))
121+func deleteEntry (key) = if (if (!(shutdown))
122+ then mustCalculator(i)
123+ else false)
102124 then $Tuple2([DeleteEntry(key)], key)
103- else $Tuple2(nil, unit)
125+ else throwErr("not allowed")
104126
105127
106128
107129 @Callable(i)
108-func reissue (assetId,amount,reissuable) = if (mustCalculator(i))
130+func reissue (assetId,amount,reissuable) = if (if (!(shutdown))
131+ then mustCalculator(i)
132+ else false)
109133 then $Tuple2([Reissue(assetId, amount, reissuable)], amount)
110- else $Tuple2(nil, unit)
134+ else throwErr("not allowed")
111135
112136
113137
114138 @Callable(i)
115-func burn (assetId,amount) = if (mustCalculator(i))
139+func burn (assetId,amount) = if (if (!(shutdown))
140+ then mustCalculator(i)
141+ else false)
116142 then $Tuple2([Burn(assetId, amount)], amount)
117- else $Tuple2(nil, unit)
143+ else throwErr("not allowed")
118144
119145
120146
121147 @Callable(i)
122-func transferAsset (recipientBytes,amount,assetId) = if (mustCalculator(i))
148+func transferAsset (recipientBytes,amount,assetId) = if (if (!(shutdown))
149+ then mustCalculator(i)
150+ else false)
123151 then $Tuple2([ScriptTransfer(Address(recipientBytes), amount, assetId)], amount)
124- else $Tuple2(nil, unit)
152+ else throwErr("not allowed")
125153
126154
127155
128156 @Callable(i)
129-func transferAssets (recipientBytes,assetsList,amountsList) = if (mustCalculator(i))
157+func transferAssets (recipientBytes,assetsList,amountsList) = if (if (!(shutdown))
158+ then mustCalculator(i)
159+ else false)
130160 then {
131161 func addNewTransfer (acc,nextAssetId) = {
132- let $t031493173 = acc
133- let transfers = $t031493173._1
134- let j = $t031493173._2
162+ let $t036693693 = acc
163+ let transfers = $t036693693._1
164+ let j = $t036693693._2
135165 let newTransfer = ScriptTransfer(Address(recipientBytes), amountsList[j], assetsList[j])
136166 let updatedTransfers = (transfers :+ newTransfer)
137167 $Tuple2(updatedTransfers, (j + 1))
138168 }
139169
140- let $t033993480 = {
170+ let $t039194000 = {
141171 let $l = assetsList
142172 let $s = size($l)
143173 let $acc0 = $Tuple2(nil, 0)
151181
152182 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
153183 }
154- let assetsTransfers = $t033993480._1
155- let _lastIndex = $t033993480._2
184+ let assetsTransfers = $t039194000._1
185+ let _lastIndex = $t039194000._2
156186 $Tuple2(assetsTransfers, unit)
157187 }
158- else $Tuple2(nil, unit)
188+ else throwErr("not allowed")
159189
160190
161191
162192 @Callable(i)
163-func transferWaves (recipientBytes,amount) = if (mustCalculator(i))
193+func transferWaves (recipientBytes,amount) = if (if (!(shutdown))
194+ then mustCalculator(i)
195+ else false)
164196 then $Tuple2([ScriptTransfer(Address(recipientBytes), amount, unit)], amount)
165- else $Tuple2(nil, unit)
197+ else throwErr("not allowed")
166198
167199
168200
173205 }
174206
175207
208+
209+@Callable(i)
210+func setMultisig (multisig) = {
211+ let checks = [mustThis(i), if (validateAddress(multisig))
212+ then true
213+ else throwErr("setMultisig: invalid multisig address")]
214+ if ((checks == checks))
215+ then $Tuple2([StringEntry(kMultisig, multisig)], unit)
216+ else throw("Strict value is not equal to itself.")
217+ }
218+
219+
220+@Verifier(tx)
221+func verify () = match getString(kMultisig) {
222+ case multisig: String =>
223+ let statusKey = kStatus(toString(this), toBase58String(tx.id))
224+ let status = valueOrElse(getBoolean(addressFromStringValue(multisig), statusKey), false)
225+ status
226+ case _ =>
227+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
228+}
229+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 7 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let chainId = take(drop(this.bytes, 1), 1)
77
88 let chainIdW = base58'2W'
99
1010 let contractFilename = "futures_factory.ride"
11+
12+let kMultisig = "%s__multisig"
13+
14+func kStatus (dapp,txId) = makeString(["%s__status", dapp, txId], separator)
15+
16+
17+let kShutdown = "%s__shutdown"
18+
19+let shutdown = valueOrElse(getBoolean(kShutdown), false)
20+
21+func validateAddress (address) = isDefined(addressFromString(address))
22+
1123
1224 func wrapErr (s) = ((contractFilename + ": ") + s)
1325
1426
1527 func throwErr (s) = throw(wrapErr(s))
1628
1729
1830 let kMatcherPublicKey = "%s__matcherPublicKey"
1931
2032 let kCalculatorAddress = "%s__calculatorAddress"
2133
2234 let calculatorAddressOption = match getString(this, kCalculatorAddress) {
2335 case s: String =>
2436 addressFromString(s)
2537 case _: Unit =>
2638 unit
2739 case _ =>
2840 throw("Match error")
2941 }
3042
3143 let calculatorAddress = valueOrErrorMessage(calculatorAddressOption, wrapErr("invalid calculator address"))
3244
3345 let kAccountScript = "%s__accountScript"
3446
3547 let kRewardAmount = "%s__rewardAmount"
3648
3749 func mustAddress (i,address) = if ((i.caller == address))
3850 then true
3951 else throwErr("permission denied")
4052
4153
4254 func mustThis (i) = mustAddress(i, this)
4355
4456
4557 func mustCalculator (i) = mustAddress(i, calculatorAddress)
4658
4759
4860 let wavesString = "WAVES"
4961
5062 let queueItemSize = 32
5163
5264 func parseAssetId (input) = if ((input == wavesString))
5365 then unit
5466 else fromBase58String(input)
5567
5668
5769 func assetIdToString (input) = if ((input == unit))
5870 then wavesString
5971 else toBase58String(value(input))
6072
6173
6274 @Callable(i)
6375 func init (calculatorAddressStr,matcherPublicKeyStr,accountScript,rewardAmount) = {
6476 let checkCaller = mustThis(i)
6577 if ((checkCaller == checkCaller))
6678 then $Tuple2([StringEntry(kCalculatorAddress, calculatorAddressStr), StringEntry(kMatcherPublicKey, matcherPublicKeyStr), BinaryEntry(kAccountScript, accountScript), IntegerEntry(kRewardAmount, rewardAmount)], unit)
6779 else throw("Strict value is not equal to itself.")
6880 }
6981
7082
7183
7284 @Callable(i)
73-func stringEntry (key,val) = if (mustCalculator(i))
85+func stringEntry (key,val) = if (if (!(shutdown))
86+ then mustCalculator(i)
87+ else false)
7488 then $Tuple2([StringEntry(key, val)], key)
75- else $Tuple2(nil, unit)
89+ else throwErr("not allowed")
7690
7791
7892
7993 @Callable(i)
80-func integerEntry (key,val) = if (mustCalculator(i))
94+func integerEntry (key,val) = if (if (!(shutdown))
95+ then mustCalculator(i)
96+ else false)
8197 then $Tuple2([IntegerEntry(key, val)], key)
82- else $Tuple2(nil, unit)
98+ else throwErr("not allowed")
8399
84100
85101
86102 @Callable(i)
87-func booleanEntry (key,val) = if (mustCalculator(i))
103+func booleanEntry (key,val) = if (if (!(shutdown))
104+ then mustCalculator(i)
105+ else false)
88106 then $Tuple2([BooleanEntry(key, val)], key)
89- else $Tuple2(nil, unit)
107+ else throwErr("not allowed")
90108
91109
92110
93111 @Callable(i)
94-func binaryEntry (key,val) = if (mustCalculator(i))
112+func binaryEntry (key,val) = if (if (!(shutdown))
113+ then mustCalculator(i)
114+ else false)
95115 then $Tuple2([BinaryEntry(key, val)], key)
96- else $Tuple2(nil, unit)
116+ else throwErr("not allowed")
97117
98118
99119
100120 @Callable(i)
101-func deleteEntry (key) = if (mustCalculator(i))
121+func deleteEntry (key) = if (if (!(shutdown))
122+ then mustCalculator(i)
123+ else false)
102124 then $Tuple2([DeleteEntry(key)], key)
103- else $Tuple2(nil, unit)
125+ else throwErr("not allowed")
104126
105127
106128
107129 @Callable(i)
108-func reissue (assetId,amount,reissuable) = if (mustCalculator(i))
130+func reissue (assetId,amount,reissuable) = if (if (!(shutdown))
131+ then mustCalculator(i)
132+ else false)
109133 then $Tuple2([Reissue(assetId, amount, reissuable)], amount)
110- else $Tuple2(nil, unit)
134+ else throwErr("not allowed")
111135
112136
113137
114138 @Callable(i)
115-func burn (assetId,amount) = if (mustCalculator(i))
139+func burn (assetId,amount) = if (if (!(shutdown))
140+ then mustCalculator(i)
141+ else false)
116142 then $Tuple2([Burn(assetId, amount)], amount)
117- else $Tuple2(nil, unit)
143+ else throwErr("not allowed")
118144
119145
120146
121147 @Callable(i)
122-func transferAsset (recipientBytes,amount,assetId) = if (mustCalculator(i))
148+func transferAsset (recipientBytes,amount,assetId) = if (if (!(shutdown))
149+ then mustCalculator(i)
150+ else false)
123151 then $Tuple2([ScriptTransfer(Address(recipientBytes), amount, assetId)], amount)
124- else $Tuple2(nil, unit)
152+ else throwErr("not allowed")
125153
126154
127155
128156 @Callable(i)
129-func transferAssets (recipientBytes,assetsList,amountsList) = if (mustCalculator(i))
157+func transferAssets (recipientBytes,assetsList,amountsList) = if (if (!(shutdown))
158+ then mustCalculator(i)
159+ else false)
130160 then {
131161 func addNewTransfer (acc,nextAssetId) = {
132- let $t031493173 = acc
133- let transfers = $t031493173._1
134- let j = $t031493173._2
162+ let $t036693693 = acc
163+ let transfers = $t036693693._1
164+ let j = $t036693693._2
135165 let newTransfer = ScriptTransfer(Address(recipientBytes), amountsList[j], assetsList[j])
136166 let updatedTransfers = (transfers :+ newTransfer)
137167 $Tuple2(updatedTransfers, (j + 1))
138168 }
139169
140- let $t033993480 = {
170+ let $t039194000 = {
141171 let $l = assetsList
142172 let $s = size($l)
143173 let $acc0 = $Tuple2(nil, 0)
144174 func $f0_1 ($a,$i) = if (($i >= $s))
145175 then $a
146176 else addNewTransfer($a, $l[$i])
147177
148178 func $f0_2 ($a,$i) = if (($i >= $s))
149179 then $a
150180 else throw("List size exceeds 10")
151181
152182 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
153183 }
154- let assetsTransfers = $t033993480._1
155- let _lastIndex = $t033993480._2
184+ let assetsTransfers = $t039194000._1
185+ let _lastIndex = $t039194000._2
156186 $Tuple2(assetsTransfers, unit)
157187 }
158- else $Tuple2(nil, unit)
188+ else throwErr("not allowed")
159189
160190
161191
162192 @Callable(i)
163-func transferWaves (recipientBytes,amount) = if (mustCalculator(i))
193+func transferWaves (recipientBytes,amount) = if (if (!(shutdown))
194+ then mustCalculator(i)
195+ else false)
164196 then $Tuple2([ScriptTransfer(Address(recipientBytes), amount, unit)], amount)
165- else $Tuple2(nil, unit)
197+ else throwErr("not allowed")
166198
167199
168200
169201 @Callable(i)
170202 func call (function,args) = {
171203 let result = reentrantInvoke(calculatorAddress, function, [i.callerPublicKey, args], i.payments)
172204 $Tuple2(nil, result)
173205 }
174206
175207
208+
209+@Callable(i)
210+func setMultisig (multisig) = {
211+ let checks = [mustThis(i), if (validateAddress(multisig))
212+ then true
213+ else throwErr("setMultisig: invalid multisig address")]
214+ if ((checks == checks))
215+ then $Tuple2([StringEntry(kMultisig, multisig)], unit)
216+ else throw("Strict value is not equal to itself.")
217+ }
218+
219+
220+@Verifier(tx)
221+func verify () = match getString(kMultisig) {
222+ case multisig: String =>
223+ let statusKey = kStatus(toString(this), toBase58String(tx.id))
224+ let status = valueOrElse(getBoolean(addressFromStringValue(multisig), statusKey), false)
225+ status
226+ case _ =>
227+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
228+}
229+

github/deemru/w8io/c3f4982 
43.94 ms