tx · 6VnwRiznJbm2wm3FFpwUmQi9fN8Bo25so8dhNKFFaoJo

3N8kB3UEjWWvTRBtGpGUErAevaK2q6u2eCM:  -0.01000000 Waves

2023.11.02 10:00 [2825387] smart account 3N8kB3UEjWWvTRBtGpGUErAevaK2q6u2eCM > SELF 0.00000000 Waves

{ "type": 13, "id": "6VnwRiznJbm2wm3FFpwUmQi9fN8Bo25so8dhNKFFaoJo", "fee": 1000000, "feeAssetId": null, "timestamp": 1698908417993, "version": 2, "chainId": 84, "sender": "3N8kB3UEjWWvTRBtGpGUErAevaK2q6u2eCM", "senderPublicKey": "6ybktvseycJDGHTjJm3tz9iT2SKaTNtLLCZsJZRemtoM", "proofs": [ "3AU4JNQBEBce5ZTUVvAjHcp32ESxqZpDCQBFs335yvesJmjWA6fwVT1iPyNbmzHigZaJEjsBJC663HoRhVDHt2z8" ], "script": "base64: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AQVpbmRleAkArAICAgJSOgkApAMBBQVpbmRleAEPZ2V0TnVsbGlmaWVyS2V5AQludWxsaWZpZXIJAKwCAgICTjoJANgEAQUJbnVsbGlmaWVyAQ1nZXREZXBvc2l0S2V5AQdhZGRyZXNzCQCsAgICAkQ6CQDYBAEFB2FkZHJlc3MADHBvb2xJbmRleEtleQIJUG9vbEluZGV4ABJhbGxNZXNzYWdlc0hhc2hLZXkCD0FsbE1lc3NhZ2VzSGFzaAEHdGFrZUV4dAMBdgRmcm9tAnRvCQDKAQIJAMkBAgUBdgUCdG8FBGZyb20BDHNwZW5kRGVwb3NpdAIHYWRkcmVzcwZhbW91bnQECmN1cnJlbnRLZXkJAQ1nZXREZXBvc2l0S2V5AQgFB2FkZHJlc3MFYnl0ZXMEDWN1cnJlbnRBbW91bnQEByRtYXRjaDAJAJ8IAQUKY3VycmVudEtleQMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQJbmV3QW1vdW50CQBlAgUNY3VycmVudEFtb3VudAUGYW1vdW50AwkAZgIAAAUGYW1vdW50CQACAQIbQ2FuJ3Qgc3BlbmQgbmVnYXRpdmUgYW1vdW50AwkAZgIAAAUJbmV3QW1vdW50CQACAQISTm90IGVub3VnaCBiYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQpjdXJyZW50S2V5BQluZXdBbW91bnQFA25pbAMBaQEHZGVwb3NpdAAEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAAwkBCWlzRGVmaW5lZAEIBQNwbXQHYXNzZXRJZAkAAgECI09ubHkgV0FWRVMgaXMgYWxsb3dlZCBhdCB0aGUgbW9tZW50BApjdXJyZW50S2V5CQENZ2V0RGVwb3NpdEtleQEICAUBaQZjYWxsZXIFYnl0ZXMEDWN1cnJlbnRBbW91bnQEByRtYXRjaDAJAJoIAgUEdGhpcwUKY3VycmVudEtleQMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQJbmV3QW1vdW50CQBkAgUNY3VycmVudEFtb3VudAgFA3BtdAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFCmN1cnJlbnRLZXkFCW5ld0Ftb3VudAUDbmlsAWkBCHdpdGhkcmF3AQZhbW91bnQECmN1cnJlbnRLZXkJAQ1nZXREZXBvc2l0S2V5AQgIBQFpBmNhbGxlcgVieXRlcwQNY3VycmVudEFtb3VudAQHJG1hdGNoMAkAmggCBQR0aGlzBQpjdXJyZW50S2V5AwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAABAluZXdBbW91bnQJAGUCBQ1jdXJyZW50QW1vdW50BQZhbW91bnQDCQBmAgAABQZhbW91bnQJAAIBAh5DYW4ndCB3aXRoZHJhdyBuZWdhdGl2ZSBhbW91bnQDCQBmAgAABQluZXdBbW91bnQJAAIBAhJOb3QgZW5vdWdoIGJhbGFuY2UJAMwIAgkBDEludGVnZXJFbnRyeQIFCmN1cnJlbnRLZXkFCW5ld0Ftb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFBmFtb3VudAUEdW5pdAUDbmlsAWkBCHRyYW5zYWN0AQJ0eAQJbnVsbGlmaWVyCQEHdGFrZUV4dAMFAnR4AAAAIAQJb3V0Q29tbWl0CQEHdGFrZUV4dAMFAnR4ACAAQAQHYXNzZXRJZAkBB3Rha2VFeHQDBQJ0eABAAGAEBWRlbHRhCQEHdGFrZUV4dAMFAnR4AGAAgAEEDG5hdGl2ZUFtb3VudAkAsQkBCQEHdGFrZUV4dAMFBWRlbHRhAAAACAQMbmF0aXZlRW5lcmd5CQCxCQEJAQd0YWtlRXh0AwUFZGVsdGEACAAWBAd0eEluZGV4CQCxCQEJAQd0YWtlRXh0AwUFZGVsdGEAFgAcBAdfcG9vbElkCQEHdGFrZUV4dAMFBWRlbHRhABwAHwQHdHhQcm9vZgkBB3Rha2VFeHQDBQJ0eACAAQCAAwQJdHJlZVByb29mCQEHdGFrZUV4dAMFAnR4AIADAIAFBAlyb290QWZ0ZXIJAQd0YWtlRXh0AwUCdHgAgAUAoAUEBnR4VHlwZQkAsQkBCQEHdGFrZUV4dAMFAnR4AKAFAKIFBAskdDA1NjU2NjAxOAMJAAACBQZ0eFR5cGUAAAQPZGVwb3NpdERhdGFTaXplCQBkAgAgAEAECWRlcG9zaXRQawkAzQECCQDMAQIFAnR4BQ9kZXBvc2l0RGF0YVNpemUAQAQQZGVwb3NpdFNpZ25hdHVyZQkAzAECBQJ0eABACQCVCgMJAQd0YWtlRXh0AwUCdHgAogUJAGUCCQDIAQEFAnR4BQ9kZXBvc2l0RGF0YVNpemUFCWRlcG9zaXRQawUQZGVwb3NpdFNpZ25hdHVyZQkAlQoDCQEHdGFrZUV4dAMFAnR4AKIFCQDIAQEFAnR4BQR1bml0BQR1bml0BARtZW1vCAULJHQwNTY1NjYwMTgCXzEECWRlcG9zaXRQawgFCyR0MDU2NTY2MDE4Al8yBBBkZXBvc2l0U2lnbmF0dXJlCAULJHQwNTY1NjYwMTgCXzMEA2ZlZQkAsQkBCQEHdGFrZUV4dAMFBG1lbW8AAAAIBA9hbGxNZXNzYWdlc0hhc2gJAQt2YWx1ZU9yRWxzZQIJAKEIAQUSYWxsTWVzc2FnZXNIYXNoS2V5CQCdAwEJALYCAQAABAhtZW1vSGFzaAkA9QMBBQRtZW1vBAZoYXNoZXMJAMsBAgUPYWxsTWVzc2FnZXNIYXNoBQhtZW1vSGFzaAQSbmV3QWxsTWVzc2FnZXNIYXNoCQD1AwEFBmhhc2hlcwQKcm9vdEJlZm9yZQkBC3ZhbHVlT3JFbHNlAgkAoQgBCQEKZ2V0Um9vdEtleQEFB3R4SW5kZXgFC2luaXRpYWxSb290AwkAAAIFCnJvb3RCZWZvcmUFCnJvb3RCZWZvcmUECXBvb2xJbmRleAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQxwb29sSW5kZXhLZXkAAAQIcG9vbFJvb3QJAQt2YWx1ZU9yRWxzZQIJAKEIAQkBCmdldFJvb3RLZXkBBQlwb29sSW5kZXgFC2luaXRpYWxSb290BA9udWxsaWZpZXJFeGlzdHMEByRtYXRjaDAJAKEIAQkBD2dldE51bGxpZmllcktleQEFCW51bGxpZmllcgMJAAECBQckbWF0Y2gwAgRVbml0BAFhBQckbWF0Y2gwBwYEDnRyYW5zZmVySW5wdXRzCQDLAQIJAMsBAgkAywECCQDLAQIFCG1lbW9IYXNoBQludWxsaWZpZXIFCW91dENvbW1pdAUFZGVsdGEFCG1lbW9IYXNoBAp0cmVlSW5wdXRzCQDLAQIJAMsBAgUIcG9vbFJvb3QFCXJvb3RBZnRlcgUJb3V0Q29tbWl0BAdkYXRhT3BzCQDMCAIJAQtCaW5hcnlFbnRyeQIJAQpnZXRSb290S2V5AQUHdHhJbmRleAUJcm9vdEFmdGVyCQDMCAIJAQtCaW5hcnlFbnRyeQIJAQ9nZXROdWxsaWZpZXJLZXkBBQludWxsaWZpZXIJAPUDAQkAywECBQlvdXRDb21taXQFBWRlbHRhCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxwb29sSW5kZXhLZXkJAGQCBQlwb29sSW5kZXgAgAEJAMwIAgkBC0JpbmFyeUVudHJ5AgUSYWxsTWVzc2FnZXNIYXNoS2V5BRJuZXdBbGxNZXNzYWdlc0hhc2gFA25pbAQFdHhPcHMEByRtYXRjaDAFBnR4VHlwZQMJAAACAAAFByRtYXRjaDAEDmRlcG9zaXRQa1ZhbHVlCQEFdmFsdWUBBQlkZXBvc2l0UGsEDmRlcG9zaXRBZGRyZXNzCQCnCAEFDmRlcG9zaXRQa1ZhbHVlAwkAZgIAAAUMbmF0aXZlQW1vdW50CQACAQIdQ2FuJ3QgZGVwb3NpdCBuZWdhdGl2ZSBhbW91bnQDCQEBIQEJAMQTAwkAywECBQludWxsaWZpZXIFDmRlcG9zaXRQa1ZhbHVlCQEFdmFsdWUBBRBkZXBvc2l0U2lnbmF0dXJlBQ5kZXBvc2l0UGtWYWx1ZQkAAgECGUludmFsaWQgZGVwb3NpdCBzaWduYXR1cmUJAQxzcGVuZERlcG9zaXQCBQ5kZXBvc2l0QWRkcmVzcwkAaAIFDG5hdGl2ZUFtb3VudAULZGVub21pbmF0b3IDCQAAAgABBQckbWF0Y2gwAwkBAiE9AgUMbmF0aXZlQW1vdW50AAAJAAIBAihOYXRpdmUgYW1vdW50IG11c3QgYmUgemVybyBmb3IgdHJhbnNmZXJzBQNuaWwDCQAAAgACBQckbWF0Y2gwBA53aXRoZHJhd0Ftb3VudAkAaAIJALEJAQkBB3Rha2VFeHQDBQRtZW1vAAgAEAULZGVub21pbmF0b3IDCQBmAgUOd2l0aGRyYXdBbW91bnQAAAkAAgECIFdpdGhkcmF3IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkBAS0BBQ53aXRoZHJhd0Ftb3VudAUEdW5pdAUDbmlsCQACAQIPVW5rbm93biB0eCB0eXBlBAZmZWVPcHMDCQBmAgUDZmVlAAAECHRvdGFsRmVlCQBoAgUDZmVlBQtkZW5vbWluYXRvcgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ9vcGVyYXRvckFkZHJlc3MFA2ZlZQUEdW5pdAUDbmlsBQNuaWwDCQBmAgUHdHhJbmRleAUJcG9vbEluZGV4CQACAQIcVHJhbnNhY3Rpb24gaW5kZXggaXMgdG9vIGJpZwMJAQEhAQkAlhMDBQp0cmFuc2ZlclZrBQd0eFByb29mBQ50cmFuc2ZlcklucHV0cwkAAgECE1R4IHByb29mIGlzIGludmFsaWQDCQEBIQEJAJQTAwUGdHJlZVZrBQl0cmVlUHJvb2YFCnRyZWVJbnB1dHMJAAIBAhVUcmVlIHByb29mIGlzIGludmFsaWQDBQ9udWxsaWZpZXJFeGlzdHMJAAIBAgxEb3VibGUgc3BlbmQJAM4IAgkAzggCBQV0eE9wcwUHZGF0YU9wcwUGZmVlT3BzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAIUU2V0U2NyaXB0VHJhbnNhY3Rpb24EAWQFByRtYXRjaDAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFCm9wZXJhdG9yUGsHyDiPvg==", "height": 2825387, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: XmxYZEQEVcdr6P8f7WBRQerPDHPqrEXdCeP2nVeopce Next: 3XQTdkT9vwstyExYtVmb4X6CNQ9ENdDo61WLcryyndAC Diff:
OldNewDifferences
2323
2424
2525 let poolIndexKey = "PoolIndex"
26+
27+let allMessagesHashKey = "AllMessagesHash"
2628
2729 func takeExt (v,from,to) = drop(take(v, to), from)
2830
9799 let treeProof = takeExt(tx, 384, 640)
98100 let rootAfter = takeExt(tx, 640, 672)
99101 let txType = toInt(takeExt(tx, 672, 674))
100- let $t052185580 = if ((txType == 0))
102+ let $t056566018 = if ((txType == 0))
101103 then {
102104 let depositDataSize = (32 + 64)
103105 let depositPk = dropRight(takeRight(tx, depositDataSize), 64)
105107 $Tuple3(takeExt(tx, 674, (size(tx) - depositDataSize)), depositPk, depositSignature)
106108 }
107109 else $Tuple3(takeExt(tx, 674, size(tx)), unit, unit)
108- let memo = $t052185580._1
109- let depositPk = $t052185580._2
110- let depositSignature = $t052185580._3
110+ let memo = $t056566018._1
111+ let depositPk = $t056566018._2
112+ let depositSignature = $t056566018._3
111113 let fee = toInt(takeExt(memo, 0, 8))
114+ let allMessagesHash = valueOrElse(getBinary(allMessagesHashKey), toBytes(toBigInt(0)))
112115 let memoHash = keccak256(memo)
116+ let hashes = (allMessagesHash + memoHash)
117+ let newAllMessagesHash = keccak256(hashes)
113118 let rootBefore = valueOrElse(getBinary(getRootKey(txIndex)), initialRoot)
114119 if ((rootBefore == rootBefore))
115120 then {
123128 }
124129 let transferInputs = ((((memoHash + nullifier) + outCommit) + delta) + memoHash)
125130 let treeInputs = ((poolRoot + rootAfter) + outCommit)
126- let dataRes = [BinaryEntry(getRootKey(txIndex), rootAfter), BinaryEntry(getNullifierKey(nullifier), keccak256((outCommit + delta))), IntegerEntry(poolIndexKey, (poolIndex + 128))]
127- let res = match txType {
131+ let dataOps = [BinaryEntry(getRootKey(txIndex), rootAfter), BinaryEntry(getNullifierKey(nullifier), keccak256((outCommit + delta))), IntegerEntry(poolIndexKey, (poolIndex + 128)), BinaryEntry(allMessagesHashKey, newAllMessagesHash)]
132+ let txOps = match txType {
128133 case _ =>
129134 if ((0 == $match0))
130135 then {
149154 }
150155 else throw("Unknown tx type")
151156 }
152- let feeRes = if ((fee > 0))
157+ let feeOps = if ((fee > 0))
153158 then {
154159 let totalFee = (fee * denominator)
155160 [ScriptTransfer(operatorAddress, fee, unit)]
163168 then throw("Tree proof is invalid")
164169 else if (nullifierExists)
165170 then throw("Double spend")
166- else ((res ++ dataRes) ++ feeRes)
171+ else ((txOps ++ dataOps) ++ feeOps)
167172 }
168173 else throw("Strict value is not equal to itself.")
169174 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let operatorPk = base58'6ybktvseycJDGHTjJm3tz9iT2SKaTNtLLCZsJZRemtoM'
55
66 let operatorAddress = addressFromPublicKey(operatorPk)
77
88 let denominator = 100000000
99
1010 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='
1111
1212 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'
1313
1414 let initialRoot = toBytes(parseBigIntValue("11469701942666298368112882412133877458305516134926649826543144744382391691533"))
1515
1616 func getRootKey (index) = ("R:" + toString(index))
1717
1818
1919 func getNullifierKey (nullifier) = ("N:" + toBase58String(nullifier))
2020
2121
2222 func getDepositKey (address) = ("D:" + toBase58String(address))
2323
2424
2525 let poolIndexKey = "PoolIndex"
26+
27+let allMessagesHashKey = "AllMessagesHash"
2628
2729 func takeExt (v,from,to) = drop(take(v, to), from)
2830
2931
3032 func spendDeposit (address,amount) = {
3133 let currentKey = getDepositKey(address.bytes)
3234 let currentAmount = match getInteger(currentKey) {
3335 case a: Int =>
3436 a
3537 case _ =>
3638 0
3739 }
3840 let newAmount = (currentAmount - amount)
3941 if ((0 > amount))
4042 then throw("Can't spend negative amount")
4143 else if ((0 > newAmount))
4244 then throw("Not enough balance")
4345 else [IntegerEntry(currentKey, newAmount)]
4446 }
4547
4648
4749 @Callable(i)
4850 func deposit () = {
4951 let pmt = value(i.payments[0])
5052 if (isDefined(pmt.assetId))
5153 then throw("Only WAVES is allowed at the moment")
5254 else {
5355 let currentKey = getDepositKey(i.caller.bytes)
5456 let currentAmount = match getInteger(this, currentKey) {
5557 case a: Int =>
5658 a
5759 case _ =>
5860 0
5961 }
6062 let newAmount = (currentAmount + pmt.amount)
6163 [IntegerEntry(currentKey, newAmount)]
6264 }
6365 }
6466
6567
6668
6769 @Callable(i)
6870 func withdraw (amount) = {
6971 let currentKey = getDepositKey(i.caller.bytes)
7072 let currentAmount = match getInteger(this, currentKey) {
7173 case a: Int =>
7274 a
7375 case _ =>
7476 0
7577 }
7678 let newAmount = (currentAmount - amount)
7779 if ((0 > amount))
7880 then throw("Can't withdraw negative amount")
7981 else if ((0 > newAmount))
8082 then throw("Not enough balance")
8183 else [IntegerEntry(currentKey, newAmount), ScriptTransfer(i.caller, amount, unit)]
8284 }
8385
8486
8587
8688 @Callable(i)
8789 func transact (tx) = {
8890 let nullifier = takeExt(tx, 0, 32)
8991 let outCommit = takeExt(tx, 32, 64)
9092 let assetId = takeExt(tx, 64, 96)
9193 let delta = takeExt(tx, 96, 128)
9294 let nativeAmount = toInt(takeExt(delta, 0, 8))
9395 let nativeEnergy = toInt(takeExt(delta, 8, 22))
9496 let txIndex = toInt(takeExt(delta, 22, 28))
9597 let _poolId = takeExt(delta, 28, 31)
9698 let txProof = takeExt(tx, 128, 384)
9799 let treeProof = takeExt(tx, 384, 640)
98100 let rootAfter = takeExt(tx, 640, 672)
99101 let txType = toInt(takeExt(tx, 672, 674))
100- let $t052185580 = if ((txType == 0))
102+ let $t056566018 = if ((txType == 0))
101103 then {
102104 let depositDataSize = (32 + 64)
103105 let depositPk = dropRight(takeRight(tx, depositDataSize), 64)
104106 let depositSignature = takeRight(tx, 64)
105107 $Tuple3(takeExt(tx, 674, (size(tx) - depositDataSize)), depositPk, depositSignature)
106108 }
107109 else $Tuple3(takeExt(tx, 674, size(tx)), unit, unit)
108- let memo = $t052185580._1
109- let depositPk = $t052185580._2
110- let depositSignature = $t052185580._3
110+ let memo = $t056566018._1
111+ let depositPk = $t056566018._2
112+ let depositSignature = $t056566018._3
111113 let fee = toInt(takeExt(memo, 0, 8))
114+ let allMessagesHash = valueOrElse(getBinary(allMessagesHashKey), toBytes(toBigInt(0)))
112115 let memoHash = keccak256(memo)
116+ let hashes = (allMessagesHash + memoHash)
117+ let newAllMessagesHash = keccak256(hashes)
113118 let rootBefore = valueOrElse(getBinary(getRootKey(txIndex)), initialRoot)
114119 if ((rootBefore == rootBefore))
115120 then {
116121 let poolIndex = valueOrElse(getInteger(poolIndexKey), 0)
117122 let poolRoot = valueOrElse(getBinary(getRootKey(poolIndex)), initialRoot)
118123 let nullifierExists = match getBinary(getNullifierKey(nullifier)) {
119124 case a: Unit =>
120125 false
121126 case _ =>
122127 true
123128 }
124129 let transferInputs = ((((memoHash + nullifier) + outCommit) + delta) + memoHash)
125130 let treeInputs = ((poolRoot + rootAfter) + outCommit)
126- let dataRes = [BinaryEntry(getRootKey(txIndex), rootAfter), BinaryEntry(getNullifierKey(nullifier), keccak256((outCommit + delta))), IntegerEntry(poolIndexKey, (poolIndex + 128))]
127- let res = match txType {
131+ let dataOps = [BinaryEntry(getRootKey(txIndex), rootAfter), BinaryEntry(getNullifierKey(nullifier), keccak256((outCommit + delta))), IntegerEntry(poolIndexKey, (poolIndex + 128)), BinaryEntry(allMessagesHashKey, newAllMessagesHash)]
132+ let txOps = match txType {
128133 case _ =>
129134 if ((0 == $match0))
130135 then {
131136 let depositPkValue = value(depositPk)
132137 let depositAddress = addressFromPublicKey(depositPkValue)
133138 if ((0 > nativeAmount))
134139 then throw("Can't deposit negative amount")
135140 else if (!(sigVerify_8Kb((nullifier + depositPkValue), value(depositSignature), depositPkValue)))
136141 then throw("Invalid deposit signature")
137142 else spendDeposit(depositAddress, (nativeAmount * denominator))
138143 }
139144 else if ((1 == $match0))
140145 then if ((nativeAmount != 0))
141146 then throw("Native amount must be zero for transfers")
142147 else nil
143148 else if ((2 == $match0))
144149 then {
145150 let withdrawAmount = (toInt(takeExt(memo, 8, 16)) * denominator)
146151 if ((withdrawAmount > 0))
147152 then throw("Withdraw amount must be positive")
148153 else [ScriptTransfer(i.caller, -(withdrawAmount), unit)]
149154 }
150155 else throw("Unknown tx type")
151156 }
152- let feeRes = if ((fee > 0))
157+ let feeOps = if ((fee > 0))
153158 then {
154159 let totalFee = (fee * denominator)
155160 [ScriptTransfer(operatorAddress, fee, unit)]
156161 }
157162 else nil
158163 if ((txIndex > poolIndex))
159164 then throw("Transaction index is too big")
160165 else if (!(bn256Groth16Verify_5inputs(transferVk, txProof, transferInputs)))
161166 then throw("Tx proof is invalid")
162167 else if (!(bn256Groth16Verify_3inputs(treeVk, treeProof, treeInputs)))
163168 then throw("Tree proof is invalid")
164169 else if (nullifierExists)
165170 then throw("Double spend")
166- else ((res ++ dataRes) ++ feeRes)
171+ else ((txOps ++ dataOps) ++ feeOps)
167172 }
168173 else throw("Strict value is not equal to itself.")
169174 }
170175
171176
172177 @Verifier(tx)
173178 func verify () = match tx {
174179 case d: SetScriptTransaction =>
175180 sigVerify(tx.bodyBytes, tx.proofs[0], operatorPk)
176181 case _ =>
177182 false
178183 }
179184

github/deemru/w8io/873ac7e 
62.55 ms