2929import org .tron .core .exception .ZksnarkException ;
3030import org .tron .core .zen .address .DiversifierT ;
3131import org .tron .core .zen .address .ExpandedSpendingKey ;
32- import org .tron .core .zen .address .FullViewingKey ;
3332import org .tron .core .zen .address .IncomingViewingKey ;
3433import org .tron .core .zen .address .KeyIo ;
35- import org .tron .core .zen .address .PaymentAddress ;
3634import org .tron .core .zen .address .SpendingKey ;
3735import org .tron .protos .Protocol ;
3836import org .tron .protos .Protocol .Transaction ;
4745@ Slf4j
4846public class ShieldedTRC20Demo {
4947
50- private String trc20 = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t" ;
51- private String shieldedTRC20 = "TQEuSEVRk1GtfExm5q9T8a1w84GvgQJ13V" ;
52- private byte [] deShieldedTRC20 = WalletApi .decodeFromBase58Check (shieldedTRC20 );
48+ private byte [] trc20 = WalletApi .decodeFromBase58Check (
49+ "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t" );
50+ private byte [] shieldedTRC20 = WalletApi .decodeFromBase58Check (
51+ "TQEuSEVRk1GtfExm5q9T8a1w84GvgQJ13V" );
5352
5453 private String privateKey = "your private key of transparent address" ;
5554
@@ -69,10 +68,10 @@ public static void main(String[] args) throws ZksnarkException, InterruptedExcep
6968 demo .transferDemo (demo .privateKey , 5 , demo .shieldedKey .getKioAddress (),
7069 2 , 3 );
7170 demo .burnDemo (demo .privateKey , 5 , demo .shieldedKey .getKioAddress (), 3 ,
72- getAddressFromPK (demo .privateKey ), 2 );
71+ getAddressFromPk (demo .privateKey ), 2 );
7372 }
7473
75- public static byte [] getAddressFromPK (String pk ) {
74+ public static byte [] getAddressFromPk (String pk ) {
7675 ECKey ecKey = ECKey .fromPrivate (ByteArray .fromHexString (pk ));
7776 return ecKey .getAddress ();
7877 }
@@ -149,7 +148,7 @@ public void setTransparent(PrivateShieldedTRC20Parameters.Builder paramBuilder,
149148 }
150149
151150 public void setContractAddress (PrivateShieldedTRC20Parameters .Builder paramBuilder ) {
152- paramBuilder .setShieldedTRC20ContractAddress (ByteString .copyFrom (deShieldedTRC20 ));
151+ paramBuilder .setShieldedTRC20ContractAddress (ByteString .copyFrom (shieldedTRC20 ));
153152 }
154153
155154 public void setKey (PrivateShieldedTRC20Parameters .Builder paramBuilder , byte [] ask , byte [] nsk ,
@@ -193,7 +192,7 @@ public void transferDemo(String fromPrivate, long fromAmount, String toShieldedA
193192 PrivateShieldedTRC20Parameters .newBuilder ();
194193 //set spend note
195194 Note note = buildNote (5 , toShieldedAddress , ByteArray .fromHexString (rcm ), new byte [512 ]);
196- privateTRC20Builder .addShieldedSpends (getSpendNote (infoById .get (), note , deShieldedTRC20 ));
195+ privateTRC20Builder .addShieldedSpends (getSpendNote (infoById .get (), note , shieldedTRC20 ));
197196 //set receive note 1
198197 addReceiveShieldedNote (privateTRC20Builder , toShieldedAddress , toAmount1 );
199198 //set receive note 2
@@ -206,7 +205,7 @@ public void transferDemo(String fromPrivate, long fromAmount, String toShieldedA
206205
207206 GrpcAPI .ShieldedTRC20Parameters transferParam = WalletApi
208207 .createShieldedContractParameters (privateTRC20Builder .build ());
209- triggerTransfer (deShieldedTRC20 , privateKey , transferParam .getTriggerContractInput ());
208+ triggerTransfer (shieldedTRC20 , privateKey , transferParam .getTriggerContractInput ());
210209 }
211210
212211 public void burnDemo (String fromPrivate , long fromAmount , String toShieldedAddress ,
@@ -224,7 +223,7 @@ public void burnDemo(String fromPrivate, long fromAmount, String toShieldedAddre
224223 //set transparent
225224 setTransparent (privateTRC20Builder , 0 , toTransparentAddress , toTransparentAmount );
226225 //set spend note
227- privateTRC20Builder .addShieldedSpends (getSpendNote (infoById .get (), note , deShieldedTRC20 ));
226+ privateTRC20Builder .addShieldedSpends (getSpendNote (infoById .get (), note , shieldedTRC20 ));
228227 //set receive note
229228 addReceiveShieldedNote (privateTRC20Builder , toShieldedAddress , toShieldedAmount );
230229 //set contract address
@@ -233,11 +232,10 @@ public void burnDemo(String fromPrivate, long fromAmount, String toShieldedAddre
233232 GrpcAPI .ShieldedTRC20Parameters burnParam = WalletApi
234233 .createShieldedContractParameters (privateTRC20Builder .build ());
235234
236- triggerBurn (deShieldedTRC20 , privateKey , burnParam .getTriggerContractInput ());
235+ triggerBurn (shieldedTRC20 , privateKey , burnParam .getTriggerContractInput ());
237236 }
238237
239- private static GrpcAPI .Note buildNote (
240- long value , String paymentAddress , byte [] rcm , byte [] memo ) {
238+ public GrpcAPI .Note buildNote (long value , String paymentAddress , byte [] rcm , byte [] memo ) {
241239 GrpcAPI .Note .Builder noteBuilder = GrpcAPI .Note .newBuilder ();
242240 noteBuilder .setValue (value );
243241 noteBuilder .setPaymentAddress (paymentAddress );
@@ -246,8 +244,7 @@ private static GrpcAPI.Note buildNote(
246244 return noteBuilder .build ();
247245 }
248246
249- private SpendNoteTRC20 getSpendNote (TransactionInfo txInfo ,
250- Note note , byte [] contractAddress ) {
247+ public SpendNoteTRC20 getSpendNote (TransactionInfo txInfo , Note note , byte [] contractAddress ) {
251248 byte [] txData = txInfo .getLog (1 ).getData ().toByteArray ();
252249 long pos = bytes32ToLong (ByteArray .subArray (txData , 0 , 32 ));
253250 byte [] contractResult = triggerGetPath (contractAddress , pos );
@@ -266,7 +263,7 @@ private String triggerMint(String privateKey, String input) {
266263 String methodSign = "mint(uint256,bytes32[9],bytes32[2],bytes32[21])" ;
267264 byte [] selector = new byte [4 ];
268265 System .arraycopy (Hash .sha3 (methodSign .getBytes ()), 0 , selector , 0 , 4 );
269- return triggerContract (deShieldedTRC20 ,
266+ return triggerContract (shieldedTRC20 ,
270267 "mint(uint256,bytes32[9],bytes32[2],bytes32[21])" ,
271268 input ,
272269 true ,
@@ -284,7 +281,7 @@ private String triggerTransfer(byte[] contractAddress, String privateKey, String
284281 "0" ,
285282 0 ,
286283 privateKey );
287- Optional < TransactionInfo > infoById = WalletApi .getTransactionInfoById (txid );
284+ WalletApi .getTransactionInfoById (txid );
288285 return txid ;
289286 }
290287
@@ -297,7 +294,7 @@ private String triggerBurn(byte[] contractAddress, String privateKey, String inp
297294 0L , 100000000L ,
298295 "0" ,
299296 0 ,
300- privateKey );
297+ privateKey );
301298 }
302299
303300
@@ -318,7 +315,7 @@ private String triggerContract(byte[] contractAddress, String method, String arg
318315 argsStr = "" ;
319316 }
320317
321- byte [] owner = getAddressFromPK (priKey );
318+ byte [] owner = getAddressFromPk (priKey );
322319 byte [] input = Hex .decode (AbiUtil .parseMethod (method , argsStr , isHex ));
323320 TriggerSmartContract .Builder builder = TriggerSmartContract .newBuilder ();
324321 builder .setOwnerAddress (ByteString .copyFrom (owner ));
@@ -391,8 +388,7 @@ private String triggerContract(byte[] contractAddress, String method, String arg
391388 return txid ;
392389 }
393390
394- public static Protocol .Transaction signTransaction (ECKey ecKey ,
395- Protocol .Transaction transaction ) {
391+ public static Protocol .Transaction signTransaction (ECKey ecKey , Transaction transaction ) {
396392 WalletApi .setAddressPreFixByte (CommonConstant .ADD_PRE_FIX_BYTE_MAINNET );
397393 if (ecKey == null || ecKey .getPrivKey () == null ) {
398394 //logger.warn("Warning: Can't sign,there is no private key !!");
@@ -405,12 +401,11 @@ public static Protocol.Transaction signTransaction(ECKey ecKey,
405401 }
406402
407403 private BigInteger getScalingFactorBi () {
408- byte [] scalingFactorBytes = triggerGetScalingFactor (deShieldedTRC20 );
404+ byte [] scalingFactorBytes = triggerGetScalingFactor (shieldedTRC20 );
409405 return ByteUtil .bytesToBigInteger (scalingFactorBytes );
410406 }
411407
412- private byte [] triggerGetScalingFactor (
413- byte [] contractAddress ) {
408+ private byte [] triggerGetScalingFactor (byte [] contractAddress ) {
414409 String methodSign = "scalingFactor()" ;
415410 byte [] selector = new byte [4 ];
416411 System .arraycopy (Hash .sha3 (methodSign .getBytes ()), 0 , selector , 0 , 4 );
@@ -429,52 +424,22 @@ private byte[] triggerGetScalingFactor(
429424 return result ;
430425 }
431426
432- private String getScaledPublicAmount (long amount ) {
427+ public String getScaledPublicAmount (long amount ) {
433428 BigInteger result = BigInteger .valueOf (amount ).multiply (scalingFactorBi );
434429 return result .toString ();
435430 }
436431
437- private void setAllowance (String privateKey , long amount ) {
438- byte [] contractAddress = WalletApi .decodeFromBase58Check (trc20 );
432+ public void setAllowance (String privateKey , long amount ) {
439433 byte [] shieldedContractAddressPadding = new byte [32 ];
440- System .arraycopy (deShieldedTRC20 , 0 ,
434+ System .arraycopy (shieldedTRC20 , 0 ,
441435 shieldedContractAddressPadding , 11 , 21 );
442436 byte [] valueBytes = longTo32Bytes (amount );
443437 String input = Hex .toHexString (ByteUtil .merge (shieldedContractAddressPadding , valueBytes ));
444- triggerContract (contractAddress , "approve(address,uint256)" , input , true ,
438+ triggerContract (trc20 , "approve(address,uint256)" , input , true ,
445439 0L , 10000000L , "0" , 0 , privateKey );
446440 }
447441
448- private PrivateShieldedTRC20Parameters mintParams (long value , String contractAddr )
449- throws ZksnarkException {
450- BigInteger fromAmount = BigInteger .valueOf (value ).multiply (scalingFactorBi );
451- SpendingKey spendingKey = new SpendingKey (ByteArray .fromHexString (sk ));
452- ExpandedSpendingKey expsk = spendingKey .expandedSpendingKey ();
453- byte [] ovk = expsk .getOvk ();
454-
455- // ReceiveNote
456- GrpcAPI .ReceiveNote .Builder revNoteBuilder = GrpcAPI .ReceiveNote .newBuilder ();
457- // SpendingKey spendingKey = SpendingKey.random();
458- FullViewingKey fullViewingKey = spendingKey .fullViewingKey ();
459- IncomingViewingKey incomingViewingKey = fullViewingKey .inViewingKey ();
460- PaymentAddress paymentAddress = incomingViewingKey .address (new DiversifierT ().random ()).get ();
461- byte [] memo = new byte [512 ];
462- // byte[] rcm = WalletApi.getRcm().get().getValue().toByteArray();
463- String paymentAddressStr = KeyIo .encodePaymentAddress (paymentAddress );
464- GrpcAPI .Note revNote = buildNote (value , paymentAddressStr , ByteArray .fromHexString (rcm ), memo );
465- revNoteBuilder .setNote (revNote );
466- byte [] contractAddress = WalletApi .decodeFromBase58Check (contractAddr );
467-
468- GrpcAPI .PrivateShieldedTRC20Parameters .Builder paramBuilder = GrpcAPI
469- .PrivateShieldedTRC20Parameters .newBuilder ();
470- paramBuilder .setOvk (ByteString .copyFrom (ovk ));
471- paramBuilder .setFromAmount (fromAmount .toString ());
472- paramBuilder .addShieldedReceives (revNoteBuilder .build ());
473- paramBuilder .setShieldedTRC20ContractAddress (ByteString .copyFrom (contractAddress ));
474- return paramBuilder .build ();
475- }
476-
477- private byte [] triggerGetPath (byte [] contractAddress , long pos ) {
442+ public byte [] triggerGetPath (byte [] contractAddress , long pos ) {
478443 String methodSign = "getPath(uint256)" ;
479444 byte [] selector = new byte [4 ];
480445 System .arraycopy (Hash .sha3 (methodSign .getBytes ()), 0 , selector , 0 , 4 );
0 commit comments