tx · 3XQTdkT9vwstyExYtVmb4X6CNQ9ENdDo61WLcryyndAC

3N8kB3UEjWWvTRBtGpGUErAevaK2q6u2eCM:  -0.01000000 Waves

2023.11.02 12:38 [2825548] smart account 3N8kB3UEjWWvTRBtGpGUErAevaK2q6u2eCM > SELF 0.00000000 Waves

{ "type": 13, "id": "3XQTdkT9vwstyExYtVmb4X6CNQ9ENdDo61WLcryyndAC", "fee": 1000000, "feeAssetId": null, "timestamp": 1698917936940, "version": 2, "chainId": 84, "sender": "3N8kB3UEjWWvTRBtGpGUErAevaK2q6u2eCM", "senderPublicKey": "6ybktvseycJDGHTjJm3tz9iT2SKaTNtLLCZsJZRemtoM", "proofs": [ "36gK1aAdkLH2kMrR4nQe97oPVWHVmkbhEc4jCYmtUmX2G7X3vPTdHYvRHiQGrDcgWc4AJEhE18Vn2yxdqCjAKJHa" ], "script": "base64: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dE51bGxpZmllcktleQEJbnVsbGlmaWVyCQCsAgICAk46CQDYBAEFCW51bGxpZmllcgENZ2V0RGVwb3NpdEtleQEHYWRkcmVzcwkArAICAgJEOgkA2AQBBQdhZGRyZXNzAAxwb29sSW5kZXhLZXkCCVBvb2xJbmRleAASYWxsTWVzc2FnZXNIYXNoS2V5Ag9BbGxNZXNzYWdlc0hhc2gAC29wZXJhdG9yS2V5AgpPcGVyYXRvclBrAQd0YWtlRXh0AwF2BGZyb20CdG8JAMoBAgkAyQECBQF2BQJ0bwUEZnJvbQEMc3BlbmREZXBvc2l0AgdhZGRyZXNzBmFtb3VudAQKY3VycmVudEtleQkBDWdldERlcG9zaXRLZXkBCAUHYWRkcmVzcwVieXRlcwQNY3VycmVudEFtb3VudAQHJG1hdGNoMAkAnwgBBQpjdXJyZW50S2V5AwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAABAluZXdBbW91bnQJAGUCBQ1jdXJyZW50QW1vdW50BQZhbW91bnQDCQBmAgAABQZhbW91bnQJAAIBAhtDYW4ndCBzcGVuZCBuZWdhdGl2ZSBhbW91bnQDCQBmAgAABQluZXdBbW91bnQJAAIBAhJOb3QgZW5vdWdoIGJhbGFuY2UJAMwIAgkBDEludGVnZXJFbnRyeQIFCmN1cnJlbnRLZXkFCW5ld0Ftb3VudAUDbmlsAQ1nZXRPcGVyYXRvclBrAAQHJG1hdGNoMAkAoQgBBQtvcGVyYXRvcktleQMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAFhBQckbWF0Y2gwBQFhBQdvd25lclBrBAFpAQ1zZXRPcGVyYXRvclBrAQJwawMJAQIhPQIJAMgBAQUCcGsAIAkAAgECKU9wZXJhdG9yIHB1YmxpYyBrZXkgbXVzdCBiZSAzMiBieXRlcyBsb25nCQDMCAIJAQtCaW5hcnlFbnRyeQIFC29wZXJhdG9yS2V5BQJwawUDbmlsAWkBB2RlcG9zaXQABANwbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAMJAQlpc0RlZmluZWQBCAUDcG10B2Fzc2V0SWQJAAIBAiNPbmx5IFdBVkVTIGlzIGFsbG93ZWQgYXQgdGhlIG1vbWVudAQKY3VycmVudEtleQkBDWdldERlcG9zaXRLZXkBCAgFAWkGY2FsbGVyBWJ5dGVzBA1jdXJyZW50QW1vdW50BAckbWF0Y2gwCQCaCAIFBHRoaXMFCmN1cnJlbnRLZXkDCQABAgUHJG1hdGNoMAIDSW50BAFhBQckbWF0Y2gwBQFhAAAECW5ld0Ftb3VudAkAZAIFDWN1cnJlbnRBbW91bnQIBQNwbXQGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQpjdXJyZW50S2V5BQluZXdBbW91bnQFA25pbAFpAQh3aXRoZHJhdwEGYW1vdW50BApjdXJyZW50S2V5CQENZ2V0RGVwb3NpdEtleQEICAUBaQZjYWxsZXIFYnl0ZXMEDWN1cnJlbnRBbW91bnQEByRtYXRjaDAJAJoIAgUEdGhpcwUKY3VycmVudEtleQMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQJbmV3QW1vdW50CQBlAgUNY3VycmVudEFtb3VudAUGYW1vdW50AwkAZgIAAAUGYW1vdW50CQACAQIeQ2FuJ3Qgd2l0aGRyYXcgbmVnYXRpdmUgYW1vdW50AwkAZgIAAAUJbmV3QW1vdW50CQACAQISTm90IGVub3VnaCBiYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQpjdXJyZW50S2V5BQluZXdBbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQZhbW91bnQFBHVuaXQFA25pbAFpAQh0cmFuc2FjdAECdHgECm9wZXJhdG9yUGsJAQ1nZXRPcGVyYXRvclBrAAQPb3BlcmF0b3JBZGRyZXNzCQCnCAEFCm9wZXJhdG9yUGsECW51bGxpZmllcgkBB3Rha2VFeHQDBQJ0eAAAACAECW91dENvbW1pdAkBB3Rha2VFeHQDBQJ0eAAgAEAEB2Fzc2V0SWQJAQd0YWtlRXh0AwUCdHgAQABgBAVkZWx0YQkBB3Rha2VFeHQDBQJ0eABgAIABBAxuYXRpdmVBbW91bnQJALEJAQkBB3Rha2VFeHQDBQVkZWx0YQAAAAgEDG5hdGl2ZUVuZXJneQkAsQkBCQEHdGFrZUV4dAMFBWRlbHRhAAgAFgQHdHhJbmRleAkAsQkBCQEHdGFrZUV4dAMFBWRlbHRhABYAHAQHX3Bvb2xJZAkBB3Rha2VFeHQDBQVkZWx0YQAcAB8EB3R4UHJvb2YJAQd0YWtlRXh0AwUCdHgAgAEAgAMECXRyZWVQcm9vZgkBB3Rha2VFeHQDBQJ0eACAAwCABQQJcm9vdEFmdGVyCQEHdGFrZUV4dAMFAnR4AIAFAKAFBAZ0eFR5cGUJALEJAQkBB3Rha2VFeHQDBQJ0eACgBQCiBQQLJHQwNjAzOTY0MDEDCQAAAgUGdHhUeXBlAAAED2RlcG9zaXREYXRhU2l6ZQkAZAIAIABABAlkZXBvc2l0UGsJAM0BAgkAzAECBQJ0eAUPZGVwb3NpdERhdGFTaXplAEAEEGRlcG9zaXRTaWduYXR1cmUJAMwBAgUCdHgAQAkAlQoDCQEHdGFrZUV4dAMFAnR4AKIFCQBlAgkAyAEBBQJ0eAUPZGVwb3NpdERhdGFTaXplBQlkZXBvc2l0UGsFEGRlcG9zaXRTaWduYXR1cmUJAJUKAwkBB3Rha2VFeHQDBQJ0eACiBQkAyAEBBQJ0eAUEdW5pdAUEdW5pdAQEbWVtbwgFCyR0MDYwMzk2NDAxAl8xBAlkZXBvc2l0UGsIBQskdDA2MDM5NjQwMQJfMgQQZGVwb3NpdFNpZ25hdHVyZQgFCyR0MDYwMzk2NDAxAl8zBANmZWUJALEJAQkBB3Rha2VFeHQDBQRtZW1vAAAACAQPYWxsTWVzc2FnZXNIYXNoCQELdmFsdWVPckVsc2UCCQChCAEFEmFsbE1lc3NhZ2VzSGFzaEtleQkAnQMBCQC2AgEAAAQIbWVtb0hhc2gJAPUDAQUEbWVtbwQGaGFzaGVzCQDLAQIFD2FsbE1lc3NhZ2VzSGFzaAUIbWVtb0hhc2gEEm5ld0FsbE1lc3NhZ2VzSGFzaAkA9QMBBQZoYXNoZXMECnJvb3RCZWZvcmUJAQt2YWx1ZU9yRWxzZQIJAKEIAQkBCmdldFJvb3RLZXkBBQd0eEluZGV4BQtpbml0aWFsUm9vdAMJAAACBQpyb290QmVmb3JlBQpyb290QmVmb3JlBAlwb29sSW5kZXgJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUMcG9vbEluZGV4S2V5AAAECHBvb2xSb290CQELdmFsdWVPckVsc2UCCQChCAEJAQpnZXRSb290S2V5AQUJcG9vbEluZGV4BQtpbml0aWFsUm9vdAQPbnVsbGlmaWVyRXhpc3RzBAckbWF0Y2gwCQChCAEJAQ9nZXROdWxsaWZpZXJLZXkBBQludWxsaWZpZXIDCQABAgUHJG1hdGNoMAIEVW5pdAQBYQUHJG1hdGNoMAcGBA50cmFuc2ZlcklucHV0cwkAywECCQDLAQIJAMsBAgkAywECBQhtZW1vSGFzaAUJbnVsbGlmaWVyBQlvdXRDb21taXQFBWRlbHRhBQhtZW1vSGFzaAQKdHJlZUlucHV0cwkAywECCQDLAQIFCHBvb2xSb290BQlyb290QWZ0ZXIFCW91dENvbW1pdAQHZGF0YU9wcwkAzAgCCQELQmluYXJ5RW50cnkCCQEKZ2V0Um9vdEtleQEFB3R4SW5kZXgFCXJvb3RBZnRlcgkAzAgCCQELQmluYXJ5RW50cnkCCQEPZ2V0TnVsbGlmaWVyS2V5AQUJbnVsbGlmaWVyCQD1AwEJAMsBAgUJb3V0Q29tbWl0BQVkZWx0YQkAzAgCCQEMSW50ZWdlckVudHJ5AgUMcG9vbEluZGV4S2V5CQBkAgUJcG9vbEluZGV4AIABCQDMCAIJAQtCaW5hcnlFbnRyeQIFEmFsbE1lc3NhZ2VzSGFzaEtleQUSbmV3QWxsTWVzc2FnZXNIYXNoBQNuaWwEBXR4T3BzBAckbWF0Y2gwBQZ0eFR5cGUDCQAAAgAABQckbWF0Y2gwBA5kZXBvc2l0UGtWYWx1ZQkBBXZhbHVlAQUJZGVwb3NpdFBrBA5kZXBvc2l0QWRkcmVzcwkApwgBBQ5kZXBvc2l0UGtWYWx1ZQMJAGYCAAAFDG5hdGl2ZUFtb3VudAkAAgECHUNhbid0IGRlcG9zaXQgbmVnYXRpdmUgYW1vdW50AwkBASEBCQDEEwMJAMsBAgUJbnVsbGlmaWVyBQ5kZXBvc2l0UGtWYWx1ZQkBBXZhbHVlAQUQZGVwb3NpdFNpZ25hdHVyZQUOZGVwb3NpdFBrVmFsdWUJAAIBAhlJbnZhbGlkIGRlcG9zaXQgc2lnbmF0dXJlCQEMc3BlbmREZXBvc2l0AgUOZGVwb3NpdEFkZHJlc3MJAGgCBQxuYXRpdmVBbW91bnQFC2Rlbm9taW5hdG9yAwkAAAIAAQUHJG1hdGNoMAMJAQIhPQIFDG5hdGl2ZUFtb3VudAAACQACAQIoTmF0aXZlIGFtb3VudCBtdXN0IGJlIHplcm8gZm9yIHRyYW5zZmVycwUDbmlsAwkAAAIAAgUHJG1hdGNoMAQOd2l0aGRyYXdBbW91bnQJAGgCCQCxCQEJAQd0YWtlRXh0AwUEbWVtbwAIABAFC2Rlbm9taW5hdG9yAwkAZgIFDndpdGhkcmF3QW1vdW50AAAJAAIBAiBXaXRoZHJhdyBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAQEtAQUOd2l0aGRyYXdBbW91bnQFBHVuaXQFA25pbAkAAgECD1Vua25vd24gdHggdHlwZQQGZmVlT3BzAwkAZgIFA2ZlZQAABAh0b3RhbEZlZQkAaAIFA2ZlZQULZGVub21pbmF0b3IJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPb3BlcmF0b3JBZGRyZXNzBQNmZWUFBHVuaXQFA25pbAUDbmlsAwkAZgIFB3R4SW5kZXgFCXBvb2xJbmRleAkAAgECGUludmFsaWQgdHJhbnNhY3Rpb24gaW5kZXgDCQEBIQEJAJYTAwUKdHJhbnNmZXJWawUHdHhQcm9vZgUOdHJhbnNmZXJJbnB1dHMJAAIBAhNUeCBwcm9vZiBpcyBpbnZhbGlkAwkBASEBCQCUEwMFBnRyZWVWawUJdHJlZVByb29mBQp0cmVlSW5wdXRzCQACAQIVVHJlZSBwcm9vZiBpcyBpbnZhbGlkAwUPbnVsbGlmaWVyRXhpc3RzCQACAQIMRG91YmxlIHNwZW5kCQDOCAIJAM4IAgUFdHhPcHMFB2RhdGFPcHMFBmZlZU9wcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACFFNldFNjcmlwdFRyYW5zYWN0aW9uBAFkBQckbWF0Y2gwCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQdvd25lclBrAwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBAFkBQckbWF0Y2gwBAckbWF0Y2gxCAUBZAhmdW5jdGlvbgMJAAACAg1zZXRPcGVyYXRvclBrBQckbWF0Y2gxCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQdvd25lclBrAwkAAAICCHRyYW5zYWN0BQckbWF0Y2gxBApvcGVyYXRvclBrCQENZ2V0T3BlcmF0b3JQawAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCm9wZXJhdG9yUGsJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkHFmmpng==", "height": 2825548, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6VnwRiznJbm2wm3FFpwUmQi9fN8Bo25so8dhNKFFaoJo Next: 9bgCno2uV9NBNaan1MSRAjVzoY9Yidpe6MKPf2XUEbae Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let operatorPk = base58'6ybktvseycJDGHTjJm3tz9iT2SKaTNtLLCZsJZRemtoM'
5-
6-let operatorAddress = addressFromPublicKey(operatorPk)
4+let ownerPk = base58'6ybktvseycJDGHTjJm3tz9iT2SKaTNtLLCZsJZRemtoM'
75
86 let denominator = 100000000
97
2624
2725 let allMessagesHashKey = "AllMessagesHash"
2826
27+let operatorKey = "OperatorPk"
28+
2929 func takeExt (v,from,to) = drop(take(v, to), from)
3030
3131
4444 then throw("Not enough balance")
4545 else [IntegerEntry(currentKey, newAmount)]
4646 }
47+
48+
49+func getOperatorPk () = match getBinary(operatorKey) {
50+ case a: ByteVector =>
51+ a
52+ case _ =>
53+ ownerPk
54+}
55+
56+
57+@Callable(i)
58+func setOperatorPk (pk) = if ((size(pk) != 32))
59+ then throw("Operator public key must be 32 bytes long")
60+ else [BinaryEntry(operatorKey, pk)]
61+
4762
4863
4964 @Callable(i)
87102
88103 @Callable(i)
89104 func transact (tx) = {
105+ let operatorPk = getOperatorPk()
106+ let operatorAddress = addressFromPublicKey(operatorPk)
90107 let nullifier = takeExt(tx, 0, 32)
91108 let outCommit = takeExt(tx, 32, 64)
92109 let assetId = takeExt(tx, 64, 96)
99116 let treeProof = takeExt(tx, 384, 640)
100117 let rootAfter = takeExt(tx, 640, 672)
101118 let txType = toInt(takeExt(tx, 672, 674))
102- let $t056566018 = if ((txType == 0))
119+ let $t060396401 = if ((txType == 0))
103120 then {
104121 let depositDataSize = (32 + 64)
105122 let depositPk = dropRight(takeRight(tx, depositDataSize), 64)
107124 $Tuple3(takeExt(tx, 674, (size(tx) - depositDataSize)), depositPk, depositSignature)
108125 }
109126 else $Tuple3(takeExt(tx, 674, size(tx)), unit, unit)
110- let memo = $t056566018._1
111- let depositPk = $t056566018._2
112- let depositSignature = $t056566018._3
127+ let memo = $t060396401._1
128+ let depositPk = $t060396401._2
129+ let depositSignature = $t060396401._3
113130 let fee = toInt(takeExt(memo, 0, 8))
114131 let allMessagesHash = valueOrElse(getBinary(allMessagesHashKey), toBytes(toBigInt(0)))
115132 let memoHash = keccak256(memo)
161178 }
162179 else nil
163180 if ((txIndex > poolIndex))
164- then throw("Transaction index is too big")
181+ then throw("Invalid transaction index")
165182 else if (!(bn256Groth16Verify_5inputs(transferVk, txProof, transferInputs)))
166183 then throw("Tx proof is invalid")
167184 else if (!(bn256Groth16Verify_3inputs(treeVk, treeProof, treeInputs)))
177194 @Verifier(tx)
178195 func verify () = match tx {
179196 case d: SetScriptTransaction =>
180- sigVerify(tx.bodyBytes, tx.proofs[0], operatorPk)
197+ sigVerify(tx.bodyBytes, tx.proofs[0], ownerPk)
198+ case d: InvokeScriptTransaction =>
199+ match d.function {
200+ case _ =>
201+ if (("setOperatorPk" == $match1))
202+ then sigVerify(tx.bodyBytes, tx.proofs[0], ownerPk)
203+ else if (("transact" == $match1))
204+ then {
205+ let operatorPk = getOperatorPk()
206+ sigVerify(tx.bodyBytes, tx.proofs[0], operatorPk)
207+ }
208+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
209+ }
181210 case _ =>
182211 false
183212 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let operatorPk = base58'6ybktvseycJDGHTjJm3tz9iT2SKaTNtLLCZsJZRemtoM'
5-
6-let operatorAddress = addressFromPublicKey(operatorPk)
4+let ownerPk = base58'6ybktvseycJDGHTjJm3tz9iT2SKaTNtLLCZsJZRemtoM'
75
86 let denominator = 100000000
97
108 let transferVk = base64'SYrHhkeDrw+dFMD6Yr/Vrvr2pPyDHCWoMO8w9LxFaQABrVkxqK1PRfgZw0t9bDNsxFEJNHhErc9XHTkkU1OiEYYWiz2VdqW6jQewS86Z3lshxW6Fdf1MU0MDPt1NoikSf2YEIBvI+gscAfqmtvJxZbkVA/Lrr7r+HyVUoZGt1QB46Zv9umeZBwmTWiDHaLPPgOVOWQAVYLMCwpEzEzIdF2C8KzI/CsCeCv3raf56RXmhFAWuJCbMtO6My12PxFQDRv98IWP0FGhY/m6sQ/9r58GInq4bSVYWKlGucbXbayaYF35Fp3o6VaRXVWzJ6FesrH8dS+DxeadscnAN4IQEB4J5YcwZvAX/fjE5JEHNC4WrNfiUe+fe6FAQ4ttHlRgKS+PbN1butH1dDkfQkBKC5Om0WI3D45eaRbN6Taxt7ha5xCUwGVh0LQ+Wf/j9bY+un1Cwur9wx+HmB6PPGC2pEFLSQhkZjtvNJTs6e1c0i3FAOhFDSNqEjcqORSer2aUGdJMXhB6YEv/XcumUDyQbem+f0wX2qOgtwVFLtGOq7S65sHzNcHpdJP/htHnhqkQErwmjDG/JTs9oc1mu5jOsGAYAAAAovMt7vHGhKq+EA+6JlSFfVMj7aU/V67EpBI64f73xJKTpnqCOEMhaQMegFHTJ/W5Cp9iTd4i3AqnoTQj+L1UOXKmddpvHhg0WJHFbosaPhv8EY7+cAaHmn1JPO30BBRPqTsN53lfykgE2oF9vGPyU4u0Y3Oh8YG2p7I2Oz+NaKkzrJo2SamjhbLOofkEX14HbjdZLWD5T07/J4qfaYb8Eervvcr/H2IS0GJ7UFTdqJGwWa/1IZZF6RN8rj5y8xg2BoioqwyhpS3I7gROorvBg6hMSFh4eYXROfzISFgWiF5eouqLDFV3P8geZwxSRDnzOaDyCe3Y7EaxhPBjHbtYA/DLJnfWLC6H6AnAA+fLxTZHjtEL/7Mcc+8MYPzH1mAf9gA0UiXxfzFWLSiAzWDBF+Uzpxn2XO25DNREAiZeYIHqYaq6iaMlcNtk5iiSMm+aO6VPqh1tuPoIND/ry5aALN3TlgjnOoDOTGpJIlakKGfGnRHaM/Jd0vbiJ723UUAM='
119
1210 let treeVk = base64'qGBPhudr70q2hdpdMHxxPVdk+MJDazUwWbBTl+eJCx/zUEagbSAhrTUc40Jajsexh+ThMSv1ZlKhNgbjvc8GFwfScaiOtcM0fDjNcUeChr2NpgbQV+y4XTvC8sjwVXEareR6FvrGlyEdKcFx+vIagiT77lQ3MK/EfxwlNHsEdAy0sWThEjpDykFPiYWG6T5IJWIGtdhrcPdePYv1GX0wCakWmTMh9NWYby1erGRPnDxWxeFcOBN4DPhkSQKg/DMH1LkY/GlCqIdfdX5Mr+0CMQWnmr8oECA5QgeOJ1ZnSQmO18Jg9rclNx9mhqD3iux0b+o293HkYg4d75ZOBeUqLdx63/eIe/VEuwIkGFBs4sU9WHEsdqpx8QKpByl6ZKgiOcx/wrW0cwTvm34cq5pRVGunz+qu90se2PqAjOjiIRoDvrcCR7qlN0iTvBedZRTlOtbOxAiXOb/nwFrsmf8wFiebpKkjbNkNvTiLGRiea53xusmuNwANOZtfYMT03Kwf1bgRFrkM6TqgEVZq1Vl7wjFhGu3CFrk5popRZ0X8zhJqn5IPLt6g/0ImUPee8frB6VtMYYkmQ7ZCWTwKEPGDIgQAAACMoBtyPY40yogNVj5bF/LbEe5QGKZjwyfMj58AY5ocK00CEsC3Nm1wSKR6xi8NSbjhPZRw0/zChVK9K8ceAO4ijNFpOFuOpTO6aEq0o7spO/E0JTwTStxF0jdD9NCydSTLZi4DdtHHkcph4Sao8AwV4qd50wavb0/hxCXkVWTvErgnIWCgjrfgzQBDfa99z0alUbwyBBd8odwfJU7bERsH/SfhNempxiwEU1uq6TPQ2NxgN3fgXo5i9dHrSaI2ZQd7R9hyJVeMlBaz6uP4gS1XYlt5LkT+TFGT/vidKlcMHQx945x1Iivq728eKgJ4aBI5Ja1nxj7QC7d98xukukQl'
1311
1412 let initialRoot = toBytes(parseBigIntValue("11469701942666298368112882412133877458305516134926649826543144744382391691533"))
1513
1614 func getRootKey (index) = ("R:" + toString(index))
1715
1816
1917 func getNullifierKey (nullifier) = ("N:" + toBase58String(nullifier))
2018
2119
2220 func getDepositKey (address) = ("D:" + toBase58String(address))
2321
2422
2523 let poolIndexKey = "PoolIndex"
2624
2725 let allMessagesHashKey = "AllMessagesHash"
2826
27+let operatorKey = "OperatorPk"
28+
2929 func takeExt (v,from,to) = drop(take(v, to), from)
3030
3131
3232 func spendDeposit (address,amount) = {
3333 let currentKey = getDepositKey(address.bytes)
3434 let currentAmount = match getInteger(currentKey) {
3535 case a: Int =>
3636 a
3737 case _ =>
3838 0
3939 }
4040 let newAmount = (currentAmount - amount)
4141 if ((0 > amount))
4242 then throw("Can't spend negative amount")
4343 else if ((0 > newAmount))
4444 then throw("Not enough balance")
4545 else [IntegerEntry(currentKey, newAmount)]
4646 }
47+
48+
49+func getOperatorPk () = match getBinary(operatorKey) {
50+ case a: ByteVector =>
51+ a
52+ case _ =>
53+ ownerPk
54+}
55+
56+
57+@Callable(i)
58+func setOperatorPk (pk) = if ((size(pk) != 32))
59+ then throw("Operator public key must be 32 bytes long")
60+ else [BinaryEntry(operatorKey, pk)]
61+
4762
4863
4964 @Callable(i)
5065 func deposit () = {
5166 let pmt = value(i.payments[0])
5267 if (isDefined(pmt.assetId))
5368 then throw("Only WAVES is allowed at the moment")
5469 else {
5570 let currentKey = getDepositKey(i.caller.bytes)
5671 let currentAmount = match getInteger(this, currentKey) {
5772 case a: Int =>
5873 a
5974 case _ =>
6075 0
6176 }
6277 let newAmount = (currentAmount + pmt.amount)
6378 [IntegerEntry(currentKey, newAmount)]
6479 }
6580 }
6681
6782
6883
6984 @Callable(i)
7085 func withdraw (amount) = {
7186 let currentKey = getDepositKey(i.caller.bytes)
7287 let currentAmount = match getInteger(this, currentKey) {
7388 case a: Int =>
7489 a
7590 case _ =>
7691 0
7792 }
7893 let newAmount = (currentAmount - amount)
7994 if ((0 > amount))
8095 then throw("Can't withdraw negative amount")
8196 else if ((0 > newAmount))
8297 then throw("Not enough balance")
8398 else [IntegerEntry(currentKey, newAmount), ScriptTransfer(i.caller, amount, unit)]
8499 }
85100
86101
87102
88103 @Callable(i)
89104 func transact (tx) = {
105+ let operatorPk = getOperatorPk()
106+ let operatorAddress = addressFromPublicKey(operatorPk)
90107 let nullifier = takeExt(tx, 0, 32)
91108 let outCommit = takeExt(tx, 32, 64)
92109 let assetId = takeExt(tx, 64, 96)
93110 let delta = takeExt(tx, 96, 128)
94111 let nativeAmount = toInt(takeExt(delta, 0, 8))
95112 let nativeEnergy = toInt(takeExt(delta, 8, 22))
96113 let txIndex = toInt(takeExt(delta, 22, 28))
97114 let _poolId = takeExt(delta, 28, 31)
98115 let txProof = takeExt(tx, 128, 384)
99116 let treeProof = takeExt(tx, 384, 640)
100117 let rootAfter = takeExt(tx, 640, 672)
101118 let txType = toInt(takeExt(tx, 672, 674))
102- let $t056566018 = if ((txType == 0))
119+ let $t060396401 = if ((txType == 0))
103120 then {
104121 let depositDataSize = (32 + 64)
105122 let depositPk = dropRight(takeRight(tx, depositDataSize), 64)
106123 let depositSignature = takeRight(tx, 64)
107124 $Tuple3(takeExt(tx, 674, (size(tx) - depositDataSize)), depositPk, depositSignature)
108125 }
109126 else $Tuple3(takeExt(tx, 674, size(tx)), unit, unit)
110- let memo = $t056566018._1
111- let depositPk = $t056566018._2
112- let depositSignature = $t056566018._3
127+ let memo = $t060396401._1
128+ let depositPk = $t060396401._2
129+ let depositSignature = $t060396401._3
113130 let fee = toInt(takeExt(memo, 0, 8))
114131 let allMessagesHash = valueOrElse(getBinary(allMessagesHashKey), toBytes(toBigInt(0)))
115132 let memoHash = keccak256(memo)
116133 let hashes = (allMessagesHash + memoHash)
117134 let newAllMessagesHash = keccak256(hashes)
118135 let rootBefore = valueOrElse(getBinary(getRootKey(txIndex)), initialRoot)
119136 if ((rootBefore == rootBefore))
120137 then {
121138 let poolIndex = valueOrElse(getInteger(poolIndexKey), 0)
122139 let poolRoot = valueOrElse(getBinary(getRootKey(poolIndex)), initialRoot)
123140 let nullifierExists = match getBinary(getNullifierKey(nullifier)) {
124141 case a: Unit =>
125142 false
126143 case _ =>
127144 true
128145 }
129146 let transferInputs = ((((memoHash + nullifier) + outCommit) + delta) + memoHash)
130147 let treeInputs = ((poolRoot + rootAfter) + outCommit)
131148 let dataOps = [BinaryEntry(getRootKey(txIndex), rootAfter), BinaryEntry(getNullifierKey(nullifier), keccak256((outCommit + delta))), IntegerEntry(poolIndexKey, (poolIndex + 128)), BinaryEntry(allMessagesHashKey, newAllMessagesHash)]
132149 let txOps = match txType {
133150 case _ =>
134151 if ((0 == $match0))
135152 then {
136153 let depositPkValue = value(depositPk)
137154 let depositAddress = addressFromPublicKey(depositPkValue)
138155 if ((0 > nativeAmount))
139156 then throw("Can't deposit negative amount")
140157 else if (!(sigVerify_8Kb((nullifier + depositPkValue), value(depositSignature), depositPkValue)))
141158 then throw("Invalid deposit signature")
142159 else spendDeposit(depositAddress, (nativeAmount * denominator))
143160 }
144161 else if ((1 == $match0))
145162 then if ((nativeAmount != 0))
146163 then throw("Native amount must be zero for transfers")
147164 else nil
148165 else if ((2 == $match0))
149166 then {
150167 let withdrawAmount = (toInt(takeExt(memo, 8, 16)) * denominator)
151168 if ((withdrawAmount > 0))
152169 then throw("Withdraw amount must be positive")
153170 else [ScriptTransfer(i.caller, -(withdrawAmount), unit)]
154171 }
155172 else throw("Unknown tx type")
156173 }
157174 let feeOps = if ((fee > 0))
158175 then {
159176 let totalFee = (fee * denominator)
160177 [ScriptTransfer(operatorAddress, fee, unit)]
161178 }
162179 else nil
163180 if ((txIndex > poolIndex))
164- then throw("Transaction index is too big")
181+ then throw("Invalid transaction index")
165182 else if (!(bn256Groth16Verify_5inputs(transferVk, txProof, transferInputs)))
166183 then throw("Tx proof is invalid")
167184 else if (!(bn256Groth16Verify_3inputs(treeVk, treeProof, treeInputs)))
168185 then throw("Tree proof is invalid")
169186 else if (nullifierExists)
170187 then throw("Double spend")
171188 else ((txOps ++ dataOps) ++ feeOps)
172189 }
173190 else throw("Strict value is not equal to itself.")
174191 }
175192
176193
177194 @Verifier(tx)
178195 func verify () = match tx {
179196 case d: SetScriptTransaction =>
180- sigVerify(tx.bodyBytes, tx.proofs[0], operatorPk)
197+ sigVerify(tx.bodyBytes, tx.proofs[0], ownerPk)
198+ case d: InvokeScriptTransaction =>
199+ match d.function {
200+ case _ =>
201+ if (("setOperatorPk" == $match1))
202+ then sigVerify(tx.bodyBytes, tx.proofs[0], ownerPk)
203+ else if (("transact" == $match1))
204+ then {
205+ let operatorPk = getOperatorPk()
206+ sigVerify(tx.bodyBytes, tx.proofs[0], operatorPk)
207+ }
208+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
209+ }
181210 case _ =>
182211 false
183212 }
184213

github/deemru/w8io/873ac7e 
44.66 ms