@@ -79,4 +79,109 @@ public void testBuildTransactionResult() {
7979 assertQuantity (transactionResult .getNonce ());
8080 }
8181
82+ private Protocol .Transaction buildBaseTransaction () {
83+ SmartContractOuterClass .TriggerSmartContract .Builder builder =
84+ SmartContractOuterClass .TriggerSmartContract .newBuilder ()
85+ .setOwnerAddress (ByteString .copyFrom (ByteArray .fromHexString (OWNER_ADDRESS )))
86+ .setContractAddress (ByteString .copyFrom (ByteArray .fromHexString (CONTRACT_ADDRESS )));
87+ return new TransactionCapsule (builder .build (),
88+ Protocol .Transaction .Contract .ContractType .TriggerSmartContract ).getInstance ();
89+ }
90+
91+ // r[0..32] + s[32..64] + v[64], v stored as revId 0 so parseSignature normalizes it to 27.
92+ private byte [] buildSignature () {
93+ byte [] sign = new byte [65 ];
94+ for (int i = 0 ; i < 32 ; i ++) {
95+ sign [i ] = (byte ) (i + 1 ); // r
96+ }
97+ for (int i = 32 ; i < 64 ; i ++) {
98+ sign [i ] = (byte ) (i + 1 ); // s
99+ }
100+ sign [64 ] = 0 ;
101+ return sign ;
102+ }
103+
104+ private Protocol .PQAuthSig buildPqAuthSig () {
105+ return Protocol .PQAuthSig .newBuilder ()
106+ .setScheme (Protocol .PQScheme .ML_DSA_44 )
107+ .setPublicKey (ByteString .copyFrom (new byte [] {1 , 2 , 3 }))
108+ .setSignature (ByteString .copyFrom (new byte [] {4 , 5 , 6 }))
109+ .build ();
110+ }
111+
112+ @ Test
113+ public void testParseSignatureWithNoSignature () {
114+ TransactionResult transactionResult =
115+ new TransactionResult (buildBaseTransaction (), wallet );
116+ // No ECDSA signature and no PQ signature: v/r/s fall back to zero padding.
117+ Assert .assertEquals (ByteArray .toJsonHex (new byte [1 ]), transactionResult .getV ());
118+ Assert .assertEquals (ByteArray .toJsonHex (new byte [32 ]), transactionResult .getR ());
119+ Assert .assertEquals (ByteArray .toJsonHex (new byte [32 ]), transactionResult .getS ());
120+ Assert .assertNull (transactionResult .getPqAuthSigList ());
121+ }
122+
123+ @ Test
124+ public void testParseSignatureWithEcdsaSignatureOnly () {
125+ byte [] sign = buildSignature ();
126+ Protocol .Transaction transaction = buildBaseTransaction ().toBuilder ()
127+ .addSignature (ByteString .copyFrom (sign ))
128+ .build ();
129+
130+ TransactionResult transactionResult = new TransactionResult (transaction , wallet );
131+ Assert .assertEquals (ByteArray .toJsonHex (java .util .Arrays .copyOfRange (sign , 0 , 32 )),
132+ transactionResult .getR ());
133+ Assert .assertEquals (ByteArray .toJsonHex (java .util .Arrays .copyOfRange (sign , 32 , 64 )),
134+ transactionResult .getS ());
135+ // revId 0 is normalized to 27 (0x1b).
136+ Assert .assertEquals (ByteArray .toJsonHex (new byte [] {27 }), transactionResult .getV ());
137+ Assert .assertNull (transactionResult .getPqAuthSigList ());
138+ }
139+
140+ @ Test
141+ public void testParseSignatureWithPqAuthSigOnly () {
142+ Protocol .PQAuthSig pqAuthSig = buildPqAuthSig ();
143+ Protocol .Transaction transaction = buildBaseTransaction ().toBuilder ()
144+ .addPqAuthSig (pqAuthSig )
145+ .build ();
146+
147+ TransactionResult transactionResult = new TransactionResult (transaction , wallet );
148+ // No ECDSA signature: v/r/s fall back to zero padding.
149+ Assert .assertEquals (ByteArray .toJsonHex (new byte [1 ]), transactionResult .getV ());
150+ Assert .assertEquals (ByteArray .toJsonHex (new byte [32 ]), transactionResult .getR ());
151+ Assert .assertEquals (ByteArray .toJsonHex (new byte [32 ]), transactionResult .getS ());
152+ Assert .assertNotNull (transactionResult .getPqAuthSigList ());
153+ Assert .assertEquals (1 , transactionResult .getPqAuthSigList ().size ());
154+ TransactionResult .PQAuthSigResult result = transactionResult .getPqAuthSigList ().get (0 );
155+ Assert .assertEquals (pqAuthSig .getScheme ().name (), result .getScheme ());
156+ Assert .assertEquals (ByteArray .toJsonHex (pqAuthSig .getPublicKey ().toByteArray ()),
157+ result .getPublicKey ());
158+ Assert .assertEquals (ByteArray .toJsonHex (pqAuthSig .getSignature ().toByteArray ()),
159+ result .getSignature ());
160+ }
161+
162+ @ Test
163+ public void testParseSignatureWithEcdsaAndPqAuthSig () {
164+ byte [] sign = buildSignature ();
165+ Protocol .PQAuthSig pqAuthSig = buildPqAuthSig ();
166+ Protocol .Transaction transaction = buildBaseTransaction ().toBuilder ()
167+ .addSignature (ByteString .copyFrom (sign ))
168+ .addPqAuthSig (pqAuthSig )
169+ .build ();
170+
171+ TransactionResult transactionResult = new TransactionResult (transaction , wallet );
172+ Assert .assertEquals (ByteArray .toJsonHex (java .util .Arrays .copyOfRange (sign , 0 , 32 )),
173+ transactionResult .getR ());
174+ Assert .assertEquals (ByteArray .toJsonHex (java .util .Arrays .copyOfRange (sign , 32 , 64 )),
175+ transactionResult .getS ());
176+ Assert .assertEquals (ByteArray .toJsonHex (new byte [] {27 }), transactionResult .getV ());
177+ Assert .assertNotNull (transactionResult .getPqAuthSigList ());
178+ Assert .assertEquals (1 , transactionResult .getPqAuthSigList ().size ());
179+ TransactionResult .PQAuthSigResult result = transactionResult .getPqAuthSigList ().get (0 );
180+ Assert .assertEquals (pqAuthSig .getScheme ().name (), result .getScheme ());
181+ Assert .assertEquals (ByteArray .toJsonHex (pqAuthSig .getPublicKey ().toByteArray ()),
182+ result .getPublicKey ());
183+ Assert .assertEquals (ByteArray .toJsonHex (pqAuthSig .getSignature ().toByteArray ()),
184+ result .getSignature ());
185+ }
186+
82187}
0 commit comments