tx · D1LXPPZNTjX4fgKEm4FJXsWs2p3gfxv3afRvrgizTxgC

3N33da2nqrqyBQgBkrpYhUVyzmS2bjZvepH:  -0.01300000 Waves

2024.08.26 12:06 [3255649] smart account 3N33da2nqrqyBQgBkrpYhUVyzmS2bjZvepH > SELF 0.00000000 Waves

{ "type": 13, "id": "D1LXPPZNTjX4fgKEm4FJXsWs2p3gfxv3afRvrgizTxgC", "fee": 1300000, "feeAssetId": null, "timestamp": 1724663261682, "version": 2, "chainId": 84, "sender": "3N33da2nqrqyBQgBkrpYhUVyzmS2bjZvepH", "senderPublicKey": "239f6DdWGZWnw9VwYUYPnK1MeEvAymD9U5pfrBYpjPLS", "proofs": [ "67abekfWmj2jiC3GmPTNTNQv9kbo1WP13PTLmkdgFnYRFAV32RLgGzzyUSaAtR8j7bAu2Jhkc5on4f2ohfBfn8VE" ], "script": "base64:BwJTCAISBgoECAgCARIECgIICBIECgIIARIECgIIBBIECgIIAhIDCgEIEgUKAwIBBBIECgICARIFCgMCAQISBQoDAhIREgQKAgIBEgQKAggYEgMKAQgYAAlzZXBhcmF0b3ICAl9fAAdjaGFpbklkCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAAhjaGFpbklkVwEBVwAQY29udHJhY3RGaWxlbmFtZQIUZnV0dXJlc19mYWN0b3J5LnJpZGUACWtNdWx0aXNpZwIMJXNfX211bHRpc2lnAQdrU3RhdHVzAgRkYXBwBHR4SWQJALkJAgkAzAgCAgolc19fc3RhdHVzCQDMCAIFBGRhcHAJAMwIAgUEdHhJZAUDbmlsBQlzZXBhcmF0b3IACWtTaHV0ZG93bgIMJXNfX3NodXRkb3duAAhzaHV0ZG93bgkBC3ZhbHVlT3JFbHNlAgkAoAgBBQlrU2h1dGRvd24HAQ92YWxpZGF0ZUFkZHJlc3MBB2FkZHJlc3MJAQlpc0RlZmluZWQBCQCmCAEFB2FkZHJlc3MBB3dyYXBFcnIBAXMJAKwCAgkArAICBRBjb250cmFjdEZpbGVuYW1lAgI6IAUBcwEIdGhyb3dFcnIBAXMJAAIBCQEHd3JhcEVycgEFAXMAEWtNYXRjaGVyUHVibGljS2V5AhQlc19fbWF0Y2hlclB1YmxpY0tleQASa0NhbGN1bGF0b3JBZGRyZXNzAhUlc19fY2FsY3VsYXRvckFkZHJlc3MAF2NhbGN1bGF0b3JBZGRyZXNzT3B0aW9uBAckbWF0Y2gwCQCdCAIFBHRoaXMFEmtDYWxjdWxhdG9yQWRkcmVzcwMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAEWNhbGN1bGF0b3JBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIFF2NhbGN1bGF0b3JBZGRyZXNzT3B0aW9uCQEHd3JhcEVycgECGmludmFsaWQgY2FsY3VsYXRvciBhZGRyZXNzAA5rQWNjb3VudFNjcmlwdAIRJXNfX2FjY291bnRTY3JpcHQADWtSZXdhcmRBbW91bnQCECVzX19yZXdhcmRBbW91bnQBC211c3RBZGRyZXNzAgFpB2FkZHJlc3MDCQAAAggFAWkGY2FsbGVyBQdhZGRyZXNzBgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQBCG11c3RUaGlzAQFpCQELbXVzdEFkZHJlc3MCBQFpBQR0aGlzAQ5tdXN0Q2FsY3VsYXRvcgEBaQkBC211c3RBZGRyZXNzAgUBaQURY2FsY3VsYXRvckFkZHJlc3MAC3dhdmVzU3RyaW5nAgVXQVZFUwANcXVldWVJdGVtU2l6ZQAgAQxwYXJzZUFzc2V0SWQBBWlucHV0AwkAAAIFBWlucHV0BQt3YXZlc1N0cmluZwUEdW5pdAkA2QQBBQVpbnB1dAEPYXNzZXRJZFRvU3RyaW5nAQVpbnB1dAMJAAACBQVpbnB1dAUEdW5pdAULd2F2ZXNTdHJpbmcJANgEAQkBBXZhbHVlAQUFaW5wdXQNAWkBBGluaXQEFGNhbGN1bGF0b3JBZGRyZXNzU3RyE21hdGNoZXJQdWJsaWNLZXlTdHINYWNjb3VudFNjcmlwdAxyZXdhcmRBbW91bnQEC2NoZWNrQ2FsbGVyCQEIbXVzdFRoaXMBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFEmtDYWxjdWxhdG9yQWRkcmVzcwUUY2FsY3VsYXRvckFkZHJlc3NTdHIJAMwIAgkBC1N0cmluZ0VudHJ5AgURa01hdGNoZXJQdWJsaWNLZXkFE21hdGNoZXJQdWJsaWNLZXlTdHIJAMwIAgkBC0JpbmFyeUVudHJ5AgUOa0FjY291bnRTY3JpcHQFDWFjY291bnRTY3JpcHQJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtSZXdhcmRBbW91bnQFDHJld2FyZEFtb3VudAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC3N0cmluZ0VudHJ5AgNrZXkDdmFsAwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUDa2V5BQN2YWwFA25pbAUDa2V5CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQxpbnRlZ2VyRW50cnkCA2tleQN2YWwDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5BQN2YWwFA25pbAUDa2V5CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQxib29sZWFuRW50cnkCA2tleQN2YWwDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUDa2V5BQN2YWwFA25pbAUDa2V5CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQtiaW5hcnlFbnRyeQIDa2V5A3ZhbAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQtCaW5hcnlFbnRyeQIFA2tleQUDdmFsBQNuaWwFA2tleQkBCHRocm93RXJyAQILbm90IGFsbG93ZWQBaQELZGVsZXRlRW50cnkBA2tleQMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQtEZWxldGVFbnRyeQEFA2tleQUDbmlsBQNrZXkJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBB3JlaXNzdWUDB2Fzc2V0SWQGYW1vdW50CnJlaXNzdWFibGUDAwkBASEBBQhzaHV0ZG93bgkBDm11c3RDYWxjdWxhdG9yAQUBaQcJAJQKAgkAzAgCCQEHUmVpc3N1ZQMFB2Fzc2V0SWQFBmFtb3VudAUKcmVpc3N1YWJsZQUDbmlsBQZhbW91bnQJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBBGJ1cm4CB2Fzc2V0SWQGYW1vdW50AwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCQCUCgIJAMwIAgkBBEJ1cm4CBQdhc3NldElkBQZhbW91bnQFA25pbAUGYW1vdW50CQEIdGhyb3dFcnIBAgtub3QgYWxsb3dlZAFpAQ10cmFuc2ZlckFzc2V0Aw5yZWNpcGllbnRCeXRlcwZhbW91bnQHYXNzZXRJZAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUOcmVjaXBpZW50Qnl0ZXMFBmFtb3VudAUHYXNzZXRJZAUDbmlsBQZhbW91bnQJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBDnRyYW5zZmVyQXNzZXRzAw5yZWNpcGllbnRCeXRlcwphc3NldHNMaXN0C2Ftb3VudHNMaXN0AwMJAQEhAQUIc2h1dGRvd24JAQ5tdXN0Q2FsY3VsYXRvcgEFAWkHCgEOYWRkTmV3VHJhbnNmZXICA2FjYwtuZXh0QXNzZXRJZAQLJHQwMzY2OTM2OTMFA2FjYwQJdHJhbnNmZXJzCAULJHQwMzY2OTM2OTMCXzEEAWoIBQskdDAzNjY5MzY5MwJfMgQLbmV3VHJhbnNmZXIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUOcmVjaXBpZW50Qnl0ZXMJAJEDAgULYW1vdW50c0xpc3QFAWoJAJEDAgUKYXNzZXRzTGlzdAUBagQQdXBkYXRlZFRyYW5zZmVycwkAzQgCBQl0cmFuc2ZlcnMFC25ld1RyYW5zZmVyCQCUCgIFEHVwZGF0ZWRUcmFuc2ZlcnMJAGQCBQFqAAEECyR0MDM5MTk0MDAwCgACJGwFCmFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ5hZGROZXdUcmFuc2ZlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQPYXNzZXRzVHJhbnNmZXJzCAULJHQwMzkxOTQwMDACXzEECl9sYXN0SW5kZXgIBQskdDAzOTE5NDAwMAJfMgkAlAoCBQ9hc3NldHNUcmFuc2ZlcnMFBHVuaXQJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBDXRyYW5zZmVyV2F2ZXMCDnJlY2lwaWVudEJ5dGVzBmFtb3VudAMDCQEBIQEFCHNodXRkb3duCQEObXVzdENhbGN1bGF0b3IBBQFpBwkAlAoCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQUOcmVjaXBpZW50Qnl0ZXMFBmFtb3VudAUEdW5pdAUDbmlsBQZhbW91bnQJAQh0aHJvd0VycgECC25vdCBhbGxvd2VkAWkBBGNhbGwCCGZ1bmN0aW9uBGFyZ3MEDWNsZWFuUGF5bWVudHMDCQAAAggFAWkPY2FsbGVyUHVibGljS2V5ASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUDbmlsCAUBaQhwYXltZW50cwQGcmVzdWx0CQD9BwQFEWNhbGN1bGF0b3JBZGRyZXNzBQhmdW5jdGlvbgkAzAgCCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAMwIAgUEYXJncwUDbmlsBQ1jbGVhblBheW1lbnRzCQCUCgIFA25pbAUGcmVzdWx0AWkBC3NldE11bHRpc2lnAQhtdWx0aXNpZwQGY2hlY2tzCQDMCAIJAQhtdXN0VGhpcwEFAWkJAMwIAgMJAQ92YWxpZGF0ZUFkZHJlc3MBBQhtdWx0aXNpZwYJAQh0aHJvd0VycgECJXNldE11bHRpc2lnOiBpbnZhbGlkIG11bHRpc2lnIGFkZHJlc3MJAMwIAgMJAQIhPQIFCG11bHRpc2lnCQClCAEFBHRoaXMGCQEIdGhyb3dFcnIBAjdzZXRNdWx0aXNpZzogZmFjdG9yeSBhZGRyZXNzIGNhbm5vdCBiZSBtdWx0aXNpZyBhZGRyZXNzBQNuaWwDCQAAAgUGY2hlY2tzBQZjaGVja3MJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQlrTXVsdGlzaWcFCG11bHRpc2lnBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABAlzaWduQ2hlY2sJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkEByRtYXRjaDAJAJ0IAgUEdGhpcwUJa011bHRpc2lnAwkAAQIFByRtYXRjaDACBlN0cmluZwQIbXVsdGlzaWcFByRtYXRjaDADAwkBAiE9AgUIbXVsdGlzaWcJAKUIAQUEdGhpcwkBD3ZhbGlkYXRlQWRkcmVzcwEFCG11bHRpc2lnBwQJc3RhdHVzS2V5CQEHa1N0YXR1cwIJAKUIAQUEdGhpcwkA2AQBCAUCdHgCaWQEBnN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBBQhtdWx0aXNpZwUJc3RhdHVzS2V5BwUGc3RhdHVzBQlzaWduQ2hlY2sFCXNpZ25DaGVja3Tt95U=", "height": 3255649, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4tpbHcBskjhu3ziBux1qYSHNeb5arGuVBbiZRLtneTaG Next: none Diff:
OldNewDifferences
213213 func setMultisig (multisig) = {
214214 let checks = [mustThis(i), if (validateAddress(multisig))
215215 then true
216- else throwErr("setMultisig: invalid multisig address")]
216+ else throwErr("setMultisig: invalid multisig address"), if ((multisig != toString(this)))
217+ then true
218+ else throwErr("setMultisig: factory address cannot be multisig address")]
217219 if ((checks == checks))
218220 then $Tuple2([StringEntry(kMultisig, multisig)], unit)
219221 else throw("Strict value is not equal to itself.")
221223
222224
223225 @Verifier(tx)
224-func verify () = match getString(kMultisig) {
225- case multisig: String =>
226- let statusKey = kStatus(toString(this), toBase58String(tx.id))
227- let status = valueOrElse(getBoolean(addressFromStringValue(multisig), statusKey), false)
228- status
229- case _ =>
230- sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
231-}
226+func verify () = {
227+ let signCheck = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
228+ match getString(this, kMultisig) {
229+ case multisig: String =>
230+ if (if ((multisig != toString(this)))
231+ then validateAddress(multisig)
232+ else false)
233+ then {
234+ let statusKey = kStatus(toString(this), toBase58String(tx.id))
235+ let status = valueOrElse(getBoolean(addressFromStringValue(multisig), statusKey), false)
236+ status
237+ }
238+ else signCheck
239+ case _ =>
240+ signCheck
241+ }
242+ }
232243
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"
1111
1212 let kMultisig = "%s__multisig"
1313
1414 func kStatus (dapp,txId) = makeString(["%s__status", dapp, txId], separator)
1515
1616
1717 let kShutdown = "%s__shutdown"
1818
1919 let shutdown = valueOrElse(getBoolean(kShutdown), false)
2020
2121 func validateAddress (address) = isDefined(addressFromString(address))
2222
2323
2424 func wrapErr (s) = ((contractFilename + ": ") + s)
2525
2626
2727 func throwErr (s) = throw(wrapErr(s))
2828
2929
3030 let kMatcherPublicKey = "%s__matcherPublicKey"
3131
3232 let kCalculatorAddress = "%s__calculatorAddress"
3333
3434 let calculatorAddressOption = match getString(this, kCalculatorAddress) {
3535 case s: String =>
3636 addressFromString(s)
3737 case _: Unit =>
3838 unit
3939 case _ =>
4040 throw("Match error")
4141 }
4242
4343 let calculatorAddress = valueOrErrorMessage(calculatorAddressOption, wrapErr("invalid calculator address"))
4444
4545 let kAccountScript = "%s__accountScript"
4646
4747 let kRewardAmount = "%s__rewardAmount"
4848
4949 func mustAddress (i,address) = if ((i.caller == address))
5050 then true
5151 else throwErr("permission denied")
5252
5353
5454 func mustThis (i) = mustAddress(i, this)
5555
5656
5757 func mustCalculator (i) = mustAddress(i, calculatorAddress)
5858
5959
6060 let wavesString = "WAVES"
6161
6262 let queueItemSize = 32
6363
6464 func parseAssetId (input) = if ((input == wavesString))
6565 then unit
6666 else fromBase58String(input)
6767
6868
6969 func assetIdToString (input) = if ((input == unit))
7070 then wavesString
7171 else toBase58String(value(input))
7272
7373
7474 @Callable(i)
7575 func init (calculatorAddressStr,matcherPublicKeyStr,accountScript,rewardAmount) = {
7676 let checkCaller = mustThis(i)
7777 if ((checkCaller == checkCaller))
7878 then $Tuple2([StringEntry(kCalculatorAddress, calculatorAddressStr), StringEntry(kMatcherPublicKey, matcherPublicKeyStr), BinaryEntry(kAccountScript, accountScript), IntegerEntry(kRewardAmount, rewardAmount)], unit)
7979 else throw("Strict value is not equal to itself.")
8080 }
8181
8282
8383
8484 @Callable(i)
8585 func stringEntry (key,val) = if (if (!(shutdown))
8686 then mustCalculator(i)
8787 else false)
8888 then $Tuple2([StringEntry(key, val)], key)
8989 else throwErr("not allowed")
9090
9191
9292
9393 @Callable(i)
9494 func integerEntry (key,val) = if (if (!(shutdown))
9595 then mustCalculator(i)
9696 else false)
9797 then $Tuple2([IntegerEntry(key, val)], key)
9898 else throwErr("not allowed")
9999
100100
101101
102102 @Callable(i)
103103 func booleanEntry (key,val) = if (if (!(shutdown))
104104 then mustCalculator(i)
105105 else false)
106106 then $Tuple2([BooleanEntry(key, val)], key)
107107 else throwErr("not allowed")
108108
109109
110110
111111 @Callable(i)
112112 func binaryEntry (key,val) = if (if (!(shutdown))
113113 then mustCalculator(i)
114114 else false)
115115 then $Tuple2([BinaryEntry(key, val)], key)
116116 else throwErr("not allowed")
117117
118118
119119
120120 @Callable(i)
121121 func deleteEntry (key) = if (if (!(shutdown))
122122 then mustCalculator(i)
123123 else false)
124124 then $Tuple2([DeleteEntry(key)], key)
125125 else throwErr("not allowed")
126126
127127
128128
129129 @Callable(i)
130130 func reissue (assetId,amount,reissuable) = if (if (!(shutdown))
131131 then mustCalculator(i)
132132 else false)
133133 then $Tuple2([Reissue(assetId, amount, reissuable)], amount)
134134 else throwErr("not allowed")
135135
136136
137137
138138 @Callable(i)
139139 func burn (assetId,amount) = if (if (!(shutdown))
140140 then mustCalculator(i)
141141 else false)
142142 then $Tuple2([Burn(assetId, amount)], amount)
143143 else throwErr("not allowed")
144144
145145
146146
147147 @Callable(i)
148148 func transferAsset (recipientBytes,amount,assetId) = if (if (!(shutdown))
149149 then mustCalculator(i)
150150 else false)
151151 then $Tuple2([ScriptTransfer(Address(recipientBytes), amount, assetId)], amount)
152152 else throwErr("not allowed")
153153
154154
155155
156156 @Callable(i)
157157 func transferAssets (recipientBytes,assetsList,amountsList) = if (if (!(shutdown))
158158 then mustCalculator(i)
159159 else false)
160160 then {
161161 func addNewTransfer (acc,nextAssetId) = {
162162 let $t036693693 = acc
163163 let transfers = $t036693693._1
164164 let j = $t036693693._2
165165 let newTransfer = ScriptTransfer(Address(recipientBytes), amountsList[j], assetsList[j])
166166 let updatedTransfers = (transfers :+ newTransfer)
167167 $Tuple2(updatedTransfers, (j + 1))
168168 }
169169
170170 let $t039194000 = {
171171 let $l = assetsList
172172 let $s = size($l)
173173 let $acc0 = $Tuple2(nil, 0)
174174 func $f0_1 ($a,$i) = if (($i >= $s))
175175 then $a
176176 else addNewTransfer($a, $l[$i])
177177
178178 func $f0_2 ($a,$i) = if (($i >= $s))
179179 then $a
180180 else throw("List size exceeds 10")
181181
182182 $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)
183183 }
184184 let assetsTransfers = $t039194000._1
185185 let _lastIndex = $t039194000._2
186186 $Tuple2(assetsTransfers, unit)
187187 }
188188 else throwErr("not allowed")
189189
190190
191191
192192 @Callable(i)
193193 func transferWaves (recipientBytes,amount) = if (if (!(shutdown))
194194 then mustCalculator(i)
195195 else false)
196196 then $Tuple2([ScriptTransfer(Address(recipientBytes), amount, unit)], amount)
197197 else throwErr("not allowed")
198198
199199
200200
201201 @Callable(i)
202202 func call (function,args) = {
203203 let cleanPayments = if ((i.callerPublicKey == base58'11111111111111111111111111111111'))
204204 then nil
205205 else i.payments
206206 let result = reentrantInvoke(calculatorAddress, function, [i.callerPublicKey, args], cleanPayments)
207207 $Tuple2(nil, result)
208208 }
209209
210210
211211
212212 @Callable(i)
213213 func setMultisig (multisig) = {
214214 let checks = [mustThis(i), if (validateAddress(multisig))
215215 then true
216- else throwErr("setMultisig: invalid multisig address")]
216+ else throwErr("setMultisig: invalid multisig address"), if ((multisig != toString(this)))
217+ then true
218+ else throwErr("setMultisig: factory address cannot be multisig address")]
217219 if ((checks == checks))
218220 then $Tuple2([StringEntry(kMultisig, multisig)], unit)
219221 else throw("Strict value is not equal to itself.")
220222 }
221223
222224
223225 @Verifier(tx)
224-func verify () = match getString(kMultisig) {
225- case multisig: String =>
226- let statusKey = kStatus(toString(this), toBase58String(tx.id))
227- let status = valueOrElse(getBoolean(addressFromStringValue(multisig), statusKey), false)
228- status
229- case _ =>
230- sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
231-}
226+func verify () = {
227+ let signCheck = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
228+ match getString(this, kMultisig) {
229+ case multisig: String =>
230+ if (if ((multisig != toString(this)))
231+ then validateAddress(multisig)
232+ else false)
233+ then {
234+ let statusKey = kStatus(toString(this), toBase58String(tx.id))
235+ let status = valueOrElse(getBoolean(addressFromStringValue(multisig), statusKey), false)
236+ status
237+ }
238+ else signCheck
239+ case _ =>
240+ signCheck
241+ }
242+ }
232243

github/deemru/w8io/03bedc9 
39.36 ms