@@ -106,13 +106,14 @@ func setupMigration(t *testing.T) {
106106// ── Test inputs ─────────────────────────────────────────────────────────────
107107
108108type migrationInputs struct {
109- value uint64
110- tokenType string
111- tokenTypeFr fr.Element // EncodeTokenType(tokenType)
112- tokenTypePed fr.Element // HashToZr(tokenType) for Pedersen
113- randomnessPed fr.Element // Pedersen blinding factor
114- randomnessNew fr.Element // MiMC randomness
115- rcv fr.Element // Jubjub value-commitment randomness
109+ value uint64
110+ tokenType string
111+ tokenTypeFr fr.Element // EncodeTokenType(tokenType)
112+ tokenTypePed fr.Element // HashToZr(tokenType) for Pedersen
113+ randomnessPed fr.Element // Pedersen blinding factor
114+ randomnessNew fr.Element // MiMC randomness
115+ rcv fr.Element // Jubjub value-commitment randomness
116+ typeRandomness fr.Element // TypeCommitment randomness
116117}
117118
118119func newRandomMigrationInputs (t * testing.T ) migrationInputs {
@@ -131,22 +132,25 @@ func newRandomMigrationInputs(t *testing.T) migrationInputs {
131132 var tokenTypePed fr.Element
132133 tokenTypePed .SetBigInt (digestBig )
133134
134- var randomnessPed , randomnessNew , rcv fr.Element
135+ var randomnessPed , randomnessNew , rcv , typeRandomness fr.Element
135136 _ , err := randomnessPed .SetRandom ()
136137 require .NoError (t , err )
137138 _ , err = randomnessNew .SetRandom ()
138139 require .NoError (t , err )
139140 _ , err = rcv .SetRandom ()
140141 require .NoError (t , err )
142+ _ , err = typeRandomness .SetRandom ()
143+ require .NoError (t , err )
141144
142145 return migrationInputs {
143- value : value ,
144- tokenType : tokenType ,
145- tokenTypeFr : tokenTypeFr ,
146- tokenTypePed : tokenTypePed ,
147- randomnessPed : randomnessPed ,
148- randomnessNew : randomnessNew ,
149- rcv : rcv ,
146+ value : value ,
147+ tokenType : tokenType ,
148+ tokenTypeFr : tokenTypeFr ,
149+ tokenTypePed : tokenTypePed ,
150+ randomnessPed : randomnessPed ,
151+ randomnessNew : randomnessNew ,
152+ rcv : rcv ,
153+ typeRandomness : typeRandomness ,
150154 }
151155}
152156
@@ -210,20 +214,26 @@ func buildMigrationAssignment(t *testing.T, inp migrationInputs) *circuit.Migrat
210214 cv , err := jubjub .ValueCommit (inp .value , inp .rcv )
211215 require .NoError (t , err , "jubjub.ValueCommit failed" )
212216
217+ // Compute type commitment: MiMC(TokenType, TypeRandomness)
218+ tc , err := mimc .Hash (inp .tokenTypeFr , inp .typeRandomness )
219+ require .NoError (t , err , "mimc.Hash failed for type commitment" )
220+
213221 return & circuit.MigrationCircuit {
214222 // Public inputs
215223 CommitmentPedersenX : emulated.ValueOf [emulated.BLS12381Fp ](pedXBig ),
216224 CommitmentPedersenY : emulated.ValueOf [emulated.BLS12381Fp ](pedYBig ),
217225 CommitmentMiMC : cm ,
218226 ValueCommitOutX : cv .X ,
219227 ValueCommitOutY : cv .Y ,
220- TokenType : inp . tokenTypeFr ,
228+ TypeCommitment : tc ,
221229 // Private inputs
222- Value : vField ,
223- TokenTypePed : inp .tokenTypePed ,
224- RandomnessPed : inp .randomnessPed ,
225- RandomnessNew : inp .randomnessNew ,
226- RCV : inp .rcv ,
230+ Value : vField ,
231+ TokenType : inp .tokenTypeFr ,
232+ TokenTypePed : inp .tokenTypePed ,
233+ RandomnessPed : inp .randomnessPed ,
234+ RandomnessNew : inp .randomnessNew ,
235+ RCV : inp .rcv ,
236+ TypeRandomness : inp .typeRandomness ,
227237 // Compile-time parameters
228238 MaxBits : params .DefaultMaxBits ,
229239 PedG0X : testPedGens .G0X , PedG0Y : testPedGens .G0Y ,
@@ -410,6 +420,10 @@ func TestMigrationCircuitInvalid_OverflowValue(t *testing.T) {
410420 cm , err := mimc .Hash (overflowValue , inp .tokenTypeFr , inp .randomnessNew )
411421 require .NoError (t , err )
412422
423+ // Compute type commitment
424+ tc , err := mimc .Hash (inp .tokenTypeFr , inp .typeRandomness )
425+ require .NoError (t , err )
426+
413427 pedXBig := pedCommit .X .BigInt (new (big.Int ))
414428 pedYBig := pedCommit .Y .BigInt (new (big.Int ))
415429
@@ -426,12 +440,14 @@ func TestMigrationCircuitInvalid_OverflowValue(t *testing.T) {
426440 CommitmentMiMC : cm ,
427441 ValueCommitOutX : fakeCVX ,
428442 ValueCommitOutY : fakeCVY ,
429- TokenType : inp . tokenTypeFr ,
443+ TypeCommitment : tc ,
430444 Value : overflowValue ,
445+ TokenType : inp .tokenTypeFr ,
431446 TokenTypePed : inp .tokenTypePed ,
432447 RandomnessPed : inp .randomnessPed ,
433448 RandomnessNew : inp .randomnessNew ,
434449 RCV : inp .rcv ,
450+ TypeRandomness : inp .typeRandomness ,
435451 MaxBits : params .DefaultMaxBits ,
436452 PedG0X : testPedGens .G0X , PedG0Y : testPedGens .G0Y ,
437453 PedG1X : testPedGens .G1X , PedG1Y : testPedGens .G1Y ,
@@ -445,3 +461,22 @@ func TestMigrationCircuitInvalid_OverflowValue(t *testing.T) {
445461 require .Error (t , err ,
446462 "MigrationCircuit must reject values >= 2^MaxBits, overflow attack possible if not" )
447463}
464+
465+ func TestMigrationCircuitInvalid_WrongTypeRandomness (t * testing.T ) {
466+ setupMigration (t )
467+
468+ inp := newRandomMigrationInputs (t )
469+ assignment := buildMigrationAssignment (t , inp )
470+
471+ var wrongTR fr.Element
472+ _ , err := wrongTR .SetRandom ()
473+ require .NoError (t , err )
474+ assignment .TypeRandomness = wrongTR
475+
476+ witness , err := frontend .NewWitness (assignment , ecc .BLS12_381 .ScalarField ())
477+ require .NoError (t , err )
478+
479+ err = migrationCS .IsSolved (witness )
480+ require .Error (t , err ,
481+ "MigrationCircuit must reject a witness where TypeRandomness doesn't produce the public TypeCommitment" )
482+ }
0 commit comments