From db2191eec2c7823864f166bbc3201cfb325f9809 Mon Sep 17 00:00:00 2001 From: furszy Date: Fri, 17 Aug 2018 20:13:05 -0300 Subject: [PATCH] Zerocoin improvements --- .gitignore | 3 +- .../zerocoinj/protocol/GenWitMessage.class | Bin 2981 -> 3677 bytes .../zerocoinj/protocol/PubcoinsMessage.class | Bin 4402 -> 4579 bytes .../furszy/zerocoinj/wallet/MultiWallet.class | Bin 18442 -> 22445 bytes .../furszy/zerocoinj/wallet/ZWallet.class | Bin 13587 -> 15411 bytes .../org/pivxj/core/AbstractBlockChain$1.class | Bin 2515 -> 2515 bytes .../org/pivxj/core/AbstractBlockChain$2.class | Bin 1831 -> 1831 bytes .../org/pivxj/core/AbstractBlockChain$3.class | Bin 1704 -> 1704 bytes .../org/pivxj/core/AbstractBlockChain$4.class | Bin 1383 -> 1383 bytes .../AbstractBlockChain$NewBlockType.class | Bin 1197 -> 1197 bytes .../org/pivxj/core/AbstractBlockChain.class | Bin 40952 -> 40952 bytes ...itcoinSerializer$BitcoinPacketHeader.class | Bin 1688 -> 1688 bytes .../org/pivxj/core/BitcoinSerializer.class | Bin 11925 -> 11997 bytes .../classes/org/pivxj/core/BloomFilter.class | Bin 9636 -> 9864 bytes .../org/pivxj/core/TransactionBag.class | Bin 647 -> 647 bytes .../pivxj/core/TransactionConfidence$1.class | Bin 1411 -> 1411 bytes .../pivxj/core/TransactionConfidence$2.class | Bin 1570 -> 1570 bytes .../pivxj/core/TransactionConfidence$3.class | Bin 1360 -> 1360 bytes ...TransactionConfidence$ConfidenceType.class | Bin 1567 -> 1567 bytes .../core/TransactionConfidence$IXType.class | Bin 1232 -> 1232 bytes ...tionConfidence$Listener$ChangeReason.class | Bin 1445 -> 1445 bytes .../core/TransactionConfidence$Source.class | Bin 1224 -> 1224 bytes .../pivxj/core/TransactionConfidence.class | Bin 11119 -> 11561 bytes .../core/TransactionInput$ConnectMode.class | Bin 1193 -> 1193 bytes .../TransactionInput$ConnectionResult.class | Bin 1266 -> 1266 bytes .../org/pivxj/core/TransactionInput.class | Bin 14752 -> 17283 bytes .../org/pivxj/core/TransactionOutPoint.class | Bin 6788 -> 7555 bytes .../org/pivxj/core/TransactionOutput.class | Bin 12078 -> 12102 bytes .../classes/org/pivxj/core/VarInt.class | Bin 1695 -> 1524 bytes .../org/pivxj/script/Script$ScriptType.class | Bin 1198 -> 1198 bytes .../org/pivxj/script/Script$VerifyFlag.class | Bin 1576 -> 1576 bytes .../classes/org/pivxj/script/Script.class | Bin 39450 -> 40269 bytes .../wallet/DefaultRiskAnalysis$Analyzer.class | Bin 1443 -> 1443 bytes .../pivxj/wallet/DefaultRiskAnalysis.class | Bin 7967 -> 8009 bytes .../wallet/DeterministicKeyChain$1.class | Bin 1376 -> 1376 bytes .../DeterministicKeyChain$Builder.class | Bin 4053 -> 4053 bytes .../DeterministicKeyChain$KeyChainType.class | Bin 1278 -> 1278 bytes .../pivxj/wallet/DeterministicKeyChain.class | Bin 49953 -> 52931 bytes .../org/pivxj/wallet/KeyChainGroup.class | Bin 28970 -> 29350 bytes .../classes/org/pivxj/wallet/Protos$1.class | Bin 974 -> 974 bytes .../pivxj/wallet/Protos$ExchangeRate$1.class | Bin 1351 -> 1351 bytes .../wallet/Protos$ExchangeRate$Builder.class | Bin 11328 -> 11328 bytes .../pivxj/wallet/Protos$ExchangeRate.class | Bin 12897 -> 12897 bytes .../org/pivxj/wallet/Protos$Extension$1.class | Bin 1333 -> 1333 bytes .../wallet/Protos$Extension$Builder.class | Bin 11313 -> 11313 bytes .../org/pivxj/wallet/Protos$Extension.class | Bin 12830 -> 12830 bytes .../org/pivxj/wallet/Protos$Key$1.class | Bin 1297 -> 1297 bytes .../org/pivxj/wallet/Protos$Key$Builder.class | Bin 24567 -> 24567 bytes .../org/pivxj/wallet/Protos$Key$Type$1.class | Bin 1053 -> 1053 bytes .../org/pivxj/wallet/Protos$Key$Type.class | Bin 3823 -> 3823 bytes .../classes/org/pivxj/wallet/Protos$Key.class | Bin 19977 -> 19977 bytes .../org/pivxj/wallet/Protos$Script$1.class | Bin 1315 -> 1315 bytes .../pivxj/wallet/Protos$Script$Builder.class | Bin 9779 -> 9779 bytes .../org/pivxj/wallet/Protos$Script.class | Bin 11577 -> 11577 bytes .../wallet/Protos$ScryptParameters$1.class | Bin 1375 -> 1375 bytes .../Protos$ScryptParameters$Builder.class | Bin 11057 -> 11057 bytes .../wallet/Protos$ScryptParameters.class | Bin 12679 -> 12679 bytes .../org/pivxj/wallet/Protos$Tag$1.class | Bin 1297 -> 1297 bytes .../org/pivxj/wallet/Protos$Tag$Builder.class | Bin 10513 -> 10513 bytes .../classes/org/pivxj/wallet/Protos$Tag.class | Bin 12055 -> 12055 bytes .../pivxj/wallet/Protos$Transaction$1.class | Bin 1345 -> 1345 bytes .../wallet/Protos$Transaction$Builder.class | Bin 37692 -> 37692 bytes .../wallet/Protos$Transaction$Pool$1.class | Bin 1109 -> 1109 bytes .../wallet/Protos$Transaction$Pool.class | Bin 4121 -> 4121 bytes .../wallet/Protos$Transaction$Purpose$1.class | Bin 1127 -> 1127 bytes .../wallet/Protos$Transaction$Purpose.class | Bin 4334 -> 4334 bytes .../org/pivxj/wallet/Protos$Transaction.class | Bin 25638 -> 25638 bytes .../Protos$TransactionConfidence$1.class | Bin 1405 -> 1405 bytes ...Protos$TransactionConfidence$Builder.class | Bin 22100 -> 22100 bytes ...rotos$TransactionConfidence$IXType$1.class | Bin 1191 -> 1191 bytes .../Protos$TransactionConfidence$IXType.class | Bin 3907 -> 3907 bytes ...rotos$TransactionConfidence$Source$1.class | Bin 1191 -> 1191 bytes .../Protos$TransactionConfidence$Source.class | Bin 3933 -> 3933 bytes .../Protos$TransactionConfidence$Type$1.class | Bin 1179 -> 1179 bytes .../Protos$TransactionConfidence$Type.class | Bin 4216 -> 4216 bytes .../wallet/Protos$TransactionConfidence.class | Bin 18487 -> 18487 bytes .../wallet/Protos$TransactionInput$1.class | Bin 1375 -> 1375 bytes .../Protos$TransactionInput$Builder.class | Bin 11921 -> 13333 bytes .../wallet/Protos$TransactionInput.class | Bin 13423 -> 14528 bytes .../Protos$TransactionInputOrBuilder.class | Bin 605 -> 783 bytes .../wallet/Protos$TransactionOutput$1.class | Bin 1381 -> 1381 bytes .../Protos$TransactionOutput$Builder.class | Bin 11354 -> 11354 bytes .../wallet/Protos$TransactionOutput.class | Bin 12955 -> 12955 bytes .../wallet/Protos$TransactionSigner$1.class | Bin 1381 -> 1381 bytes .../Protos$TransactionSigner$Builder.class | Bin 10826 -> 10826 bytes .../wallet/Protos$TransactionSigner.class | Bin 12427 -> 12427 bytes .../org/pivxj/wallet/Protos$Wallet$1.class | Bin 1315 -> 1315 bytes .../pivxj/wallet/Protos$Wallet$Builder.class | Bin 52198 -> 52198 bytes .../Protos$Wallet$EncryptionType$1.class | Bin 1134 -> 1134 bytes .../wallet/Protos$Wallet$EncryptionType.class | Bin 3730 -> 3730 bytes .../org/pivxj/wallet/Protos$Wallet.class | Bin 28340 -> 28340 bytes .../classes/org/pivxj/wallet/Protos.class | Bin 15701 -> 15907 bytes .../classes/org/pivxj/wallet/Wallet$10.class | Bin 1513 -> 1513 bytes .../classes/org/pivxj/wallet/Wallet$11.class | Bin 878 -> 878 bytes .../classes/org/pivxj/wallet/Wallet$3.class | Bin 1126 -> 1126 bytes .../classes/org/pivxj/wallet/Wallet$4.class | Bin 937 -> 937 bytes .../classes/org/pivxj/wallet/Wallet$5.class | Bin 1333 -> 1333 bytes .../classes/org/pivxj/wallet/Wallet$6.class | Bin 1325 -> 1325 bytes .../classes/org/pivxj/wallet/Wallet$7.class | Bin 930 -> 930 bytes .../classes/org/pivxj/wallet/Wallet$8.class | Bin 1106 -> 1106 bytes .../classes/org/pivxj/wallet/Wallet$9.class | Bin 1089 -> 1089 bytes .../wallet/Wallet$BalanceFutureRequest.class | Bin 909 -> 909 bytes .../org/pivxj/wallet/Wallet$BalanceType.class | Bin 1238 -> 1238 bytes .../wallet/Wallet$CompletionException.class | Bin 409 -> 409 bytes .../Wallet$CouldNotAdjustDownwards.class | Bin 468 -> 468 bytes .../wallet/Wallet$DustySendRequested.class | Bin 453 -> 453 bytes .../Wallet$ExceededMaxTransactionSize.class | Bin 477 -> 477 bytes .../pivxj/wallet/Wallet$FeeCalculation.class | Bin 694 -> 694 bytes ...Wallet$FreeStandingTransactionOutput.class | Bin 1530 -> 1530 bytes .../pivxj/wallet/Wallet$MissingSigsMode.class | Bin 1192 -> 1192 bytes .../Wallet$MultipleOpReturnRequested.class | Bin 474 -> 474 bytes .../org/pivxj/wallet/Wallet$SendResult.class | Bin 664 -> 664 bytes .../pivxj/wallet/Wallet$TxOffsetPair.class | Bin 975 -> 975 bytes .../classes/org/pivxj/wallet/Wallet.class | Bin 129299 -> 130930 bytes .../wallet/WalletProtobufSerializer$2.class | Bin 5097 -> 5097 bytes .../wallet/WalletProtobufSerializer.class | Bin 45173 -> 46037 bytes .../org/pivxj/wallet/MultiWalletTest.class | Bin 9126 -> 12702 bytes .../zerocoinj/protocol/GenWitMessage.java | 26 +- .../zerocoinj/protocol/PubcoinsMessage.java | 20 +- .../wallet/CannotSpendCoinsException.java | 18 + .../wallet/InvalidSpendException.java | 11 + .../furszy/zerocoinj/wallet/MultiWallet.java | 103 ++- .../zerocoinj/wallet/ZCSpendRequest.java | 274 +++++--- .../host/furszy/zerocoinj/wallet/ZWallet.java | 49 +- .../org/pivxj/core/AbstractBlockChain.java | 18 +- .../org/pivxj/core/BitcoinSerializer.java | 3 + .../main/java/org/pivxj/core/BloomFilter.java | 13 +- .../java/org/pivxj/core/TransactionBag.java | 2 +- .../org/pivxj/core/TransactionConfidence.java | 20 +- .../java/org/pivxj/core/TransactionInput.java | 86 ++- .../org/pivxj/core/TransactionOutPoint.java | 33 +- .../org/pivxj/core/TransactionOutput.java | 7 +- core/src/main/java/org/pivxj/core/VarInt.java | 1 - .../main/java/org/pivxj/script/Script.java | 27 +- .../org/pivxj/wallet/DefaultRiskAnalysis.java | 4 + .../pivxj/wallet/DeterministicKeyChain.java | 154 ++++- .../java/org/pivxj/wallet/KeyChainGroup.java | 13 +- .../main/java/org/pivxj/wallet/Protos.java | 593 +++++++++++++++--- .../main/java/org/pivxj/wallet/Wallet.java | 78 ++- .../wallet/WalletProtobufSerializer.java | 37 +- .../exceptions/InvalidCoinException.java | 7 + .../exceptions/RequestFailedException.java | 10 + .../org/pivxj/wallet/MultiWalletTest.java | 146 ++++- .../org/pivxj/zerocoin/CoinSpendTest.java | 348 +++++++--- .../org/pivxj/zerocoin/ConnectionTest.java | 244 +++++++ .../org/pivxj/zerocoin/PeergroupUtil.java | 6 + core/src/wallet.proto | 6 + .../pivxj/examples/BackupToMnemonicSeed.java | 6 +- .../org/pivxj/tools/BuildCheckpoints.java | 16 +- 149 files changed, 1976 insertions(+), 406 deletions(-) create mode 100644 core/src/main/java/host/furszy/zerocoinj/wallet/CannotSpendCoinsException.java create mode 100644 core/src/main/java/host/furszy/zerocoinj/wallet/InvalidSpendException.java create mode 100644 core/src/main/java/org/pivxj/wallet/exceptions/InvalidCoinException.java create mode 100644 core/src/main/java/org/pivxj/wallet/exceptions/RequestFailedException.java create mode 100644 core/src/test/java/org/pivxj/zerocoin/ConnectionTest.java diff --git a/.gitignore b/.gitignore index 6522dc396..85af96b87 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,5 @@ checkpoints.txt *.db core/2.0.32_pivx-wallet-backup_org.pivx.production-2017-11-20 *build/ -*.DS_Store \ No newline at end of file +*.DS_Store +*out/ \ No newline at end of file diff --git a/core/out/production/classes/host/furszy/zerocoinj/protocol/GenWitMessage.class b/core/out/production/classes/host/furszy/zerocoinj/protocol/GenWitMessage.class index 90b0651ba572095d3a5d79fb70cf8dd3211da3f2..7ad074138bd909d4dc63387d866cecb290c04006 100644 GIT binary patch literal 3677 zcmb7H>su7p9exjc85jpq6e8ZDYplxxuGO?n6s;gemo7*^P-2>P*ge4L?#yO(7R5x< zHcd_M_cpyJZ4&#TACk0yPko;HEg$+v)xPKKu!|eC^x@fa{axSRZyMsIzaX;adjYG_eQYHt?2#@0i$!I|klXdcSMndj`HQ z(CW)qE3zDnR*D%nFVK^{YA@L7O5haIInT{id|$dj+77&;lS>ciDdPrmPWmSVHq8_~ zulRyf2&6BtJL~y#>5{W><0^T5nI5d)D&lfr`@wnX%*_V^A|nvVOIP4vHs=-7H>L08 zJjV@L&u}>;U21jh!0}x2n{`tK;{A^61g8WJB^$Ml%HX=^UmLT1yC`W``NWmM?kR!j z880sd+Om!->F$j5FWNH&p0sDZoL!i*eMjxX!)P$?lm!lF=e=@}o~`)hn~Q6VEcsqQ zdkg7v(!JyaBeGn!=OnF+my}*|CjPfw0!GPREO<77Z@MxlFuDO}G8=*`Gc>GxZk7dE zWB_T;)>*qymSbMo37iEvZU^*S3^6Re?dHAWD1)s|hRMWulnR875lSj4o69noSR1@( zGNaC0=VUNm%O8P`WOp@v3bs3!uBS;0=~k0uFKM2bCYwq8h%(y1T#56T384bsy&(k1 z;<#n$GuOJ3RkMnAFrOZD=2k7!S&_E`TcC4&3Jr!E*p&1HF)sexq1^tF-+Nzc=s)3xC9)1or3_^f*Wq?|_9#ylde-{Mo`^ zl$7@|W#I!12yD~bIs-4x``&d`(-uC&-PJ1!UV|c?tTT*P+`uWy8pKK$`MNd5MtY)R zI3v*e|1=FIUjxixHxby^a4{Bkotl9H$qlrOD}%aR4{m@|m4uOG_s|?|j+^s!0~v7h z=OjyMYaOhxib%g;7b@}sv$>Ofp_-}<9bkKdBa?hzSW(+ppVhLcS0w}TxN=ox6H8XR zxt>{gs$GP5P3ZE9^UW%Ie2(~D*!fAv4UQevjf|b`zy@9#ftFd{D^4k&6uk6k16(Y| z)h@&QdZdIEq}wanj*FhE@@i>k&ni!cYnA;Op0;Yot382i)q&>MU4lsD3Z7~?t#&>? zQ7M&tzCn^N$&L`dM@!&D_Z0T?)8QaLQDW#)HOp0#Dquac==IFH*E1`bb1Q@@RgRzM zZWvKSI5($ydLt_kA8X2^98F3BKRFCM#Sb9xOGDG)S$u&za;Va$6t!aglUm6=9?E?O zE&Kx#sh$-yrFJhNlImMRG<6@b>5k}*Sf>$NL3{~DU1KM`06mKFYsSO@w9&Wy^iF9% zPdg~Brae*9o>0wA+nP`vPFtD437$nYM?X$#xe1)YmnlWyGzLN|t5yS>QlFrC87)gN z>*iDeNYa#UZGuH6l7=P-4B|{E<`mT{u;Qs*^s`YyFV**H37u7{niFwtI^P2f;cO`D zC}$07>K`!gVbe#H+XNMmxIRC!#+K%qEid3)$e#}RW8^m)nV((59IG*(M`j)7$ln?? zKesOPFut-5bF@)&|GLasjD*ZXA%vDPyXPLPWwbT|d79u4XgO6Nts0OPMsYzqK86=V ziKjm+adV?fLr;_z#W?jf={k9hK~!NmsS}t+w(+-R1zVZHDP{9A+Ly2`m0HI3w^g$1 z#XWSWoDUDzHE@S8F+SH4lW$YU5`4oG4KSc*OyYHg?c(k{R zlzZP_X<|c33>Fh4vAELWQaEbCR^Yju=#wp=4Zev;l zrMglxD!jQ&SZ=fDO!Hnv>P`sW6|OI%({*Gpq!(vVOZsu-=XHCfc7lYz3 AQ~&?~ delta 1491 zcmaJ>T~}0P6n@T}Gv}Q-z7{fkID$ZA40DD7lMtgQ4HQwp3L&A-QAtGtRQ$^1q(;)W zdb;Z-*Rth}7rJZ)R;(3WdC^^W-L$&s7t{}ko_%H-KoK!faFyo*Grxng9oW1ww zuZI6usL{V}&Xk#r$zcP|&U1&xre}^#O|tf!AG4;{vT~d)6k6H9|Hj%>nZ$XGB;MC( z#8VoZ#55q`|6+N)uP(Bg|=h zEKROrUf~msPw|=G6RvMhqDx~JKG*mHUut|Mh1bxdaUER-V&j=JnU;yn)Jze@@jJt#wobun-cgj6%X9@FWs= zQlnQe1SD;?+#f$D`(i#0s8gdEC=zkv({ z$8I8G-y)7g5l13mC#Vx5RDd^uHZrt=+*Y)+tL$#WvjOK0JXgTGg+Acoeh<@IMD#8T z^N8$Vqaiq4=Zgx58&tcK86n)wYB^f7K_s;ZCx0b_T;I%C&qRTfpNSzbl|~D9K`->*nB< z&WlovO6M056TyO*8m>|jq2%7jsCf;ioWNGD+BuSK{~A?ifnqmnEuO!V&o1=P5|eR- z8i|@$mrypcfbu@0UyyjI94Z)Ca~xzPgK!S(AI4@7up&N?dVq~h4^Ym4&&K%6OLIJiJ;F zoaU$9%fZazd=z`Immw!pm|q{`1Bk8=nWfOLFrctc;bj=~j=92OvzQN(-P~B=?Xg$W WWVf&Q0`Dt##Js|nUuFLg2LAy^vdudH diff --git a/core/out/production/classes/host/furszy/zerocoinj/protocol/PubcoinsMessage.class b/core/out/production/classes/host/furszy/zerocoinj/protocol/PubcoinsMessage.class index a05239d070845ce95cafde13eaf6f1acd758d58c..26c705195b5a2d9b04b905dd27f3854e79818240 100644 GIT binary patch delta 2147 zcmZuxX;hR|7=G@|FyG8@RYX8RNn|l)fPq{xOdFR>4JZv2EYcB21V_*TTq+waq|CHz zw6rW+rNtc?KuT=0vOQaW^s93^{_0nM>YSwK{RV-I^PTg&?|qm1uJ=2W{#!=q($#b4 z0ZhWrPSm5pg+^==*zCe&Y!TS%r1k-U2L&Dy*ybWUEL_OIb{8~uh~yE0M+KT>2h_9}n|34?| zgo(?;nYJsTV;U!M%D`!jGicQ~i#81}A_DCiQ!rKIW`SwAMdMb?&?rN>MhA)%M%4H= z`8XYxFSsGu9%{M5$mSezITjeQT8?4*xTNUtYe2eeGY4#~rFKL;5n&UFQ*SL%y z!UydIahLI<9DdTM!v=-C@E0D-kb%+2LME41qRxb!nAI0Gt1oJnS+7LRGAov-S+XjOC!ACpgGJ=EnWgBa zQ)l)ggvDgJA$EYaFPr=glTe&YlFR)8lv@DXQu8P zyZG>Fz+1n~c2!BZV45yD+MpyrUDz3On18 z62a&Q#zaM_3MILnxIy6%Mv@t;Z~r94x}E5?D=VKeIL`&86bs znwi9KUh&7cbzFSeM7t?nU{(@+Co#RbDpX;u`Cd;9OA7Sc77t<@{l`@Et{SW(%99!x z(SC}8fdLl{a*0A9>Kx9GOEP~D(d3p4YP+6uzZQr^_m<{7eqEsQL7n+;?RBo<7KpRA z3lsPPCdTs-%gV3k!sW#0Mh}MYc~RaWyeG;#Bgl{27C}J-H(g)hiUEPWy)Ct1qnTci P8yNio*K>1^dz1eKk3ee? delta 1954 zcmZuyTU3-)6#mZK{+WM{id+Wqf`pFZ%phW3(G*Kf3kb~{X6Q&L5Ne@lW;R+#7qi>1 zm1&k)QCi-R0i=X(R?_XYm)2^vR?CN;dvGnKZ~rqwwuH6z{?5Lf^X+~1`RC6u=W}CM zZd|+s;7F*hLm{?_XcVzs#150<2|+szJZVB>msp+>vD=TQ z5fk4Y1A9%RitiabE27E3K5;jj2;e!27@n7i7sU9YAN%o=hyw;*7V|42UN!KVi97JR z0n5Na6Jv46z#AsUVV4(gihfJPVK3hH;)oYVW%Z7TVFiT?@mTR2FB84>jw8m|<^#$`98lpQ(YPW8a#Bz;u zsL?o&Y6Gnr7tp2=$0DoSo$GJc=s>5&MRZwzyN8coiq9qI3yn*%aW{H2zQk8#s_`|x z(fAgZ71AxG(t{e`NzC^szj=6lbo0i7Wi<_3c0||LS8M!$E7k_jROf8!W1bn_Ui_%h zi=V9DJ%xjM@v|&`(WpgT>quj{qjirjqFm0r39DOAnm#qFkb?oZ;E>9R98$ckSw9qJ z*mx%GYz488w%NFg>p9jx{&BInv<2X%OoJDh9H3zsN}P@nD5iCa?aRPC+|3n`fqO8Y zdk9*9h1^Hby;uaNjTRHRa38UYQTN-YmB?wdoMMbY9Snur;SNRG;IWSA9GgS7?aAh8 zqhTTkLpW#|$R&%h{14h(=D;J_{ak|mT!MD>!X;?eFI<8$0c0UaYImcQSlisiHgWyucY@lh>hWeN{+Llchc2)WcX48NuSoPI{I|LQmPK>FX&g;ds+R-#Ht z&KC=JAU#av=|F~PLv$Ac6~x|7WGd`y$FMlE;uxMVjZi4d@5D%j!^k8UrO<=yB3C%e z#oU&@zrt~hE(>4AsK{mR6-Q1BQj1)XELR-4EilBAf3_^YG{3vZ9s7TrCz9nEh|6+! zmvmul1!pGMP5ztFfJRP-i4AB@>iw+h5V;)Xx)}%f<&wW9oMvB}DMcrmUxdN*Ok?(R ze$r;JS2JTAvm$#$R`F?6@^M7jt_{3~ChBGe?|%sG|Q7R8z|HETEQ$ z?UqqEOW?4_HL=O!+iarPBs)p7{{3%pPCoP1R)qlD3xO**bp2^V6Wi(1op)-F=clg1#wKerJhOLaOHmvE>3pE Wfk*AK>v^m4pcH?Jx8TF#tbYNMHbFoD diff --git a/core/out/production/classes/host/furszy/zerocoinj/wallet/MultiWallet.class b/core/out/production/classes/host/furszy/zerocoinj/wallet/MultiWallet.class index 1b5222fa8001276bf31eb9a9ee456538c1f812cd..367894529940df2422cf8d74963e37435528fec8 100644 GIT binary patch literal 22445 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 G)&CDCZYt&g diff --git a/core/out/production/classes/host/furszy/zerocoinj/wallet/ZWallet.class b/core/out/production/classes/host/furszy/zerocoinj/wallet/ZWallet.class index 16f494e5ee6c7e333bb7e5a824256ff9a0b71d2f..f73968ac0777b66503a4fe88283bd6fae5f1013d 100644 GIT binary patch literal 15411 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 literal 13587 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 XYSHKW@E@DL&ELg!Cf~!m=llK#ba3KA diff --git a/core/out/production/classes/org/pivxj/core/AbstractBlockChain$1.class b/core/out/production/classes/org/pivxj/core/AbstractBlockChain$1.class index 87afc2bf5b9aa280f062d7ad6cc572c23668500b..82443d64791d52765686c273b44c7f9b7f010f94 100644 GIT binary patch delta 39 vcmcaCd|7zINe;%w$)`A)McWuynA#b%nEDuWnK~Ktn7SA&nffOuaTWpq{}~HK delta 39 vcmcaCd|7zINe;$|lTUFpi%w%;VVcgM#WasWmuV)09@8uaOQ!jglQ;_j2Dl5g diff --git a/core/out/production/classes/org/pivxj/core/AbstractBlockChain$2.class b/core/out/production/classes/org/pivxj/core/AbstractBlockChain$2.class index 2ba0b9db363d102f2410dc94dc866400bb768f23..85059556909fd0b0096f903b6eef50ac2362feec 100644 GIT binary patch delta 39 vcmZ3^x14W-D;wkN$!=_AqVpNJm=-X|GA(0JU|Pta$h3$-hiUobi)>*4*%%6$ delta 39 vcmZ3^x14W-D;wkL$!=_AqU#yBm^LuTGHqi}VA{x_$h3(;hiUudi)>*4;HV1; diff --git a/core/out/production/classes/org/pivxj/core/AbstractBlockChain$3.class b/core/out/production/classes/org/pivxj/core/AbstractBlockChain$3.class index 9b777c4e9d6aa678a48578f7d93c98e2c099e080..38f53b8983ff0b937c5d529d72547907e462c0bd 100644 GIT binary patch delta 35 rcmZ3%yMlMaRaQo=$=6s*1oarCnGG4_nDrUtnGG1Un2jb!v-tu5sze9U delta 35 rcmZ3%yMlMaRaQo;$=6s*1nn54nH?GAnC%(lnH?Ckn4Km^v-tu5umlJ) diff --git a/core/out/production/classes/org/pivxj/core/AbstractBlockChain$4.class b/core/out/production/classes/org/pivxj/core/AbstractBlockChain$4.class index 9cd1a863faf112280d8c8f239e406efd6a5b5fa6..ff2c4ac087325b65eccd2071907f92342d8bbbc5 100644 GIT binary patch delta 31 ncmaFP^_*+N3KqtRlUK6D@lIjjW}C_&%r=cdhHb`V5!PS;tJ4V{ delta 31 ncmaFP^_*+N3KqtNlUK6D@h)NDW?RZ2%(jd{hHb@U5!PS;umcHh diff --git a/core/out/production/classes/org/pivxj/core/AbstractBlockChain$NewBlockType.class b/core/out/production/classes/org/pivxj/core/AbstractBlockChain$NewBlockType.class index e51a2ca759c930ea904738aabb883cc246bf10eb..67f6f1ec2a7be9431eeb966a4a334a08f298b100 100644 GIT binary patch delta 39 scmZ3>xt4RoQf9{N$;+7af#fx2J0K~_lFOOHz{{M=AjO delta 39 scmZ3>xt4RoQf9{L$;+7af#fx2J0K~_lFM1cz{_0AAjMogxtm1^0R8+6RR910 diff --git a/core/out/production/classes/org/pivxj/core/AbstractBlockChain.class b/core/out/production/classes/org/pivxj/core/AbstractBlockChain.class index 3258e8641eb94d18b3bb2cf39280df6c03a94abe..005cd15a8a0e13360170ff7ceaabe54b5f80a689 100644 GIT binary patch delta 2564 zcmWlZdwkE;AID$s+sE8DGc(K#GcA`i#>Q-J%N8+7av8a1rTWQb7++&d{QT6u?wjqA zq@oGmSh=L6h%%STZAgAUxB7LX3|)Tb_t)#3^FHtQc|Tw0JWkbquG-JrPL1=0ey+3bPOx00_*5FPSPoyrmt{? zzQI*GgS&K=K<6lkE>TT7PqnF%BIp9e&_!xZSEwyrqj_jH8=0nyP4`(`@>I zrqa(epKj42x=l;ycUtCRE1a&TszC1eQi@D zaDTcu? zg1HJ!_%7PgPXq;`*eD)0OKp@%HM}deutVx#r-a}$sfUvi zinCH5cO;BR!l|Y-qz2N6qNOoCBuywmqNs4I@3n!5(uA` zz!BXMCMk%NR5X*Gh?QRGEWOc7()<% zVpslU)RH9#k)>!X|3q_HR#+77Z!!C3A3thHu?wz8gp{~IsjL4Q5@iFr%SH^4H!w)v z##q_x>Tkhpc?WZ)40*B@3*}w-Wjj{Oj=-SY_S9joEA^o(wcnlbkt_2Fy2(NG6L+_A z7!%}kOpzll{V0~mmv}`g0z2l6X5UxNfv;VQ-ylfNpr)L4PMmYCo=1JDM7UgVu3U8F zm(Wtab^cvOTlo(0@*kwjRY!i^mA-+QauYuJ!BPJgMe+;E-n9UPDgqC9369rchOi)F66Dt5YYfMG0Dmk~EZ(HJDPg9;M24O4A0Eq2V-C z8`5(cLDRJn&DAEfR3pi+O{r9)=uK@#0ga|T+L8`w44u+gIot!Fd7kbpY$bFpWo$c0x@}KppLj5bc8cnuu^sLL=>pDD8%pnv7WOj<%YD zcQ@p-M;N z4;@3Ctz)UWj(0{(qE?zs59(xUqc1o^rc%8A!FemPn=n$}#EbftW8I9ox&?*$4gy-{ zIJefvF^uT`Z4~F(@kXhsbfAw4fJzru16?N zk2=OLsJm9Ui#|?6^aN$;sle`+6UFB~9X*c*`Yj&T%ShDkkfc|Urq?lEZ#eIN#6-P? z=kzva>+e{kcd$yUP^$Ovw%*59{SzM;@P(V7G{!j-TrtHh^Kj3qQ8lYh!B&GJtR_WS zEoyDGsh!oO&K69)Erc@TER;rDeVSrnG}{_dfkn_VYeMTSk~UdWDzj#^)1v8uwFne1 zn@W+bpcaej)*2!903s|7(e@x7u=Yr>v_RYC%h}f-VvoVI0d89+YTFX{HrWt}UVEwv<-bE40!I zX|0W;QY)g@t(dmkdfI0t^tru8XKVxAwAbmDy+!wJb6{a%U5+ku9Pc8`b|BK;bA9hb z8!Jag`vBc+x9fjjVCRZ*8h-$F>=TD}5V7_d;_VO;?FiECsKfgLE^LnD6*9)V(-k9w5!3-}AbG%1T;Pu5iFCArG2KIUV{EOFoTzxRA zc~78@H^e_^?MH3Ly4iSydJ_=tO+Kx zUK~-5>fUa5=w3v6`;q7!L|^X^26~76PptRXK8Ctpg^M0{$Di>3wtiS`_lhTRq#KG~<6zuy6DL delta 2564 zcmWlZd01A}7RKMT_F6{}5tOMvUA?L^m6~8PLL=EM`5r?jp zmWrt-wNx^Fy4he-IN&^7yINvub}KB)_I=JD@7ZhZwf6eG`+0WdQLa47drqf&pCF1{ z#L#}Uqyy+k2hoL|ptsd$=`dcPBN#)UVlEv+mW^jy&7p6wluEIRzQuYfLm8b#Ii15z zx`!#cd?DPVJ~mT zNBkbX;+?p`hwwcg#%(UaL;l1Knfe`d_}sdA67~5M;Yet`0icA`57;R;0aT{P!=Xvg>6kr_?dYZz5c z6$BeU)G_{OVydFE3BW*84P#6Yrkh~QH#PCP2|mX+R{SPjsl8I587mU z(L1KM8!@vrd-@^F^hcx_fO=*S;>=*QG0&l!N%M`HT^>COY(_)P1XMS#pq80vcTGZq znS!UyRCF+}`bN&lra8Wwb4r^pMwH1#qFI9GCeLp9&MZTk$;V9lKgX=VTvLE- zQ)uZ{xi>RIDQvB6zYf*RdeksQsBJbN#%wGoityE+cc;fz>((xtEQZJIwuujH|Gh{y z`_R#Ri2i0j2APkobBApI!En?#mj*-tVmg|Ft9Df}i;T0p>^R#2q_o z1wzeTM3|qfEB7qIPyiKofZh-OIwEs#W7DoNy%CbU_a(spS^t~95^(vnU{D>^N0=#q4# z0)QOULMgg)2ET^d)XY8`GwA<+Ztz0ac)Nh5D^$9{PkJCgdZN1YLJjGSP)R|Aq@tEQ zizw-X2GSRC(ho_}A1!1MQe-gFWC+Gd8fM8*WXdpjWjJzVgf(KcH6q;_G2R+6!5T3M zua2Le|k4DWc1=#oe`N ztnt2UdAC{K?UwgFRFn4+Bs)-3c3Re5s3XOeb+={x0F7iXI>|ot5f^>s07l3`OqY)= z>me+V!zhp=aHYg@eu_`z7`~R{D3i}{Sx(@-e1ZST*Y?7{!6PZNtflx{zQdCQIY26B zEps`A%LR&&i;2ytuLhGY12J?gH}G%!Ky(sVVd4pBNDu{s$EIu+e?8V2aA7_1o>p))W=XX168Wl`r~oo3>I&cz|k z!fEy5ioSsd`X+wUY&_CMB$`8EnrG3LQIamF)|yYxr|JrNQCHGv_0cO@NSV5Z=IeUO z*CHy^w`rAbp>;ZgHtSB>s=H{f7E_7trZ06bo!5PIM_u|wKcYYNkh`cLh@(p^$5Djo zaYX88cJ6;8QBRoUPOvsvUrz~u2(JE zHN2tMu}N=Zo8CdO-i538P@?y7N`J;#eTd8YJML*E8GU529#f1yp~eoVvqLo8>E?d7 zdI2T(L{%phVNPGfIs*{z3`Bcp5c)WS@sjf#rZ__|+et%~^E`5#p;+&{fMRDDN}S=o z+_lI2(^174i|Woe-=KA$CcS1?GZEs?;Enw7kCvx&NZ98ZjZm=`*q{6K>Lh4 bw=DE+oB6>vd{cX>aMx`LCHmaAdvoeP5QKHo diff --git a/core/out/production/classes/org/pivxj/core/BitcoinSerializer$BitcoinPacketHeader.class b/core/out/production/classes/org/pivxj/core/BitcoinSerializer$BitcoinPacketHeader.class index 82578a2ad60ae3a999ac4d6a001259cf216d4cd1..5fa852cca142b723cf838b99023779c4db6c5668 100644 GIT binary patch delta 77 zcmV-T0J8s>4VVqE;{`#b00aT101N@A02=|R0389X05Sot05$=y06_t;080U}08Rn3 j09ygH0A2yM0B!-d0E_{;0Fwc{0HFcB0HguFlOzUo8N(Gt delta 77 zcmV-T0J8s>4VVqE;{`#Y00aS}01N@702=|O0389U05Soq05$=v06_t*080U`08Rn0 j09ygE0A2yJ0B!-a0E_{*0Fwc^0HFc80HguClOzUo5@Zz; diff --git a/core/out/production/classes/org/pivxj/core/BitcoinSerializer.class b/core/out/production/classes/org/pivxj/core/BitcoinSerializer.class index 05fad264bd781e4b038cb116259788c4eea8fc98..b66d485b1b1efce3fc92c4979602fdb61e6a26e0 100644 GIT binary patch delta 4270 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 delta 4251 zcma)A2~<^87vA4}!?|284><4;5EO(QcuJWKilJ#*Hrl9?l{qF!QaI$_^cqZ4qv>X) zm6@9L+aQU8M)Pb%+FX{VWs})tlNRQ`_kE9dk+uG{V!6)Qd!KXmx5sntbL;sF&yT+G z&r{D5Q6Hm&LcT>$qf-(E&{>88g+dEmP-LMPhgj4RU1jJdYWS zu)v~fk>0FOYf+7mw@FK6nTS1kI39;(JD-~ z2v{#gxIw6=q#Bw6T*&fwz{1mbM&VhD>d{Fm>^X(!O}wD+qKTIjURHQT;Z;z^8sFJQ zcnioHI&1vIOQ%;>Po1Xl8mM=7XNQ^XTo*VJ1L_+CE8ric@VYZb&Gm2Otk&;R`+$6B zXVNQa&B(Rs6?)aC*XVUnfpZ|aV2HvSHr~Wr3e7g&#wMHgVzZ5R@UD&buu0*48z109 zg^z4}j87D{*!UEm+4LMeudvm|He@^b$w&759NQIk*!Tip+SrM&YyH zVI##kJ=C|GVH-a7)9@Pska_8hapS8ir%tmGKoH~~J7GeNP5;mVXLZO4bJjU+lPasG zPpqk`9y`H?0_sPmmKe^1>4*55ji9qJeKgO?>86+aV3S~@%o$Y`dgI2bThrp<0h6=@EIS^sU?kMltk8% zuOx3B`JZ$*Z{|^xpT|i&UPMVWnL^aNlHOraLF^p8OYbqq8eCkslpq_7z{%%%ld~`X zQEYY|>eN3fCx?-uEb2}lvfa`(ixWB)(?|3%pA*?9w1v+K^(lSESV6jzwzAAmr_m|2 zji~^A&g+_d`zcG&cKk)%TIgJ+Xa~#vtmg~YhA+himMkZ~Gp6&fsJNBoBG02VnopUu zfDWfxI)-j>Ju7itE>Boh&bI7yttxkIG5Az3*HWKrfk|kg!xepX5boFXO&oVLTQ4yV zmqZ$h`z_4L10D`i0Zvqih}}VSYDU>Ez!}r*NA1U!Oi_DL&v~ z|H`P`^n%SrUdV7Jk*^$OL1$H$9^KO-y1aq9MMDEh0G=zT2Zo=e7zd!cv-J^dKcwjk#lkpKfTV4Ma9RJMfBNi6rUrz zx<>SfHnNc-(-A$YRcA%3&U1MMd!5~^b6b6|co?GTO*B8Y>T9G0brF5Ddnm1mYFiK8 z!qQt^X=)SQ=1Lpsb{5{zDsv4=;oHxnVh5TRKP{?2Pd7g)mjux@l`Ix$JAc# zcCJsRVnrcTtSFd@${WBH<@1%f%@%YkrId85z1`PEO=hMSmA(WaQ+8!=X?( zEi8YTox|a*aAsy^I6KjPJs7fu_VXxhe<;sVmjS7Oc1?jpT@UPNY)9O1$UPq`K{}O7 z(7hm=Xh|%XC3%hXKzluX+jMVgtN(l_imw8m8uxz(({eMhiEI_(AcLYTl;%xoqNOpE zMtZP4#-KJ0oRYvuiDR_YY(VY;aefqML@scyyk#-Pc_sOcw7i|}C{A*f$F9D#gz~h6 z18MNb63CaIq|(6ucO4D1g(ml=X>P3cd~m`V(h=x!Ji#*9c>(66*Eo><-{I60<4o~ap@dkP#Cm_&no5vn;Oec*Q)B!W85SP1V z$aT)TV(E^$WNZA36ZtNV=UX<$8dkHS5K_5ckSC$v`Ii+L6)_W=bl)G*QH*@fXgZp2%{GSj^_vw}m10Q&(Ug z7q8ntAtrw1zU+W(sb}Ymo>^_mVxbFZ^NM_c#XfvY~|Z%nUu8oSRITEee`UY=luAbvD^YuKBar7M?)1>e5m|A^vjFB%} c&}OG!X>Es&OdH4}`9BE$AxA}=)n_Q_f5PZz#Q*>R diff --git a/core/out/production/classes/org/pivxj/core/BloomFilter.class b/core/out/production/classes/org/pivxj/core/BloomFilter.class index faa1e9cbed9146bb47a1faa63260aed239a899df..6e913ae59e45b86a0f226e79a7423e64550f421f 100644 GIT binary patch delta 3744 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 K)(xyE>hOP0N$z+6 delta 3495 zcmYjU33!y{5q{r2^6&on6E?e>gOFr5gb>&e0)d2ZNg^Q-2|^XH$kixd4y1zMQIQn| z8zX}7TMtwO6i);sW)Ow%!4{bzI;T~oE$U{4P- zO%$+~?qqqGtz(W_4yg#M$Tis8#31IW=wmXUeN7gypKATrpGc2JoL^3Dn&({o?ZGDJ zv%7bc#vPoHj~Xk~vjbEVnHb4laX3d99GS>b z9Btxko?&tfD-tTgaZ2KRRqAH+OoL-hOlOtO#;MtAy*%FJ1lAZlOD7Xe%wnw`n3Tw~ zIa$RNUHgs6b9k;^nyO-&8k%nKJQEl3wH+N7U(^ z3k+UpVhQJ|m~Y~8E--l!>kT%TY-E#87Mi@6i%kBWml#}Za7k;8!{e}Ly7utW)_~jZ z3?>*{YH*ps%LKQ<%ZX4w`?Z8Ddz$BP(h`AX@Cv~rzU(q@bM}=M|A0*v*5ED`+bmwi zFX_SV6#En;w@-5_$Q0E@-~_9b_?4T)-F6|@eXdZcqi{Nc(=t(Y_{+e+AZFr z+KYI};AV?kxYgpl5-;zw*CtkuTxxL}?NtkAF%i!AF}wc((?$n+ol!Dev~^b?!-?PUd2(1yZD&!ZgDqTi7b1KkyUQ-aki<6 zn8iKZD+#gq1YWYZkNYh?iK7Oeve>R5_v1+mui&7?1H9kfXyqqA&1WQA7N1p&S@yu> z^uA;3mn~|t_?((}Ud0P4UZlkLvc*@#4iCz0GpWzGS1CKM@fnM+^9_SB(G2}!Zhp#<`kU!ixNr@rX-&^z;@^-~Nt`nIM zzqkrFi*9uq!Fp_vnG5$}n>bboZ8B2_vm=oh`n16(#-qOW)j{OnvI$B1Q82^bZx8w( z(EUgoQe;0R2!Hox;c1&`k%%jX0nQ<9$cV_nBKbdXUK@%Z6Aw-(s)&RPVaFr-XW6(=q!PH3i|9W==aNI7aXB1+#1&?mtA-O589vi3`7Ub5QhSO z4+h6j62p)}oy#agO5t7%l`&06UC)T2RB<`txH5$=;0^?_5m~qseQ*~B;BE}XrZ|kW zc%n+XU;w3f2oDQ$Ct*AyaXF>w?8`DERa;KGl87A=s(uo&GhP&4?Mt~T^g9*^`b2KC~gGtX@MI(I7T3~NTLHADG*v-9 zHrZ42UTBSlk#Iu%cn$1xQG^}N4m#x_vWI04xVU03DmTLI+`h`e2TpwCIz>#HxB)(s ze)}AG_yYN&7vg9HhocdEfoo4E2SXRu~bn99PE8eEamD;ZNHU0z$G5f z+>n#j>ua(6jez@FnEv)Ot9{UF56%fhPucOpp>~c53^jA0v)(XCAgJ?{NMQ_PW2n+` zoQ$VBAzA6eKZKHh!iOJDE9I1K#3^_h&xpxf$>X*z(<9)vpUVm7;8#gjNBmmnvtxB# z%f)ke-exG^sosd0;mt2|GuA4CdURZ4VLeAL=is3 zN8;qqVp1!+)5yo&HjZ@L_*iUc)Dqqa!DJZt#K5NpK0EnuAA!-wkmf#)0t25L_`<+n zj)_$z=&1cw@2#w{Tk6$M-@BB$r)mi>6tj zfDTD>eJMnxGgDe@lMto!OhmwU94S)xKS=n;(a*rY4E$U44ulQ-r9k7j-(|#s|A|Qljw33g`~`)p<#k$7(ewW+ C^tZ(T diff --git a/core/out/production/classes/org/pivxj/core/TransactionBag.class b/core/out/production/classes/org/pivxj/core/TransactionBag.class index 1a5d10bccbfe564acafd818a4dddb932e1aed3b5..b7b6fa5faee295108167a666c6b877d1af1dbf9c 100644 GIT binary patch delta 16 XcmZo?ZD*a3%o?0rlv%JbL!Jo$Eu;lZ delta 16 XcmZo?ZD*a3%<5lSQc$`vL!Jo$E@1^| diff --git a/core/out/production/classes/org/pivxj/core/TransactionConfidence$1.class b/core/out/production/classes/org/pivxj/core/TransactionConfidence$1.class index ba8f6e3c6369ceef4f33b402711bf2a7a61b08d7..e39c464731613ac4e51831b7870163e5aa96bef3 100644 GIT binary patch delta 23 fcmZqXZsy)_kA?BU=0 delta 23 fcmZqXZsy)_kA?BV8@KJ9$5AG61jb3ZDP~ diff --git a/core/out/production/classes/org/pivxj/core/TransactionConfidence$3.class b/core/out/production/classes/org/pivxj/core/TransactionConfidence$3.class index cb3b40a7642f077701ea2644aee450ad3ac7ddfc..7ef07689e2193d336d883534f9a078f3c281c036 100644 GIT binary patch delta 17 Ycmcb>b%ATc6BgED26e{7$uC*b0Xw(`H2?qr delta 17 Ycmcb>b%ATc6BgDS26e`$$uC*b0XtR(CjbBd diff --git a/core/out/production/classes/org/pivxj/core/TransactionConfidence$ConfidenceType.class b/core/out/production/classes/org/pivxj/core/TransactionConfidence$ConfidenceType.class index 1f040013db07bef98add1c10ed5709adf104f8a3..e5ef479602e73e2fe4dd7659632182da71939392 100644 GIT binary patch delta 65 zcmbQwGoNQeB@1KN1vREEp;n+!(?p|7BGI06{PiV*mgE delta 65 zcmbQwGoNQeB@1KVdCIGi$#MO_!wdtWEfHz Uv>5UjEEtLz+!z8U|7BGI06I_*CjbBd diff --git a/core/out/production/classes/org/pivxj/core/TransactionConfidence$IXType.class b/core/out/production/classes/org/pivxj/core/TransactionConfidence$IXType.class index d424531ac16f05a54162e32678cff1f2d73fccb9..e7a4c305a867c825bb3db7279cb20ddc4e858422 100644 GIT binary patch delta 43 wcmcb>d4Y4oMrKCo$(xw3IG5A delta 43 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 WZsvKZ(DBcp8gs_mO#06Br2hi6h;=*w delta 4598 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 diff --git a/core/out/production/classes/org/pivxj/core/TransactionInput$ConnectMode.class b/core/out/production/classes/org/pivxj/core/TransactionInput$ConnectMode.class index 5e879d1c06305512d51f0f7c334bdbb456bd4b05..2d69f03c0c92df16023a1ec894fdf2804a1fc8a9 100644 GIT binary patch delta 39 rcmZ3PQMX diff --git a/core/out/production/classes/org/pivxj/core/TransactionInput$ConnectionResult.class b/core/out/production/classes/org/pivxj/core/TransactionInput$ConnectionResult.class index 30850e5a4acdfb9b3decc8ed8ed05f9d4a22d52b..5aacc1f748b7eb367efef17fec5b3b42d737b861 100644 GIT binary patch delta 43 vcmeyw`H6GGWoAap$yb>5fg}ry9guWpY2dYD;AOOCkYco9PzQ=!U{L}985fg}ry9guWpY2YqScDsZnw6&c6Zyl-Q8|?x81hdcWqhO|M~8nnLCp}Y5Uu? z<<7m|+e5ziij>%uNb`D;2oKGptJbT;C>G=4|qs%P%a@4#dt6qcRS@0 zmP0Jp4)il+4|o&G+!V9$fB|$4`6s zGkm|n2W0a>4=v;e1mJ@nTEw3<_;WJyd4s4=v%x zW#$PPd{Qn)1kO`#e%jzKd8mPp%H_*4b4(CFBahFz`M8H3kl&c>9?szrJ|TC{diXg$ z>E`F%{DQ1J<>nW2_$B^|?0q>KmsdQL$#=`;t1|YgY&~u8Yx3|lLGw4+{B{0Y0rm|K z{~dqR!>{wVJp65bLjb**!++0jXo%+V;MievoV6@7RiTgatr7{hbnKTqzVO8ky}l0t73Vc=vI?Fszgne%M^h%RaQ)MtLZW_0}@nTLtW&d zXVgrOx>(IJ)NDh|Vallw1%v*s=;~0npUG^(L%6=*7m4^IhPs3)&z=v2g023@P=Ayu zt3TA+>kl&(G>5{yRgwOlh1;u|^;iu6wyfFG)_Bdj#+LdmLG= zoW|8_+dH?^wzk%GGO0~<7+Tj-zow<7vA(^rfyo{5?;P?6yRg;U ztp|meFKHbLMgs%>^?^uWTfe_H7z{;yatM$+MWfwQ+l>vz7#cf#_1E z`qFgRE&k~4PK}2AN8KrU_+k-XxgG`gQ1)^Q>A_)}jp|)t)?;C(uDYZOSAXH_E#G0@K6R{T+ zkG;lFCR0g0p6?KWceA?O3Oj&UNr2)gwX- z)&NL6=OQFG018<-fKGJ^C>5r#WgJLY9u5uEc6W!tcc#fHL}-U=&%t4M8vKJ{f0r-n z2lX}=bR0;IV^zK!%MLx3L)1b*2+J4R(q>$xD}|68Y!Z%3_+gqenu=8AkB2Ft-#V=w zsa&OVB@*U!_4|F{l$mh}#@I_UODzYU9qR9fUi3!$AfBLqcl^Exu;CNao$B=S(uVW9 zvCodt6GyML!&gpJbS@C=tsfj@D#E&CRJA4mDFYfOab(n#p(>DrVhX72%);MoDJ;{a zwhj+P1N~L-XEjc>8YARe(Z-A>^8o0@#NP8(*~+8}vo3YF<{Pg$MF zNuxlf+pL&jRTQRaj-78}N7jeTb1 zR0BGvs&u%z^BzDS*HD#)num1UP*sMSZ>SG2y?mjZ{mYf?&!X{s8hK8Ue8zc*bUxIa zo7w;Olw~0MK*$*k2X-MS=p=+`_W8)QoRp5IwHL5%W%?N$eni4XzKz=Q)8bwv`FG>GMV60SUn{5Lq)AZ3-?&td+0h zZJ#x3aA+HR0*rZJuRSztw9ikCU6#L{=yW@d1vpdp&|rT+qHKd7DQTYs+l$W&G+r?v z`9KmI?DmDb4YdH&whr~9KnnHi!iZ^63KZKPHTZjcC`elaksY-`U;o}nATldupBOEI zwyz&yVS??Ob<|(8Z97Wdnz_hvIFuTv>?!z!P_$2qTsJt~XH`l_$dF08;{gzBdis66 z0M5wPyrYDtOTt9j31S#aOGd@Sx}iXSHq zdeNkB(BGMAk-FSei`5mTs-~Zrs)nyKxr8UnjwL321v_{OPnE|j5t7p|+PSdIE;Z>N z=pRk`Z|qQ40Tlg$ekl{nOjQe@s*ZC_`l;ZkR}H3W#G_hHzXO-jfTD_R3P!P&$D8VE zE;Q5%Q#En1p;nq|m1;KCYSm(>HKtn2SDUPvByc{zzw-rY8Yg zDM_kkF>P!|ZSKYYeO`%h+mOS1qsgquySp#Y)#vT?qqhU&jCheN>V=Vc-lnLxJ0wG) zsJG9z%MTFZGQ2)3ubwBAZ8q7ht~J$l^lMXXQCm&rQ`=x$_3e9_f~7ck@?=&9Xsa~# z%8oA8ZE_yxn>>xDo4kdmBUo1?DTN=d@LC*0IdP?_{Hn)Ly{78p>yR&+DxkJAkzR(< z$7&5>S(n-Yo0^NzDFOi7`c;d`&GcPU4X7Sd1w|>=DHymnje)5q0=H&zIaioKa>h`D zrrN2(ri!R20<)=x)GowjQ|(rJ47Jx(`_%QOxYoYg2s~s-SLG>rM3$ zx%;T7$9~x`-&D7#TMc!ap>8+1ifc{vF?EMY&(jM~Ry*l|TlVhj+M-?bJR|}iH`SeL zGjy*$6b=s!MxDYm)hEHR5deBs#W$1No3nXsG6MwfT-senS#SLh*rEzP$#1e7q$hHzDz*KE1o%DQ?Dg@2; zhrQ8|7tYfg-6II1K6o=6P(~1Sv3wpx>c?XhoZ>P`xEDkJ74rPn$|c*9pbe7O^WZevjZz7 zhn{Ob#>+vp7SC4;pv5xAw5|Xkuq31=v{-%75YmGM$)jCpT7pirAn6T-di(uVxE%-u ztHftlt%UQIoTF}3f;oz*HKP(thhTML3t|=iFQzvZXM|b>)=o>T>zJt z-YS$_IM}7D(;}_NX`Mo3v%ABAC=eATRa&PT>(Gut=2|qQLAQqlE$j|$$7cA&$)zi; zlr{~X)))hdVbwO%QZjfejY)P^kQb*RO_n}5?8e5{HCtBHwyi)tF@}ALJ8AF-LjwW4 zzJX`L4#{EcR#s_g)7-I2&GcPJ&~=YfHwEC~L3()t*TiN?E%F7OdYl$Sf`EW%TsOTV$kH)wTUDxD{b)95&vH59LaAOIY&zHcbF z1Nv3~jY)dk=0HSVEsaYZfh&q=c<;qY?zaD3+Drk$OXt7yTF@BZ6p%v3P`IT zZ$~s9L}^1@(_x-mt8OleLu1dIzx9Zqrx|^MQdtbO6?8yS7}-&iEi+&H~q%{xQA; zXm#!pSHwgwG`=8yqBKUq^~h`eb@eN@v~K`A(@ozI!BdjTM4AZ1c_K>Z#{w|kK(Ghp zS-y6Mjs1Q(nr&PYVZ;vOiu(>^9pWP_tCWr%EIO$oI;=Qov9k%dgg~TrmoK1Sq%RMJ zwLYUJfe>(}`o^|4ENN(Jv%f*uvZiGVZkIPV)wd&o9PovA)JE0?Bk*aEO@3|Nn%4HT zHMPyHjkOJ(TiVt(wqQ?=wMXz^$E;Cy>Y!2cOFQoIc+X?|ADapC<|oA?O&@4Ma4B@x~!j$N7-je0FHdxq**rBT9l>FJHyLg~jbz#}+*( z%AJf$wc)UDudoeo>F}NoJw_{N>GjPat##V72uBN3Ly}Abnts6tzUC*zXS+ll-JB9j zy2|P2$UUsM1cHi7H;o~E5nnW9Ynf$cOet}DjEuxumkga#OY5CPrB5r#$>MMKoH5yQ zSLdvRz>4h1j=-R#NjN~6MgmB~4qs1|3}ei*~O5ML!e!zpn59 z7BJA)#q&4uoQ2=l@jDm4-=c40?hQP3;p<2jekYcdS5%%P?kq2&41S3+hbe2Aj4xwK z(VMv9gEU;Pp<-&KzsFsfwT<4Q@8Aglq~#0Ha`#X4UA=mubeVCC?_o420~d<|`9(L{ zroacv?p`gUY!{koKx*pg&G}eXI(gfC=1lF7c)*KrvKuUufbPE1lIb|HbMZw!P z1;53TEX>xFl@C*PS>T4;Ft^-H5&@|dgGs#EQv`wF6sf99elA6RxY7!@@ zNt~p{J_(4_BF&_K29_&Houx|3GUx{e{fj~WYS6zK^h1OGofO9SENB^PGD9X=v!zg2 z?_`Up2thnQ!l)?7&&kk~c4+2Q#wdUPG7> z4jl<5b|jeCkzis6{RjOggk#bw`Y%|GOS5jGu&$Ic9jyB?G{n@Z`4cRcv+u-W;ZI>% zdF2GxFcn)mz@R>9iE zT_EC}b1Ch+w$kpl;{<3FjGX71$zo})oOdF=@q79w${4C|fXa=liYFUiDw=IzcGI~+> zl&yvsQ(4)R7|j&5!GeonfJtUg$Ek_#qN(&rs-REN0=gTDaSt`qz0^+k=>ry9gxHK< zKo`?*z*cbI%7g|~((ma#2O)pJJ>C%ED$4d4}Eri4fmIG=k z4nU^*xe_MyLHxV-pmsm5j3rYJ(0C!}wh@}wk#S`8lp}ytL5t{essbc&+7`PWrXqR- z%6J3)q}hH&gOf?#)2qZLaN4{gN{L52XeLg3@=94lKocYrAZ zejyIJ0FIXr!*Sp?Mwh-s3!BSdqbVn8p%&LLUDgccThs|Be)(})P<|BqEH+p|dKIzj zG(zcXGzYK!79dDU9J91#p-o3IP3H_20~CsKDI=%J;LI~L71x9UEdhyHV1*^OcAG@; zhCn_-i!JsN1|HWO zpxl$Rq_g14VOsj4Fdgie9HXm}r?t?04-)u3<(Vj$~v%)Q* zEk(RKLjvmzHXShB@pH%(W%_@&6hYf$92k?#FD&>wg}-%Z37%BsBb<=4V}Z(2-8~*-d-J}6}XF0Q!}1m zIM+?tHMNikY`m@*5liNl9sh<83f z)14q%EgWWy+Jp+{RJ*;?;iu-n28b(>fX}0;Ttyf2eEb2)0=fZbyp8)z=(Sr9xV!D60bpf^jH z%R%TlLF*K1kj&K;uhAxJZ2f5}vZvQOr!SJ}XQ|^fP1Mu4jnM|@icCI=v`<_#KySS5 z1Z@)7n;nCd$w5%z(vizz#R|&D3)%^I<2r*^(R^M_OSy$wc`a?=YiNMmG%LIo^$A74 znP>AHoI0O&@+DG=a4Fzg0Y~Pf0unamkn0T1N7{T*W|37gaar62>Qag2y8??zl569C zDAq);pkLRftL$cnSh5qeWOF5inM^*Gq#>w+h_yZN4{>twyKhybNukH3Njgip6l5MBaQ8zsgGLZ{*Yb;})k zW{_*OyTlEVoFII)R-IjvZLhdo?(~Yy)t(Yhi~|M*T4wh*9tWc}m>X zsDZK$pMAB&bsE2Nd%xV~qH-$9LW&1^Ru_@&TfCUBfV>On z6|FcfhvLYpxe%2o&SG+(r519Fr{rpbYYbi@)fZoB@KS@XBBW3k>4B@N|3K;wWZ?Q9 zjmxmLY#AIWz9j*6n4ii4jbiuHx!P4kJ1-Z9C{`Fx00YM;QV=~sLrOA2TWU$UE=tIC zvn5wZZHCBKqz20yLujW(p$w5viAxuBnTKg9U~jN7Bkx3(spY3hsl3fX3?EpqYlL=p z*q)&Bw*4{MBl;Pmy$5M&S&a4x2<-%}KOi7(I9hp(ZahRevgW44G#QT{JOoFIWinK7 zoH~xthmID*1a~60MX`<14y2Za$&Nt{|L(ey|l$CpJmnjPS) zRJmvYf%765Z;U<~7tsE6Brj7Yze2hERVwCJHIh-SAR7rl>O;#JCh~H=8jN6Gk*FQ+ z0b-e3Z0pQxl$mkFzL%dESqjz+x^5{uMEUr=NhXjnb-0e8(1@#qu5Pk z`ZiVY8~FRpH}TiDZ#h`8*k*;7CTU?>kpO>uYM!CFkO&CG7eO{>mJ7i^k`JVIbeGJ` z<-n{{V18R;up&&pjX?yB(sKMV;Wj=Q8XM-V_daOXbIH?KFn{!?V6I9O-yg9hcnOr_ zY8annJIH-1Ys(96AEA$RlzVMM)y8#4QlgW^De}*up6@_y-i4HY0sj4x=J2l^lD)(} zksDDM-{;{Vd04p`>a55M!w{oLb}sJ3aq%G<<|NB|6FiVq*H`{5ef%_9Y??CBv;u9~ za5SiA?(8i1#4z0@^^DMs+5G)TrL37x$_$3Kug3Jg7<~%)$=ynO8%dz|P1_GIcTX}m zwo-@pk%yn9DbTOkis>@^>F!m^g}=4Uq*j$hThSj&b}@Yk`|#OH(LmF<1%;TRRvOQ1 z5;-zPW|t(&COIlTV6%^!Oo;U=fG;A`1YxiXg)2Gv+I#c!nne3S}d&s{}2l1;l2*{b%*F;+~(jm zCq@Sj&;&er@Z=exg9tKd7O8bwRS`bkq)F-nG)*m_CF)Y7v5NPSy+bKxc+fJVFn)b-IMewoVD( zpzO0F^trYX`n;I6qc~NI9c-GD;4!|cwV?BRHk;m)TA|9r16(aCqyt?8v6_yt~jtSV$ z^1Qh*dIG?QoKO#?fGl`&gpR~?3JTCO(m{{V(}06AN1y}!m(Ud}I4TbrU{s90yc&3p z9UP4m8qjof^+|fBvtpQ@mG>VWnAkf=+^m4#g5D#kW%%3sI?7k|FzQB{sg}c_SCCIN zkzcJua<82rt^y;i2@1b|Ni@QOW`1B2wbB3m%koqIlFGDd^q<$y0mLH8VyUv;^ zb(SAfXOYlLBOZ&BL&;Sc)+#KV4gfvy!o7($L%CKlqVWZ4gpNN$k&Nfv&rp$gIo1V| r^*&}1vXN>OIDLYg14#PiWl;tV;{YSeO6WQKo?KSK>rlO~Usm$JhcVq9 literal 14752 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 ijT`9wxX*y7?gGgi2erPBxQd+s#hc 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 b%I+(VZ^f3Ps%!~Utd@h7)d|n=32=ViaGIx`l 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 BZf^hp diff --git a/core/out/production/classes/org/pivxj/core/TransactionOutput.class b/core/out/production/classes/org/pivxj/core/TransactionOutput.class index 7dfdceea1641e01fa0c12746f5de645672dd8f02..d1cdaffdacbb70253f9805d5e86c056d289b0bf3 100644 GIT binary patch delta 449 zcmXw!&r8#B7{_1l+4|13&0&#a7}QDqeqEG!Xon)`;1Y)^PEFd>xoibvln{g@L}7<0 z>qCb!FJ1geXp^8zhXM~CtD~nPp%niDp+0?~)9dv-ym@#(Z?hZO)lG$Jlvn8x@yZu{ z3Om}a)gIp}vvpIUc({1`O1?LLt5}}sDwYbO+Fz6lrLjtT>|><*B2^p!#?5}ysbepx zalH?W1X%IjGx~ot$>x)7L7QqI!vHZ_e7cw`_2!< zn)NurePRwf(Qx<=wFDgAIqaHv%jfp11eGPC9LF_`rxDv`ln&*|X^d+sP}Vqibe;Pu zGOZgt(oIwEPHMu;xSg6bTW&@VOq*AZKE=_Dz4eTkp4)pb%(|D;oH^3kqc`UCiF$Ll j_1@8Wn_8eji!^G<{=CefmdxSAL#-N!W>*Y z7HXwj92^`Z2l*E$l#`=_?|!HEt3L1E@Av01a22?DqQQg`Ch{0gzw*JX$6G#s_>n#= zTr`vz<5NT7-efcpAV{X-EF4HrJqpBLm7}kL?QpXb9?C0y@Ua_y_TW%@8j%Yt z4EV&l?Da_c(kKUQc*h2G@SzZo_>d$wA%!EUnRQlYv93TbDxEKNBgmm276wqtAXJXZ zx-qmegdoF+F@hvxnB_Q@IDu8hvBpWEDD#{WXG#a>#IMrNWznG~tsBsDQ)X?!&TW~u yE1uOLQ$nro;jySKD-t`^3&khWbqX8L;NZD@>H>p27Zt7*UW-dt6Vu|`HT)0t2whG9 diff --git a/core/out/production/classes/org/pivxj/core/VarInt.class b/core/out/production/classes/org/pivxj/core/VarInt.class index 10973eecc8b0ef574cf1f9d4138c09627cd21ba8..5065c74c45aa129c1d387c9f59e5649145ef1a71 100644 GIT binary patch delta 824 zcmZ8fO>fgs5F9(tv7NrAPDuiRCJhO+jZIT%DIwvblpZQ1ENYf*|#RD%3;% z0aE22L2%;|i6T)EA=ESCzi@(cVb-xCgb(}1>z$o>yM8zNdt~;Z#O&hK4_P*jd8BQB7>v>$z7{?)vX-sKkk+X48 z;}R}wEJ>I_P2&odHLhYg{AF~)?`EUwQ5Y~8$t4;WCeI`cG6NO~DjhoW=ZvQf2h!eC*o;IaNBrUp(i$5Z&0{~4-BU`Dbs5O98SVNKj+MXZ{Uku$}6VxHwv z=#XvpVgKJ?b=ZJ4G2fNl#QY83N2ckQ+?_W_dTy_jg+pj5L8+a$u#$q>TAWgUh+e1>8arYqWOzA4xx24WdzSAub;Z`v_wBpInp3Z^ib*FV?+oI@tBxZ_f1~ zVXjF&P<@OAyF=MJMu_k877wwAM-*;j9glGrPl%o}K0}9F*kF8x7m=MZEwA&pJ{50k YE1pFMV{uNlMT;|97v*P~<*SMMUlS-s`1O-qjEPIQe=EpbrmyXhg4u z5c+(y^m8=eLkfd@8PaeK!zxC6xQ-i~FuKznJ(I#1@7`39RxrNv_*kZIhutDX0>=1QTI*SE~_bji|F{rYmj+E8$hA%pu2 z30!7)fEk8a%-G+BV%7h`+%l6zvy@NHS2nENssL$i(-P2>aXN*y#S-aaHDPU}MdkcRe35jUMCj{XSR1ccxpcW~Rx%R;>@l&uGepM)hzRga z5(@Gy($@lq5_Mt8_Dk_}DjLAadxVWdtGsjs&mlxZJ%s!Lt!~N7OMZ=NpP&TQFVGHXh6J8w z6b*J+8hkQ@R~UA37&V7~IjWSggZ#-AowO?v3>&yWNWw*`HbVYG6j{L~1ziFWxPAHwUS@@B3Z)n>+ks=!0nj196 OSTsZ#uaJd^tA7E-dXcjL diff --git a/core/out/production/classes/org/pivxj/script/Script$ScriptType.class b/core/out/production/classes/org/pivxj/script/Script$ScriptType.class index e77362c3d84b176dcedda15d56db660d89be8382..acc1346e40c09f0465502a24240d2eef4c36af91 100644 GIT binary patch delta 47 zcmZ3-xsG!~1v8_~j?sPdc@{oKO%DcM22Tbl1}_G625$xv1|J4T244n0 ZAdF$~XUJj*V5ndSWN2e>pUlRl1OQVh4tD?m delta 72 zcmZ3%vw~+sJPV`Cj?rcFc@{oKO;-k91~&#N26qN^1`h@k22Tb@1}_Fb Z25*KK1|Nnj2498>Ag_(VWilI^5&%u+4ov_6 diff --git a/core/out/production/classes/org/pivxj/script/Script.class b/core/out/production/classes/org/pivxj/script/Script.class index 69844ea24af5ae6d6243ca317ee4f92ad786b0e0..7b6fd733d3911831d2be99638495324cb1b1c867 100644 GIT binary patch literal 40269 zcmb__31C&l_4k>3=PvKP`$7^(-~|GY9g;v;g9JpjAdx_j1Q1*xBoBy$BxVt?b*o}s z+iKlF1zf3hw;Dh!R_ngB+FI8xT9?+UU2NS^zTcU9?|b)ULHqxTzI*4+ojG&n%$YOi zoH=vz^w$p@Afk!#G)wzYSj^Ba4QrQaKMql&cDbcp5hg>sGOS&tT^-i8Y1=vb8opc` z#^pNB+Y#1wYP&4$`Y>f^mqxT3v>PMZP1?ZVOXi?RExx zho#*arabK~zTC~1dyGTgKTEsU)_xYIxON}czu(q6xWJyUwpZK7?LWZT`?<9T`SNqV z9N@f%`0|SoE)QGUBaG!Q`SPf(J!WZ-hiRgAsjWT1_b2)C6kndUwP*PLESG%F)_%qP z`ZYg1Z)-2`{WrGu+pzYc_Pen5lJ+v^ykcvw+S+TJe4Q`9=Q@7~Q?d3(e*6<(-r&bK zIrZl-ous|Rm$z;0ov`+<_7}eVRVP7YYws~p?&Hq=jXU?gt$h&IKGgmm(f*%F){ zW=PwnXNC1_y|=CRvGp8V&*cU#Wr%%ky`QbeY(0;k`txM~U-B7u&|s%NkW+u<%dPxk zkgdl-N_{Y2hS>U0TOS78_2D79MjsK@N9v<2eKg+-xOkzZ7lmmDH+GLc1}S|kKR#%H zr}0m-ZN1pm$JzRLTc5yhes1d%x!5F2EM)+bZM}q_huiuTOFx3aOttmWkUmYH9>(QJ z#$yJjjmF_E^KHG{){n9E1-4$nc?)fQk*!zS`eIu@ z*4CGBTU89E+SZq1Zs^NweYve4XX`6$eWk4*Z|f)6`iWfPB)+WT%W6iW1}Sa7rLVE| z+AzJY*V%f4U#_+Fb+*3V*6VHkWLw{0=?!6ehbi%nzL77Dw%%mx&0+l%y@fBWmfmLT z?HD%wR9oM~_sy6s`W9P1jnVrKU%tz9K0TtJp^xR%nYMlwXP<5B-?Q~|Z2eqY-x?OA zpJ(acS47T#Eus93eEY)SdN6|3e|%sRSC zQ16P9Yfh~xZf~n^C@yPk-&mDsnMbo-^-aaxm02wKe-euz)DcWG?!CvY**^YiDti1np-bjB4gtE?T+`ADjAUI+ zTMdw_WjeOiw6yU!^8l1LCMjYzHPrX`7*ICs9TmePEb~TYgMAL4ZvzPEpA`4AhAU;^h$8D|7KQQT}z@BZ8&}o&tr_% z+(dIr0$3)1MQllXV;g4KvijC~u=%XU#-=ufKkDTM#yVAp$<5=f8l7L$y51$RkAy23 z#-SO-0OMTxxVhu~-0^O1HV;kH#*OuD8_^d}3ib1cV`EL*`r_I3>&hG360SINRQdYG zs^&x^aBmzH;H}!GmPGNQMBApOmJN$*AWIT$iI&!B6}3$pi%(0mG}SiMH=bOqNQx5dgf zH`lj-xiau}UQ5%)Bv(!U7StcznND79(2~cpx+w|m$Zr8{oHr`H#LB*SMsD#|ZEe-)F zGp1SkQ-a2H!5}Ef(#k8$vfS>t0>|rxja35#VG$l`O(`g*i;}ylsJFRp<+6>21Nxz%3{!{%a41y7h2FKTaS z;AI^2j)C!9a2Ubm^=<0|YS@$@>glK)KfC;Jc!u24fCW7Ybn{rwsK-Ry3|WAz*2OJ} zwe_3lG(qBeIaTdzQ#pMYF&1~Ni57PSQB@}eaZ+PgwZ3M;w&cq;|>%p{b`u3=+Rnq7Ldvt zm#8rVsk@-=asuNg>cQvGg;4=~t~3a>qTs>AM8FJ7F869aDV4xmvBw1FSu(#zR)>#6 zP=UXyBqwK&<-MM$q40YW$E-LECAmWxOiQKCdt*N`SfOQ0b6Zn!bxTcSYfUYWF2K8` zF?FADmsDg`HhaYF(|P7kTgi>sHMOE$z@uxq(KH>jnjCDe88qFrf!l z3yeWp@24^R+;((tBa|Una&_*q!D<#7hO|?20&138Q(W|2Z70)Lr~G9A%nZwAuuFKQ z8J9OSB-TM^gDRCs>8bF#U(b`3086qiF5V;vLFF%6|(BE1HR zcuQhq)2WGB4Gj<%FyU$wt(91xWb20dX7F!KT^*FhrpB5Ej~AguvQp^{LbR6kVOB&L z27wQP2$iJM@-)}|J?r$EB)5UB(X79+0~3aGy>Z-#5ZsMSrgo0=Lt z3kE&Q^fHrr9!P|$o}JNE2kfuly0q^4Hng#3b48+YT^qF0aD8iK^O6J%>_*J5`c`y` z^+wmav+G+|)-J4PNgU#&$9K`h=0t6KTf(Q*;x23zn8MSJ3D7N_yV53Miof_Kh2%ZWwFf ztAKFG>lTyg$IoV!;aNe||H}?4u&R?M{V%~z3-p0qCrm}NzHP$XrHe5W0x!#<^4GLA zvFD>#kO`{BL{$T?IN`sVs0s&jP}lq_s`2n_80A`63Gm-mY#vOK%*eqZr_4ADC1!HhhMF>axoG~_U<~V zdnL>Hia|7)g9KowJp*zd^mOUMvSXLds&GAVZn5sN8IQ`v%gd|hmoGvobT0S^*uh5> zHtXuwC0Zdi#;Zx&+T7H*ZVSt>hD33#yUM#IT8rU!D_b~se95@EstUN$a{##ONCZB^ zjfstQ?vuA}w?h2DWZ6=@sHv*GcKxh|bxn9&zcICnptmp++8gT1Tv3HpgvK5pM zObFM}Xt4lRN@s6Y6<8QoC7OLl1uGQ|ZCFHD#8~xfv1oCsUjU3huhje&G&%4JE%c~i zbaqr02I|4x=1IlrZmwE4d1*-0G(szZ?-_o7OMlMNe+8$up!5Hi5=C_+fX%n>1x@+NHv|($!h+Wl$loEnJh|yjJSHDH@o1T;U$;V_Tc&J5R&DO=-1ZWx93-`>X=e zw{p$NV2WwV-e}?t5M@cK3G2PWtYf!=tIpfgYa6_+lyFs3JKS&c>UrZN;^H=zYs10a zLl0bowbc`~<_Fg@)kz+vX-zt{hOodQSyqqxw~|D?YmXh09> zDlO8{-_-x?=x+%a6fTm09@vS%(vTvV=c!6^CimcNzPy80x}X+t`ZGz;mv_a-j{X<% zaT*Dgb>PxB2^eej(#FK*W+f@(uyEo{YvV4raC3j<%X@;REN*XI&#&0`9#1qR*k2rP zTVK-_uWyYv)U?3I&X0|8m~^gnqKX0u{co23zN3Gjf9Qzi;y6b;U%SB3|Bj2;$yokF z|EHt>OaI8x{|!QlGsIG8b16b9q&-isBfjJ!7l{jDcDfyj!%G*hZ$#UPINP#yH7#`> z{;mj#!?=Nd*f&L6cjsw#dwm1k+=9ji0HK2|_3PHR#o1S06nE(YODjGhzNWn`z7B0U z`hRp_{U7}kM{E#SZ-#mG>+0(iGEhNl*LzhHb*lMNRqInni!tVXy$T>4BVQ9gt#;K$ z7?Y0vnbybA^0-XDZptVF)DfqN?*K-5qgp7quFCiNZ0Vmn`WO0_mVOXit$*cc#NbK- zeXL2*Y0iAO)G8|HET}GD=&HK$wv>~pG>&oq=89$A)pWGpT8<+w6^)MmwfH%6(IH3N zB6d6CN63>Tg(EJ&U`kEuj+EkNZ2e*pXM(UkjPV3{T9rJDw>5!C%{5!bv^9-^bAmlC zaTZ#ZGl58I&= z<0_Y>BYrAwgBP*WyTkZN1WkYk33JKyY%v8~hk0i*D9?;PU!^IdmdtR(KG};enE>PZ zAbm=91CZA9OU8aE&Dh!N9H=Ruj~iD zO!d))<}Epn_?>vk5oe2qj`)*!!x4WI??V#E7#d2=%x*nj5O`3L8r;dnUgEf#VLU4_ zFyPS$&wr0q;7O}&Y}gWSZ)HynPd<0RG2UL0*0FGzIxTv~gU$c~ywVtl zzZyy!=fxcvmxC=i#F0bgFhL{JyrAG>xbYxO8$rd!c;(_%i{k!HZr^}o)Gx;k2^t>X zw7wqFV^ae8YBIP*xrdOgE`YI)cw1l{D4B;kYWQG!BJ@B>ZlAAP<8=vkShX?+aE@Xd z#3KL(37ps7+}zXx<=7{js|1Wu;5=G-%+l&ruS!lvOaYcTZI1X41UTH6jgBTX&5^_9 z2uCx;11W)1)7F;29uL|93%9o>xEBz0yd|5qYD|i+;UEM@j)bs~qvU8o9_PfrEeKfG zK9BQhZ z1!CPmfFbY5$=X~;mWZnyIYl19qcOEJ0^U;8rDw{c<;7LS*VaJO1d081*qf=qcS%|G z(j|)ojZQEjIdW=|+~8H&S^3Wd`N%Z|}vW-s_fRSRiou&RVL zbh^NWfs&=XvW`*4s3Hpj9#TMS;#d^fKa54QYx}T2 z~S&l)q{lI4y(MlNu)h2rN} zG1Mr1qpQ2~(g0A1d+6GVBc4@I(+EF*R@HpC-n%I+D_B8U$dxJjF(pU>eBidGyr`& zju+2v_!myttVM}+&{s}P#2etZ=D ztZ!8ceNTnhBy2^qt!wMqs#_wfELrWyrK~+H4!GIk919261C*#Z%!HbTpe^fJIILyY z#JlTttI}@AI&zsTa^!Np9LHl)(v@C_Wgg`!8lx41bVIBOY+$T#Nl`=krylb{(u$bHE4Nr6MbFp7D&4fq-L6 zn@tptRVP&=ysCkvv-@^Ne8RZ#@jC2Zp(i~-6;$zm#~BO4s;0H8JcB-7$O_h^o?7xX zv31=dzxscOg@;yBcC-SsiH@v;DlQYO@Ju*7j=Tu+W&swwhK4%cz-Qxp1DmA2YpN3q z_+#brfg|RKxsJ9;`;H^m%5|1p@5p+2vLiQ$MoTt0a-)RD5@v^go(2aY<=4+v^^_^=@5Ex)C6&psC0JBC4R0#Y55o|6*K;HqmWLEj@0<#Ja;ZFQK>CI? zBFxBQ9 z7YNu%?EvL;_XfZ-+Z#7F)zz<6hc#S+3<-i!@i$&jk>?aphgCXz`+p-9u>Dc0dho6b>mrUQ4F;tjyigKOfmwB5m($>VAVG0i@%E3-luWxDEq{3sl zAjkgU7Q*&Ty$YH|7FMphPP;{3C%LFK3Snxhl8X9Lp@YM^^23^%)Fe@HCJE zrv#v8L7s3(qa3Azhje&|v2_eviJL^&ts3+69y{(1mLK-WIKyy4RF|J))-<#8jDw;B z^?jtfWO;iDp!tCG7Tp@D*J@XlH z`9z5uu#B;3OPy74U5lOO82YSOc~;9hSgjma7;u=CyZ%zl6m0plCwThjrn8w>0(fOI z2ElWDm=~LBIEE2KOw9z3lLI+EGlGb@qgHnRqNm;1`K8yvLCcH2d3v z?s3-})X8@@QJ6veP!D(ORA~f)=6W%x#Y(t3hv(>? z1}TUc*<*_se}qE2t5cs*Tr#zqsRas)q++5)O$d^1fH^TDIOP5ScO6<5!RpusWMEcm z6Js{~6KcsS!rS!IGlv;jtWj=2nI$nRGRo%6t(uiIRRqmR8%CZZDNUn$t{9dMLIoJ; z^UIEd4?)S1bgh9m?6FXkapXA+35@yRu1iU$LO|KwWntD&1`oT!RXOtkCE_l;O9HXg zZhSJ1n4rI{{wbl5OTUGS5h%mK#-N)TrA`_TAX@dUW$b!~bXc^sqGImSg$q|eWAADB z0~-~ntTjOh3=a-3Yh1n>q1ZQdRM>=tprl3`Kd2+fJ=A~%2(FucU>%l7-^NC=8M;*k z>{PJb8aMI|0abhwSg%}E2AVdqvjC4Fm$)8Dx+lj<73&?tk6sRukff-C!Cb)CWU3jg!rg`kAz)Nt7(tG+VW=Zns3>^6hfdAK{R zm;rx|lFYz)&^Hu8)96(dR5~yk^IKK*lJYs#WsBy3uyf0nz?*>`+ltENtAOPgo|FHD zFmu2LOfx>b4}~*RrJGs;5^XT6uh3~aVHpr>Zl}FiG8U$t%PKXYvz&tfFTI8raHJzOD<8dp8Yugh-VFcVyxKq&m^+SMAznmud)~ z+gP(95#Tjc!nkx9#6Sr&C0TF41YT6Rs(QuZGBDNR35yqS&f=xBS1l-m_-5`_f|XD5 z2SunWZBYdqysW^fIEkR1HV;y#iI2)Mk=;))bdvDC!0xQ!0kff|@_0PW0Bn5KhMa;uq!sKX{eF`7;8_zV;F>`?t_hN~mLjxH zoX92J^5P`13Qq)Bt5KR^ZA3W@_x=jjelk`R?jdt8S%3-9_WcxM(7FPhjlx7HDEMg>0C1>u9I{$96gP}*&pbE=XZU4s;Y>^u~X1Hz0#AB95U{S+<$4v~V8*S6cO zT;h+Rw4v>G48W=A<|g2S0wJz9>e62NVF4dd7W5~_L&R$JOhpL$eIO%(hvRgq1L!K6N>^h}Y{M+sPUUnBN?%Krbe-x$0S0g?8KOxv1LpxWL7XC5(DzDwQm0k4 zDJmT2_E59~@&J;3zM?EkoN9?pUr^p5W?)Nf=F1lJ9wFTM*1 zh?jNYX#c{0p(p5EdJ@d}6kSKp(p~f%y-2^J-_!H-7E&M3@8~OfS=jW7$fj3Cj9wE{ z>2)k1e*{zfNt}ZFCVEqxLw^?M(OZg*njy-+fD~pnwo#*)qkO@_wUi;wM4m&V5xH;{ z78i+k)f^@Wwwi?H=6jGwCSXr<>oTMHq5&yhZlIcr7IBU^7n3dzv1nUSS67o^8TI~( z@+@(l_?pHDA^U~;W%V1D5yK1_h#7dhK2sc`EV3~_@Wka%$P(Wt`kEX|oG(QG&&W6g z*@;}g2rvjrM})9?LghzjpM}z~uHY!ZTEC0R_(ATYLXE{n7Tw-KMcb&Db9FzrgT`#9 z0clzH(bxm>CXYpK2T)gfxNGAFG>Sf?#q>d7h8`P`0TyXrQsqn*nFy5ju=}-#-C0TO z>|NBB)@bIb3b|FB89@0~m0QlahL1Aim)U0*P2^nD&&?umH@cV4xmGII?X=79sm|~a z5PeG7^cjt$&*?~TNELla^>mQVq)!8#JF9c&&QP7Z7@gC-g~?qHjDijt$1MaFCLsfm zyoE_zf-)q2fD0Bc@k4&#uw+j(o&izIBUuV?<1uqPcl~Z|#>-C<3M9eO0a-PHr#@=C zL#Eb!(T6ONL;XZ94HA86oQMT*Dh>1w%1pn$Y5au%Y8NXp4ReEai0c`heZ>5=lZ8io z#eSNI6>C!Vk(@r=U{MP!>VU=C02UJuhsBLamTd8`n9>av z^STlvDP@6$y_b&eOplX+$p&EJ8al3aKBW^T7>t|5&6q^29am^LC5i8k< z)wvOL00&DvkT;?OY-h{{?hxL|epGNLkO#pXDuijc@a_TIC>I%vwoxy)pOsMN7rR3I zSe`zB;!a?9f?NPvUI-KEA{dAl(_nP12usKjSUA{5jk~QTv7DWpAhX3!#I3-N^>c&t zK2C0mKG1=1G{i&w_a5!n7am}ZIIE!WKnE>h6QgQ3EiF6%Bjg6^Taa0yas%(C79Pm1 zzJW#+WG>`aS#+rIz!}L@rhS@vaN$6q?z0I+CR&OSJP{;cCvFY!!FqAKV6%{Dy|@#zUZ^gcBy;)~ zhLU~GMW62yce{OtWuhyA|C78ONsV}UUZIk`H>PsjjLgg~S>{cYdoLZAy}~WAmsakh z<8`RH%7|N7l(&~o=%5qv7M9$iF`gxthlH}^PQtnulO42bFRk8v=&d3j3fC#hqC5Ep z3-9iQOtm6q+5rso;vF#Ur1C1vpkAQe9ps2RA=&Q&t?q`ldJiPzeY8y6k7cWawun9S zJ+YUzihXpMc!0Kv{j@_oNIMaE$jrlw-WJg19&s;tU>RuqGnjcA?L;1%c|1pcBJP7s z<$pgB_bazc4btwE=9~_X-Xkb%&lH(6Mb=C)=qt+gZNWi@s2_-K0Tng|J!5V!TG$7S zTnqndZ}N=VPc$AxJR7CrYmFla}Ue!dGjRhVyRH9 z;5ogTt?{54&Wn2vaPzTqwXx?hRxe<+`wiua-%?-kVsZjI6jqqQKj&e_5aKRo9yg0+ zt|@&$z|2=N^I4B-C%Pi1Z{gz}<7U_Hr8)t!C0O!6(AeOCwVo8}3vJ5PiL=*nv7)`S zK258tPZ#$<#Fa)P;LsuQCrs8iFj3!xH2O0n{980qyiH@pJ6N{grP<=I$xacbs^>XF zidl?1b)xtMylJjfijdW7rU*wea1jsVWfZ22cmxUm`b!L{%OX#B%E%FViPTG!#=VVj zDnrT=V>jiYpC?1Y;(0ekU3!>!Q&^OrBXgj3Y)Gw8$`>O3iC+B+Cf-L7JpaZd{SOA^ zV+fy5AbdWBmirk@w=Yy*TovSqWM7UDkD&+Lmm|dEU>KexM~Elb{KJ2f#gj?}G2t_L z3MpR&(J>{2a6;(L)8ZMoQ{pm=AUkGuD#e&DN&v~aebk^s??OgermKIH%9zBuyO%aD z-%pJz)WaTXDmC;HC|i&g%_SBD4FpfA%_h2XB2DL%>qTNS|2{fpJHgd3gp&$XjukW1 z0~{zVH;|cQ-hQqLOaB*007X~mD1ogRl&hKegt$dVXg1B$!c?wB=vd96CM`;*X_<76 zmPJ3-vgt~#H*M2$=vpmT(eecFP!p)j206G1g2?BPod}11PEmEI_!W3X!{oU@{2BsB zhuff8JdYZZ=FtkpKL$Kj%ft(yuL-?;k@yW#mZ$+l7EErC z%3f+cQlF7O;07AWg=GHf)XT9D6%hJu+sMej{ahXNeQiIrCrv4s!X+rN3AgOc!Fjl) zlUAVR;Y;%UX}mT7V~|hP+CW-{^ai-`L zd1|`sHH2)adxd0aMUuVZni9ZPO1r767r9XlkI3?=M&LN)2xsp5Z-;Dl@LfAXs zEoC{CW8~jJiUK)?4Dta;pfrHfw_&Oox1Vc(6@C|F1?WyCSoO|iRyYfnd+BU&#`lm? z=5Bx?T&k6TA*O&KjsQbUrCC}jt=6VdEzRn?Obo&}=h9%w-Bbisi0!KnI(V)YNBT$d+#k2Jzp$g6@a77S= zl_!Eu=9DLbjF^FGw2i7_21Lxf*o7q5Zc}EI;$u>#28s z=IR?MIv^htZS|46DRi#ZXE*5z(v01QE*sEUUL8%EHlIwboQ7$~P?5HP7Hf;BN~^@2 zSwd^IDr(l2QmeL%PSsY@ceNAfOzlKPGFFg=(Q!&%G0DzWTQo=@^)9q)L`2Y;;x9ap z(Dm)t%;^;r>IeImCc#rLr~Yn z%pwWRA#OoidRzP*6l5FnOwfsiT^_HBd+0pqX4nvew|gO+Pwevk{_Q~A#<9i0NSN6la5OIJE7t&`ki$0Oz}ETP#h$ zva68S(A!y!+m1ahrNSDLpJ7GAkZfO(ef}QW@{mehz$w6T$J3RCS7Qa)j@9ED%Ga(1 zTkW7R+D>$M7tPRaP@QDsJ_l_53DgQ^=J~EHRAURvF+VCYf$OJG1JxjkkT;06E)s)M zO7w+bZ^-G3G8e4J?cxKg8BgeR2fjh&CCU=OWUY#=Byc+3!tt?SQ|J14$WVE zdpDhNNAEUt<_>h`P8zD+MFrYD=*Yb^O}h`Bxu43kJv3k2ODnVolA|{tD&OZUiO{jy zq>!(LKI`h>wE-P`9NCyj*_ok3uszg%11m^~`xn@xz`CroCO1dprBZaSsN?%6-q^CV z;<25I{$E@HmqOoNG`3Kmh$Z2SEV^|U4K9@GfgSldg_*hDoA2-PL|IBMs6ATk*AQmU zCkG9Hy&myKjoOG&gNCvPX$q#}Ohz4_h;Y$?;o}Y!tS&fk6Eg{HkfH-Oz}cAJfAz$o{E3QSO6UGt03YRK)Di!qYZTFS z{M{W%19gMqNRQCXq)>^%r{bFvqcmMD1n`+?5}d#ibd+Ww&o?Jz=26`$U4T`2710hR^8^4WrXI4mwHkp=lcQOSf7HfVXPKFi&z59b&qFj-sOo%$>Y zl!E+;XUNr@d6K&~KhVomH@SM^8N4HJs1noNE&0jal}HuO+=a{Sa(hoc6N4u$4sl^Vun8hACegXA!5=6nJcY`GNU}O6U@?AhDLA;Wl zL18_U96gJ&^=!)1`+&qbG+NK4$$DR!uJ@xkdW??M^XNFeKeg)lbecX8JH|ut=bwht z9(@Eos*k28^pW(GK8k*;7t$+w5xuUDQNy$Zw0#OHIlJyG%A*6C1szq=2)ftX+8#}J zX*LFo)$}*CkT-~LXknxf^hYm=Q((z!u%cho99}_`Y|SJ4E9^{bQB3P%Y*zOfe8fsP zqavT7m5`R9_41f-7Dkt+eY5~uKP&Y9msank%Q`vN^+^g<*SQ`|q7c@-R~~1CJLR9N_Ag8Dz3NilZpDhhgUMw-S)SYGyUi;_|VA1J+I6 zw%3o99rfTDOZ!)9MTt%saH^@zECym&gmHBq2Cz5Wd;-_ZY#%Ys|};aBq%O8 z(ElbH8r-6~63TUd*0QhiO+swB_JF|(V6YObc0#h_0O?}Dz~P($3Di&nmk|M6gx1%W z!E^#J;eIQphEiL1bP6BHJQ;!zQ6ehBBsB;sP)lDO=>5omL<7qV2bG1^FWJ(GUQ45r z(jGwx>5&SDZK^KN)Ts2PMyRInIW&*Q>b#~3+@`MPcq@p`v}FYgZx%h=gLO- z8Y~DjXky04REzky+JD>PBR#da5iK@;LyIANPiO$#o6NBHW4d$9Lp;ZT%k*B_wwJc= zCOi9@y>x9U;^M}{WDK#3*YUoL>xXft%^8?BXM%6fq8$BuG)O;3wduM;<61skPW&$p z*XJ?Bj1gBx0V|zxZIBiR>vC!^M34bpI|A3#Twqj#TzB?!si7$4zMF@4Y$hX&BxA0n z4NGyMx0%Q80Zkho44+WCXfO6yJ%X41KkoYo^aOp+yAdLB3fw)fV=2)~Agy=6GTd2e z`-u=6QLdvR91FXSii{nc@*EWrgir0IT^)42A39ay#3Epc?bJ8NVIS(Dr(;ro5CKv* zEZ?0mB^FVd;CL=G_Q2LYbYn6&>t+@bUY#pJb1vc55(;8TG$)$5`X=fJziW<}MNj$C z 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 diff --git a/core/out/production/classes/org/pivxj/wallet/DefaultRiskAnalysis$Analyzer.class b/core/out/production/classes/org/pivxj/wallet/DefaultRiskAnalysis$Analyzer.class index 64d2fa4c2ea0b89f97bacb8f2220c3ff012b3e53..90bee19506023036d8cb21974b369454b849e39f 100644 GIT binary patch delta 25 gcmZ3?y_kE$Di+2+lUK7iGyb3ao~0bfPG_|N0EvkTasU7T delta 25 gcmZ3?y_kE$Di+2clUK7iGyb0Zo~0bfPG_|N0Eq<(W&i*H diff --git a/core/out/production/classes/org/pivxj/wallet/DefaultRiskAnalysis.class b/core/out/production/classes/org/pivxj/wallet/DefaultRiskAnalysis.class index fcd55839cb488222dae6dd80e5247294c08bb559..5ef20b518f171744bdd93517bf3d05a8461f18b7 100644 GIT binary patch delta 2763 zcmai0d3;sX5&q^ax%b_7l8`+wAtV8U^d%3A0$~k-ge4GyF$5%FEV2lSgn$-X3(vaL zx?pLqR;8tOQ)o*|%!4FArLI`$V%2J`xVE;mwRXV;p%MDceUBgc&wpm-oHH|L<~uWU z??W|5YT`%F95@8vV!6&i6M7viKwpT`ekBK#98~gi2an;9s{A5^FW_;No^VirCmlS6 zr$cxKhjsa^D*sYdjyO1qUn%*u9{eVZ-{QG2euw9kykOx)-H!iW4PLVGvV%Y1l`#H@ zS3_8gV|w_S+Ptph4GVATm2c_U+cy5>;LmtRwf~}uf3Z zHTakA{oBER@Lvlj9E`^MNg2Rm@e!f6NpL%&*oqC00ak+Tk_ z3M>&@e2(}fz&j<#yCjVni)D%JU3|lfS8RSToWQTZ^V@Ym~ zgJutK$+INik^)N#-MeJ4L=wB?xKE1QZGjs|L&51%oM;T*CNenjLRyx{5ceIc-8#WY zEy@k{2%4<7=S#c;>kT@v*We0#&R`j?G+2pM2G?M%C8b8nq}<>p+-PJdHXA&w(l8lr zNrjOSGSZUI7>P=ykt&H9Tumo33Y#st(8y;8mX0OMy6w{kvge2GDE%2lv#o@_a=)e zr=_JEd=vK@nT@T2DV~qQa7j*s`k12*<{D{~dO;~IN`nU5@hx|4c-qi;(qwQs+AW!H z1*X$BkQo+;3wGa z9y8ZxbQoDLokljGT@Z82{V~RVE!Mf)(%+JeiO!5i0#0bn#0I(fU(yZ{pq!xRF#NxRnv8Rb_N9(%c#ORSPwSBIX0kL?&j@x`9Z{ z!EnsQ2+Z^1$WPj&;)oy{U&3a3+(N4`{NY;ZN5n#$YU}{gPWRdTJ+i^wRL~OFM8+`5 zn~{ev6C}OrJ1JL_805{kg|6!O2)E)k+Rny8e1&@f&wU=O+&udXViMpbj)mK!r>QjX z4MJKY$^2v=&Gdpqvj)Ut?+(n2QP>j2=l}4j58Tas3 zA8yA`d=1;UcTegxNa$+3Q@^@Sl}8mdzwQ-C2kP++NRAHai@z_-!hwVHr*1hV>J z2+MGVC8Qmjf})ySOKTIM82ccsZVc<9ILOPEb+6il7K$>EQF}P|k zxHWORDo^T)^p!2xPMM%^c< zeTdWeakSt`EaGQv8J=btKf^YOA7*D9VTB#_s!WTdk&eHOhe(^5&Uf)WK0^yiQhSyB z4xB?_llMqT6v|+SlPL6KxP|XGTlhgg{1$$gbqbCGIQ|A$F#ksDh|H!Xi%gV-A8P{V1}qvmYVW#RZzaU>ANwt|Q<=u5?TU znND5TcuGF+Ep?;;$GxkPgCv-`U|_Qeew_5=jw;Fb23XSWy-&5{u;vXKLBfj&Sj7m^ zwxi@AW-RW-%c4>P8Eqb$f517IF0AjQsgADQ0av#?|^sw!Ki#Qh-l4Fp~-fF^S e92Seo+iD~HuWZE^$#+NzN3;HRJ|!2_M*a`-ngH4W delta 2643 zcmai0dwkVp8UH@#viEm>d(Q@A8=S-DHegDJ4Fh2~E^`|f2W*3Z+%JL`6rI2-iWEDg zX;$E+pLQXQtQ5=4xiiiX5|L!3XdtHti{6Ry$sIr$F{L#gq@Um+ESruO~_=}2Pb?{dg6*#6&|K{TF z_=g(&Q+cnscpYyT9CtAeZ|d?EWl8+Y#b~@8;rZV#ZpVKN-f{6RPN?C3mD8s+yyv10 zCk^@?fh!^bhLa$}NQlKs*hr3x8R&7ua2JPJNkl2vkz7ZtBT*xHuH?(02t|X96u6j= zo;-Ci#7Lo$A|u7#%~B#mQ}@ZM0U74q7TUr!FWe}xR9pBuk$CEG&R~%e@0eL_jx$q3 zy45+ICYzmklH7oe78{VVSdH^7)?ls0MY!1FGF)z?)XHg6W|72|R?4x};s;7q$Ot1N zt&Eb>jhta+w0z7;LdICErxU5dRwLC`#>$yiJ}%>|jF+>F#H~z_iAG{pYN#ud1y+=j}z(rmF3tBkZ*X_a|a z=4+fbSzu(LmGjiD#A`Dp6;>8$#*1}XqB=`uft6*l+{y}BDJ&x4#7m5*NxPFX0A@OBJe1vDMpYYoqJsGAozkUW*@5_Z7Q2uieTO zvcbwmtP)gv$HSH0_NW_d#}(d==u5IGbyeQop;YydSRmQL4iub+2;zz$do!kGaWB+c z^>pW(KL?3 zDJXmoIR>}N#1jZ-$w?%c7`saA@S^b*OnH5LWYa11#}V^y;G1*<%<+?l4^I@K!F{lV zWt74a(KgFMF_L?j>g|MLqW5CFOlrLT_^@Qn9!zT81v5D$t<}9KspqF4s`-9(ws~`k)US>eRJ3MK}bR@bF?nNxoJr?0Krlv8i;G8t-{Zb>H zlm_>pp?M4oz6<#YJ?}EM;uG8U6p0umO%)U`m3;5TiqXu}{50z>Aa5lieCKCMc z|2oR2qnZzSI`)yCI87OIlXqunQF6wz9?UG5mBzV>X&OzW(wMD?=l7y?A2JGaG79-0 zQfM5YFgK&n_<=$}^9S&s2E!U(BK+5Z~#p~<}BUn*h zJ_sDKKh})NTF&R9UE?IiR8{vt9w0ps$12~I&NJ#{T`6^+KiZZ031^(Pse}8mHp#nH zvJ(%`v4bx5O(sySuf(rLLCYSrrV#7GycDYTVLlOSOJRXV7XJqGd?(d3pMX5{)3BSe w09$V{_wgKfi@0Nu!#|Z4Ea4Pb%6(aV3|or%h59Us+hsWJpx{v)l*;GxZ0(t+yyn8&pY>Z3{tc=V+ZYnD$ki`X- z*u?u^mybb>k)OeiQHa5nQG_9ZQIsK_QH-IEQJkTbQG#Itqa?$8Mrnpsj4}*68RaM6 NJh_TL8UUC4EpPw; delta 178 zcmcaAe^q`%I2Y$p1{Q{W4BQOICMR%tGoG5fhAW!&G6O5amC1&@;**uR{aEh+d3V9Q zUhZJd7eL-i1}=tIlV5V@vwi{czJldSc>Gv@0(rl{yn8&pYz+T^-2XssDl01kDMm`2tMgfKdMnQ&jMj?heMq!3lMiGVyjG_$l8O0e^F-kD(WR#wK Nk8d`k{NyVBXaEQ6F75yT diff --git a/core/out/production/classes/org/pivxj/wallet/DeterministicKeyChain$KeyChainType.class b/core/out/production/classes/org/pivxj/wallet/DeterministicKeyChain$KeyChainType.class index 1e02b6fed19c0a5750df1632d2c1362a1c7efb3c..b6eb60443bc603e06abaf60d3a83a980ffa47106 100644 GIT binary patch delta 35 ocmeyz`HyqMb7saJlV33F14#)MJ0Ka((!jctL7id8`9J*3nVEBMZcai71h}kW5keA(AVdg=1PBmWB`ksqgyaH|Y-V9m>r!{? zzJvQp-H}QN#j4d-t!=HXZM9XaR$IGRwVS*0exEt#-h1wn5bf{(`MkEAdzM+AdFI*X zd7ha(|JC;&C!!Iw`=+CI=)=bmm5NIhuq0`H->1wyeTMe4#`{Ot^9CX zNZu~*;7WG}&89z8kV;$=?LzUqVzZ&*xHqg7OxHIO4j1XoonSVGsa(GF;Y(lOUgdG&eq6Xepi~3+G0a~F zW>{~jK_R+P4d$;y_-<%OT!Vq&>#$6fuZCx;5%T$f8ktEqs8M`5ETBeny)j(6fO{Vs zQiZB0WL>3-8Om{dH=aL~@ZI5jnZWH&0FrRH+Ac_B4lRr2F8{J4Pc z7V_O9zFW+fCH%NFMDs8$=179`<)TW@S3(>3cRenA>s5XP}R6Rd51XUyd zHU(63$l9k);Y&-1-chZ9Q?>D>oiAIs)K(1{ga4RB=gH21+7?pV)u|b{oW|ogJ)pi7 zqJJCWRc8d$SzPJtkadOnc0ipIqEFSiOu_H*biWOjQIJv_RSDm*oKP2p)P?GzOm#7M z5SO1bm@Ksv3oHeJ^^v+Ppe_%IAS9K#0>A1?et8w&UB!1-^W_>w-L*`G*YV@^e0Kx4 zzavxaR5u3IP5gT^f4e29Ze{px3#i*OFw8qb>P~f6NDNYUGg;lk-*zzpPhwt!aGS5b z3((ZPnd&}uKVKeT+Ildc9tw#9^>9$_W}qM8f_u1w?*-MPJX}=WsP=Mm9emjrQk`l) z-%aFF5MUpv13bvb`0|5*dOWC}2#Klk)u4KkdE$qBc`8#qt$q|#KMts8LZV!rpGm6} zq?cCD@#QCcc^((}dQkn8AAS~8KM$%G7y%GvTCpfozYM8gsh0xk*Fp80kXXu8q1A7L z>Sg};3P1Gb%kKi}_ZjL{^;$?Ar(Wmo|B$KPkk9kuo6M_k@!cPT>TNFl4&(PvkVWdx z{0Nbt)w_^+3ZxQYEwEAjl`;A^zLW$NMB1n7J?`-zA@#ocfM?{xkou?k7X+C4H&_1; zKmIqUKH_g5bJ0(jPd*K)&(!A`>I?N{NPVRa0`HobL?Q4#&?2C%pq8kjA=l<<9n_F& zFX})BiUqku2H%CaRwkO$PKKJVv-kr<+XuQ=K<5N??~u3zLLASzTo7XI1Kl^I^K`$U z?jO(tct+0$j2a>>q6b1@=s_5m9vqSj^$@-c1b6}F*Z*_jA=cMFVp#QR7lUzM`LRAOum#$t1Rye26R?H&kpE0f}G06#z@QT`s&u! zNUNa0toFM4+DJ=4SK!-%$oAQrs_Pn;Z*PtWlJ!j+1?4VmYS~!QTEAh^$t4S$Hg1fx zOcOM0PQ~2v6$_WIU0PmMwRHZn@~VopbC)bzyJ&I6q9uzfXLGfatG85_)K@odEU9X1 zscYPbYFV?J8e7|{8{1Y^*SDhwRo_&zSx}){w!N*czNDt9v8KJHCDPbd!XH~pmPK&i zf;tQFh&D1d)kRvWTWU6K7c|zu)?Bw`+sP$0E!&&hno8zG+9E9tb&YkcZFM#CqeW3K z(9+b@h5-s1d5Bslg!18K?Tu}94Uv^~t##|`Bjt^aO>Na}br^u4K?dM$CDpN)C5zkZ z>#I=?HC1aQQY&bbubZva_4SdqMBu7W3Z;9O&z`+x#p2~_*HkQ90(>r?&*Q3TYAD&* z)U>fa0*o{?G&SM}P1LlNR5moUw{cGkF+|kQsH)r8Sl!m%0(@5XwBB?dY#!ofZvr7K zZf{tR37&y=b1IHoUa@R(`NFkTD`vT1^x;y=)4eN)rs>P?aA+N!!!fy><3^YTqCk=9L3^_bJ%k!>Ka#_IZ| z)l8y>oO;(aro79oYi(_h)K++LxEPn~iR%Tu6To6dpRxla{wMI~%*1CnB?G#%PpxUHV@~MhW8Fp7&G@u9@l6^^OYUKsq1sa;Elu1gIJv1M zQnF???hPRhsj057nG@Mi-ChqF;LVY5PGrH@N-*8*rdrHeuZ4Au5toXWGm{wkg$7nu zx76{o_foZOssr=|JsduU6-brM zPB_#&8ByB9xlANw26#-5n&*zt-5A2c*>A0 zR`pn&8ZDgwZdX98VQ_<{LDO2cxh-$3b)|%$MLiixPYE4_s!a!&{py;UCTLF6>$iK- z$v4AS4{HIk?S3HAv1>B*csRufX0uHJeb~d!Qb|kHK{R_9Sz6r&*&Z;hM_L38@wJ-T zrJ#N=czl8jg4d%2xOn~$&~pWiNHkHPld2oo{7JA?=KSx&XIi??-%KjFW-P7EO^qA3 z*HpK*vDxC}k1Fw9C!RK{on^AOUSgYRn5@6sD|aF0zuTm<_mC z%2r2OaVKcp*BS>}u3>W-v+B)pK+g;4`EVr(%H9}hD|dOpo%tfDfS#Lm3wmBUjfzb+ z=6V4b4A7_fkLc}1vg=ycc)Hph7!)w)9{gx@rvCu-S0#pZ|Y9o7`6@VDhj=P1E3V|xXs^$hetbF|&jK3?ypS*&wv z{VPTTY`_H;cFNQqLRUG~wPef^Ho7o##gA!G*EQBgw!!YfYBwXcut4Xj)zoIQSa2H6 zQf$cv)CVAwlM1Gp>XaFnF)g4M0OJ9@P|!)=bR<3N36^)wCWzU&O)azP+UC~RHDjPy zctl$2wlK-q)irJH)%7S=U5nL-S-yCyo2-WFmdzMtdFzT+E;`>2X;)m?GjhlT5{)Q? z9>7Xq17-mo&24FFSlYgReswGK@fcX4J!>q~+`b-j<5ugP*cMu4ePaq>mB=IVdWeoH z$9v}+sJ*G$)jHvX5yur1i&e*^#aU3FY(C5>INnFt9(MfFzGq_@c8FGZ!IDIAJ>=hN?M_?Mvx;^NFIXU)RwlP_NXUBF0~-gc{MP_02O=!pYie=9ig-_0P#>Z=JSZ)ZhNdl%gu#77jDV5Z1Y6XI78~noTwg^l=G-_* z{aRym%FF3)A^$p?xu#DmWUEoq%bS+AG_^IYZ->!k!&L=831-xYq>`i#{PgQ#)zoce zRcpL06VmjbLIFv2!ZA=5ZEua#Z}0<@)!>b}0!w-b$-`2qA>NwLVIo1ou&+;LHxP)o zYZnm;HS_Q>c4%@8BcK<7l#{h#Krc>9ieBf*#eI-yc18el?TsMMhf^%iN14}{5aYA} zck#;2Kdp_MBekAMu*~-%R@FZz#`Wc{N_vDRCWJ)OAljS1)$}vHFcBDkg|80=Vk7~* z1R-1mZVjpfZ7x*?^io*RYq01F=wk)VD(HG9{lYmBWUlU;kr2DY>)IMHG0exjs7mr4 z&W;rTf_lY^o7oQNWssclA^}|`sJKgf#|!#EP^SVUSi)V_N&*>6P{WWxL#s@sY8!&P z=-QwqV*}eHE*Y;%BlAtU2f@1PyH_2SA0h(I2!;nlFZje3yZqzY@J;t-Px3M72icJLj z=paXG4bkQ%y!OgwaIg-+#Rgt^)U__EZfU7AD-UP|kQ^Koa7#DU)WNW;b(Km+4MXMX zVn5k>l)bR})a@0smjW;jvt`vq<8H1Y-ZyS}d0rk2(>Oyx>Y;gNrCQ_)?3bTmmw|1ZEh(7RG}W*kXjJ&|e+=fP#t)N2GU!ER94q!`WPk zg4Jvv2`WvPm~@)NLrt;;UzSj@we4%s*D*bZF-^O1^nq9ddKHqU0{S@MJfK%2#|3E~ z#&?-WaffQhhjwqojP@>_!O3%yOyFs{>zdtqH@CNyCs8T_G0%<6$Ig{8FiPCli~UGTH&ib6bqFWR$f~6=>KWuInN;#&CrG9#U0zXT z2%N+4fyS}6jG~*D)MQ_kpkPe9+%lJyL05#PhBasF->_`tIUE|uVHRoJ)|iw z2+TSl11-6)1Pw2!oO4V}hfYdo=}y}|SZIp1oM6?$)|u5XPj zZEA(%b_;^S?7R?jux4r78mZol#4fCe08A`=?xr~8w5GgL1ttL88{UE1liOR{d~x1L+f(w{a9oK=hhOHVX<`HQ$9DBx*7}eBl;-;va(FnzD6l*|(Vo&^r zVDxmDpmI2PKqv-C(6CQ@#~A`t1S`U|(%GyiPN#>AfxfM+BpMZ(%{KiuHkx{a5gHmI zwQiPzYqJmXPe1cO)u!r+lS|pHiW-5sRv7wqz+s>r-eAM;A=k=xB~h@ttu4~f%;^ce z;XmCJsfD8z#o%>ji_!7FW1G)Vaiq4&I7v0(c1%4HAqz*wzw>xO@q(9%m0>R2WfCU1Lpsd#zz4 zlb*zBD~Yue<~(i#Ff|vY_SH@4zOlhCi_}CQNn8;6`ug*ki^XYPchh)bx1J@R%Yos} zWTE1DFxl=0AOU@%pb2SMDQ#w)Z>_%a>()sagd4_Akx*=G0v-;db~71WRz{Xi%xT8t z;~8e0q67@X^R>{=|6LMOD#69=;TQ%u5{H#CWD+=-rx?hLX@Y3V8D1}g@QO6JegXJt z;)1fPj~rM1lmC#I?8)R;jH6J+3hD zwI5Fb9F-y{%vAZx@(Na64u|E2rWPQ$ytWotGilmK_hfKg_HA;(y!^$9aJ9jZL(*_+ za%ex$R@x5(IocU#?OEI131FRVIGDN9b22o0p@8qe_McqUm#{7JkmXnb65r_)bSv0i3b;L*FV@Ld1yzPh&`SMTk zuYj&`bghm!;@{#wj^1ER6?Bm&8uDA)*R#3SnvYEZ`QCno`t5k#+}zXx2V+@&-G=<_ zP3`#`@tt#x^EXGf=d+VIf6jv0G~YIIyv-G~Z+$*eE(@#Lkb z8AxIvBON~l*9p1hj(AV}!x6s{FFE1`@e9XVZ5@rULA+8r;~&eIYIw z;zf?W7-QGp(U&;-QYN%tbLVgJpN!I@p$y0vL0O!BC5%uMn?0`bvG3qp!vthF!@>y@tu?+JL?e zj39?O`g(l{rZ*1IipCgGFKOllBX+>V0CVI}InvQL=p8VWOdS)-E^le6-pZZWub0G65b~^e-eUoFYWHjBZZ*lak49ji$_JF>_(Rb;)9et1fZb0Ab==&_k(f8}d zfPTQy4{F3?9(MF@{Rq&AHQ=}nNIl9o?xOq+)sSRh#lu?jx3uDlwN!juOV*!^-87Ee ztoOiE?C9_5M;*OacR1D%%n-&k%&|_?`y6W>U)EU1J65d~adfBN?^qkGI=<8g^!FWo zKtJYKO+3{tpd71}`EaYXjW4G;)*05Bj&+uGHkbQ>V_nF1kLxEK{iOb(qo2}GJNic! zsP@PD8Al!~mpS@b{hXtJqMt`R)zLrIKMUxeCtx=gICiXZeZHe#U{W0!N3kc2Qx^h` z{ss5+qW-0$f5ixV$ozj5?$^~+5DuQ>X5`uB`fOu(zSlVQGWV|;Ao53gZ-;(cb1 z*YzJ9{f2(iv8Lcr9w%2j*6kK%=`H<7N58G#arB?`pB??K{)?mks{iKbzw7rL{SSV8 zpYJ~4yAS#9Px_yZ{+Ir@qyMA-i{P50Sr+S$^(T)0lsF8`(e%Fze$!6sWc zwq;AlR%AjLS2 zn~#WMeO-+a#|>EUBNXG<0~xx-%UNN#)0mIDn3T(3-`*B|f894*kc{LP>$yYiV{>x%$zWLeprV2 z!iSFag7wRQU7R59QfS_>$Jyf@yTm#hexf+ndtqhAJ{c?)t}@aqU{qw16q854nYl(KxtG4fcVT?`1BL-aN*wgHxd^g<@KNimf?4ule26r=dPHg%>5@q>wDzI~IQRU*ws^yil zV;d~X@=yDgV;^nLbnJ4jH9En_@e@@(TyZVc`8>r8)32DqQU$Uv*y-4_?AZZ(j$>EY za~Z;Ukb3rf$F9U6@OX@4FVN>B)aKX=?M05g*k0n;OO3uX7)n|iaup{CjIYbhc-TUWY=bgvWp&%^*eBS_0``fHeUkVXgDH32ncS?05;SdW zHtwv334eS#lY_a!)$CY{VV8gt$SbuhPj$>Eb>m4bja_kzrHef?5K4>HNY*btZnwm|#>%#-mhsZEA zlbP9k1au6FSlYE<>xd%*G6)WE`*)RiG{Be-21^SHYGpAd2l{$vW6c*Z3D}z)`(%4F zQ&GKRH`t8lS^n8SP;yXmy zM#y)>-(hmvZ6GSic7xq+Z*lCc5Gi`EjePHx)4s(cgq${!0W%1^Ittti$<9vR{35=O zwVcoKoaA?H(G95iH5Dt@c%V zAM}IkBJ!1J^I*Y5T@8!Xdcv`2iaUKXcYK|Fy<^{C{m8L**gGBjMwSSN$EV&? z1d(V+ueGGog@!#+J|MHa*ZHS%jK;BV;%U6uzQwU`wJ#6Yw=qd0bD%1rSg~JcgJ=y~ zF@dy3Da5DK+cs6VhjHX$@B9}9nLho?wJ7Il_FYUW{%rL5+ zwI(_CJ@zig{;qwmW5WUt*!Mg31NMWC{gCB2_QQO)+kP})?}d3{cR2Pwwv9S@2)VqZ zPB0@v@GzN|upf-;3wpucZ^M+m(LUh&wkfi$EI%LL9TOWk2mmvOZ;*g-f|LCtzc0 ze{4VFh~M-2=v7?6O3x-p7jKfGQCRY^iN%73MI~Y*DYTHF8KVV9O~Cfn9u|$(aZ`B4 z_?%t1?Q&~A*5TZK4?RAZr#MkWV=Mvtxpd=>!sBz2BGMJF&MU73=7eBt+RA83haPX8 zkc_2tT-8OajqHZcaL;lu z2RHbjU~$=6!aBOT7N(IPxIPWJ`5ox~U>t_#HQ&WaB15|#2B;U1gc>7T*~e{YIWHm7 z=e>sK*r{uEBhX9WZ39iGHfrW!X-fnE)gnK`oFL-nzeLSU_~hZ>kB`Q6PM94F9A9=b z4zX|FHzzFl{05dOj8h)Z9JZ|5v|$g5c%p0`OP;A9k5a zGzmRo3KR0Sytz#&1HP&$f!xgREnmHEgo0-}l(C=DPn#7m9kL>q{tXh|bKJj!=tzX%wbob()@Gu~sO z$}}^Rf~%gOd?kk#+g)tV7*(~k4o5$*XAj651?9Ny?%?S>KTk(vaOg1PN>=ww9L47iAx7_}WEzKTnyq-?m(tvQ1$yUkQ-@; zbVn97@wquUsjsqERW6^uwsP^xie*)mOR#(Dh}4b`)i9tL;v+E3jNv112QFX$0WPcF z8htP5u5ZR)egu32DAS-cd1O8)F{t80qS#j+LDtRQz&-h5GS;GIoY74tWCF^xjl%&q z0qjf0&ScPn8?LlU1hqrc!#iz<|qFE)6+oQhc_f_yxZUz5eZV3G$!{reH$5*Y9yZ7iLBN-C5fvQrl<@r0Fr>0QsDO;~NN;z{T( zwJk2xoSv%}ZOefWzi1%wq2Z%t5K5N)QUYWqTFdgo&T= z3ZH!oS5qbkv1_uPP&^R}<_J69OP#EjW6^*~2@*OH{^Uy0B`H8)Yu%`HZ$pxgSesLG zYA_<^3l^kUa~S^Vz5@4vY4i1fE!Kyq;uniO9tR(f=4%(XeizA##)hWax(((mHotWS z4slmGli5ayOV=KE%em}s-fopSg@HvVRzt`XhPj$;KE^g?@h0wsWk8R6=~q)9sc!MF zSiBu)W4f7iXgA+HGxNCakAx$*5<&1gKzhtTym4W6ER~P99HdSAix&Y+@Devhx#PPT zM7)-7EFsgQw}Ue#u#y5m=q0{aJ-)RQ9(zx`CYLwMR3v?4FkaKxegZoBnki;o`hNgW zZUU-2PVW`((tE=g_2;fOE6;mf8 zFlk?KazP-5Pbo^ z^d9HKd}Crr>Vk=EWu&DQIvA_~n8B(`tLw1kfr&XTg%UF6Sd6;XGD-`Y_dkG>C>a>j zrpayugTIC!!fwO|Xb&TE*R;#GRbtgKBz16c_a2CVw+bzbYyo0o&LbvYe-mjpJEYJr z+8W`JUN`BXSOc^*@w&j6URV^hH^vMc$P4Vh<*nc>FZie)V*)0N43}^{dEqf{MHk{F zeGBQ|n$&qc=}c%!Kw-K#@@eJX}??0TjOBqpT((>u`;o(j>ZuZJxMV3nZfOT z4|>v(PX6V@aPG+i0>@#pTNcO5w$~#ShIbN~CFx)gS~pE(n{l{gMQT zAy0Na4NO3*5iZ_0mcUUV9V>pTD`BGVy#sP<++9{FyROm`a(Y^gs-v_g@TO>o^a7Dt zqbVIkip#-C~|h z)Ic$lLih3hb6;+}S+64T-cNgp@`4-i_0jFeu7VqhK_Rb+WH1dVm@vn`MPAUW|2Lqe z>(oSpd}H&#$B1WhUq477y^>A@9OQ0Y=4_DH9A z;!@vuwpyaE|AGIF-h5+EMN9%QrjTl)EK04Ni~>WJEPm6dcD9w0ybW#wh8gT4b5x^j zs73}Df(n%!T;TWfhbjD8Vz>L&K8aMK}kQuI* z9q2JDlJw=hiBAwU9!)i;Ii?w)dO3iC(w*e(pNn{hp5`+6?P*VGRx$~*;e|z6c)>

7B?%PExfT4mQ>8elkC8T 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 -gQ3f~^sfzT7f`yd1R4D|}zh2h{ndZ>dQURA`! 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 diff --git a/core/out/production/classes/org/pivxj/wallet/KeyChainGroup.class b/core/out/production/classes/org/pivxj/wallet/KeyChainGroup.class index 3535942c23f35d1f2c534f9ba9ec583e481f1c47..45d8abe580e29468a2bf2b910eff1d0a1d4cc2fc 100644 GIT binary patch delta 12163 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 delta 11696 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 F{{e|xPe}j( diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$1.class b/core/out/production/classes/org/pivxj/wallet/Protos$1.class index 26c4e9fb4b3339d387764a097e3ab021f8d3ee3c..5ac1d29315adf4bae1134108cd5aa0c1f85c00c7 100644 GIT binary patch delta 42 ycmX@devW-ZITMGep@9)2Lz2ei4NL};*E4l7h2NQM&1}mSexHFg{K4cp<^TX3Jq?in delta 42 ycmX@devW-ZITMG8g@F+xLz2ei4NL};*E4l7h3QVVX0~MuGhkp1Gn`z<8~^|aUkir- diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$ExchangeRate$1.class b/core/out/production/classes/org/pivxj/wallet/Protos$ExchangeRate$1.class index e5e7599e8ba3eb6a6af99e7884effdf7f4ca101d..b6c1b7fdb44e98715a5493d519067bf865ec5116 100644 GIT binary patch delta 28 icmX@kb)0L1FAG!1rpf*+j!YrjCr@ID2JzmrL;wJiV+u+D delta 28 hcmX@kb)0L1FAGyJ+hl(hN2Xxz$&*;3LA>`Y5deA&2txn> diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$ExchangeRate$Builder.class b/core/out/production/classes/org/pivxj/wallet/Protos$ExchangeRate$Builder.class index 8ff1595c0397845ec78a00b5e9145de0683d33da..a93c661918fcd707e82a825e7a029ec741b2f7b9 100644 GIT binary patch delta 947 zcmYk4TS!z<6o%Iv9WSFE9rZZQj5;$qGtR|qG_BOUWL}6+A7rl)vO+9MU$r8F2z<;U zTxBW+K3IZJfe<~Ew+a=?3Nr4D_mEJh&^`*=GBvKXg%eVHsCftsZ-F#(a{ zF%=rhgTzw^5|h+wD3`=EO&e;H#0;p#3+84)5ih|YUV%-#2Df+v+r?X|GVYeddulW0 zO5zJm_?89IB=`1K?Glb!B&O5<* zC+W1MOv08`?wy6X^AwiM+!f|JnCoP&i#ZduB=3;1huQ1Q-e9(u#*&%sXSOj3@A6k0 zfN&fHEe`WjjBuy-AQ>Nk6-TKf<(vU0*)qkJX%2YC0nd5P8J=^N@~x-h@Du+EpZR!> z>3NpF@|+9w(0W+LpM32vP;iNfWh$_FMIBBc^kf%RKKq>b=_y7&P{bH)xHs=b@PdH(_;$^1mv8BIcmD%9 CB_Qqq delta 942 zcmYk2OGuPa6vxkerIOm$jQY(qGmhho^R{$+W}2FjBT{PN|EA?5$_jc>q)}0bR78;U z@R*epxCn$+h09(pT4;r|C|XC9Y zlBHx#G-{&sT|GT}dwYGwB^5lJdDT?R{;W@?QZ^e^=CWw&#PB&{@fX$A7Q*3pm*KP4l` zgN_CbVSeN2%)x4b3dAcU15t9Ii2Nv~e3Vc*O1Z^Zr=fy}oRu1?c_zNpacXv>j(YK8 zl#T|nppkcFk5{5eVw&Zy7HMsvmDozzXq7n7DkzGgjn<-_)?+(uLuv@ zHs|H?NNzyG1AdabNykGO?vV`lm@@H%ZJup9rsQv@CGWZ9z2MWHn1;7=-g}RD?>NmX z-mG|^#rq=OSMl6@&bvm(cX5A+`%~OsJmrmPDn;A_Im$vwDudEhCRvn0R%IoZvXNKW z$)}urGw+f^1qBHS5+<{XP?lOncD0(Es*tOFr>v@qma27fTqAa^wAYhc)$vQ;9$jss zG_{!w)g(qU*ZAA4YP--ogzgl&OXzN)cM5IiXZ|t`sr)TsY6k|{x!P@-%OEd<&4aww579ZDo*g%jPDa6%jW mS57aM^G^xexIU6l1|kbV_4DtXV+!&&#&>=Bk@zx}KlT^Ug8Xv; diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$ExchangeRate.class b/core/out/production/classes/org/pivxj/wallet/Protos$ExchangeRate.class index 4d50d0e04dcc4e6dd69818f1924b1355601ca9c2..b0a561ab1ca5eacab14348fa1bbe14d709ffd093 100644 GIT binary patch delta 935 zcmY+CS!|3^6vzK_(Wa%-&Zsgi9bISXEZY=%W@N}^mt`s~iMT>JwSn6INy~xwA2K=B zos#ORuqZE22);djV^|IYN z!_XSJ>-8I2C-1!z4YekHV`n?|(B^-@EpXFTWYacyXa`2qP885C_-HqX_98+1&`1Zc zmJVSfwPP!FU=MX-KOI3Q9Yq%%LpOEdEFDKLoj@OT;|85VlFs8cUBF$sh5#sTPa1|fr^A}O(pDBV+@(!G9+gE5pOo)q%JfKGNacc@3Hc3Qln0?H zhA&G>c%tE6nI5iA;p@7fKIsTAFtk`+=|JUKWQ0T`r2}@uUwd`H{^mwXNwm118!k=J zpl#cut8Dq$pK`4RJN>jg^2AD!PD}sZff(txvj&>xSje_VVhf#g6X^*zMkIzKFOe;u HVr{3ht7{~wT%&2JewzosMmR`EJz3uJ2r!5_6C&tt=wobCH2p*d<98HugxrhzMEhwj|&V#&q;|{2H?iWPQTy zAEU!+x--7FwEc8eMoYV!=h-)gWp{48(uk&QsKLJ>oYx?dY}BLe@-}vii+12!t!rtm zUM6_knzUOEc#}-pCzal8lMdOwCLN3^bo2}G7^3Mo>d;Aes2q*xG@8;G_~!}i(=^nPw1K9K&d+7xZ&`TVo zhd4}+aDpD=6g@#?1wF+T1u7MIO#jQfrsqw1Bj@5m;SAJdLq84TiqA6HEuG?jG1)6i z;@g|-m+OvXN^*iqYbkalSN0?fkL3b=lkTX^J>ceEh~YkH$c2dGzVLC8~>6)zRKiTA@%ktVu*EM;iI3;BA9c}z_A|+_@eR-Rr z%v0$SP`;G49#o|UR#zvzw>(mAg-NNUe{XdRR@tAco1(OU ZW9O%li)$b}e=zFi4?)BHq4F@T_yfoWGP?i( diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Extension$1.class b/core/out/production/classes/org/pivxj/wallet/Protos$Extension$1.class index 783ebdc53c5d91db492fdb03401ab50c05ca3a31..2bdc2f9cdfc729a90ffd305bc132c6d490a95fe3 100644 GIT binary patch delta 28 hcmdnWwUujwH4Bra{bXAfM`$qg*gAl_Y;2mp4J2s8iy delta 28 hcmdnWwUujwH4BsZVto1meVPLsMHi6n@n`b2W%`qnvPQ;2((00euoTv!3;3j3Lj=|7vcqu)_~APU5}6Q&J3+x+ zG@&aG#|rRgIhf^etOPAqkxE}2fYlIy`)QxPSjHL})z=uYj=_2e#s-Gm5RC`Gjt5}_ z9)c`vB%@)Aj7RuwC}T4Xd5&ZB-cX{(6YM()Dm=ySZ6jyYIO1vEtP?`;3`=KW9iD?I zya4fd5!PcDII$bDu?O<77YgtSlw%+4#;Z_?L}AfwYP`g5oUJ8QH!}!D>gEn#B?&#DNLs_oyN3|ewp)Rv57Y;l0`ms#xcB=;Sz>j z43{xn&hWM+IMCu!i#;5_m*XoqzLM%JY;-R*dug%CqKSTbpjQ5S+8{)%d&fw zv#)Y?Z%8Dy+r6AZGj^ZbKf$X;QvS-QP-}uOVP{Ed;0q3azxIEtJxhR%1cH8E`>@5EtS?1oU8n+PGa*T;jnc62<66 zGtsyqNN~dqBvC;1x0bZS$&R-H|DcL;9 zfJ%-$Gq~PhipUE3C&;z4t;dixLd8RDG>wbKV-Sh;ASYK@5_qwR^wnQP_!10u#l8 zh2pu_w%lfQ9!PjiF>)o zE2QsARvb%pv`#+JdN9xiactyjM}?8L3tc1h4xx7nT`Tl1p-ueDQJ~UZnXFi)16-3P z@KJ&51g;mjLEz&8Hx9y4&Y3zoE%9e0zFFeW@?xhL+Xpx6bh=c!#b1Na1NnO%LM%Ok z1bWOf)5~?#Exy;XOph${hA*b)tH|8qHn8Gy4V9B!o?v;zYv)>*dr)Vxp1g7@aBwgLdS5~KU`*e!@wGEC~Vr$ U68--#?Y^R*67YG0$39=fKPht(dH?_b diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Extension.class b/core/out/production/classes/org/pivxj/wallet/Protos$Extension.class index 52c9d7dd22f2ad363ed9a60676906e269cc7d360..c3ea9f11767056d5d22826b0403f116444406da1 100644 GIT binary patch delta 918 zcmYL{S!`5w6vn^#mv-#HOlJy1TWV)urpxS$(Dr_JNE1=kPy>X7B|JzM#WlpnL{wbb zga`GZ@gzbtfd}Ff7zz`Ys#GaT0!Y}x5~0w56_wftO-y(&dTz#vPv`r-`@83V&i~&1 zef#@HY=70_T+W5H@^$O`Co1Fqyt~8k{UzTN=yr9=a{EpET%^qaH2x3_;_pgG^cVr|2N3e%Y{dYcZoYOVXIWDy=-M~yX& zI_q~C3+?n-Gnl1uwZ^JtY4~wt{UL+ln6dtn!{LIl{x1F+UhaC6=6{eCsO2ooV-*_s z5FTbV7SV$?&c;T1v57uxr5{hT7B8?41FXkxHeiSgu!l_;W(fNj#z&0cV@B}_+c3fm zMw!KN=I||J7-t-(nZQ{lagiy^zNx@H1!kC+FBV-jTq47ftcQe~wys4v9kC79NM-a1 z!_6|?yii__t_iV6_wL0U_94KhFrPcn$Y&7YvpVndG7)`u0bfyMmm;si&)0OV-MZEr zioGR+%{vU=(Pk?Qhh<5NmILy-Qx3^@EvtPzf+~){%cFWD$E2}!R|h}UZl7tl&ovs= zPG2I#udtBE^}sQt_zf~Vfp(6==1DB&_jr`2b~`+FhpbAkGuD)RnAU%4O4euU zWG3BQl0k`QT1)c3he0`5PJ%L7mUE>sn{c?5*&e4HD!FUf^^W^G*C3DOGG+N*S*|Q6 cp?u1bYx5g??1HE80fL3SXe{iL!}*u~1>zhCTL1t6 delta 918 zcmYk4TWHf)9LK*oHVut!nncqYGn+O^n@e-;CBI+NQnk)jODn4rqoUh-vx81ii;7rR z*E-onrS$jU*q}a$PwPMkY&x`vir~Ca5q(kdK@d0bWlwvW=T8jy^u3(VxpL-)=Y}t4 z?WM_N(u7|5##|*2Dptr|d&JU|Y%*bENEWSrxo%HcnvFbC$g3QErWP4#gN62< zqteurf99yS*jtVD$_IvqM#jejsdPH;bpN+Rr8!@*>YT|*t6^pftQd(LSt~X86)(^lOoU{$gX$Rc26Ccqo)X`@M z(&yMh1IW=JcF-_JX*c%J7{=)<9HTv$roA{x`!PcY@Dq*W7dnIsbQr(UQCy@cT&8JU zr4zVD6Sz*taGSoy9h$@<9mmqA8hE9FxAd)Cs(Y;HJDKq%taKU{Is>h8+m}@|CuaX9 zMf36|P%8)hJvH<@%=8D!=@K0DC#vWQJaiR4TF~dcCeQpouB5vfxu=o)u+sy5twnvU zhZ=h%Q-LoPJ=cqMDS9a_^;-Uw2}AyuoAn!Qyac6Of(kan$))0HIFjZv{m@pF^HN<^ zz|A()a3yNlfgn2(c`$0CuK2emBpJVz@Wu!k|EpKCi zf^|ta-cYdb2VHW$*tq0H(Jm8DB4Tjei9thtEu<%jej{B;x@BE5UbLr*w!7HWq@srH XO>MT(EUcNo;mZ62Pv(uxrw+UWDw*z( diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Key$1.class b/core/out/production/classes/org/pivxj/wallet/Protos$Key$1.class index ec070b4a3d6de5205e5416d8d3622c7c66975b55..184b690ba1594965502e03f866d6cd66841e36c2 100644 GIT binary patch delta 28 hcmbQpHIZwBI17`Y^JGaDMSR9z9jHhkQ7fN9^^rR)CqIb1y~K1Qz? zZF(mUC`cM8(|34uinsBBzLwgRgor{o#5;(TcDUqz zB&rCcs(MUN{m8dpN3s2LeL8t%;#U~P41Z?WnGwp2C}zYmV+=FKF(Zo^1@^B|V!x?Z zq_m1};BEgFegp)O0YMgol9%pJDY1}uUwUe+v68G@)DQmT4@CiRk_~Yb2oD7zlR}VB zgmMz7C5d)Ym`NrUkOL1XwZ4HhLI7^iw{AM<8i^ z-{%>AJjX`(lIGYZIOu1Hq%CaxR@T3b^*_n_pF$~ZM-}Zr3-w|K?ZhnFg-+UyZrXz$ z+RNte!v@-qE%YlqP0wKuJ&)(;1wMd2)_-8oWC;sfeGI4YC;lE-UB$%#<5x{spGhyV zt|P4DW!CWu-;JZ}iuTIhZG58lWtSM&^?$P)#n*iAZ}ORb!(M!g5dw%1 zhHjtOVG}<59ES6A@P!ms{pQ4Ci%`sr(BpDqEh1XCo0!Noav(%5KdC&Oom;G%iv#q*Y|^`OGpwQsKBAe~t-8I=sfXp&ImIjv&1Tm3 z`B}|@Dduv)PPoMaB#Q_1;=CnNEN93H1d1N+xeC!@4HCp!?UVm=msroK4czZhmhu=P z#pCb@jd5Z#vcwh?iLIy<+w}4LMN;fy=x*4=GYsF0aIue@?AJ@nBXn0mrd1q-RlLaQ zL;6rbxmEn0(Z|?~*K|a!QzsObIZkuruLuxl5G>x}8fW1Y=MW>_);nrl`e0$IaYeTl zM`~+PtnnY6T+}3PvRAiw+HavG5GD=&jj`w*Mfcid0Q{s4LI%PigLFvoB#R7V_We%j z!Y~;Nf9XcBjE9t?5iS!DEyrM_^ytgQ>q2D~L$Vn%5kWEsB=fjPK1Rqw{cy=rDXZWm zr*gW6+tza1I&NFfZB3mtX^Krw->E5-IYO-Zpue_!}e6AW*)=Hk@M% z-bSMQhmN1JebhzH{ENlD$L3t(%w;6YD@d2`W1{>JCGulb%WJxSO1Jowk)OdPuk*w= z82u%8_=-=x*{T3PWgt*l^o8D5wwS+@US>`g>)e5fHg9x<>ZncL0q1Ni2 zsmr9=z>r6IipRL_MntPk{CBij2UhpG)OJqofJ5~%YbQpkUodMoGSnXAs%KHE_M=Yy zQlG8vmg+@@9)eB1#8Vz&(Jv!Ty`s-GMCdg&SyuH1%Q}uAbwVGnsqp1Z8H!YM1kdHre)ZF(>0($c0!=rh8INc)0b|TWp3R}3tpAD2Oy~4?ILr)YXJVu| zf!W!}FmsS==AqOqK%H5r%Nn|+S;5ds*vu*jvl`)ME#k~Np0CAfwzI5h2r@f#R%5x< z{GL0Z#j0iu24KwabDX1dUIP5f1Ym}7|5sn-~R*N$9o$9 delta 2500 zcmYLKX?T?76+PcH5Hbmqg!?X;kW3aJnFIopOcoLn2nksxD_h7iAu%G*N6R7sLZP67 zY(?~u7qo%`L6AxDMC;d`*JZb+2XQg&M6`HtYm${PUvC>Rba;oJuRmsbKl(nrV7lXN<2wbSV`4*p2p!Nnt<&z5x=4u9HL411J&XL)#H8g<5OzH z=QJ5tsTnt^#j@yOyaylz7R<$rG8;`ZNtrn|dd#$EO0zI?kd0>X(dVF67B`p0%|ke~ zb==83z=9X?1b>E5TFkK}h@dABMNeT6EyWO8#=@5)n^qv7R$>gTMmhZ)we$?8(X*IE z&tWb-kHxeOE689CZNPeZ0k6=D*hVk0_>I_4n{b$3!BN_bQ?wNqXdAwuSMfFNVDYb6 z!$3Q&-t@ZFmv&iBdc$(lZp%x1tZdq6<c<(44dii*h!ybH(lZde8KuJcMn;?#-l!lQ#j54yH1z!S=Zp7 z9I-ZsuCT7Ftm7Njah>nR4W8vq44_*`p*t8x-yxIkvX&oEAT0QV4HHBFYDAzZ$^FG3 z2W%n?VM0O(g=i6u7|{=IK^V-jRF35crwPd0Va1zWc_o(H+{mkwL;2nh<6E2xCDPDe zc$t-Mnn$)cL=L|WBlva5D1YiAd)B28>J3r7D`i9HP2i%_wTTXrB`9KaB9&;%B2N)Sgm^%l1~#!B8s ztoS25;y5zI3FL~CC=#boEl!&g1@o0S%g}Rhh))=PfyZ@`n{=9ml`*EZFvl+b3A^}` z(_fiGg_U;kZ${tbS==@;6J2J=m@;Po0%b4sm4OJCeIR8JT+)sKGQ@11m|zZ!Nw=J) zu{hS)ixRDYCatJm4nu(SAVj7?OE02iI)7p^%+{hu95Nrlax@ny;4e?1=~rB8lhw?A z)FtcDOExgc&uu0{$tFb0X2i=D43tyMrQ$V_au!2oGvslE$vF^mE*F`H{<6)iE?KDL zGH&}cr&n;>mE3j}w_VL`BTQ;(g+m%{y`EcdVAcy}O=+Ey?abK5jP1t1|9`6QRT$)Q_Jx($;5L4^DkG4d|l@&|b3f6d17MY1;nRUkrDA1Gx< zyb9q@b6=BOv1Jf(MnEfxXr(x#k*1u;QvESfMWaN;V7!Vo*DBg%0wWXQP;N+-%;+I- zs}$aPgI#$MtkSuBhUu)Vw5t(}%tb#nvU}qbs(g{EghQq1tI80r%DF%VT&fZSR5hBe7Ouhbj_s8)oid5BQ+xnmpR)BDHrIWJNAWKI8l5nqpO(0yXM4%svzEr4n#j4#FP55 zQ}L5VU+qM=j)c_x;nGnUpj|wqMr#QBtF!A&24x{cXS26?EjzuPv^PrAR-f2&+FzfMf~?dQr$lTr&i0uiW_j|*rP5vu?o5v%|t5v>3y5v~9% z5w8F+5wMdD3`YVHwv$#2KLQcLla~xS0ujcO(+oxe5z3Pr4MGXg016S(02C3`lV%N4 z4ch<)5!?U^5#0b05#E!<4Za!?T>uXeWdI%#ZvZV3d;mNVQ~+BMxd3Gm&6AxDQj`WL AE&u=k delta 146 zcmV;D0B!&89q%2mAPWKzhm#@;E&>pTlTr&i0ubAij|*rP5Z(YF5Z?eK5a0kP5a9qU z5aIwZ5aW{#3`YVG>62CrKLQZ-la~xS0ucF=(+oxe5dD)I4MGV7016QW02C1jlV%N4 z4GsVX5f1kN^)5m;fFSq5v%ruK+v{hX7j;>;PpE0F#{#QkoDY Ad;kCd diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Key.class b/core/out/production/classes/org/pivxj/wallet/Protos$Key.class index dea7a603ebd5afefa44b6a590dee0bd98ffb97b2..acc8f808bd08bdc9c0d88643e425faddc184ea25 100644 GIT binary patch delta 1573 zcmYk6dr;I>6vxlK@({%3-rr$i7Yq=UMZ{%!EwBq{?8>qTisUO%6!4KcDoQ?4NF6f4 zbmH`yq*Bb(Qd2iA8!gRD%F(8LHBE*OW;7d(seDaj-4(_D`F+p%obNrqb7t<`wasj8 zGuzV{%B=KH=tRE^OEQB>Di4pO6=B6JlTL@t<>?m6F{}tl^45BlS5{7|uI`_n?9Chx zoi_~@mO_!nB$i6W#?^G$h=JX{bm}n9W*Ms7kLtp8EZMU@JTxdc$zplZ%$n@+#D47K zm+FNjG)kZ5X&J=0Cf)~Mln{ue5G=MqnAlGH2UqFD4)9SpKw%YAirLAqIMT5Z^$PI0^5HQ?OP1 z03V7ouuq(YPsBMmCN97!@gtlOKf!r%5iW^e;JRpo-^3NTBd)>&(axB-#{9)~riovf zLEK;w;wGz$6}OmK{LYfZA1qb;$#TSB%q8xyvEnW(75CUQai7fasgSAK>woUr7z0!|;CVR5uGJv(pAa+*vWqTPE@?(!zJE`axAcBGWwX6er^{gEpil2Fh&kmpP!6T2pOYjv$}3 zk?aPIPIIviYF6I|)Si~dwE#-6DhZ|My%J4_tah%&(|v0`*D{)H(Nvip%QXizrYlhF z1-H`+BDD$NtCd2KHW8#&2BF#%h|tO*MymjmHkBr2G=^(c$}(SB7J$&IAw*jUMs1O@ zEg_yci)(AVz1C-{=1p`UQ#Ie%WK$DtrhJ>4U>nuj3b?kPzW2f-WV8=wr&JP6^>!1x zK)dW&>@wX@^wvW8u&?=m-Aj4?64#dJKR*7zi=g3rrXUX6y}V zsDmsF1_uh7oPD?qQQhbe2tqw*7zRc(KqML=8Y9$^K9Gb@ffXYm1N*`di~%?HgAv#t ziqQn)Fb>LbAWX-2cn$}{JT${nOoUprzzdiH^_c2emSbZRFjM`*2Ek~D2+W27n4?A+ z3O0ONjp2Zi=!Ef@2UF1nbI=Wou>e+LA-s%5@CJ^Atyl~nVF?_@XW#^mfpa((+HgEv z!)HCZp)*+>PE!5L)DBbB+T~!t3bjKe#Nsrt;B+r3aRJm|wVHV$G~gn51sB8XxD;A&8SKCs*o`aT5Z1ymtbgzsIcm=<=3*0BUFyZzM0;F%ddU^r6?PMz|A>T8PQIzD7(z8&;d}YnUUD_R!YeL! zyjQB-qr9@Yz({Rwb5|He<^uJ)bu4g@;@z!q!9oB delta 1571 zcmYk6c}&z-5Xa{|1uQDR`AvakK>@L{9&}l*<=7PvR+d{p1p}f26|`21!K0pdghoZ7 zG9Ep!tti&}LTx2tn;KJ+rZ&bSsoFp+jkcz#Z9Qs>rfGTKUue{Np-FoJpCCXh zy1@Z-hvVo0pW^^Hho0~q4unfM7_K5hH|lU33GSc|JV0M~f(9YbUwB}EARHq6aHt5t zU{M>2!-N?_LvhQ?>&vk=}hew#14;9qRCWeHG8FxS~k!jli#?82LWRdm=> zT4**9lsAP#YaOZu66 z9iw=;!z}3+MV04wMU>|rPadzbf4J2pkNN)ik&>QpP+F3@8q?G4+-~>gBWV^l5Ab|- z0QaQjN$nC_o$A@S#7CVzyv`Zg7rr1e{TcD*#B@_%(VLg`g}c+oy2wxIPiPWoj%BSy}C8E$B$1zxxiJPjS-V>k-|hA-Kf^YwrAny#V% diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Script$1.class b/core/out/production/classes/org/pivxj/wallet/Protos$Script$1.class index 8af28006cc57e9c103b0b10405aaa1680da51f27..2314f16c26cd20fc5dbb5f9a418e841962b5e29a 100644 GIT binary patch delta 28 hcmZ3?wU}#zCJU1!$7F35Mv{l#6gfT$JQ|P-~otY9yA<+J}f{#d;8cM z!V#K_Jdm+O!_mVs9w#HA(0p_}h*SJmC%}cLc*SW5;~5U0r619X2QPpV%Mic{ubHMw zF9&BhuhU9zQpVa=heOMG@H#)f&X2zV3f`on+LQQC&|p<)UtJHpAjZjBU=KTZY+6KW_uJSeuP)6;Br)D}E+%$0FG?)@1y-rI!~g&Q delta 723 zcmYL_OHWf#6ovP_wlwwyw6wjerL?!)K2XGhJPK8L2v`ZC(MXIjzQFiGqt-+x#et(5 z)WKF^pa}z5z3^fEbTXXRV#tbI!3rSV0l(q2-W$E~%Q zbXp zpHaDz7C^9vCWLZbjc zjR;Z_A-=5*DG`3FWfg;e$(iB~jJaBc-63on)g#SCa2q^tq-?&zHv!Kf%k+* zRor7e?&XE>updSFtNXIcoV0jAAv_fGBmNPdcH@bB;ZyQqUfL}1bdwlgh(F3JO$ik* z*E4L9j2rJ{`LZnkp1k9j1JR`^vUt7<=4H+;M$ny8Kg(Ntx8ZbY~k zO;*O&QIoUiCO4>Wa5~TFM%Ddk6R^ZK+1Pr}<(L^%j+t&-v*{jcHZ6BI$8vQH@b4;X b2IY;7ppj~YHRFFse7K@qh;OT09AEqgPhYd} diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Script.class b/core/out/production/classes/org/pivxj/wallet/Protos$Script.class index bb0e73bff218db88b0e17edfe0902486cd33a3d4..ce678b1be53e2c37f87a6f96e44f5fb60eff2708 100644 GIT binary patch delta 759 zcmYjOT}YE*6h7Z;ZMkY2GxMC~a?`ne`*BW5e{L!%Ql^1g7hPl!1(ihqL=a`vh5b>9LGLF@T|Liv&U4Ot&Ur`5M#=`7O}bUV zpaNlTj9tzTEoSamx`?luJo?qaOa-b`&M??{#uVmbW;fTHjY@X3)jX^-tQCE!l#gk&%lAt!Hq8&UqdmzfeL&J zHTWLt@dF&iNoc`O(2k$s3{Js0{0W`-3%c+(bmJH3#jkJ~zd=8KhXMQnV=_N3^AB(u zY5|~}BT3`RANJYP4J1HMF>)Kh5&K#}aol4s5M<*id#<1qZDh`OWC_aP6Ar1Yn^j&q zf(F_sD>uOs3UPdLotL)Cv*gM!4=l6|h_=H@$_G2`05=tYp9&#BMUX|s+@IWLr4ni1 z4JIlDq&<*K<=~@zGF`!WDHj7&Ez=R%Z9f>PR$30oZU-TS>L85{N!ww_rg{ib1LRR7 zTb#QDHP4RL;*?vo@(rilqMdcAC4x?KMXHR>@^vjb&x5WccDvFAb+Y32@JUxdP?uDt zr%x)>Bjh@x>Mi~=Xm5d4{^FT zo;y6Qd3x_3)qCgEIbQ;|d7YZ?ig&#Rlin%~!alDC&AuWH_WFt6`2zDa%|A!Wjid*I RwFly@y|BXC$9Mfl{sQBh(7*ry delta 763 zcmYLGO-Phc6usX|M;&!$7`5+=Iy$4{%s1bRfHIbiN{RySv4GJ}ATx@pnk~N}~al6gS%{B{fxA|hjwmy@!+?Y&0 z)Y#b6(&E{;DORP9uTzR+OPQAxyE;$tI7MdMAgj7Ss``s>W*@bvixem2Bq>YIY0j-e z{mloQno$36m$Oo+|9D7Ci%mK0%K5l8FXG7#6Qv`O957QhlF5w}@*$NXu+lErXb^#QQV<4v)!{- z;Mwxi+B`DF7{Bz$6tCD+uwP(;>kDM{nqL^z8y@rKvd>#2@SYW)pF6!Ffsay^o@uE_ z&lj%s$?6-A81S9{`ZR$V_GnuKesEN)6qu8@Rhcj^SGT}FwHl$$a;0B>^DGzX8Qkml zuF`jFG(lfcS9~gW=^n%PRNrjCoZetSB%mA68rW^X!Jva@0-;q}7+j%s7F3YgF+~}U N&y?ku=C{G){{bTL%P;@{ diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$ScryptParameters$1.class b/core/out/production/classes/org/pivxj/wallet/Protos$ScryptParameters$1.class index 243a02e7b62a17380bc0abe8a3b0cf86febf28ab..c4ac03fd55a046962e9b1c97f622f4822e3887f4 100644 GIT binary patch delta 28 hcmcc5b)RcPDhrdD2m zOb=p-P+X|3t%gV=E+m2?sl=7UwZx4O)TJ|Brge4B_n!B8|L;FvU#u_IJ7_V@?|)}` zooX!!hfQSJ(%9I%f4?^}4}2^0nN||v4YqIQx#40H?GA7_EyxG5mYbuA^X$>{uPm#1 z-lTKXZj~&VC$mb>UvD4MG*q+Un3IlLGNX>9@+L=v3o9uFpJFqrR14){6&0bL zKRVXB&_Jm&w#e8fW2cPsv6kFe$BUiSY1lw%*vN5bwT8|7+1YBKNq}auU>oHiVct$b z?4UW=Nu}6DW!O#2u!mb+6&m(&zpGTk0sfvShosoKJU6Q2h-9=$#!tTC$7?7T;ui` zZ8~nq0&bEOw+5b=Z*I#m*-;|3#0uS?w!X{mrlq!g||Ioak} zq^m8$Zlw&>DBo`4O`av1YUOT^L>%HDo?2ZU7sCm%s&>j!9bDs$=_)Q#r${W)1@7@K z&``m>hMi45W4vAD3nbdO)5ed27Vhx*M<%|cS2L2{GGmfg=hKFFG-bl;pYZy}f^xXc zKjyRZfd9XQ)WFyzhbzZhJ0A`tQwAp5;fXdHOd9qDCj}Od|J3lPq04RK;!q@^Hitrq I5)a+{2OswgAOHXW delta 996 zcmY*WYehc-T^bGoV1ZEoK#MQ*lpNR2cpEv<;CWf(|g1QB5fkwpkW7wVUs z`W1ynly))AE@ovHioig+5oH%Dx>HGH*^i3OyiEIb&imZn_nfyQ+!1c?HR!1Gj^TE! zae5%21H-D-tJl=kxq=wt!^vF=&ft}%Px?S0PY3J09EkJrrj$kcVB|b)60vjF!2e$A% z%ZhY739&*Ogfz~ffL(!jDdYefWkNRDz)M*$MX;b?1?1u%Sw|EK@`3D9g$lXZ zY35(qC8;!5_FpOso(HKkA2O(1%oV)YUZc`7`Ia!4X}P?rl5g0>SR;Nr`yHA>8-_F1 zI!L9>kU;g2NL%ESw(Q!@T20*MGw?3AXP9wEwTc$i7HJc-D(}%;BPrur&$!kz z8kEKjo>85dyFLFU#Ck`WG%guy&AiPUP3azQhsN8GFDlsRn-G{cHq_9FpxJ5SJby5P MuJQXLrP1H?4+nxBIRF3v diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$ScryptParameters.class b/core/out/production/classes/org/pivxj/wallet/Protos$ScryptParameters.class index 7e048dc463d6f38ffb82446de6c6bf1f96d65c61..0990948501af830d977259c3bf7dd884ef698211 100644 GIT binary patch delta 847 zcmYk2Nl4XE7{$;3W@=Bdr}i>ad=Br~n|y=%KYz=zurQm%h-j2bt4*Ux5LC1YjN0`D zEi!UZi=xSFHYrS!CXxmku+VJO76nm@2)Zw`TAlO#?z!LP+{U`by0cYw#fVhfYm6c} zZQp4WOCWiwVaodCsdk174J59rt6S61;EK>{ZAAn*&HQ2W4f}<|OkIVl*D5vG(#RYlbpEi_7Uz=2xk5mMZf{>ptfSV;Au+ zNCPQU7{eH(GZvYQLk{CHfupdT30T2I)G`U1XvbDMu#02S$TaNbcpP8`nwW_rbmBO( z(ZU>@rwiBVMi;%f!!RB(f~PFR3;NJQKl&L!>RT3IkU@N7*f1C|;#nj+a_%cq=H!NK zEJYkA>w2ZKJ9m=eT)B~3rMOh=c@>JQWpPyMr8z3wi}KVTz2qJaZ)Z^A;wFOuh(r}$mAcy#lh(&1U8EJHH9 zRmzH!bzVIs$OfNN`n@4#B}=={D^q+yWjQp}nG8*ICR@h(^^`AbqvDl|evh(z((5l% zRzR`?rOFCQO`ts1DuT@_mScfxW%kQ=eW0bjz#+2=@`vnSa&wqC_6Pr*Ib_PPO_gmy zU-ZV&U~N?5L%*lu(ERAs9ZHwxP;ki3943X~KO|kY|FfOp=}DXhTgf3fN}7;Sa#$RZ GEx!N?#`+Wh delta 847 zcmYk4SxD4T6vn^*Ew{mJG{-b;+(w(tnNiP~%u=J(63r;fQW_9NDK8)5!6%Aoy_v-`@Y}#?zwQe!Ny?Y)e5uX0;x3D z89o^?_ZYe2jx90rWKV2~Ip3FOAbLk*V{=D`E!R(@W3g|;HTBJ)Oruv4Kg}}yqi0iY z8gW#FFb;=_voV*7F`r7L-nuV_mSeWYQ5tJ6udS;TtrA&vYF}$K)Oi&*t=?Lb%qoept{rEuxhCzcyBn9Pg z`cp+iQkLO0(Md$mDQJ~}j6y}jayO$w(TJEc*C@Ir)ggHx!y$PlA44)BKAV>J(rqhM z^j*e7>6e(YD&yEd1S`bwEX4C{BypJR$*Qw*q<+IFM6(HT9If#jSUCo1Y(^Hx%7?7W zPEOF3`IyUzNaO{`;AFUXA(*Ww<}|G5bZp{G)UZv)vLCNuyRJL*Mwh_ERe9l7w6IL*zl>I2@0&L?Y2yh{qco|x`2pwE3PZm`vUM-pSa>ZrRZm&?hQO50C z6<0~JL#GF_FUmfKE;6gfSLTQt?3HcfP=QxaS{9h99R>5&^QyW(DX z<0@8sMAF<#757V>dqp@0^=~>Z7u}VL7RygP(6T?rBI|Opr|ds+Z<<(6d;ZQWQZ#Mn zNw>!tI&s0%5RypmpG4k`q4eCFB*R|MlwCVb@_c_uk{tSP@B3E9&>5KgUtsZnMY8{! ISaREc1J+jEBme*a diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Tag$1.class b/core/out/production/classes/org/pivxj/wallet/Protos$Tag$1.class index 14b4c0c2430ff2ba530a73989976a3e069ec9449..cbd47af72de9d0ecdd80565480b41620c5fe555b 100644 GIT binary patch delta 28 hcmbQpHIZwBI17`F_+&{IMG(bYWuHhy;ysCl25- z(V$34Ob}Nn4v8CAuEc>=m6e(p6B0KX6J;TuLTOj`-2Z<6f6lpM(Xr^PWGHN`RTLep zXdoIU--asMpQoFP8;%zgHz|q+4DsIHlLG^Cq*0-Tk~^AuN{CC^2BlU5E#x)3>6|H| z-I~6}RGqIU}zJRp%KDZ zM7JHg1T@j2qgg;ZS)F{8Qqr?7(_x!7Y?<4I8lubl42VsB%}N->xeX?uL!n!cr?Zu?-|_ham2OD(r*? z>|%E}O_jz(JiyK4OT^BCIuIg67K} z2sl8eeO|ih-s{FeUgkV6GsKe*^C%bCd69cx0vRvUvU|jdBaB>S6d_xSlfyC+#ra^ESc_VyWZnt$~nSa60Nk0|LqV#UWyKVkYQ)6bZG&h!hW z9TfEK6z~;K)-K>{n)NaKhT(aJ-!c52;SUTitilaaml0DO|B>TAar`3PkhTfxcN&!~ z^hFA;mu`PJT@Hmj)b9_is{SnZ)t}`&a)$F!LYCLuIZn=TflP>vVu1{2q47Z0{cT;f rkrd1V$AZ~}@m!h8mF7?uI2g)=wXH9aT6bT4>={VarqqBVT&4ODqS&E)ZC8biS(G(Ryjb>p;4}}$mSy9nS zrJYEVL<4D~2SHjW=%JThvakrDmsFC#m!k5e&CcjJ^K{Pr-{1c%_jX6RBg2YbS6&ec zrNf*CB0=(G6w}6(^pPfgV_J4uD5L>>Q*-m)wl+0fUQS~XEA?Y@v^GrG)#*V&`yxBKCC#JjDEA(Bl#A*G~8CRD#ENnod}P$5}c7HarP= zcnW-Y8jA1?gzzj>;5k@@=V1+ApjJnx0Wb3sS0Ed^xNA4fIxZ@B12VCPrCzY(O;E58 z{CEqBu^-BCfZc<1J1=U)A$Hzj^d6%Rc)5pU%)jo(5s>f^OV7ZB&v}i<;KC=o%2Oz0 zEzDXazM$9nLlVBCeI7SmbFO#dC@=GdmwC&RkMSt)*!iA&e*hK7>6i189X~NL!N?>R zpW@=5LB?rt;1?Qj9kt+Be*SNK{hi%ESpLah%9gk9n&)TJ*y>=%aheeLZ)F4!!Cy13@Z$K8CDtg&BJBN27@T%-z@^O zCQl=OFIHCYViiB}U~NpP4i?11!QkM3 D{tN9d diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Tag.class b/core/out/production/classes/org/pivxj/wallet/Protos$Tag.class index b35d6404f5020e7971544d9db50de6b4260353be..4b31e6059bb14ea8039271d60e1be813e6f2e69a 100644 GIT binary patch delta 825 zcmYk2Ye>^!6vm&u<(9+TCZ(ylHeGJcxt4~_-eZAimY43-m(Wz~CS5F|qDaC@&7#Zs zV00rWDIp|UNI?)p(M2ky`eH>|bfKuebfKcl`BS4lJL zRInp8k=I%reB3tCl+S&(1(wO7TobB&JWZwX411*|Y-IPJe93MzyK#ApRhrH#uohr+w?cI>hIXEe}T!2qh!Ge8iA7pbdm{YNuisD;Q|fE73trW zem}*6-;aBsD2}hWCRoV<3nj=Y4*ubqq9~mU+_Mw~*p=bpE_a!ea^==M#L*-;C?AOw zMk*B`ou^M3CvQQz=H#Oe9m8U=`exzFg5lSvFnKVqTt6Y^5bIQw>H^ zE%#(J_^DoIm&)uiB+v?(TL~vMz(uQM{b~eg4T98&JX*))p5_$VDEKDWXfwvp7J0>1 zWYacjH}PxFu^=@|dxvb>g?MTaq*Y$gh74*)4($!PM)Pc~75pJyrum)a_#@(k_%qx)@EQ*Pv@?WNf^)##62 z+1S|B(&Ehtha-InL!(qUKeFAv%M^=b8iVs>!DF(*K?!hjvSZx@q|j(7kCU=+ZgmtX zc=)x$ui#^gQ&-R;B~HI-D{}t}PN7)j(L{tP5&4u1kQ+MrP(brAgQ_r-YA}l$Fq@iC zO3j!{8&O7^QBGS>NxM-+hfqt5#dI7?s1r-+1nQ^@3+N0M(pl6~FBZ{&__xHrk7dN4 zQywX-;Onj|3z{ejtL2m?{^^3kCeC+PDr{qy$Hm?5GADM*t-B~1yD0{HDIWXDjsuj6 zgRxK`)tcj>e;p`#jA- z^h@sr>Afh=a7p?ulM@5v!W9{Rl|r~i8U`sBH@MupJqbe+zb&tRhbG~kY%xq3cp&ye z{@`ub@I>sVGVPiCz;lVbkS$)42d^j-uO;?|rr|9W;vJRXJx9`N6+ZIV^a_P9T%Rt7 zf8~?u^$I@@`zn>LxY}2*bTfAwDw@9;$|fp>*ZZ@S9xs&u5BW8v+xfd+GHxyp2za?I z;8%JY4+dr^-N$2sy3zw&7%VjF8d>x#-W#k|i02n#2n=V$v6hiOLYx25QzP_mE`hxv zuaPSYO*ddqXq5qIRIWNIVy?g%Y5D#cpO1gs@XK_0~wOeK3kn7gzM FzX9DY36KB) delta 28 hcmX@eb&zX=I}4L$@MKRGM<&gP$vrI5Al^%s2mpKd2#5dx diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Transaction$Builder.class b/core/out/production/classes/org/pivxj/wallet/Protos$Transaction$Builder.class index af3f6a0dfb1b1e734f895251a51941f34c175ae4..f4b238f6c470d27b2fcc565c70b06c716fe55f58 100644 GIT binary patch delta 3833 zcmY*bd3;pW6+ZU~1Ses#&dWw7B!nyw=G^z*eUJb~3;`lbKvENtK*A6RDoX@Hgai@- zC|eeCe_9X~QH!Xhp!vCgxC5e6S46B zoyLKk#@=L04C(4?Rfk78QVNQgIcwJJ#fvj6N9m3cpNc%a^onDKl6pcxewebPEvQCc zQ;?}2E0|y?yYtFTx@KgYzW2%n!qt%@uXBcUQ!ZsuLw~!?`|UQrd%HH2@A;9phqa?*8@;|J7-(trr$n2uB|+Oz4GVf`*1P zQKN!F>BXahg+qSRqZ{JjKDwi+!FQ#zM-(dX~MVO zQL<)O;4Jl!%P3slMKRWJinT^iqCJR`>|E;SBvY1iD+Qb*TKpqQu9OOxmCqteFc{bz>`4GsjfV>Fuae;GG68MkyPo8E5exY80 z|4}#-MX?|s8&&@b2fd% z1L;d1L}xgc{>y_!4-N<~OA%?ZEz;Q$*{pNvkWfK*OU&^p9lNs zic*ihuT*(?3@RQ=5nN2sJg)0h>3E}wOVGh2isZ?NT|)^x1)cnk2Jp3%%Vi|_I&?FY zM)LJk#1%A=r&AfvplMu1)jX5tbC4EsH8t>TYT-H5#x=B+=h6dwBkkpRbbuGoOT3WY z;9B|%-%OwKVsui6PU=NC-y&w2ybN75h(X*a@_B_Q;+0}DH;bvfN>p=;xPjM*T3#y} z`8KhU*NZ!NgV@HK!~@(a_HdhcoIAt;-Ykx=7Vq)x;uF3@e8F498Qv;>ixv((AY(Y^cvJ;(>Cix1H=e3%aM%k&B#p||)I`jB6xzw&Ez zijSi2*U|UenBY4iijRq=zWlDp;N!yP6JiLzkKR8J2e@d z%E2^82B=m_S|lBPrec4l97cv5fmByfoGhdic?G4)0?L+G(jdev#D>Yy`mN~?7;=iP zpE1Ue75cdu~Kgv%(}x=wp*{d(M-LXTC6P!;*CAX>`S&(10LTQ?$f6ONgOyL17?TMMbb zRZ9b{MWn1H+IMq*T~-q`tp?Bj19@ya8D@AxkTz zTWyqMb&zd!>LqiV{nl1c?gV8UD0hQ$4=CF~*+GtVzdpODzjkk^GOdR}djzyUQlhn+ z`dND@*Lqa9E>6@3yWyt*?*qIa@Y8^wp~2R3y6=+ydisrJrga$b%YcvIkXKRaQFQaV zeq_lYefCClaSZUgt8K#{IVn0f^Gbqy@Kx}7{va|JyTPEo*7fkTl z0gA90&o>F!)c>ud#!2T1j;;6=Hs!tfYR(*3fPM<>vewn7C?A# z+smPDgn9*vUP(E2Gud{FE?d;>x7UNR0hEoPw1UzGN;@c<$+0!&yxO$y1Z5j2cj2*r zH}$i(Q?9)OGhSxey8t}|2-mj#2%z0G*xrNr0(t__lYpK=;{7P?04jeLvu!o)gMbc^ z*FFr@%TT>SS@vs~YmI5Y1?X+4-XYUIMk)4j8epHmOv?=WW6U#E7cMRI*q?#*IgI)O zM!~mlu{{HK|8>dTqCjqm($Lpk!*YQ(|lS(;GnyzT{>#@sn3@11AL)f^C4QHr6-RRSAbuSCG zu{>xxCDg;2L=nz46y@Og?Udpb>34eh@+GEI38)HC5YQ}2cB(1WnT-azFTH4;+u(Se zn?YFw3NBHnPA^-+&(cS8OkC`)Qng z0B0}uIxphfmmoX{;UWF)%5jGCj^4YvpRQ=i^EiJ6`VjZK46~?159<_uLR2@!TN@=QI*Q^P8)e3}HQmksCc-0K6eEO?3uA$mO zc8yw_=TTd5;#RP>p$Naee{H#6?L_E73Rk-zd>A<&LG!yQTkS#fdtq6kwr&lY>S@pp zz_w>#+jFq(1=#kYe&|-%b`;Q`VcY9az5(0bgz|0Jb_}*1hixZd+xxJs-c%<+Jq61? zMYo@$_)aH}x$N61JJza|;TpLV9rt4CQJA~5RJj!r~>C_DyliabO6oYa# zMY-cB&YeJs?nFvdbra8S5kso1@%lybA$TYjkCS(e1sPu=|W0!YxR+h zQ%$!KY?$vhf!z%DDzIDh&`l*q;G`be?$dW|$~?b}*B_i;Hnpef^wzBI==j#*7kPKL zUgCXte%aLCPiM3ZxJamKyFl>iyDu)|^@ryPm$hF=bVWD4seSZC)d%gDR0$pDmmQbR t?7R>`nQvTNn!3;CP;E`^X}WxK#>GUPn?vgTn~M>P;CuH4Qj@qf;YFVg@3 delta 3830 zcmY*bd0bW18eRK{kr%vxcn_l&1Y}V6J`;#IMS!NLXp)ekh=8J|p&*VZIHsb4d@p|u z=9~?$(!wmu%FId|)yR6KR;Kk{X=cOg_g-r6^E&kU=ia@)wbnPDv-jDzL)*7Q+ZAOA zrzP4d4+u6*Qy_4BS=of@>IBQNsHx9ckw&xnwrWl~4e6KR@ANcnfeN~_Um`u%Z;0k( zG~c$Gb!@z;OSNdjZB@dipv=2z^=%zv{zTILO6+lUyUgcof9C!Esp(hui>~hz=!@ib zwDa~1|5RVl>g)Ch3K|kf=ToAt{=0ksf8Y$N%o-z1dM_*d7W--~={`+xcB!zaI=eK> z`AdOmKF*)nrTzs?P5bLMHQ3UZl$rxJBk8K;DI5IT9XOfJk{a zH4eW+lcQTc9X?vr$zrsX<2c_EhQ}jXmLf@(LCJDt$O-5tCvrj+>~RuC$;l{@Q&1uA zL5-Y-T3LxDaynMY8F)ZeW0S1G4mk_Y$=TQ|=ip5_7w^e=I4)~(N-o5AvJMwzJub^d z!cQ(1Zn;zh>2kS#~nerLr$X(ps zXHg)ZLy_E#a``-_$vvo&FJivji^cLKtd%e0LAejx<*V2w_hX+tfH&kD_)s3iXYx&) zm2Yz)hq;h$@~Fs>$HZ{iDn`kVMY%jKCd*I7bomcaD?b+v z@}yWVPl<=+mtwp8O6-)U#q;uv*eB15L-JekiTsy1Ex!~0l;^}nd0zY`e-OXR3lvh= z zq%y<`)l1y3`iLzmQ#`G17kgEfcwJ?SBdWh>RRhFnHBfw`a>Y+-u(+azXt$`Lnnw-O zBGhm#NsZ9Dsk<~=jnsOp!UQc#-K`B)qqPyLNGnofwNh2A-K)lFvs8&TPnBv*R9VZW zqFY6-s(`&KYxtRbsH%NFuL-Q)s5lqR9HGtGkVgN(gD93o5s*%Wh|UT7t01{MwKskUODS( znY4gO3z<|$RL;7UY+A*p1~#px-^$0jjb=`dIJLha(O6HV6AE0$Ciokh5oBzojdhV^ zPP>)POz7t_o?!En2r-@__jE7iPRw!{Eo|BikFkeqN~TvQ7J7|W+4LHR+0SR`0fZTE zAl^8LuEtwPH4c$yMm!Z%lYQ>f0sEC zZOsbYYEGmbvt#J%X(^g{Fa0<>f|Bkn*3D`r&P1F!2Z`of80I{rnzgiG&M^A!-XU&t zF#^pce7`Macsb=%7P!ntRy1+M=9@ErtFoWVe2~o#A;jFkGcR$O+jzU3Q{CZ9b@TK> zulWp{c5;ooxI@n&%xvKf?M7E~4~Kk_=edQ(<6n8kb9M6)LzfxibKCrbzXk-P)rRLgSGQd7w*nAg1tQdPBhm^+yw!nc zyGFOd8H#}0ibRAJ#i~yH4H3h0twij5)!S+Fsvy^wWjhcH@dAEoMIK{P>mF;hQ`!->5jQ6npN+65E|whn$T*44^GbDVE63c1KbX%>QiE$jn}@7 zx0wjAZ)ZU^!tETy*aMJk4@9axh^+egy3OyM&F`IEz)|l;oIRSq8;j^b{gy;~0z(rK zVOOwf5)$mmthxso_B3SL{5fgQz(~7_rr#GqTNf4Ub}iEvz-=#t$F4^wdofb%C3N|| z7)o2*$7QeKwAOMRjWmDpP?ycGnf(w~yTSK-oLf9J(&p3FeiH5Nrx0R4%}$GLCANWN7wYE_Hxrzvesg+b_-0Z61%!~^3b`ZX_|f7*RJek+^%yR@jSCGa1vhHwye-=|Cdd_bIUHV@Cy6<12K+3veO2s zjvu!yf~@7Gx)TI{Cm2Ca2y`bDagGPd(dmihTN0gEhB_m{iDP9v5}X89CL+U0MyAsh zgPiUd=}2zdY~4v`YEQVG40xR0=;ZW8iqnrnvk`%bB@?6JE)o zR&mm+IlHwKv#KG|d6+31nDPjR+=!0OW-ee0qMU7XaMgU>*#$r6S%zB>?(Amu^XTmC zp^*&}+|KK4KEO`jK%{e!4mFI@og>WV<~tuTyOr4=Gy6EDug=qCI%PI`Xv6BnYs)bD z{MxdvF^1yS@OODS4PMjx2JewIH+d(nE$bR%DPe7w8-$Xz*9jhaJ z?^SwTWB(hf&l_*5!kexwn{LKzzHZ?(KfJNjsr@=%Zgq{Fsc>Dw4M)xEeCn6h<*=o> Nxhwy+bZ-t8{{!E~EaCtF diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Transaction$Pool$1.class b/core/out/production/classes/org/pivxj/wallet/Protos$Transaction$Pool$1.class index 70b91c35357e5ab289e9087462fbe9aea4748250..f78c2187fa731560bf94421aa5e064f7aa57ae32 100644 GIT binary patch delta 28 icmcc0ag}330W*{K^vOlc)=b(nC$DFA1M$8y#{mG4MG55q delta 28 icmcc0ag}330W*{4>&ZpT)=ZjjC$DFA1M$8y#{mGF#|qm3 diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Transaction$Pool.class b/core/out/production/classes/org/pivxj/wallet/Protos$Transaction$Pool.class index ae81f2b554d25082dc15c1d576bffe61083da29b..5a985436a4f8994cf0eb01cf6ea300260e9460b2 100644 GIT binary patch delta 164 zcmWl~JqrPG90%}k|H0s%QdZYxuzX`QxRB)rqR1do27|%7P&g0MuhdNjN*R#J@d9p< zSK=*@e3nn(1kUBDDW>G5<^Fv&S8*b)zPC9=n=^DcM~^-RTwus0MqFXcwS4rNqDa*! zD{f_J6cl$78J^-nEVB~l32~m06E>r*j delta 164 zcmWl~zY0NN90uUGPo2Rz=Q}C0WP88j0-Pj^fed7jD1*UZIjhlz&2M6q3$VHZi>%6j zlakF~5XrMVllUaQSlfz$Z0yv(uk9;t#dqd0?oj0(H6GC55iOq3<{2Gc(B)M=PEqkD z1vjhsl#!cOe96kqE560kxv)_Pn-HSLlDaNy67;JP* z860%X7+iGB89a0>Chz3+V$!jj%*toaq~kT&jn9fn$8T~IpBs}-(BxBmj$AsC3|u-< z3?e$QlSTOh`E-&Q*mP1DxOGw)1a;Cjm+&(&s%c+f;McyvAgBF+L09_)gN^nZ25;>T Z3{l!Y7;?0aGtAdB*~j^gz@t9&0A8#>wKm4N6)q3_4n^3I1)3^rPw z3=Udd3@%#T3?5oNlXvoZF=hLu_?C(jWG0stGHEgAp- diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Transaction.class b/core/out/production/classes/org/pivxj/wallet/Protos$Transaction.class index 11ab3df1df53e4407692a60f76ae61e0a949d8b0..eb49459ab05483cb41325e2c3c25e74ba392010a 100644 GIT binary patch delta 2427 zcmY*aX;f9$72fAuc%VTf3_&!Eu>zZSHjm+f546fWqYxQnkU@#YsS2rCVhXMx#z-8G znlz>>(bPl}v^Fo4v_@TRLaSEAm>69)U=nRw1;ix8F0I<0dr^j8`D| z@0?(Vi+xQ~EfxmZGB5fG*%|C64~-ckH~EG*MO!S93_@kz#3^1Gp&1NZs^-tHsjHhD z5gnmB3w1~O`ei#sN9ugdAP@ABGegG7kNx81>;9f>us<_2b7a3&&!-vrW&R>6MyJEm zV@K1eqp3}&%|mBd&`T~Li);Ld308}&2-xOiHP)V_zSp)D;UF-Y#i1xZ+wpV;wlz^t63Pi&MWalz69I&N^IvZ;zzt0kMI`!m`gm$_u(;q7?1Nm;Gg+X{0sjK zKjjy(gI~rIybDkA9z4Yd@U*7k8O<5bYVO#nO~TK#U_7rOUeGM~r8W&OYKeGBOTm9= z>G-XdhgY>S{HIof<=<&5@ZZ`RysoXs9&H=;YH#38Z6Ee)2k@5GieG7muuE&hZmk`! zXh-pD?SvZexf;-|2K)=Z(|%C>_wl-eGxj)mV6TH8-gF4Yeh0$u?Ym~~VjKq~C5Dg1 zJK%(OK~=dhF^-3gm2W5Ja`P(rV`3^duhm}(nVS^F%`eNQB&BRIlx|&lQ+gyTrPWZD zCtJDsk1{YTKz1Zg;pR_tb$f~u&lzG-iV`my(d{WA+D+uvW~C-` z^KH2;RV{E|ev_KQg~^B|q#+mM47ffmoC^=xo|epokBa)sC)1S@V8Es6Q@98>atC!a zPIjlOT#8{PWhir&VXn(iW`S(WNaLbZKFG-DVv(_BZKlf9s*Hy`m>I&w3kJNAY2~6> z1yZ?aF_agwV!3!tuFnpT7qV2#UPE=uRxN|qk&~?ge^PiJKd(Ocaab4Lrl-&a!q8BEJ zKJXPcVY29lFmVea#rI$nKfp}!BczD|$Q3`q9C2Ij%DvJk?x@zgs`bC%F7B(T55Q0S z4+4lmFmW)G21Jf9l}wOCPLNK{kg51=dJIa)1!`yn#cn-kSA;; zZ`ei?U^n@|TQm{&k}teVesBu_5FEe)0n9!ytD7~_Q{YIGVLbf|CQvX0Q3!+)f|bG` zfdu3bK_OY7nj&BcML|79!zNWF#i*gN(5C7UvcV~egDzFC(lqF&>2QZ;Fh`on+$oU- zQWA?*bvmW6EJ|esl+NZ;23tm1O#3Be+vnsj;Egm}Es_T=^fb8A9JNdV_)#G|Ma3X! zE<{m@x`{GKq;ho=^VBU=LK#)5#j0T;Er2?zQ8(}mG|(co;Ipuk7OMpp!G2l_?X(Pz z({ebi@OfGZUr?=Dv<|M*b8uVXd$fv`0zJ=MX*HWj^=jiaYzqB~MN$K^Q6o#B7g-WD zv3y#`im90`Qg}JN#A;~+TT2_+W@=$O=@s@mZD#vv3u~pV>_ghlj*(=a&r#*6aVJ@e4Wlv!dr}t%Ykz&7>JBk!*lYKfnBBvKCc3d%k*;X9RsY5BDa{OH4 zbV|;ct1{>07QK8fugneM^o1N#@^emK%8ZhDPM3@~{?{epChAh(nr?ZvWH!f08BnUe zB#|<&%u}u`4Soa<4a1&C&|8L;O&$z9Z1IqL%1~F%lvV2`qTFER<#{?wsPvHyRVLY4 zu0C0V)O{X3f~CVy54|^UDAYIXG*+18w2C38v0|uQcg~J)~YxYM!Gq(lX7ddmn=tmB delta 2428 zcmZ8iX>?W972fCEj0j20Knx)xDLLo8{gRiw47@-f^LsB7CM5$I$be~FGAs%0vVx1W zBB={XG;GC%TD4$=&=8Pk1T90WqA4vz0~An6u&|02SlBYOR@9z*14-zw{q67j_Br3( z@7;CZ7+`M0&UsY4PHg zl`G?tY_oKwRaYn?ve?^Z*Zb9@eM}f-i79j-a(0MSr^lvJlE%*~l!X(OWL^UIvsPVDXdrwKz+jV1iSxq7IP=eKO_QdnjsUf<{JH?2(@{YCIJH?1uWb|8OlKwwl zvc86Nr3wm&4KGX5+wl~(d)idPJg%nPqox=e9artTYQJ-`r@JRM#V^2m&x9?>ebu_b z)62M}e8NxRL+4Fi?!9SF9w>edo>&Bva4YzWjSwn2X|nxMKk*EBDB4%i3e$Rf9v4I( z+XWXd(0}c-xp;+GL6EyJqs^mTY@1+y9Rfu+1dHtuCVF7H*a

Instances of this class are not safe for use by multiple threads.

*/ public class TransactionInput extends ChildMessage { + + private final static Logger logger = LoggerFactory.getLogger(TransactionInput.class); + /** Magic sequence number that indicates there is no sequence number. */ public static final long NO_SEQUENCE = 0xFFFFFFFFL; private static final byte[] EMPTY_ARRAY = new byte[0]; @@ -172,8 +180,7 @@ public boolean isCoinBase() { */ public boolean isZcspend() { try { - CoinDenomination.fromValue((int) sequence); - return true; + return getScriptSig().isZcSpend(); }catch (Exception e){ // Nothing.. } @@ -319,8 +326,16 @@ public enum ConnectionResult { @Nullable TransactionOutput getConnectedOutput(Map transactions) { Transaction tx = transactions.get(outpoint.getHash()); - if (tx == null) - return null; + if (tx == null){ + if (outpoint.getPrivateHash() != null){ + tx = transactions.get(outpoint.getPrivateHash()); + } + if (tx == null && outpoint.fromTx != null){ + tx = transactions.get(outpoint.fromTx.getHash());; + } + if (tx == null) return null; + return tx.getOutputs().get((int) outpoint.getPrivateIndex()); + } return tx.getOutputs().get((int) outpoint.getIndex()); } @@ -348,12 +363,32 @@ public enum ConnectMode { * @param mode Whether to abort if there's a pre-existing connection or not. * @return NO_SUCH_TX if the prevtx wasn't found, ALREADY_SPENT if there was a conflict, SUCCESS if not. */ - public ConnectionResult connect(Map transactions, ConnectMode mode) { + public ConnectionResult connect(Wallet wallet, Map transactions, ConnectMode mode) { Transaction tx = transactions.get(outpoint.getHash()); if (tx == null) { + // if the input is a zc_spend then the way of connect the input is different + if (isZcspend()){ + CoinSpend coinSpend = getScriptSig().getCoinSpend(params, Context.zerocoinContext); + ZCoin zCoin = wallet.getActiveKeyChain().getZcoinsAssociatedToSerial(coinSpend.getCoinSerialNumber()); + if (zCoin != null){ + // now i can get the tx that minted this value + for (Transaction transaction : transactions.values()) { + for (TransactionOutput output : transaction.getOutputs()) { + if (output.isZcMint() && output.getScriptPubKey().getCommitmentValue().equals(zCoin.getCommitment().getCommitmentValue())){ + tx = transaction; + break; + } + } + if (tx != null) break; + } + } + if (tx != null){ + return connect(tx, zCoin ,mode); + } + } return TransactionInput.ConnectionResult.NO_SUCH_TX; } - return connect(tx, mode); + return connect(tx, null, mode); } /** @@ -365,11 +400,26 @@ public ConnectionResult connect(Map transactions, Conne * @param mode Whether to abort if there's a pre-existing connection or not. * @return NO_SUCH_TX if transaction is not the prevtx, ALREADY_SPENT if there was a conflict, SUCCESS if not. */ - public ConnectionResult connect(Transaction transaction, ConnectMode mode) { - if (!transaction.getHash().equals(outpoint.getHash())) - return ConnectionResult.NO_SUCH_TX; - checkElementIndex((int) outpoint.getIndex(), transaction.getOutputs().size(), "Corrupt transaction"); - TransactionOutput out = transaction.getOutput((int) outpoint.getIndex()); + public ConnectionResult connect(Transaction transaction, ZCoin zCoin ,ConnectMode mode) { + TransactionOutput out = null; + long privateIndex = -1; + if (outpoint.getHash().equals(Sha256Hash.ZERO_HASH)){ + // This is a zc_spend + logger.info("Connecting zc_spend.."); + for (TransactionOutput output : transaction.getOutputs()) { + if (output.isZcMint() && output.getScriptPubKey().getCommitmentValue().equals(zCoin.getCommitment().getCommitmentValue())){ + out = output; + break; + } + } + if (out == null) return ConnectionResult.NO_SUCH_TX; + privateIndex = out.getIndex(); + }else { + if (!transaction.getHash().equals(outpoint.getHash())) + return ConnectionResult.NO_SUCH_TX; + checkElementIndex((int) outpoint.getIndex(), transaction.getOutputs().size(), "Corrupt transaction"); + out = transaction.getOutput((int) outpoint.getIndex()); + } if (!out.isAvailableForSpending()) { if (getParentTransaction().equals(outpoint.fromTx)) { // Already connected. @@ -381,7 +431,11 @@ public ConnectionResult connect(Transaction transaction, ConnectMode mode) { return TransactionInput.ConnectionResult.ALREADY_SPENT; } } - connect(out); + if (privateIndex == -1){ + connect(out); + }else { + connect(out, privateIndex, transaction.getHash()); + } return TransactionInput.ConnectionResult.SUCCESS; } @@ -392,6 +446,12 @@ public void connect(TransactionOutput out) { value = out.getValue(); } + public void connect(TransactionOutput out, long privateIndex, Sha256Hash privateParentHash){ + connect(out); + outpoint.setPrivateIndex(privateIndex); + outpoint.setPrivateHash(privateParentHash); + } + /** * If this input is connected, check the output is connected back to this input and release it if so, making * it spendable once again. @@ -519,7 +579,7 @@ public String toString() { s.append(": COINBASE"); } else { if (isZcspend()){ - s.append(" for [").append(outpoint).append("]: ").append(getScriptSig()); + s.append(" for [").append(outpoint.toPrivateString()).append("]: ").append(getScriptSig()); String flags = hasSequence() ? "sequence: " + sequence : null; if (flags != null) diff --git a/core/src/main/java/org/pivxj/core/TransactionOutPoint.java b/core/src/main/java/org/pivxj/core/TransactionOutPoint.java index 3912232ff..96df6ec4f 100644 --- a/core/src/main/java/org/pivxj/core/TransactionOutPoint.java +++ b/core/src/main/java/org/pivxj/core/TransactionOutPoint.java @@ -46,6 +46,10 @@ public class TransactionOutPoint extends ChildMessage { // The connected output. private TransactionOutput connectedOutput; + // Private data + private long privateIndex = -1; + private Sha256Hash privateHash; + public TransactionOutPoint(NetworkParameters params, long index, @Nullable Transaction fromTx) { super(params); this.index = index; @@ -111,7 +115,10 @@ protected void bitcoinSerializeToStream(OutputStream stream) throws IOException @Nullable public TransactionOutput getConnectedOutput() { if (fromTx != null) { - return fromTx.getOutputs().get((int) index); + if (index < 50) // random index value + return fromTx.getOutputs().get((int) index); + else // Then this is a zc_spend + return fromTx.getOutputs().get((int) privateIndex); } else if (connectedOutput != null) { return connectedOutput; } @@ -183,6 +190,10 @@ public String toString() { return hash + ":" + index; } + public String toPrivateString() { + return hash + ":" + index + " , Private("+privateHash+":"+privateIndex+")"; + } + public String toStringCpp() { return "COutPoint("+ hash.toString() + ", "+ index +")"; @@ -213,6 +224,22 @@ public void setIndex(long index) { this.index = index; } + public void setPrivateIndex(long index){ + this.privateIndex = index; + } + + public void setPrivateHash(Sha256Hash hash){ + this.privateHash = hash; + } + + public long getPrivateIndex() { + return privateIndex; + } + + public Sha256Hash getPrivateHash() { + return privateHash; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -225,4 +252,8 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hashCode(getIndex(), getHash()); } + + public void setParentHash(Sha256Hash parentHash) { + this.hash = parentHash; + } } diff --git a/core/src/main/java/org/pivxj/core/TransactionOutput.java b/core/src/main/java/org/pivxj/core/TransactionOutput.java index 290d085bf..63d2327ac 100644 --- a/core/src/main/java/org/pivxj/core/TransactionOutput.java +++ b/core/src/main/java/org/pivxj/core/TransactionOutput.java @@ -325,9 +325,10 @@ public boolean isMine(TransactionBag transactionBag) { return transactionBag.isPubKeyMine(pubkey); }else if (script.isPayToScriptHash()) { return transactionBag.isPayToScriptHashMine(script.getPubKeyHash()); - } else if (script.isZcMint() || script.isZcSpend()){ - // TODO: Check if this method is right or i should create a new one.. - return transactionBag.isZcOutputMine(script); + } else if (script.isZcMint()){ + return transactionBag.isZcScriptMine(script); + } else if (script.isZcSpend()){ + return transactionBag.isZcScriptMine(script); } else { byte[] pubkeyHash = script.getPubKeyHash(); return transactionBag.isPubKeyHashMine(pubkeyHash); diff --git a/core/src/main/java/org/pivxj/core/VarInt.java b/core/src/main/java/org/pivxj/core/VarInt.java index 14e0f0cea..21f5ce8a5 100644 --- a/core/src/main/java/org/pivxj/core/VarInt.java +++ b/core/src/main/java/org/pivxj/core/VarInt.java @@ -53,7 +53,6 @@ public VarInt(byte[] buf, int offset) { } else { value = Utils.readInt64(buf, offset + 1); originallyEncodedSize = 9; // 1 marker + 8 data bytes (64 bits) - System.out.println("REading varInt 64 bits"); } } diff --git a/core/src/main/java/org/pivxj/script/Script.java b/core/src/main/java/org/pivxj/script/Script.java index 7658e93a8..06f97eed9 100644 --- a/core/src/main/java/org/pivxj/script/Script.java +++ b/core/src/main/java/org/pivxj/script/Script.java @@ -18,12 +18,15 @@ package org.pivxj.script; +import com.zerocoinj.core.CoinSpend; +import com.zerocoinj.core.context.ZerocoinContext; import org.pivxj.core.*; import org.pivxj.crypto.TransactionSignature; import com.google.common.collect.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.spongycastle.crypto.digests.RIPEMD160Digest; +import org.spongycastle.util.encoders.Hex; import javax.annotation.Nullable; import java.io.ByteArrayInputStream; @@ -177,7 +180,7 @@ public List getChunks() { * Bitcoin Core does something similar.

*/ private void parse(byte[] program) throws ScriptException { - chunks = new ArrayList(5); // Common size. + chunks = new ArrayList<>(5); // Common size. ByteArrayInputStream bis = new ByteArrayInputStream(program); int initialSize = bis.available(); while (bis.available() > 0) { @@ -220,12 +223,6 @@ private void parse(byte[] program) throws ScriptException { if (c.equals(chunk)) chunk = c; } chunks.add(chunk); - - if (opcode == OP_ZEROCOINSPEND) { - //Zerocoinspend has no further op codes. - - break; - } } } @@ -315,12 +312,28 @@ public byte[] getPubKey() throws ScriptException { * */ public BigInteger getCommitmentValue() { + if (!isZcMint()){ + throw new ScriptException("Script is not a zc_mint"); + } if (chunks.size() != 3) { throw new ScriptException("Script not of right size, expecting 2 but got " + chunks.size()); } return Utils.unserializeBiginteger(chunks.get(2).data); } + public CoinSpend getCoinSpend(NetworkParameters params, ZerocoinContext zerocoinContext) { + if (!isZcSpend()) throw new ScriptException("Script is not a zc_spend"); + byte[] coinSpendBytes = getChunks().get(0).data; + if (coinSpendBytes == null) throw new ScriptException("Invalid zc_spend script"); + // now read the length + int size = coinSpendBytes.length - 3; + byte[] coinSpend = new byte[size]; + System.arraycopy(coinSpendBytes,3, coinSpend, 0, size); + //System.out.println(Hex.toHexString(coinSpendBytes)); + //System.out.println(Hex.toHexString(coinSpend)); + return CoinSpend.parse(params, zerocoinContext, coinSpend); + } + /** * Retrieves the sender public key from a LOCKTIMEVERIFY transaction * @return diff --git a/core/src/main/java/org/pivxj/wallet/DefaultRiskAnalysis.java b/core/src/main/java/org/pivxj/wallet/DefaultRiskAnalysis.java index 46f2e4fc1..97be6ede1 100644 --- a/core/src/main/java/org/pivxj/wallet/DefaultRiskAnalysis.java +++ b/core/src/main/java/org/pivxj/wallet/DefaultRiskAnalysis.java @@ -176,6 +176,10 @@ public static RuleViolation isOutputStandard(TransactionOutput output) { /** Checks if the given input passes some of the AreInputsStandard checks. Not complete. */ public static RuleViolation isInputStandard(TransactionInput input) { + if (input.isZcspend()){ + // TODO: add here more validations.. + return RuleViolation.NONE; + } for (ScriptChunk chunk : input.getScriptSig().getChunks()) { if (chunk.data != null && !chunk.isShortestPossiblePushData()) return RuleViolation.SHORTEST_POSSIBLE_PUSHDATA; diff --git a/core/src/main/java/org/pivxj/wallet/DeterministicKeyChain.java b/core/src/main/java/org/pivxj/wallet/DeterministicKeyChain.java index a82ab2f94..a0bb9595f 100644 --- a/core/src/main/java/org/pivxj/wallet/DeterministicKeyChain.java +++ b/core/src/main/java/org/pivxj/wallet/DeterministicKeyChain.java @@ -25,10 +25,12 @@ import com.zerocoinj.core.ZCoin; import com.zerocoinj.core.context.ZerocoinContext; import com.zerocoinj.core.exceptions.InvalidSerialException; +import com.zerocoinj.utils.ZUtils; import org.pivxj.core.*; import org.pivxj.crypto.*; import org.pivxj.script.Script; import org.pivxj.utils.Threading; +import org.pivxj.wallet.exceptions.InvalidCoinException; import org.pivxj.wallet.listeners.KeyChainEventListener; import com.google.common.base.Stopwatch; @@ -36,6 +38,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.spongycastle.crypto.params.KeyParameter; +import org.spongycastle.util.encoders.Hex; import javax.annotation.Nullable; import java.math.BigInteger; @@ -50,6 +53,7 @@ import static com.google.common.base.Preconditions.*; import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.newLinkedList; +import static org.pivxj.wallet.BasicKeyChain.serializeEncryptableItem; /** *

A deterministic key chain is a {@link KeyChain} that uses the @@ -829,7 +833,7 @@ protected List serializeMyselfToProtobuf() { // data (handling encryption along the way), and letting us patch it up with the extra data we care about. LinkedList entries = newLinkedList(); if (seed != null) { - Protos.Key.Builder mnemonicEntry = BasicKeyChain.serializeEncryptableItem(seed); + Protos.Key.Builder mnemonicEntry = serializeEncryptableItem(seed); mnemonicEntry.setType(Protos.Key.Type.DETERMINISTIC_MNEMONIC); serializeSeedEncryptableItem(seed, mnemonicEntry); entries.add(mnemonicEntry.build()); @@ -884,13 +888,19 @@ private Protos.Zpiv.Builder toProto(ZCoin zCoin) { .setHeight(zCoin.getHeight()) .setSerial(ByteString.copyFrom(Utils.serializeBigInteger(zCoin.getSerial()))) .setVersion(0); + + ECKey ecKey = zCoin.getKeyPair(); + Protos.Key.Builder protoKey = serializeEncryptableItem(ecKey); + protoKey.setPublicKey(ByteString.copyFrom(ecKey.getPubKey())); + zpiv.setKey(protoKey); + if (zCoin.getParentTxId() != null){ zpiv.setParentTxId(ByteString.copyFrom(zCoin.getParentTxId().getReversedBytes())); } return zpiv; } - private static ZCoin fromProto(Protos.Zpiv zpiv, ECKey key) { + private static ZCoin fromProto(Protos.Zpiv zpiv, @Nullable KeyCrypter keyCrypter) throws UnreadableWalletException { BigInteger content = Utils.unserializeBiginteger(zpiv.getCommitment().getContent().toByteArray()); BigInteger contentValue = Utils.unserializeBiginteger(zpiv.getCommitment().getContentValue().toByteArray()); BigInteger randomness = Utils.unserializeBiginteger(zpiv.getCommitment().getRandomness().toByteArray()); @@ -898,12 +908,37 @@ private static ZCoin fromProto(Protos.Zpiv zpiv, ECKey key) { Commitment commitment = new Commitment(content, contentValue, randomness); BigInteger serial = Utils.unserializeBiginteger(zpiv.getSerial().toByteArray()); CoinDenomination den = CoinDenomination.fromValue(zpiv.getDen()); + + // key + Protos.Key key = zpiv.getKey(); + boolean encrypted = key.getType() == Protos.Key.Type.ENCRYPTED_SCRYPT_AES; + byte[] priv = key.hasSecretBytes() ? key.getSecretBytes().toByteArray() : null; + if (!key.hasPublicKey()) + throw new UnreadableWalletException("Zpiv public key missing"); + byte[] pub = key.getPublicKey().toByteArray(); + ECKey ecKey; + if (encrypted) { + checkState(keyCrypter != null, "This wallet is encrypted but encrypt() was not called prior to deserialization"); + if (!key.hasEncryptedData()) + throw new UnreadableWalletException("Encrypted private key data missing"); + Protos.EncryptedData proto = key.getEncryptedData(); + EncryptedData e = new EncryptedData(proto.getInitialisationVector().toByteArray(), + proto.getEncryptedPrivateKey().toByteArray()); + ecKey = ECKey.fromEncrypted(e, keyCrypter, pub); + } else { + if (priv != null) + ecKey = ECKey.fromPrivateAndPrecalculatedPublic(priv, pub); + else + ecKey = ECKey.fromPublicOnly(pub); + } + ecKey.setCreationTimeSeconds(key.getCreationTimestamp() / 1000); + return new ZCoin( Context.get().zerocoinContext, serial, commitment, den, - key + ecKey ); } @@ -1092,8 +1127,8 @@ public static List fromProtobuf(List keys, @N chain.basicKeyChain.importKey(detkey); if (key.hasZpiv()){ - ZCoin associatedCoin = fromProto(key.getZpiv(), detkey); - chain.putAssociatedCoin(associatedCoin); + ZCoin associatedCoin = fromProto(key.getZpiv(), crypter); + chain.putAssociatedCoin(associatedCoin, detkey); } } } @@ -1107,9 +1142,9 @@ public static List fromProtobuf(List keys, @N return chains; } - private void putAssociatedCoin(ZCoin associatedCoin) { - if (! (associatedCoin.getKeyPair() instanceof DeterministicKey)) throw new IllegalArgumentException("Trying to add a non deterministic key"); - DeterministicKey key = (DeterministicKey) associatedCoin.getKeyPair(); + private void putAssociatedCoin(ZCoin associatedCoin, ECKey associatedKey) { + if (! (associatedKey instanceof DeterministicKey)) throw new IllegalArgumentException("Trying to add a non deterministic key"); + DeterministicKey key = (DeterministicKey) associatedKey;//associatedCoin.getKeyPair(); // Check if the key exists checkNotNull(getKeyByPath(key.getPath()),"Associated key not exists"); if (zcoins.get(key) == null) @@ -1234,7 +1269,20 @@ public BloomFilter getFilter(int size, double falsePositiveRate, long tweak) { try { checkArgument(size >= numBloomFilterEntries()); maybeLookAhead(); - return basicKeyChain.getFilter(size, falsePositiveRate, tweak); + BloomFilter zcFilter = null; + if (isZerocoinPath()) { + zcFilter = new BloomFilter(size, falsePositiveRate, tweak, BloomFilter.BloomUpdate.UPDATE_ALL); + for (ZCoin zCoin : zcoins.values()) { + // for outputs + zcFilter.insert(Utils.serializeBigInteger(zCoin.getCommitment().getCommitmentValue())); + // for inputs + zcFilter.insert(Utils.serializeBigInteger(zCoin.getSerial())); + } + } + BloomFilter filter = basicKeyChain.getFilter(size, falsePositiveRate, tweak); + if (zcFilter != null) + filter.merge(zcFilter); + return filter; } finally { lock.unlock(); } @@ -1354,7 +1402,6 @@ private List maybeLookAhead(DeterministicKey parent, int issue needed, parent.getPathAsString(), issued, lookaheadSize, lookaheadThreshold, numChildren, createZcoins); List result = new ArrayList<>(needed); - ExecutorService executor = null; final Stopwatch watch = Stopwatch.createStarted(); int nextChild = numChildren; for (int i = 0; i < needed; i++) { @@ -1364,11 +1411,8 @@ private List maybeLookAhead(DeterministicKey parent, int issue result.add(key); nextChild = key.getChildNumber().num() + 1; if (createZcoins){ - try { - generateZcoin(key); - } catch (InvalidSerialException e) { - log.info("invalid serial", e); - } + generateZcoin(key); + //log.info("Valid coin created, pubkey: " + key.getPublicKeyAsHex()); } } watch.stop(); @@ -1376,12 +1420,32 @@ private List maybeLookAhead(DeterministicKey parent, int issue return result; } - private void generateZcoin(DeterministicKey key) throws InvalidSerialException { + private void generateZcoin(DeterministicKey key){ if (zcoins.get(key) != null) return; ZerocoinContext context = Context.get().zerocoinContext; Sha256Hash trimmedRandomness = Sha256Hash.twiceOf(key.getPrivKeyBytes()); // Here the core is using a Sha512.. BigInteger randomness = HashWriter.toUint256(trimmedRandomness.getReversedBytes()).mod(context.coinCommitmentGroup.getGroupOrder()); - BigInteger serial = ZCoin.generateSerial(key); + BigInteger serial = null; + // Serial + boolean isValid = false; + ECKey usedKey = key; + byte[] serialSeed = usedKey.getPrivKeyBytes(); + final Stopwatch watch = Stopwatch.createStarted(); + do { + try { + serial = ZCoin.generateSerial(usedKey); + isValid = true; + }catch (Exception e){ + // swallow.. + log.info("invalid serial creation, loop"); + // TODO: Remember to remove this serialSeed from memory.. + serialSeed = Sha256Hash.twiceOf(serialSeed).getReversedBytes(); + usedKey = ECKey.fromPrivate(serialSeed); + } + } while (!isValid); + watch.stop(); + log.info("Serial creation, took {}", watch); + Commitment commitment = new Commitment(serial, randomness, context.coinCommitmentGroup); BigInteger attempts = BigInteger.ZERO; @@ -1399,14 +1463,27 @@ private void generateZcoin(DeterministicKey key) throws InvalidSerialException { commitment = new Commitment(serial, randomness, context.coinCommitmentGroup); } - putAssociatedCoin( - ZCoin.mintCoinH( - Context.get().zerocoinContext, - key, - CoinDenomination.ZQ_ERROR, - commitment - ) + usedKey = ECKey.fromPrivate(usedKey.getPrivKeyBytes()); + ZCoin zCoin = ZCoin.mintCoinUnchecked( + Context.get().zerocoinContext, + usedKey, + CoinDenomination.ZQ_ERROR, + commitment ); + + if (!zCoin.validate()){ + throw new InvalidCoinException("Invalid zcoin"); + } + + // Double check + byte[] hashedPubKeyBites = Sha256Hash.twiceOf(zCoin.getKeyPair().getPubKey()).getReversedBytes(); + BigInteger hashedPubKey = (new BigInteger(1, hashedPubKeyBites)).shiftRight(ZCoin.V2_BITSHIFT); + BigInteger adjustedSerial = ZCoin.getAdjustedSerial(zCoin.getSerial()); + if (!ZUtils.equals(hashedPubKey, adjustedSerial)) { + throw new InvalidCoinException("Invalid zcoin, public key is not equals to the public key that generated the serial"); + } + + putAssociatedCoin(zCoin, key); } /** Housekeeping call to call when lookahead might be needed. Normally called automatically by KeychainGroup. */ @@ -1546,6 +1623,15 @@ public ZCoin getZcoinsAssociated(DeterministicKey key) { return zcoins.get(key); } + public ZCoin getZcoinsAssociatedRealKey(ECKey key) { + for (ZCoin zCoin : zcoins.values()) { + if (zCoin.getKeyPair().equals(key)){ + return zCoin; + } + } + return null; + } + public List getZcoins(int amount) { List createdZCoins = new ArrayList<>(); for (ZCoin zCoin : zcoins.values()) { @@ -1554,9 +1640,18 @@ public List getZcoins(int amount) { return createdZCoins; } + public ZCoin getZcoinsAssociatedToSerial(BigInteger serial){ + for (ZCoin zCoin : zcoins.values()) { + if (Utils.areBigIntegersEqual(zCoin.getSerial(), serial)){ + return zCoin; + } + } + return null; + } + public ZCoin getZcoinsAssociated(BigInteger commitmentToSpend) { for (ZCoin zCoin : zcoins.values()) { - if (Utils.areBigIntegersEqual(zCoin.getCommitment().getCommitmentValue(),commitmentToSpend)){ + if (Utils.areBigIntegersEqual(zCoin.getCommitment().getCommitmentValue(), commitmentToSpend)){ return zCoin; } } @@ -1572,6 +1667,15 @@ public boolean isCommitmentValueMine(BigInteger value) { return false; } + public boolean isCoinSerialMine(BigInteger serial) { + for (ZCoin zCoin : zcoins.values()) { + if (Utils.areBigIntegersEqual(zCoin.getSerial(), serial)){ + return true; + } + } + return false; + } + /** Create a new key and return the matching output script. Only applicable to married keychains. */ public Script freshOutputScript(KeyPurpose purpose) { throw new UnsupportedOperationException(); diff --git a/core/src/main/java/org/pivxj/wallet/KeyChainGroup.java b/core/src/main/java/org/pivxj/wallet/KeyChainGroup.java index a9fa56cc2..2bb2b955c 100644 --- a/core/src/main/java/org/pivxj/wallet/KeyChainGroup.java +++ b/core/src/main/java/org/pivxj/wallet/KeyChainGroup.java @@ -276,6 +276,7 @@ public final DeterministicKeyChain getActiveKeyChain() { * @return */ public ZCoin getZcoinsAssociated(DeterministicKey key) { + // TODO: Change this for: getZcoinsAssociatedRealKey return getActiveKeyChain().getZcoinsAssociated(key); } @@ -283,6 +284,10 @@ public boolean isCommitmentValuesMine(BigInteger value) { return getActiveKeyChain().isCommitmentValueMine(value); } + public boolean isCoinSerialMine(BigInteger serial) { + return getActiveKeyChain().isCoinSerialMine(serial); + } + /** * Sets the lookahead buffer size for ALL deterministic key chains as well as for following key chains if any exist, * see {@link DeterministicKeyChain#setLookaheadSize(int)} @@ -626,7 +631,12 @@ public int getBloomFilterElementCount() { } public BloomFilter getBloomFilter(int size, double falsePositiveRate, long nTweak) { - BloomFilter filter = new BloomFilter(size, falsePositiveRate, nTweak); + BloomFilter filter; + if (getActiveKeyChain().isZerocoinPath()){ + // TODO: check this.. + filter = new BloomFilter(size, falsePositiveRate, nTweak, BloomFilter.BloomUpdate.UPDATE_ALL); + }else + filter = new BloomFilter(size, falsePositiveRate, nTweak); if (basic.numKeys() > 0) filter.merge(basic.getFilter(size, falsePositiveRate, nTweak)); @@ -856,4 +866,5 @@ public int getCombinedKeyLookaheadEpochs() { return epoch; } + } diff --git a/core/src/main/java/org/pivxj/wallet/Protos.java b/core/src/main/java/org/pivxj/wallet/Protos.java index fe828440b..7977bf557 100644 --- a/core/src/main/java/org/pivxj/wallet/Protos.java +++ b/core/src/main/java/org/pivxj/wallet/Protos.java @@ -2956,6 +2956,19 @@ public interface ZpivOrBuilder extends * optional int64 height = 6; */ long getHeight(); + + /** + * required .wallet.Key key = 7; + */ + boolean hasKey(); + /** + * required .wallet.Key key = 7; + */ + org.pivxj.wallet.Protos.Key getKey(); + /** + * required .wallet.Key key = 7; + */ + org.pivxj.wallet.Protos.KeyOrBuilder getKeyOrBuilder(); } /** * Protobuf type {@code wallet.Zpiv} @@ -3052,6 +3065,19 @@ private Zpiv( height_ = input.readInt64(); break; } + case 58: { + org.pivxj.wallet.Protos.Key.Builder subBuilder = null; + if (((bitField0_ & 0x00000040) == 0x00000040)) { + subBuilder = key_.toBuilder(); + } + key_ = input.readMessage(org.pivxj.wallet.Protos.Key.PARSER, extensionRegistry); + if (subBuilder != null) { + subBuilder.mergeFrom(key_); + key_ = subBuilder.buildPartial(); + } + bitField0_ |= 0x00000040; + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -3188,6 +3214,27 @@ public long getHeight() { return height_; } + public static final int KEY_FIELD_NUMBER = 7; + private org.pivxj.wallet.Protos.Key key_; + /** + * required .wallet.Key key = 7; + */ + public boolean hasKey() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * required .wallet.Key key = 7; + */ + public org.pivxj.wallet.Protos.Key getKey() { + return key_; + } + /** + * required .wallet.Key key = 7; + */ + public org.pivxj.wallet.Protos.KeyOrBuilder getKeyOrBuilder() { + return key_; + } + private void initFields() { version_ = 0; commitment_ = org.pivxj.wallet.Protos.Commitment.getDefaultInstance(); @@ -3195,6 +3242,7 @@ private void initFields() { den_ = 0; parentTxId_ = com.google.protobuf.ByteString.EMPTY; height_ = 0L; + key_ = org.pivxj.wallet.Protos.Key.getDefaultInstance(); } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -3210,10 +3258,18 @@ public final boolean isInitialized() { memoizedIsInitialized = 0; return false; } + if (!hasKey()) { + memoizedIsInitialized = 0; + return false; + } if (!getCommitment().isInitialized()) { memoizedIsInitialized = 0; return false; } + if (!getKey().isInitialized()) { + memoizedIsInitialized = 0; + return false; + } memoizedIsInitialized = 1; return true; } @@ -3239,6 +3295,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) if (((bitField0_ & 0x00000020) == 0x00000020)) { output.writeInt64(6, height_); } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeMessage(7, key_); + } getUnknownFields().writeTo(output); } @@ -3272,6 +3331,10 @@ public int getSerializedSize() { size += com.google.protobuf.CodedOutputStream .computeInt64Size(6, height_); } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(7, key_); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -3387,6 +3450,7 @@ private Builder( private void maybeForceBuilderInitialization() { if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { getCommitmentFieldBuilder(); + getKeyFieldBuilder(); } } private static Builder create() { @@ -3411,6 +3475,12 @@ public Builder clear() { bitField0_ = (bitField0_ & ~0x00000010); height_ = 0L; bitField0_ = (bitField0_ & ~0x00000020); + if (keyBuilder_ == null) { + key_ = org.pivxj.wallet.Protos.Key.getDefaultInstance(); + } else { + keyBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000040); return this; } @@ -3467,6 +3537,14 @@ public org.pivxj.wallet.Protos.Zpiv buildPartial() { to_bitField0_ |= 0x00000020; } result.height_ = height_; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000040; + } + if (keyBuilder_ == null) { + result.key_ = key_; + } else { + result.key_ = keyBuilder_.build(); + } result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -3501,6 +3579,9 @@ public Builder mergeFrom(org.pivxj.wallet.Protos.Zpiv other) { if (other.hasHeight()) { setHeight(other.getHeight()); } + if (other.hasKey()) { + mergeKey(other.getKey()); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -3514,10 +3595,18 @@ public final boolean isInitialized() { return false; } + if (!hasKey()) { + + return false; + } if (!getCommitment().isInitialized()) { return false; } + if (!getKey().isInitialized()) { + + return false; + } return true; } @@ -3822,6 +3911,122 @@ public Builder clearHeight() { return this; } + private org.pivxj.wallet.Protos.Key key_ = org.pivxj.wallet.Protos.Key.getDefaultInstance(); + private com.google.protobuf.SingleFieldBuilder< + org.pivxj.wallet.Protos.Key, org.pivxj.wallet.Protos.Key.Builder, org.pivxj.wallet.Protos.KeyOrBuilder> keyBuilder_; + /** + * required .wallet.Key key = 7; + */ + public boolean hasKey() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * required .wallet.Key key = 7; + */ + public org.pivxj.wallet.Protos.Key getKey() { + if (keyBuilder_ == null) { + return key_; + } else { + return keyBuilder_.getMessage(); + } + } + /** + * required .wallet.Key key = 7; + */ + public Builder setKey(org.pivxj.wallet.Protos.Key value) { + if (keyBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + key_ = value; + onChanged(); + } else { + keyBuilder_.setMessage(value); + } + bitField0_ |= 0x00000040; + return this; + } + /** + * required .wallet.Key key = 7; + */ + public Builder setKey( + org.pivxj.wallet.Protos.Key.Builder builderForValue) { + if (keyBuilder_ == null) { + key_ = builderForValue.build(); + onChanged(); + } else { + keyBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000040; + return this; + } + /** + * required .wallet.Key key = 7; + */ + public Builder mergeKey(org.pivxj.wallet.Protos.Key value) { + if (keyBuilder_ == null) { + if (((bitField0_ & 0x00000040) == 0x00000040) && + key_ != org.pivxj.wallet.Protos.Key.getDefaultInstance()) { + key_ = + org.pivxj.wallet.Protos.Key.newBuilder(key_).mergeFrom(value).buildPartial(); + } else { + key_ = value; + } + onChanged(); + } else { + keyBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000040; + return this; + } + /** + * required .wallet.Key key = 7; + */ + public Builder clearKey() { + if (keyBuilder_ == null) { + key_ = org.pivxj.wallet.Protos.Key.getDefaultInstance(); + onChanged(); + } else { + keyBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000040); + return this; + } + /** + * required .wallet.Key key = 7; + */ + public org.pivxj.wallet.Protos.Key.Builder getKeyBuilder() { + bitField0_ |= 0x00000040; + onChanged(); + return getKeyFieldBuilder().getBuilder(); + } + /** + * required .wallet.Key key = 7; + */ + public org.pivxj.wallet.Protos.KeyOrBuilder getKeyOrBuilder() { + if (keyBuilder_ != null) { + return keyBuilder_.getMessageOrBuilder(); + } else { + return key_; + } + } + /** + * required .wallet.Key key = 7; + */ + private com.google.protobuf.SingleFieldBuilder< + org.pivxj.wallet.Protos.Key, org.pivxj.wallet.Protos.Key.Builder, org.pivxj.wallet.Protos.KeyOrBuilder> + getKeyFieldBuilder() { + if (keyBuilder_ == null) { + keyBuilder_ = new com.google.protobuf.SingleFieldBuilder< + org.pivxj.wallet.Protos.Key, org.pivxj.wallet.Protos.Key.Builder, org.pivxj.wallet.Protos.KeyOrBuilder>( + getKey(), + getParentForChildren(), + isClean()); + key_ = null; + } + return keyBuilder_; + } + // @@protoc_insertion_point(builder_scope:wallet.Zpiv) } @@ -6703,6 +6908,40 @@ public interface TransactionInputOrBuilder extends * */ long getValue(); + + /** + * optional bytes private_transaction_out_point_hash = 6; + * + *

+     * Hash of the transaction this input is using.
+     * 
+ */ + boolean hasPrivateTransactionOutPointHash(); + /** + * optional bytes private_transaction_out_point_hash = 6; + * + *
+     * Hash of the transaction this input is using.
+     * 
+ */ + com.google.protobuf.ByteString getPrivateTransactionOutPointHash(); + + /** + * optional uint32 private_transaction_out_point_index = 7; + * + *
+     * Index of transaction output used by this input.
+     * 
+ */ + boolean hasPrivateTransactionOutPointIndex(); + /** + * optional uint32 private_transaction_out_point_index = 7; + * + *
+     * Index of transaction output used by this input.
+     * 
+ */ + int getPrivateTransactionOutPointIndex(); } /** * Protobuf type {@code wallet.TransactionInput} @@ -6781,6 +7020,16 @@ private TransactionInput( value_ = input.readInt64(); break; } + case 50: { + bitField0_ |= 0x00000020; + privateTransactionOutPointHash_ = input.readBytes(); + break; + } + case 56: { + bitField0_ |= 0x00000040; + privateTransactionOutPointIndex_ = input.readUInt32(); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -6936,12 +7185,60 @@ public long getValue() { return value_; } + public static final int PRIVATE_TRANSACTION_OUT_POINT_HASH_FIELD_NUMBER = 6; + private com.google.protobuf.ByteString privateTransactionOutPointHash_; + /** + * optional bytes private_transaction_out_point_hash = 6; + * + *
+     * Hash of the transaction this input is using.
+     * 
+ */ + public boolean hasPrivateTransactionOutPointHash() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes private_transaction_out_point_hash = 6; + * + *
+     * Hash of the transaction this input is using.
+     * 
+ */ + public com.google.protobuf.ByteString getPrivateTransactionOutPointHash() { + return privateTransactionOutPointHash_; + } + + public static final int PRIVATE_TRANSACTION_OUT_POINT_INDEX_FIELD_NUMBER = 7; + private int privateTransactionOutPointIndex_; + /** + * optional uint32 private_transaction_out_point_index = 7; + * + *
+     * Index of transaction output used by this input.
+     * 
+ */ + public boolean hasPrivateTransactionOutPointIndex() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional uint32 private_transaction_out_point_index = 7; + * + *
+     * Index of transaction output used by this input.
+     * 
+ */ + public int getPrivateTransactionOutPointIndex() { + return privateTransactionOutPointIndex_; + } + private void initFields() { transactionOutPointHash_ = com.google.protobuf.ByteString.EMPTY; transactionOutPointIndex_ = 0; scriptBytes_ = com.google.protobuf.ByteString.EMPTY; sequence_ = 0; value_ = 0L; + privateTransactionOutPointHash_ = com.google.protobuf.ByteString.EMPTY; + privateTransactionOutPointIndex_ = 0; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -6983,6 +7280,12 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) if (((bitField0_ & 0x00000010) == 0x00000010)) { output.writeInt64(5, value_); } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + output.writeBytes(6, privateTransactionOutPointHash_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + output.writeUInt32(7, privateTransactionOutPointIndex_); + } getUnknownFields().writeTo(output); } @@ -7012,6 +7315,14 @@ public int getSerializedSize() { size += com.google.protobuf.CodedOutputStream .computeInt64Size(5, value_); } + if (((bitField0_ & 0x00000020) == 0x00000020)) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(6, privateTransactionOutPointHash_); + } + if (((bitField0_ & 0x00000040) == 0x00000040)) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(7, privateTransactionOutPointIndex_); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -7139,6 +7450,10 @@ public Builder clear() { bitField0_ = (bitField0_ & ~0x00000008); value_ = 0L; bitField0_ = (bitField0_ & ~0x00000010); + privateTransactionOutPointHash_ = com.google.protobuf.ByteString.EMPTY; + bitField0_ = (bitField0_ & ~0x00000020); + privateTransactionOutPointIndex_ = 0; + bitField0_ = (bitField0_ & ~0x00000040); return this; } @@ -7187,6 +7502,14 @@ public org.pivxj.wallet.Protos.TransactionInput buildPartial() { to_bitField0_ |= 0x00000010; } result.value_ = value_; + if (((from_bitField0_ & 0x00000020) == 0x00000020)) { + to_bitField0_ |= 0x00000020; + } + result.privateTransactionOutPointHash_ = privateTransactionOutPointHash_; + if (((from_bitField0_ & 0x00000040) == 0x00000040)) { + to_bitField0_ |= 0x00000040; + } + result.privateTransactionOutPointIndex_ = privateTransactionOutPointIndex_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -7218,6 +7541,12 @@ public Builder mergeFrom(org.pivxj.wallet.Protos.TransactionInput other) { if (other.hasValue()) { setValue(other.getValue()); } + if (other.hasPrivateTransactionOutPointHash()) { + setPrivateTransactionOutPointHash(other.getPrivateTransactionOutPointHash()); + } + if (other.hasPrivateTransactionOutPointIndex()) { + setPrivateTransactionOutPointIndex(other.getPrivateTransactionOutPointIndex()); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -7503,6 +7832,105 @@ public Builder clearValue() { return this; } + private com.google.protobuf.ByteString privateTransactionOutPointHash_ = com.google.protobuf.ByteString.EMPTY; + /** + * optional bytes private_transaction_out_point_hash = 6; + * + *
+       * Hash of the transaction this input is using.
+       * 
+ */ + public boolean hasPrivateTransactionOutPointHash() { + return ((bitField0_ & 0x00000020) == 0x00000020); + } + /** + * optional bytes private_transaction_out_point_hash = 6; + * + *
+       * Hash of the transaction this input is using.
+       * 
+ */ + public com.google.protobuf.ByteString getPrivateTransactionOutPointHash() { + return privateTransactionOutPointHash_; + } + /** + * optional bytes private_transaction_out_point_hash = 6; + * + *
+       * Hash of the transaction this input is using.
+       * 
+ */ + public Builder setPrivateTransactionOutPointHash(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + privateTransactionOutPointHash_ = value; + onChanged(); + return this; + } + /** + * optional bytes private_transaction_out_point_hash = 6; + * + *
+       * Hash of the transaction this input is using.
+       * 
+ */ + public Builder clearPrivateTransactionOutPointHash() { + bitField0_ = (bitField0_ & ~0x00000020); + privateTransactionOutPointHash_ = getDefaultInstance().getPrivateTransactionOutPointHash(); + onChanged(); + return this; + } + + private int privateTransactionOutPointIndex_ ; + /** + * optional uint32 private_transaction_out_point_index = 7; + * + *
+       * Index of transaction output used by this input.
+       * 
+ */ + public boolean hasPrivateTransactionOutPointIndex() { + return ((bitField0_ & 0x00000040) == 0x00000040); + } + /** + * optional uint32 private_transaction_out_point_index = 7; + * + *
+       * Index of transaction output used by this input.
+       * 
+ */ + public int getPrivateTransactionOutPointIndex() { + return privateTransactionOutPointIndex_; + } + /** + * optional uint32 private_transaction_out_point_index = 7; + * + *
+       * Index of transaction output used by this input.
+       * 
+ */ + public Builder setPrivateTransactionOutPointIndex(int value) { + bitField0_ |= 0x00000040; + privateTransactionOutPointIndex_ = value; + onChanged(); + return this; + } + /** + * optional uint32 private_transaction_out_point_index = 7; + * + *
+       * Index of transaction output used by this input.
+       * 
+ */ + public Builder clearPrivateTransactionOutPointIndex() { + bitField0_ = (bitField0_ & ~0x00000040); + privateTransactionOutPointIndex_ = 0; + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:wallet.TransactionInput) } @@ -21974,88 +22402,91 @@ public Builder setFiatCurrencyCodeBytes( "s\030\003 \001(\r\022\026\n\016lookahead_size\030\004 \001(\r\022\023\n\013isFol" + "lowing\030\005 \001(\010\022\036\n\023sigsRequiredToSpend\030\006 \001(" + "\r:\0011\"G\n\nCommitment\022\017\n\007content\030\001 \002(\014\022\022\n\nr" + - "andomness\030\002 \002(\014\022\024\n\014contentValue\030\003 \002(\014\"\200\001", + "andomness\030\002 \002(\014\022\024\n\014contentValue\030\003 \002(\014\"\232\001", "\n\004Zpiv\022\017\n\007version\030\001 \001(\005\022&\n\ncommitment\030\002 " + "\002(\0132\022.wallet.Commitment\022\016\n\006serial\030\003 \002(\014\022" + "\013\n\003den\030\004 \001(\005\022\022\n\nparentTxId\030\005 \001(\014\022\016\n\006heig" + - "ht\030\006 \001(\003\"\266\003\n\003Key\022\036\n\004type\030\001 \002(\0162\020.wallet." + - "Key.Type\022\024\n\014secret_bytes\030\002 \001(\014\022-\n\016encryp" + - "ted_data\030\006 \001(\0132\025.wallet.EncryptedData\022\022\n" + - "\npublic_key\030\003 \001(\014\022\r\n\005label\030\004 \001(\t\022\032\n\022crea" + - "tion_timestamp\030\005 \001(\003\0223\n\021deterministic_ke" + - "y\030\007 \001(\0132\030.wallet.DeterministicKey\022\032\n\022det" + - "erministic_seed\030\010 \001(\014\022;\n\034encrypted_deter", - "ministic_seed\030\t \001(\0132\025.wallet.EncryptedDa" + - "ta\022\032\n\004zpiv\030\n \001(\0132\014.wallet.Zpiv\"a\n\004Type\022\014" + - "\n\010ORIGINAL\020\001\022\030\n\024ENCRYPTED_SCRYPT_AES\020\002\022\032" + - "\n\026DETERMINISTIC_MNEMONIC\020\003\022\025\n\021DETERMINIS" + - "TIC_KEY\020\004\"5\n\006Script\022\017\n\007program\030\001 \002(\014\022\032\n\022" + - "creation_timestamp\030\002 \002(\003\"\222\001\n\020Transaction" + - "Input\022\"\n\032transaction_out_point_hash\030\001 \002(" + - "\014\022#\n\033transaction_out_point_index\030\002 \002(\r\022\024" + - "\n\014script_bytes\030\003 \002(\014\022\020\n\010sequence\030\004 \001(\r\022\r" + - "\n\005value\030\005 \001(\003\"\177\n\021TransactionOutput\022\r\n\005va", - "lue\030\001 \002(\003\022\024\n\014script_bytes\030\002 \002(\014\022!\n\031spent" + - "_by_transaction_hash\030\003 \001(\014\022\"\n\032spent_by_t" + - "ransaction_index\030\004 \001(\005\"\254\004\n\025TransactionCo" + - "nfidence\0220\n\004type\030\001 \001(\0162\".wallet.Transact" + - "ionConfidence.Type\022\032\n\022appeared_at_height" + - "\030\002 \001(\005\022\036\n\026overriding_transaction\030\003 \001(\014\022\r" + - "\n\005depth\030\004 \001(\005\022)\n\014broadcast_by\030\006 \003(\0132\023.wa" + - "llet.PeerAddress\022\033\n\023last_broadcasted_at\030" + - "\010 \001(\003\0224\n\006source\030\007 \001(\0162$.wallet.Transacti" + - "onConfidence.Source\022=\n\006ixType\030\023 \001(\0162$.wa", - "llet.TransactionConfidence.IXType:\007IX_NO" + - "NE\"`\n\004Type\022\013\n\007UNKNOWN\020\000\022\014\n\010BUILDING\020\001\022\013\n" + - "\007PENDING\020\002\022\025\n\021NOT_IN_BEST_CHAIN\020\003\022\010\n\004DEA" + - "D\020\004\022\017\n\013IN_CONFLICT\020\005\"A\n\006Source\022\022\n\016SOURCE" + - "_UNKNOWN\020\000\022\022\n\016SOURCE_NETWORK\020\001\022\017\n\013SOURCE" + - "_SELF\020\002\"4\n\006IXType\022\013\n\007IX_NONE\020\000\022\016\n\nIX_REQ" + - "UEST\020\001\022\r\n\tIX_LOCKED\020\002\"\303\005\n\013Transaction\022\017\n" + - "\007version\030\001 \002(\005\022\014\n\004hash\030\002 \002(\014\022&\n\004pool\030\003 \001" + - "(\0162\030.wallet.Transaction.Pool\022\021\n\tlock_tim" + - "e\030\004 \001(\r\022\022\n\nupdated_at\030\005 \001(\003\0223\n\021transacti", - "on_input\030\006 \003(\0132\030.wallet.TransactionInput" + - "\0225\n\022transaction_output\030\007 \003(\0132\031.wallet.Tr" + - "ansactionOutput\022\022\n\nblock_hash\030\010 \003(\014\022 \n\030b" + - "lock_relativity_offsets\030\013 \003(\005\0221\n\nconfide" + - "nce\030\t \001(\0132\035.wallet.TransactionConfidence" + - "\0225\n\007purpose\030\n \001(\0162\033.wallet.Transaction.P" + - "urpose:\007UNKNOWN\022+\n\rexchange_rate\030\014 \001(\0132\024" + - ".wallet.ExchangeRate\022\014\n\004memo\030\r \001(\t\"Y\n\004Po" + - "ol\022\013\n\007UNSPENT\020\004\022\t\n\005SPENT\020\005\022\014\n\010INACTIVE\020\002" + - "\022\010\n\004DEAD\020\n\022\013\n\007PENDING\020\020\022\024\n\020PENDING_INACT", - "IVE\020\022\"\243\001\n\007Purpose\022\013\n\007UNKNOWN\020\000\022\020\n\014USER_P" + - "AYMENT\020\001\022\020\n\014KEY_ROTATION\020\002\022\034\n\030ASSURANCE_" + - "CONTRACT_CLAIM\020\003\022\035\n\031ASSURANCE_CONTRACT_P" + - "LEDGE\020\004\022\033\n\027ASSURANCE_CONTRACT_STUB\020\005\022\r\n\t" + - "RAISE_FEE\020\006\"N\n\020ScryptParameters\022\014\n\004salt\030" + - "\001 \002(\014\022\020\n\001n\030\002 \001(\003:\00516384\022\014\n\001r\030\003 \001(\005:\0018\022\014\n" + - "\001p\030\004 \001(\005:\0011\"8\n\tExtension\022\n\n\002id\030\001 \002(\t\022\014\n\004" + - "data\030\002 \002(\014\022\021\n\tmandatory\030\003 \002(\010\" \n\003Tag\022\013\n\003" + - "tag\030\001 \002(\t\022\014\n\004data\030\002 \002(\014\"5\n\021TransactionSi" + - "gner\022\022\n\nclass_name\030\001 \002(\t\022\014\n\004data\030\002 \001(\014\"\351", - "\004\n\006Wallet\022\032\n\022network_identifier\030\001 \002(\t\022\034\n" + - "\024last_seen_block_hash\030\002 \001(\014\022\036\n\026last_seen" + - "_block_height\030\014 \001(\r\022!\n\031last_seen_block_t" + - "ime_secs\030\016 \001(\003\022\030\n\003key\030\003 \003(\0132\013.wallet.Key" + - "\022(\n\013transaction\030\004 \003(\0132\023.wallet.Transacti" + - "on\022&\n\016watched_script\030\017 \003(\0132\016.wallet.Scri" + - "pt\022C\n\017encryption_type\030\005 \001(\0162\035.wallet.Wal" + - "let.EncryptionType:\013UNENCRYPTED\0227\n\025encry" + - "ption_parameters\030\006 \001(\0132\030.wallet.ScryptPa" + - "rameters\022\022\n\007version\030\007 \001(\005:\0011\022$\n\textensio", - "n\030\n \003(\0132\021.wallet.Extension\022\023\n\013descriptio" + - "n\030\013 \001(\t\022\031\n\021key_rotation_time\030\r \001(\004\022\031\n\004ta" + - "gs\030\020 \003(\0132\013.wallet.Tag\0226\n\023transaction_sig" + - "ners\030\021 \003(\0132\031.wallet.TransactionSigner\";\n" + - "\016EncryptionType\022\017\n\013UNENCRYPTED\020\001\022\030\n\024ENCR" + - "YPTED_SCRYPT_AES\020\002\"a\n\013MultiWallet\022\022\n\007ver" + - "sion\030\001 \001(\005:\0011\022\037\n\007wallets\030\002 \003(\0132\016.wallet." + - "Wallet\022\035\n\010mnemonic\030\003 \002(\0132\013.wallet.Key\"R\n" + - "\014ExchangeRate\022\022\n\ncoin_value\030\001 \002(\003\022\022\n\nfia" + - "t_value\030\002 \002(\003\022\032\n\022fiat_currency_code\030\003 \002(", - "\tB\032\n\020org.pivxj.walletB\006Protos" + "ht\030\006 \001(\003\022\030\n\003key\030\007 \002(\0132\013.wallet.Key\"\266\003\n\003K" + + "ey\022\036\n\004type\030\001 \002(\0162\020.wallet.Key.Type\022\024\n\014se" + + "cret_bytes\030\002 \001(\014\022-\n\016encrypted_data\030\006 \001(\013" + + "2\025.wallet.EncryptedData\022\022\n\npublic_key\030\003 " + + "\001(\014\022\r\n\005label\030\004 \001(\t\022\032\n\022creation_timestamp" + + "\030\005 \001(\003\0223\n\021deterministic_key\030\007 \001(\0132\030.wall" + + "et.DeterministicKey\022\032\n\022deterministic_see", + "d\030\010 \001(\014\022;\n\034encrypted_deterministic_seed\030" + + "\t \001(\0132\025.wallet.EncryptedData\022\032\n\004zpiv\030\n \001" + + "(\0132\014.wallet.Zpiv\"a\n\004Type\022\014\n\010ORIGINAL\020\001\022\030" + + "\n\024ENCRYPTED_SCRYPT_AES\020\002\022\032\n\026DETERMINISTI" + + "C_MNEMONIC\020\003\022\025\n\021DETERMINISTIC_KEY\020\004\"5\n\006S" + + "cript\022\017\n\007program\030\001 \002(\014\022\032\n\022creation_times" + + "tamp\030\002 \002(\003\"\353\001\n\020TransactionInput\022\"\n\032trans" + + "action_out_point_hash\030\001 \002(\014\022#\n\033transacti" + + "on_out_point_index\030\002 \002(\r\022\024\n\014script_bytes" + + "\030\003 \002(\014\022\020\n\010sequence\030\004 \001(\r\022\r\n\005value\030\005 \001(\003\022", + "*\n\"private_transaction_out_point_hash\030\006 " + + "\001(\014\022+\n#private_transaction_out_point_ind" + + "ex\030\007 \001(\r\"\177\n\021TransactionOutput\022\r\n\005value\030\001" + + " \002(\003\022\024\n\014script_bytes\030\002 \002(\014\022!\n\031spent_by_t" + + "ransaction_hash\030\003 \001(\014\022\"\n\032spent_by_transa" + + "ction_index\030\004 \001(\005\"\254\004\n\025TransactionConfide" + + "nce\0220\n\004type\030\001 \001(\0162\".wallet.TransactionCo" + + "nfidence.Type\022\032\n\022appeared_at_height\030\002 \001(" + + "\005\022\036\n\026overriding_transaction\030\003 \001(\014\022\r\n\005dep" + + "th\030\004 \001(\005\022)\n\014broadcast_by\030\006 \003(\0132\023.wallet.", + "PeerAddress\022\033\n\023last_broadcasted_at\030\010 \001(\003" + + "\0224\n\006source\030\007 \001(\0162$.wallet.TransactionCon" + + "fidence.Source\022=\n\006ixType\030\023 \001(\0162$.wallet." + + "TransactionConfidence.IXType:\007IX_NONE\"`\n" + + "\004Type\022\013\n\007UNKNOWN\020\000\022\014\n\010BUILDING\020\001\022\013\n\007PEND" + + "ING\020\002\022\025\n\021NOT_IN_BEST_CHAIN\020\003\022\010\n\004DEAD\020\004\022\017" + + "\n\013IN_CONFLICT\020\005\"A\n\006Source\022\022\n\016SOURCE_UNKN" + + "OWN\020\000\022\022\n\016SOURCE_NETWORK\020\001\022\017\n\013SOURCE_SELF" + + "\020\002\"4\n\006IXType\022\013\n\007IX_NONE\020\000\022\016\n\nIX_REQUEST\020" + + "\001\022\r\n\tIX_LOCKED\020\002\"\303\005\n\013Transaction\022\017\n\007vers", + "ion\030\001 \002(\005\022\014\n\004hash\030\002 \002(\014\022&\n\004pool\030\003 \001(\0162\030." + + "wallet.Transaction.Pool\022\021\n\tlock_time\030\004 \001" + + "(\r\022\022\n\nupdated_at\030\005 \001(\003\0223\n\021transaction_in" + + "put\030\006 \003(\0132\030.wallet.TransactionInput\0225\n\022t" + + "ransaction_output\030\007 \003(\0132\031.wallet.Transac" + + "tionOutput\022\022\n\nblock_hash\030\010 \003(\014\022 \n\030block_" + + "relativity_offsets\030\013 \003(\005\0221\n\nconfidence\030\t" + + " \001(\0132\035.wallet.TransactionConfidence\0225\n\007p" + + "urpose\030\n \001(\0162\033.wallet.Transaction.Purpos" + + "e:\007UNKNOWN\022+\n\rexchange_rate\030\014 \001(\0132\024.wall", + "et.ExchangeRate\022\014\n\004memo\030\r \001(\t\"Y\n\004Pool\022\013\n" + + "\007UNSPENT\020\004\022\t\n\005SPENT\020\005\022\014\n\010INACTIVE\020\002\022\010\n\004D" + + "EAD\020\n\022\013\n\007PENDING\020\020\022\024\n\020PENDING_INACTIVE\020\022" + + "\"\243\001\n\007Purpose\022\013\n\007UNKNOWN\020\000\022\020\n\014USER_PAYMEN" + + "T\020\001\022\020\n\014KEY_ROTATION\020\002\022\034\n\030ASSURANCE_CONTR" + + "ACT_CLAIM\020\003\022\035\n\031ASSURANCE_CONTRACT_PLEDGE" + + "\020\004\022\033\n\027ASSURANCE_CONTRACT_STUB\020\005\022\r\n\tRAISE" + + "_FEE\020\006\"N\n\020ScryptParameters\022\014\n\004salt\030\001 \002(\014" + + "\022\020\n\001n\030\002 \001(\003:\00516384\022\014\n\001r\030\003 \001(\005:\0018\022\014\n\001p\030\004 " + + "\001(\005:\0011\"8\n\tExtension\022\n\n\002id\030\001 \002(\t\022\014\n\004data\030", + "\002 \002(\014\022\021\n\tmandatory\030\003 \002(\010\" \n\003Tag\022\013\n\003tag\030\001" + + " \002(\t\022\014\n\004data\030\002 \002(\014\"5\n\021TransactionSigner\022" + + "\022\n\nclass_name\030\001 \002(\t\022\014\n\004data\030\002 \001(\014\"\351\004\n\006Wa" + + "llet\022\032\n\022network_identifier\030\001 \002(\t\022\034\n\024last" + + "_seen_block_hash\030\002 \001(\014\022\036\n\026last_seen_bloc" + + "k_height\030\014 \001(\r\022!\n\031last_seen_block_time_s" + + "ecs\030\016 \001(\003\022\030\n\003key\030\003 \003(\0132\013.wallet.Key\022(\n\013t" + + "ransaction\030\004 \003(\0132\023.wallet.Transaction\022&\n" + + "\016watched_script\030\017 \003(\0132\016.wallet.Script\022C\n" + + "\017encryption_type\030\005 \001(\0162\035.wallet.Wallet.E", + "ncryptionType:\013UNENCRYPTED\0227\n\025encryption" + + "_parameters\030\006 \001(\0132\030.wallet.ScryptParamet" + + "ers\022\022\n\007version\030\007 \001(\005:\0011\022$\n\textension\030\n \003" + + "(\0132\021.wallet.Extension\022\023\n\013description\030\013 \001" + + "(\t\022\031\n\021key_rotation_time\030\r \001(\004\022\031\n\004tags\030\020 " + + "\003(\0132\013.wallet.Tag\0226\n\023transaction_signers\030" + + "\021 \003(\0132\031.wallet.TransactionSigner\";\n\016Encr" + + "yptionType\022\017\n\013UNENCRYPTED\020\001\022\030\n\024ENCRYPTED" + + "_SCRYPT_AES\020\002\"a\n\013MultiWallet\022\022\n\007version\030" + + "\001 \001(\005:\0011\022\037\n\007wallets\030\002 \003(\0132\016.wallet.Walle", + "t\022\035\n\010mnemonic\030\003 \002(\0132\013.wallet.Key\"R\n\014Exch" + + "angeRate\022\022\n\ncoin_value\030\001 \002(\003\022\022\n\nfiat_val" + + "ue\030\002 \002(\003\022\032\n\022fiat_currency_code\030\003 \002(\tB\032\n\020" + + "org.pivxj.walletB\006Protos" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor. InternalDescriptorAssigner() { @@ -22098,7 +22529,7 @@ public com.google.protobuf.ExtensionRegistry assignDescriptors( internal_static_wallet_Zpiv_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_wallet_Zpiv_descriptor, - new java.lang.String[] { "Version", "Commitment", "Serial", "Den", "ParentTxId", "Height", }); + new java.lang.String[] { "Version", "Commitment", "Serial", "Den", "ParentTxId", "Height", "Key", }); internal_static_wallet_Key_descriptor = getDescriptor().getMessageTypes().get(5); internal_static_wallet_Key_fieldAccessorTable = new @@ -22116,7 +22547,7 @@ public com.google.protobuf.ExtensionRegistry assignDescriptors( internal_static_wallet_TransactionInput_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_wallet_TransactionInput_descriptor, - new java.lang.String[] { "TransactionOutPointHash", "TransactionOutPointIndex", "ScriptBytes", "Sequence", "Value", }); + new java.lang.String[] { "TransactionOutPointHash", "TransactionOutPointIndex", "ScriptBytes", "Sequence", "Value", "PrivateTransactionOutPointHash", "PrivateTransactionOutPointIndex", }); internal_static_wallet_TransactionOutput_descriptor = getDescriptor().getMessageTypes().get(8); internal_static_wallet_TransactionOutput_fieldAccessorTable = new diff --git a/core/src/main/java/org/pivxj/wallet/Wallet.java b/core/src/main/java/org/pivxj/wallet/Wallet.java index d481a085b..8a0faae2d 100644 --- a/core/src/main/java/org/pivxj/wallet/Wallet.java +++ b/core/src/main/java/org/pivxj/wallet/Wallet.java @@ -24,6 +24,7 @@ import com.google.common.util.concurrent.*; import com.google.protobuf.*; import com.zerocoinj.core.CoinDenomination; +import com.zerocoinj.core.CoinSpend; import com.zerocoinj.core.ZCoin; import host.furszy.zerocoinj.WalletFilesInterface; import host.furszy.zerocoinj.protocol.GenWitMessage; @@ -47,7 +48,6 @@ import org.pivxj.wallet.listeners.WalletEventListener; import org.pivxj.wallet.listeners.WalletReorganizeEventListener; import org.slf4j.*; -import org.spongycastle.crypto.Commitment; import org.spongycastle.crypto.params.*; import javax.annotation.*; @@ -1038,7 +1038,7 @@ public boolean isWatchedScript(Script script) { } @Override - public boolean isZcOutputMine(Script script) { + public boolean isZcScriptMine(Script script) { keyChainGroupLock.lock(); try{ if (watchedScripts.contains(script)){ @@ -1047,10 +1047,11 @@ public boolean isZcOutputMine(Script script) { if (script.isZcMint()){ BigInteger commitmentValue = script.getCommitmentValue(); return keyChainGroup.isCommitmentValuesMine(commitmentValue); - }else { - // TODO: Check zc_spend here.. - return false; + }else if (script.isZcSpend()){ + CoinSpend coinSpend = script.getCoinSpend(params, Context.zerocoinContext); + return keyChainGroup.isCoinSerialMine(coinSpend.getCoinSerialNumber()); } + return false; } } finally { keyChainGroupLock.unlock(); @@ -1118,7 +1119,7 @@ private void markKeysAsUsed(Transaction tx) { } else if (script.isPayToScriptHash()) { Address a = Address.fromP2SHScript(tx.getParams(), script); keyChainGroup.markP2SHAddressAsUsed(a); - } else if (script.isZcMint()){ + } else if (script.isZcMint() && getActiveKeyChain().isZerocoinPath()){ keyChainGroup.markCommitmentValueAsUsed(script.getCommitmentValue()); } } catch (ScriptException e) { @@ -1904,6 +1905,40 @@ public boolean isPendingTransactionLockRelevant(Transaction tx) throws ScriptExc public boolean isTransactionRelevant(Transaction tx) throws ScriptException { lock.lock(); try { + if (getActiveKeyChain().isZerocoinPath() && + tx.getHashAsString().equals("81ad478724332c24ee6e3893e40bb4ef93e8240477b7b11a326ae5951567f8cb") + ){ + log.info("mine"); + } + // Before check this, try to connect the output in case of zc_spend + try { + for (int i = 0; i < tx.getInputs().size(); i++) { + TransactionInput input = tx.getInputs().get(i); + if (input.isZcspend()) { + CoinSpend coinSpend = input.getScriptSig().getCoinSpend(params, Context.zerocoinContext); + ZCoin zCoin = getActiveKeyChain().getZcoinsAssociatedToSerial(coinSpend.getCoinSerialNumber()); + if (zCoin != null) { + // now i can get the tx that minted this value + Sha256Hash parentHash = null; + int index = -1; + for (Transaction transaction : transactions.values()) { + for (TransactionOutput output : transaction.getOutputs()) { + if (output.isZcMint() && output.getScriptPubKey().getCommitmentValue().equals(zCoin.getCommitment().getCommitmentValue())) { + parentHash = transaction.getHash(); + index = output.getIndex(); + break; + } + } + if (parentHash != null) break; + } + input.getOutpoint().setPrivateIndex(index); + input.getOutpoint().setPrivateHash(parentHash); + } + } + } + }catch (Exception e){ + log.error("exception on zc_spend parsing..",e); + } return tx.getValueSentFromMe(this).signum() > 0 || tx.getValueSentToMe(this).signum() > 0 || !findDoubleSpendsAgainst(tx, transactions).isEmpty(); @@ -2244,7 +2279,7 @@ public void notifyNewBestBlock(StoredBlock block) throws VerificationException { // included once again. We could have a separate was-in-chain-and-now-isn't confidence type // but this way is backwards compatible with existing software, and the new state probably // wouldn't mean anything different to just remembering peers anyway. - if (confidence.incrementDepthInBlocks() > context.getEventHorizon()) + if (confidence.incrementDepthInBlocks(block.getHeight()) > context.getEventHorizon()) confidence.clearBroadcastBy(); confidenceChanged.put(tx, TransactionConfidence.Listener.ChangeReason.DEPTH); } @@ -2348,13 +2383,13 @@ private void updateForSpends(Transaction tx, boolean fromChain) throws Verificat if (fromChain) checkState(!pending.containsKey(tx.getHash())); for (TransactionInput input : tx.getInputs()) { - TransactionInput.ConnectionResult result = input.connect(unspent, TransactionInput.ConnectMode.ABORT_ON_CONFLICT); + TransactionInput.ConnectionResult result = input.connect(this, unspent, TransactionInput.ConnectMode.ABORT_ON_CONFLICT); if (result == TransactionInput.ConnectionResult.NO_SUCH_TX) { // Not found in the unspent map. Try again with the spent map. - result = input.connect(spent, TransactionInput.ConnectMode.ABORT_ON_CONFLICT); + result = input.connect(this, spent, TransactionInput.ConnectMode.ABORT_ON_CONFLICT); if (result == TransactionInput.ConnectionResult.NO_SUCH_TX) { // Not found in the unspent and spent maps. Try again with the pending map. - result = input.connect(pending, TransactionInput.ConnectMode.ABORT_ON_CONFLICT); + result = input.connect(this, pending, TransactionInput.ConnectMode.ABORT_ON_CONFLICT); if (result == TransactionInput.ConnectionResult.NO_SUCH_TX) { // Doesn't spend any of our outputs or is coinbase. continue; @@ -2402,7 +2437,8 @@ private void updateForSpends(Transaction tx, boolean fromChain) throws Verificat // less random order. for (Transaction pendingTx : pending.values()) { for (TransactionInput input : pendingTx.getInputs()) { - TransactionInput.ConnectionResult result = input.connect(tx, TransactionInput.ConnectMode.ABORT_ON_CONFLICT); + // TODO: Check this, have to be changed to the new method with the zcoin.. + TransactionInput.ConnectionResult result = input.connect(tx, null, TransactionInput.ConnectMode.ABORT_ON_CONFLICT); if (fromChain) { // This TX is supposed to have just appeared on the best chain, so its outputs should not be marked // as spent yet. If they are, it means something is happening out of order. @@ -2467,13 +2503,13 @@ private void killTxns(Set txnsToKill, @Nullable Transaction overrid return; log.warn("Now attempting to connect the inputs of the overriding transaction."); for (TransactionInput input : overridingTx.getInputs()) { - TransactionInput.ConnectionResult result = input.connect(unspent, TransactionInput.ConnectMode.DISCONNECT_ON_CONFLICT); + TransactionInput.ConnectionResult result = input.connect(this, unspent, TransactionInput.ConnectMode.DISCONNECT_ON_CONFLICT); if (result == TransactionInput.ConnectionResult.SUCCESS) { maybeMovePool(input.getConnectedTransaction(), "kill"); myUnspents.remove(input.getConnectedOutput()); log.info("Removing from UNSPENTS: {}", input.getConnectedOutput()); } else { - result = input.connect(spent, TransactionInput.ConnectMode.DISCONNECT_ON_CONFLICT); + result = input.connect(this, spent, TransactionInput.ConnectMode.DISCONNECT_ON_CONFLICT); if (result == TransactionInput.ConnectionResult.SUCCESS) { maybeMovePool(input.getConnectedTransaction(), "kill"); myUnspents.remove(input.getConnectedOutput()); @@ -2996,7 +3032,7 @@ private void addWalletTransaction(Pool pool, Transaction tx) { switch (pool) { case UNSPENT: //case INSTANTX_LOCKED: - if (unspent.containsKey(tx.getHash())) System.out.println("Unspent pool contains: "+tx.getHashAsString()); + if (unspent.containsKey(tx.getHash())) log.info("Unspent pool contains: "+tx.getHashAsString()); checkState(unspent.put(tx.getHash(), tx) == null); break; case SPENT: @@ -4182,6 +4218,7 @@ public void completeTx(SendRequest req) throws InsufficientMoneyException { */ public void completeSendRequest(ZCSpendRequest spendRequest) { SendRequest request = spendRequest.getSendRequest(); + long tweak = (long) (Math.random() * Long.MAX_VALUE); for (TransactionInput input : request.tx.getInputs()) { // First get the zcoin to spend TransactionOutput connectedOutput = input.getConnectedOutput(); @@ -4190,26 +4227,29 @@ public void completeSendRequest(ZCSpendRequest spendRequest) { // Now get the mint transaction associated with this coin Sha256Hash mintTxId = connectedOutput.getParentTransactionHash(); - int mintTxHeight = lastBlockSeenHeight - connectedOutput.getParentTransaction().getConfidence().getAppearedAtChainHeight(); + int mintTxHeight = connectedOutput.getParentTransaction().getConfidence().getAppearedAtChainHeight(); - if (mintTxHeight < CoinDefinition.ZEROCOIN_REQUIRED_STAKE_DEPTH){ + if (mintTxHeight < CoinDefinition.MINT_REQUIRED_CONFIRMATIONS){ throw new IllegalStateException("Coin depth is lower than the minimum spend depth"); } zCoin.setHeight(mintTxHeight); zCoin.setParentTxId(mintTxId); + if (zCoin.getCoinDenomination() == CoinDenomination.ZQ_ERROR){ + zCoin.setCoinDenomination(CoinDenomination.fromValue((int) (connectedOutput.getValue().value / 100000000))); + } // Now create the genWithMessage - spendRequest.addWaitingRequest(newGenWitMessage(zCoin), zCoin); + spendRequest.addWaitingRequest(newGenWitMessage(zCoin, tweak), zCoin); } } - private GenWitMessage newGenWitMessage(ZCoin zCoin) { + private GenWitMessage newGenWitMessage(ZCoin zCoin, long tweak) { GenWitMessage genWitMessage = new GenWitMessage( params, zCoin.getHeight(), // minted height zCoin.getCoinDenomination(), - 1, 0.001, (long) (Math.random() * Long.MAX_VALUE) + 1, 0.01, tweak ); BigInteger bnValue = zCoin.getCommitment().getCommitmentValue(); genWitMessage.insert(bnValue); diff --git a/core/src/main/java/org/pivxj/wallet/WalletProtobufSerializer.java b/core/src/main/java/org/pivxj/wallet/WalletProtobufSerializer.java index 4ee5550ad..8796d7afc 100644 --- a/core/src/main/java/org/pivxj/wallet/WalletProtobufSerializer.java +++ b/core/src/main/java/org/pivxj/wallet/WalletProtobufSerializer.java @@ -146,10 +146,12 @@ public String walletToText(Wallet wallet) { } public Protos.MultiWallet.Builder walletToProto(MultiWallet multiWallet) { + // TODO: Deadlock en el getWalletTransactions y en el saveToFile de la multiWallet. DeterministicSeed seed = multiWallet.getSeed(); Protos.Key.Builder mnemonicEntry = BasicKeyChain.serializeEncryptableItem(seed); mnemonicEntry.setType(Protos.Key.Type.DETERMINISTIC_MNEMONIC); serializeSeedEncryptableItem(seed, mnemonicEntry); + return Protos.MultiWallet.newBuilder() .addWallets( walletToProto(multiWallet.getPivWallet()) @@ -168,7 +170,6 @@ public Protos.Wallet walletToProto(Wallet wallet) { if (wallet.getDescription() != null) { walletBuilder.setDescription(wallet.getDescription()); } - for (WalletTransaction wtx : wallet.getWalletTransactions()) { Protos.Transaction txProto = makeTxProto(wtx); walletBuilder.addTransaction(txProto); @@ -272,6 +273,13 @@ private static Protos.Transaction makeTxProto(WalletTransaction wtx) { .setScriptBytes(ByteString.copyFrom(input.getScriptBytes())) .setTransactionOutPointHash(hashToByteString(input.getOutpoint().getHash())) .setTransactionOutPointIndex((int) input.getOutpoint().getIndex()); + if (input.getOutpoint().getPrivateHash() != null){ + inputBuilder.setPrivateTransactionOutPointHash(hashToByteString(input.getOutpoint().getPrivateHash())); + } + if (input.getOutpoint().getPrivateIndex() != -1){ + inputBuilder.setPrivateTransactionOutPointIndex((int) input.getOutpoint().getPrivateIndex()); + } + if (input.hasSequence()) inputBuilder.setSequence((int) input.getSequenceNumber()); if (input.getValue() != null) @@ -334,7 +342,17 @@ private static Protos.Transaction makeTxProto(WalletTransaction wtx) { if (tx.getMemo() != null) txBuilder.setMemo(tx.getMemo()); - return txBuilder.build(); + Protos.Transaction txProto = txBuilder.build(); + // Transaction should now be complete. + Sha256Hash protoHash = byteStringToHash(txProto.getHash()); + if (!tx.getHash().equals(protoHash)) + try { + throw new UnreadableWalletException(String.format(Locale.US, "Transaction did not deserialize completely: %s vs %s", tx.getHash(), protoHash)); + } catch (UnreadableWalletException e) { + e.printStackTrace(); + } + + return txProto; } private static Protos.Transaction.Pool getProtoPool(WalletTransaction wtx) { @@ -687,7 +705,7 @@ public static Protos.Wallet parseToProto(InputStream input) throws IOException { public static Protos.MultiWallet parseMultiToProto(InputStream input) throws IOException{ CodedInputStream codedInput = CodedInputStream.newInstance(input); - codedInput.setSizeLimit(WALLET_SIZE_LIMIT); + codedInput.setSizeLimit(WALLET_SIZE_LIMIT * 2); return Protos.MultiWallet.parseFrom(codedInput); } @@ -710,6 +728,12 @@ private void readTransaction(Protos.Transaction txProto, NetworkParameters param inputProto.getTransactionOutPointIndex() & 0xFFFFFFFFL, byteStringToHash(inputProto.getTransactionOutPointHash()) ); + if (inputProto.hasPrivateTransactionOutPointHash()){ + outpoint.setPrivateHash(byteStringToHash(inputProto.getPrivateTransactionOutPointHash())); + } + if (inputProto.hasPrivateTransactionOutPointIndex()){ + outpoint.setPrivateIndex(inputProto.getPrivateTransactionOutPointIndex() & 0xFFFFFFFFL); + } Coin value = inputProto.hasValue() ? Coin.valueOf(inputProto.getValue()) : null; TransactionInput input = new TransactionInput(params, tx, scriptBytes, outpoint, value); if (inputProto.hasSequence()) @@ -756,8 +780,11 @@ private void readTransaction(Protos.Transaction txProto, NetworkParameters param // Transaction should now be complete. Sha256Hash protoHash = byteStringToHash(txProto.getHash()); - if (!tx.getHash().equals(protoHash)) - throw new UnreadableWalletException(String.format(Locale.US, "Transaction did not deserialize completely: %s vs %s", tx.getHash(), protoHash)); + if (!tx.getHash().equals(protoHash)) { + if (!tx.getHash().equals(protoHash)) { + throw new UnreadableWalletException(String.format(Locale.US, "Transaction did not deserialize completely: tx: %s vs proto: %s", tx.getHash(), protoHash)); + } + } if (txMap.containsKey(txProto.getHash())) throw new UnreadableWalletException("Wallet contained duplicate transaction " + byteStringToHash(txProto.getHash())); txMap.put(txProto.getHash(), tx); diff --git a/core/src/main/java/org/pivxj/wallet/exceptions/InvalidCoinException.java b/core/src/main/java/org/pivxj/wallet/exceptions/InvalidCoinException.java new file mode 100644 index 000000000..6e9da3109 --- /dev/null +++ b/core/src/main/java/org/pivxj/wallet/exceptions/InvalidCoinException.java @@ -0,0 +1,7 @@ +package org.pivxj.wallet.exceptions; + +public class InvalidCoinException extends RuntimeException { + public InvalidCoinException(String message) { + super(message); + } +} diff --git a/core/src/main/java/org/pivxj/wallet/exceptions/RequestFailedException.java b/core/src/main/java/org/pivxj/wallet/exceptions/RequestFailedException.java new file mode 100644 index 000000000..b15974386 --- /dev/null +++ b/core/src/main/java/org/pivxj/wallet/exceptions/RequestFailedException.java @@ -0,0 +1,10 @@ +package org.pivxj.wallet.exceptions; + +public class RequestFailedException extends Exception { + public RequestFailedException() { + } + + public RequestFailedException(String message) { + super(message); + } +} diff --git a/core/src/test/java/org/pivxj/wallet/MultiWalletTest.java b/core/src/test/java/org/pivxj/wallet/MultiWalletTest.java index 61c11cbf3..f74fb550f 100644 --- a/core/src/test/java/org/pivxj/wallet/MultiWalletTest.java +++ b/core/src/test/java/org/pivxj/wallet/MultiWalletTest.java @@ -1,6 +1,7 @@ package org.pivxj.wallet; import com.zerocoinj.JniBridge; +import com.zerocoinj.core.CoinDenomination; import com.zerocoinj.core.ZCoin; import com.zerocoinj.core.context.ZerocoinContext; import host.furszy.zerocoinj.wallet.MultiWallet; @@ -70,24 +71,23 @@ public void generateZPIV(){ tx.getConfidence().markBroadcastBy(new PeerAddress(PARAMS, InetAddress.getByAddress(new byte[]{10,2,3,4}))); multiWallet.commitTx(tx); + // Confirmed tx + sendMoneyToWallet(multiWallet.getPivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN, tx); + sendMoneyToWallet(multiWallet.getZpivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN,tx); sendMoneyToWallet(multiWallet.getPivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); sendMoneyToWallet(multiWallet.getZpivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); sendMoneyToWallet(multiWallet.getPivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); sendMoneyToWallet(multiWallet.getZpivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); - // Confirmed tx - sendMoneyToWallet(multiWallet.getPivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN, tx); - sendMoneyToWallet(multiWallet.getZpivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN,tx); // More blocks.. sendMoneyToWallet(multiWallet.getPivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); sendMoneyToWallet(multiWallet.getPivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); - sendMoneyToWallet(multiWallet.getPivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); - sendMoneyToWallet(multiWallet.getPivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); + Transaction tx2 = multiWallet.getTransaction(tx.getHash()); - System.out.println(multiWallet.getPivWallet()); - // TODO: add the receiving part of this.. i have to check how is this calculated - System.out.println(multiWallet.getZPivWallet()); + Assert.assertEquals("Invalid depth in blocks", 5, tx2.getConfidence().getDepthInBlocks()); } catch (InsufficientMoneyException e) { @@ -149,10 +149,12 @@ public void recreateWalletTest(){ } /** - * Test to validate that the zPIV wallet understand mint txes and add them to the wallet balance + * Test create mint, save the wallet and restore it. + * The minted zcoin needs to have the values saved. */ + @Test - public void addZpivToWalletBalanceTest() { + public void mintSaveRestoreTest(){ try { NetworkParameters params = UnitTestParams.get(); setUp(); @@ -162,8 +164,71 @@ public void addZpivToWalletBalanceTest() { System.currentTimeMillis() ); MultiWallet multiWallet = new MultiWallet(params, new ZerocoinContext(new JniBridge()), seed); + + ZCoin myFirstCoin = multiWallet.getZPivWallet().getWallet().getActiveKeyChain().getZcoins(1).get(0); + + // load balance loadWallet(multiWallet, Coin.valueOf(2, 0)); - SendRequest req = multiWallet.createMintRequest(Coin.valueOf(2, 0)); + // mint + SendRequest req = multiWallet.createMintRequest(Coin.valueOf(1, 0)); + Transaction tx = req.tx; + tx.getConfidence().markBroadcastBy(new PeerAddress(PARAMS, InetAddress.getByAddress(new byte[]{1, 2, 3, 4}))); + tx.getConfidence().markBroadcastBy(new PeerAddress(PARAMS, InetAddress.getByAddress(new byte[]{10, 2, 3, 4}))); + multiWallet.commitTx(tx); + + // obtain the minted coin + TransactionOutput mintOutput = null; + for (TransactionOutput output : tx.getOutputs()) { + if (output.isZcMint()){ + mintOutput = output; + } + } + ZCoin minteCoin = multiWallet.getZcoinAssociated(mintOutput.getScriptPubKey().getCommitmentValue()); + + // Now check that both coins commitments are equals + Assert.assertEquals("Coins are not equals", minteCoin.getCommitment(), myFirstCoin.getCommitment()); + + Assert.assertSame("Minted coin denomination is not correct", minteCoin.getCoinDenomination(), CoinDenomination.ZQ_ONE); + + // Confirmed tx + sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN, tx); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN, tx); + // More blocks.. + sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + new WalletProtobufSerializer().walletToProto(multiWallet).build().writeTo(outputStream); + byte[] walletBytes = outputStream.toByteArray(); + outputStream.close(); + + ByteArrayInputStream inputStream = new ByteArrayInputStream(walletBytes); + MultiWallet multiWallet2 = new WalletProtobufSerializer().readMultiWallet(inputStream, false, null); + + ZCoin myCoinRestaured = multiWallet2.getZPivWallet().getWallet().getActiveKeyChain().getZcoins(1).get(0); + + Assert.assertEquals("Restored coin is not equal", minteCoin.getCommitment(), myCoinRestaured.getCommitment()); + Assert.assertSame("Restored minted coin denomination is not correct", myCoinRestaured.getCoinDenomination(), CoinDenomination.ZQ_ONE); + + } catch (Exception e) { + Assert.fail(e.getMessage()); + } + } + + @Test + public void moveMintFromPendingPoolToUnspentPool(){ + + try { + NetworkParameters params = UnitTestParams.get(); + setUp(); + DeterministicSeed seed = new DeterministicSeed( + Hex.decode("760a00eda285a842ad99626b61faebb6e36d80decae6665ac9c5f4c17db5185858d9fed30b6cd78a7daff4e07c88bf280cfc595620a4107613b50cab42a32f9b"), + "", + System.currentTimeMillis() + ); + MultiWallet multiWallet = new MultiWallet(params, new ZerocoinContext(new JniBridge()), seed); + loadWallet(multiWallet, Coin.valueOf(2, 0)); + SendRequest req = multiWallet.createMintRequest(Coin.valueOf(1, 0)); Transaction tx = req.tx; @@ -171,6 +236,8 @@ public void addZpivToWalletBalanceTest() { tx.getConfidence().markBroadcastBy(new PeerAddress(PARAMS, InetAddress.getByAddress(new byte[]{10, 2, 3, 4}))); multiWallet.commitTx(tx); + Assert.assertTrue("Mint is not in pending pool", + multiWallet.getZpivWallet().getTransactionPool(WalletTransaction.Pool.PENDING).containsKey(tx.getHash())); sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); @@ -180,12 +247,69 @@ public void addZpivToWalletBalanceTest() { sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN, tx); sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN, tx); // More blocks.. + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + + Assert.assertTrue("Mint is not in unspendable pool", + multiWallet.getZpivWallet().getTransactionPool(WalletTransaction.Pool.UNSPENT).containsKey(tx.getHash())); + + Assert.assertEquals("Invalid value sent to me", tx.getValueSentToMe(multiWallet.getZpivWallet()), Coin.COIN); + Assert.assertEquals("Invalid value sent from me", tx.getValueSentFromMe(multiWallet.getPivWallet()), Coin.valueOf(2,0)); + + } catch (Exception e) { + Assert.fail(e.getMessage()); + } + + + } + + /** + * Test to validate that the zPIV wallet understand mint txes and add them to the wallet balance + */ + @Test + public void addZpivToWalletBalanceTest() { + try { + NetworkParameters params = UnitTestParams.get(); + setUp(); + DeterministicSeed seed = new DeterministicSeed( + Hex.decode("760a00eda285a842ad99626b61faebb6e36d80decae6665ac9c5f4c17db5185858d9fed30b6cd78a7daff4e07c88bf280cfc595620a4107613b50cab42a32f9b"), + "", + System.currentTimeMillis() + ); + MultiWallet multiWallet = new MultiWallet(params, new ZerocoinContext(new JniBridge()), seed); + loadWallet(multiWallet, Coin.valueOf(2, 0)); + SendRequest req = multiWallet.createMintRequest(Coin.valueOf(1, 0)); + + + Transaction tx = req.tx; + tx.getConfidence().markBroadcastBy(new PeerAddress(PARAMS, InetAddress.getByAddress(new byte[]{1, 2, 3, 4}))); + tx.getConfidence().markBroadcastBy(new PeerAddress(PARAMS, InetAddress.getByAddress(new byte[]{10, 2, 3, 4}))); + multiWallet.commitTx(tx); + sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + // Confirmed tx + sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN, tx); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN, tx); + // More blocks.. sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); Assert.assertTrue("Zpiv balance has not been increased" , multiWallet.getZpivWallet().getBalance().isGreaterThan(Coin.ZERO)); + + + // Now spend it and check if the wallet notice that + + //SendRequest sendRequest = multiWallet.createSpendRequest(multiWallet.getCurrentReceiveAddress(),Coin.COIN); + //multiWallet.spendZpiv(sendRequest) + + } catch (Exception e) { Assert.fail(e.getMessage()); } diff --git a/core/src/test/java/org/pivxj/zerocoin/CoinSpendTest.java b/core/src/test/java/org/pivxj/zerocoin/CoinSpendTest.java index d5a501872..132044f14 100644 --- a/core/src/test/java/org/pivxj/zerocoin/CoinSpendTest.java +++ b/core/src/test/java/org/pivxj/zerocoin/CoinSpendTest.java @@ -2,24 +2,31 @@ import com.google.common.collect.Lists; import com.zerocoinj.JniBridge; -import com.zerocoinj.core.CoinDenomination; -import com.zerocoinj.core.Commitment; -import com.zerocoinj.core.ZCoin; +import com.zerocoinj.core.*; import com.zerocoinj.core.accumulators.Accumulator; import com.zerocoinj.core.accumulators.AccumulatorWitness; +import com.zerocoinj.core.accumulators.Accumulators; import com.zerocoinj.core.context.ZerocoinContext; import host.furszy.zerocoinj.protocol.GenWitMessage; import host.furszy.zerocoinj.protocol.PubcoinsMessage; +import host.furszy.zerocoinj.wallet.InvalidSpendException; import host.furszy.zerocoinj.wallet.MultiWallet; +import org.junit.Assert; import org.junit.Test; +import org.junit.rules.TemporaryFolder; import org.pivxj.core.*; import org.pivxj.net.MessageWriteTarget; +import org.pivxj.params.MainNetParams; import org.pivxj.params.UnitTestParams; import org.pivxj.testing.TestWithWallet; import org.pivxj.wallet.DeterministicSeed; import org.pivxj.wallet.SendRequest; +import org.pivxj.wallet.Wallet; +import org.pivxj.wallet.WalletProtobufSerializer; import org.spongycastle.util.encoders.Hex; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.math.BigInteger; import java.net.InetAddress; @@ -27,119 +34,294 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import org.junit.Rule; public class CoinSpendTest extends TestWithWallet { - @Test - public void validCoinSpendTest() throws Exception { + public void validCoinSpendWithCppDataTest(){ - // The test basically load the wallet with 2 new mints and fill up them until they are spendable - // Then try to spending them getting a valid accumulator from the node. + NetworkParameters params = MainNetParams.get(); + Context context = Context.getOrCreate(params); + context.zerocoinContext.jniBridge = new JniBridge(); - final NetworkParameters params = UnitTestParams.get(); - setUp(); + // Setup the wallet DeterministicSeed seed = new DeterministicSeed( Hex.decode("760a00eda285a842ad99626b61faebb6e36d80decae6665ac9c5f4c17db5185858d9fed30b6cd78a7daff4e07c88bf280cfc595620a4107613b50cab42a32f9b"), "", System.currentTimeMillis() ); - final MultiWallet multiWallet = new MultiWallet(params, new ZerocoinContext(new JniBridge()), seed); - loadWallet(multiWallet, Coin.valueOf(2,0)); - SendRequest req = multiWallet.createMintRequest(Coin.valueOf(2, 0)); + final MultiWallet multiWallet = new MultiWallet(params, new ZerocoinContext(new JniBridge()), seed, 15); - Transaction tx = req.tx; - tx.getConfidence().markBroadcastBy(new PeerAddress(PARAMS, InetAddress.getByAddress(new byte[]{1,2,3,4}))); - tx.getConfidence().markBroadcastBy(new PeerAddress(PARAMS, InetAddress.getByAddress(new byte[]{10,2,3,4}))); - multiWallet.commitTx(tx); + // Setup the accumulator status with random coins + List coins = multiWallet.freshZcoins(15); + for (ZCoin coin : coins) { + coin.setCoinDenomination(CoinDenomination.ZQ_ONE); + } - sendMoneyToWallet(multiWallet.getPivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); - sendMoneyToWallet(multiWallet.getZpivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); - // Confirmed tx - sendMoneyToWallet(multiWallet.getPivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN, tx); - sendMoneyToWallet(multiWallet.getZpivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN,tx); + ZCoin myCoin = coins.get(5); - this.wallet = multiWallet.getZpivWallet(); - // Now 200 blocks depth - for (int i = 0; i < 500; i++) { - sendMoneyToWallet(multiWallet.getPivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); - sendMoneyToWallet(multiWallet.getZpivWallet(),AbstractBlockChain.NewBlockType.BEST_CHAIN); + Assert.assertEquals("Serial not valid", + new BigInteger("112528974699127969510791029434430131089903980535436389917566704532828560273751"), + myCoin.getSerial()); + // valid serial --> 008f9c42288d572cf96394a7ff0c6247579c8a5bdc1227e220417cb7f620721b75 + // adjusted serial --> 3973891039144036301193230988785217477463369911398361130575219525410001236311 + // adjusted serial vch (NET) --> 809c42288d572cf96394a7ff0c6247579c8a5bdc1227e220417cb7f620721b75 + // adjusted serial hex (no sirve este..)--> 8c92482d875c29f36497affc0267475c9a8b5cd21722e0214c77b6f0227b157 + + System.out.println(myCoin); + + Accumulator accumulator = new Accumulator(context.zerocoinContext.accumulatorParams, myCoin.getCoinDenomination()); + AccumulatorWitness witness = new AccumulatorWitness(accumulator, myCoin); + + for (ZCoin coin : coins) { + accumulator.accumulate(coin); + if (!coin.equals(myCoin)) + witness.addElement(coin); } - // Now create the accumulator with the coin to spend + System.out.println("Accumulator: " + accumulator.getValue()); + System.out.println("Witness: " + witness.getValue()); + + // build the transaction + Transaction tx = new Transaction(params); + tx.addOutput(Coin.COIN, multiWallet.freshReceiveAddress()); + Sha256Hash ptxHash = tx.getHash(); + + CoinSpend coinSpend = new CoinSpend( + context.zerocoinContext, + myCoin, + accumulator, + BigInteger.ZERO, + witness, + ptxHash, + SpendType.SPEND, + null + ); + if (!coinSpend.verify(accumulator)) { + Assert.fail("CoinSpend verify failed"); + } - // Create the spend of 1 zPIV - ExecutorService executor = Executors.newSingleThreadExecutor(); - PeergroupUtil peergroupUtil = new PeergroupUtil(params); - peergroupUtil.addWallet(multiWallet.getZpivWallet()); + if (!coinSpend.hasValidSignature()){ + Assert.fail("CoinSpend signature invalid, coinSpend: " + coinSpend); + } - SendRequest spendRequest = multiWallet.createSpendRequest(multiWallet.getPivWallet().freshReceiveAddress(), Coin.COIN); + BigInteger adjustedSerial = ZCoin.getAdjustedSerial(coinSpend.getCoinSerialNumber()); + Assert.assertTrue( + "Not valid serial", + Utils.areBigIntegersEqual( + new BigInteger("3973891039144036301193230988785217477463369911398361130575219525410001236311"), + adjustedSerial + ) + ); + } - BigInteger commitmentValue = spendRequest.tx.getInput(0).getConnectedOutput().getScriptPubKey().getCommitmentValue(); - final ZCoin coinToSpend = multiWallet.getZpivWallet().getZcoin(commitmentValue); + @Test + public void validCoinSpendWithCppData2Test(){ - final Peer peer = peergroupUtil.getConnectedPeers().get(0); - peer.setWriteTarget(new MessageWriteTarget() { - @Override - public void writeBytes(byte[] message) throws IOException { + NetworkParameters params = MainNetParams.get(); + Context context = Context.getOrCreate(params); + context.zerocoinContext.jniBridge = new JniBridge(); - System.out.println("Sending message.."); - System.out.println(Hex.toHexString(message)); + // Setup the wallet + DeterministicSeed seed = new DeterministicSeed( + Hex.decode("760a00eda285a842ad99626b61faebb6e36d80decae6665ac9c5f4c17db5185858d9fed30b6cd78a7daff4e07c88bf280cfc595620a4107613b50cab42a32f9b"), + "", + System.currentTimeMillis() + ); + final MultiWallet multiWallet = new MultiWallet(params, new ZerocoinContext(new JniBridge()), seed, 15); - new Thread(new Runnable() { - @Override - public void run() { - // Accumulator calculation - ZerocoinContext zerocoinContext = Context.get().zerocoinContext; - // Accumualtor - Accumulator acc = new Accumulator(zerocoinContext.getAccumulatorParams(),CoinDenomination.ZQ_ONE); - AccumulatorWitness witness = new AccumulatorWitness(acc.copy(), coinToSpend); + // Setup the accumulator status with random coins + List coins = multiWallet.freshZcoins(15); + for (ZCoin coin : coins) { + coin.setCoinDenomination(CoinDenomination.ZQ_ONE); + } - List networkCoins = Lists.newArrayList(multiWallet.getZpivWallet().getZcoins(4)); - if (!networkCoins.contains(coinToSpend)){ - networkCoins.add(coinToSpend); - } - for (ZCoin coin : networkCoins) { - if (coin.getCoinDenomination() != CoinDenomination.ZQ_ONE) - coin.setCoinDenomination(CoinDenomination.ZQ_ONE); - acc.accumulate(coin); - if (!coin.equals(coinToSpend)) { - witness.addElement(coin); - } - } + for (int i = 0; i < coins.size(); i++) { - PubcoinsMessage pubcoinsMessage = new PubcoinsMessage( - params, - acc.getValue(), - witness.getValue(), - Lists.newArrayList(coinToSpend.getCommitment().getCommitmentValue()), - 10 - ); - - try { - TimeUnit.SECONDS.sleep(1); - peer.processPubcoins(pubcoinsMessage); - } catch (Exception e) { - e.printStackTrace(); - } + ZCoin myCoin = coins.get(i); - } - }).start(); + Accumulator accumulator = new Accumulator(context.zerocoinContext.accumulatorParams, myCoin.getCoinDenomination()); + AccumulatorWitness witness = new AccumulatorWitness(accumulator, myCoin); + for (ZCoin coin : coins) { + accumulator.accumulate(coin); + if (!coin.equals(myCoin)) + witness.addElement(coin); + } + // build the transaction + Transaction tx = new Transaction(params); + tx.addOutput(Coin.COIN, multiWallet.freshReceiveAddress()); + Sha256Hash ptxHash = tx.getHash(); + + CoinSpend coinSpend = new CoinSpend( + context.zerocoinContext, + myCoin, + accumulator, + BigInteger.ZERO, + witness, + ptxHash, + SpendType.SPEND, + null + ); + + if (!coinSpend.verify(accumulator)) { + Assert.fail("CoinSpend verify failed"); } - @Override - public void closeConnection() { + if (!coinSpend.hasValidSignature()){ + Assert.fail("CoinSpend signature invalid, coinSpend: " + coinSpend); + } + + } + } + + @Test + public void test(){ + NetworkParameters params = MainNetParams.get(); + Context.getOrCreate(params); + System.out.println(ECKey.fromPrivate(Hex.decode("8b21ddfbd2e20cc5b04606b8d57736ea390176f170cbe1216019680cfb36f0f2")).getPrivateKeyAsWiF(params)); + } + + @Test + public void validCoinSpendTest() { + + try { + + // The test basically load the wallet with 2 new mints and fill up them until they are spendable + // Then try to spending them getting a valid accumulator from the node. + + final NetworkParameters params = UnitTestParams.get(); + setUp(); + DeterministicSeed seed = new DeterministicSeed( + Hex.decode("760a00eda285a842ad99626b61faebb6e36d80decae6665ac9c5f4c17db5185858d9fed30b6cd78a7daff4e07c88bf280cfc595620a4107613b50cab42a32f9b"), + "", + System.currentTimeMillis() + ); + final MultiWallet multiWallet = new MultiWallet(params, new ZerocoinContext(new JniBridge()), seed); + loadWallet(multiWallet, Coin.valueOf(1, 0)); + SendRequest req = multiWallet.createMintRequest(Coin.valueOf(1, 0)); + + Transaction mintTx = req.tx; + mintTx.getConfidence().markBroadcastBy(new PeerAddress(PARAMS, InetAddress.getByAddress(new byte[]{1, 2, 3, 4}))); + mintTx.getConfidence().markBroadcastBy(new PeerAddress(PARAMS, InetAddress.getByAddress(new byte[]{10, 2, 3, 4}))); + multiWallet.commitTx(mintTx); + + sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + // Confirmed tx + sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN, mintTx); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN, mintTx); + + this.wallet = multiWallet.getZpivWallet(); + // Now 20 blocks depth + for (int i = 0; i < 20; i++) { + sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); } - }); - multiWallet.spendZpiv(spendRequest,peergroupUtil,executor); + // Now create the accumulator with the coin to spend + + + // Create the spend of 1 zPIV + ExecutorService executor = Executors.newSingleThreadExecutor(); + PeergroupUtil peergroupUtil = new PeergroupUtil(params); + peergroupUtil.addWallet(multiWallet.getZpivWallet()); + + SendRequest spendRequest = multiWallet.createSpendRequest(multiWallet.getPivWallet().freshReceiveAddress(), Coin.COIN); + + BigInteger commitmentValue = spendRequest.tx.getInput(0).getConnectedOutput().getScriptPubKey().getCommitmentValue(); + final ZCoin coinToSpend = multiWallet.getZpivWallet().getZcoin(commitmentValue); + + final Peer peer = peergroupUtil.getConnectedPeers().get(0); + peer.setWriteTarget(new MessageWriteTarget() { + @Override + public void writeBytes(byte[] message) throws IOException { + + System.out.println("Sending message.."); + System.out.println(Hex.toHexString(message)); + + new Thread(new Runnable() { + @Override + public void run() { + try { + // Accumulator calculation + ZerocoinContext zerocoinContext = Context.get().zerocoinContext; + zerocoinContext.jniBridge = new JniBridge(); + // Accumulator + Accumulator acc = new Accumulator(zerocoinContext.getAccumulatorParams(), CoinDenomination.ZQ_ONE); + AccumulatorWitness witness = new AccumulatorWitness(acc.copy(), coinToSpend); + + List networkCoins = Lists.newArrayList(multiWallet.getZpivWallet().getZcoins(4)); + if (!networkCoins.contains(coinToSpend)) { + networkCoins.add(coinToSpend); + } + for (ZCoin coin : networkCoins) { + if (coin.getCoinDenomination() != CoinDenomination.ZQ_ONE) + coin.setCoinDenomination(CoinDenomination.ZQ_ONE); + acc.accumulate(coin); + if (!coin.equals(coinToSpend)) { + witness.addElement(coin); + } + } + + PubcoinsMessage pubcoinsMessage = new PubcoinsMessage( + params, + acc.getValue(), + witness.getValue(), + Lists.newArrayList(coinToSpend.getCommitment().getCommitmentValue()), + 1 + ); + + try { + TimeUnit.SECONDS.sleep(1); + peer.processPubcoins(pubcoinsMessage); + } catch (Exception e) { + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + } + + } + }).start(); + + + } + + @Override + public void closeConnection() { + + } + }); + + Transaction spentTx = multiWallet.spendZpiv(spendRequest, peergroupUtil, executor, new JniBridge()); + + // Now check + multiWallet.getZpivWallet().maybeCommitTx(spentTx); - System.out.println(multiWallet.getZpivWallet()); + // Confirm tx + sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getPivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN, spentTx); + + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + sendMoneyToWallet(multiWallet.getZpivWallet(), AbstractBlockChain.NewBlockType.BEST_CHAIN); + + // Check the balance, must be zero + Assert.assertEquals("Wallet balance result is not correct", multiWallet.getZPivWallet().getBalance(Wallet.BalanceType.AVAILABLE), Coin.ZERO); + + }catch (Exception e){ + Assert.fail(e.getMessage()); + } } @@ -157,4 +339,8 @@ private void loadWallet(MultiWallet multiWallet, Coin coin) { } } + /** + * TODO: Un buen test puede ser armar una transacción valida de coinSpend, generar la wallet y enviarla por el notifyTx + */ + } diff --git a/core/src/test/java/org/pivxj/zerocoin/ConnectionTest.java b/core/src/test/java/org/pivxj/zerocoin/ConnectionTest.java new file mode 100644 index 000000000..f3c644ae7 --- /dev/null +++ b/core/src/test/java/org/pivxj/zerocoin/ConnectionTest.java @@ -0,0 +1,244 @@ +package org.pivxj.zerocoin; + +import com.google.common.base.Charsets; +import com.subgraph.orchid.encoders.Hex; +import com.zerocoinj.core.CoinSpend; +import host.furszy.zerocoinj.MultiWalletFiles; +import host.furszy.zerocoinj.wallet.MultiWallet; +import host.furszy.zerocoinj.wallet.files.Listener; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.pivxj.core.*; +import org.pivxj.core.listeners.AbstractPeerDataEventListener; +import org.pivxj.core.listeners.BlocksDownloadedEventListener; +import org.pivxj.core.listeners.TransactionConfidenceEventListener; +import org.pivxj.net.discovery.PeerDiscovery; +import org.pivxj.net.discovery.PeerDiscoveryException; +import org.pivxj.params.MainNetParams; +import org.pivxj.store.BlockStore; +import org.pivxj.store.BlockStoreException; +import org.pivxj.store.LevelDBBlockStore; +import org.pivxj.utils.BriefLogFormatter; +import org.pivxj.wallet.KeyChainGroup; +import org.pivxj.wallet.UnreadableWalletException; +import org.pivxj.wallet.Wallet; +import org.pivxj.wallet.WalletProtobufSerializer; + +import javax.annotation.Nullable; +import java.io.*; +import java.net.InetSocketAddress; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +public class ConnectionTest { + + @Rule + public TemporaryFolder tempFolder = new TemporaryFolder(); + + @Test + public void syncTest(){ + try { + NetworkParameters params = MainNetParams.get(); + final MultiWallet multiWallet = restore(params); + multiWallet.setKeyChainGroupLookaheadThreshold(75); + BriefLogFormatter.init(); + + Context context = new Context(params); + File walletFile = new File("wallet_connection_test.dat"); + if (walletFile.exists()){ + walletFile.delete(); + } + File file = new File("watching_blockstore_2.dat"); + if (file.exists()){ + if (file.isDirectory()){ + for (File file1 : file.listFiles()) { + file1.delete(); + } + }else file.delete(); + } + BlockStore spvBlockStore = new LevelDBBlockStore(context,file); + try { + String filename = "checkpoints"; + String suffix = params instanceof MainNetParams ? "":"-testnet"; + final InputStream checkpointsInputStream = new FileInputStream(new File("/Users/furszy/Documents/pivx_wallet/dashj", filename)); + CheckpointManager.checkpoint(params, checkpointsInputStream, spvBlockStore, multiWallet.getEarliestKeyCreationTime()); + }catch (final IOException x) { + x.printStackTrace(); + }catch (Exception e){ + e.printStackTrace(); + } + final BlockChain blockChain = new BlockChain(context,spvBlockStore); + multiWallet.addWalletFrom(blockChain); + PeerGroup peerGroup = new PeerGroup(params,blockChain); + //peerGroup.addPeerDiscovery(new DnsDiscovery(networkParameters)); + peerGroup.addPeerDiscovery(new PeerDiscovery() { + @Override + public InetSocketAddress[] getPeers(long services, long timeoutValue, TimeUnit timeoutUnit) throws PeerDiscoveryException { + return new InetSocketAddress[]{ + //new InetSocketAddress("202.5.21.31",51474), + new InetSocketAddress("localhost",7776) + //new InetSocketAddress("localhost",51474) + //new InetSocketAddress("88.198.192.110",51474) + }; + } + + @Override + public void shutdown() { + + } + }); + peerGroup.setDownloadTxDependencies(0); + multiWallet.addPeergroup(peerGroup); + peerGroup.setMaxPeersToDiscoverCount(1); + peerGroup.startBlockChainDownload(new AbstractPeerDataEventListener(){ + @Override + public void onBlocksDownloaded(Peer peer, Block block, @Nullable FilteredBlock filteredBlock, int blocksLeft) { + if ((blocksLeft/10000) == 0) { + System.out.println("block left: " + blocksLeft + ", hash: " + block.getHash().toString()); + } + } + }); + + ExecutorService executor = Executors.newSingleThreadExecutor(); + final File tempFile = tempFolder.newFile("tempFile.txt"); + multiWallet.addOnTransactionsConfidenceChange(executor, new TransactionConfidenceEventListener() { + @Override + public void onTransactionConfidenceChanged(Wallet wallet, Transaction tx) { + //try { + // Check that the serialization works right.. + + System.out.println( + "Transaction: " + tx.getHashAsString() + ", "+ org.spongycastle.util.encoders.Hex.toHexString(tx.unsafeBitcoinSerialize() + ) + ); + + //multiWallet.saveToFile(tempFile); + //FileInputStream inputStream = new FileInputStream(tempFile); + //MultiWallet wallet1 = new WalletProtobufSerializer().readMultiWallet(inputStream, false, null); + + //Assert.assertTrue("Not consistent wallet", wallet1.isConsistent()); +// } catch (UnreadableWalletException e) { +// e.printStackTrace(); +// } catch (FileNotFoundException e) { +// e.printStackTrace(); +// } catch (IOException e) { +// e.printStackTrace(); +// } + } + }); + + peerGroup.startAsync(); + peerGroup.downloadBlockChain(); + + + while (true){ + try { + TimeUnit.SECONDS.sleep(120); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + + } catch (IOException e) { + e.printStackTrace(); + } catch (BlockStoreException e) { + e.printStackTrace(); + } + } + + public MultiWallet restore(NetworkParameters networkParameters) throws IOException { + String filename = "3.0.0_pivx-wallet-backup_org.pivx.production-2018-08-11"; + //"1.01_pivx-wallet-backup_org.pivx.production-2017-07-26 (2)"; + String password = "123";//"12345678"; + + + File file = new File("/Users/furszy/Documents/pivx_wallet/dashj/core/src/test/java/org/pivxj/zerocoin", filename); + System.out.println(file.getAbsolutePath()); + final BufferedReader cipherIn = new BufferedReader(new InputStreamReader(new FileInputStream(file), Charsets.UTF_8)); + final StringBuilder cipherText = new StringBuilder(); + copy(cipherIn, cipherText, 10000000); + cipherIn.close(); + + final byte[] plainText = Crypto.decryptBytes(cipherText.toString(), password.toCharArray()); + final InputStream is = new ByteArrayInputStream(plainText); + + MultiWallet wallet = restoreWalletFromProtobufOrBase58(is, networkParameters, 10000000); + return wallet; + } + + public static final long copy(final Reader reader, final StringBuilder builder) throws IOException + { + return copy(reader, builder, 0); + } + + public static final long copy(final Reader reader, final StringBuilder builder, final long maxChars) throws IOException + { + final char[] buffer = new char[256]; + long count = 0; + int n = 0; + while (-1 != (n = reader.read(buffer))) + { + builder.append(buffer, 0, n); + count += n; + + if (maxChars != 0 && count > maxChars) + throw new IOException("Read more than the limit of " + maxChars + " characters"); + } + return count; + } + + public static final long copy(final InputStream is, final OutputStream os) throws IOException + { + final byte[] buffer = new byte[1024]; + long count = 0; + int n = 0; + while (-1 != (n = is.read(buffer))) + { + os.write(buffer, 0, n); + count += n; + } + return count; + } + + public static MultiWallet restoreWalletFromProtobufOrBase58(final InputStream is, final NetworkParameters expectedNetworkParameters,long backupMaxChars) throws IOException + { + is.mark((int) backupMaxChars); + + try + { + return restoreWalletFromProtobuf(is, expectedNetworkParameters); + } + catch (final IOException x) + { + throw new IOException("cannot read protobuf (" + x.getMessage() + ") or base58 (" + x.getMessage() + ")", x); + + } + } + + public static MultiWallet restoreWalletFromProtobuf(final InputStream is, final NetworkParameters expectedNetworkParameters) throws IOException { + try { + final MultiWallet wallet = new WalletProtobufSerializer().readMultiWallet(is, true, null); + if (!wallet.getParams().equals(expectedNetworkParameters)) + throw new IOException("bad wallet backup network parameters: " + wallet.getParams().getId()); + if (!wallet.isConsistent()) + throw new IOException("inconsistent wallet backup"); + + return wallet; + } catch (final UnreadableWalletException x) { + throw new IOException("unreadable wallet", x); + } + } + +} diff --git a/core/src/test/java/org/pivxj/zerocoin/PeergroupUtil.java b/core/src/test/java/org/pivxj/zerocoin/PeergroupUtil.java index 3275b4ba7..bb783c7fa 100644 --- a/core/src/test/java/org/pivxj/zerocoin/PeergroupUtil.java +++ b/core/src/test/java/org/pivxj/zerocoin/PeergroupUtil.java @@ -1,6 +1,7 @@ package org.pivxj.zerocoin; import com.google.common.collect.Lists; +import com.google.common.util.concurrent.ListenableFuture; import org.pivxj.core.*; import org.pivxj.net.ClientConnectionManager; import javax.annotation.Nullable; @@ -45,4 +46,9 @@ public PeergroupUtil(Context context, @Nullable AbstractBlockChain chain, Client public List getConnectedPeers() { return Lists.newArrayList(peerUtil); } + + @Override + public List findPeersOfAtLeastVersion(long protocolVersion) { + return Lists.newArrayList(peerUtil); + } } diff --git a/core/src/wallet.proto b/core/src/wallet.proto index f101b8ef7..e7b7ffe34 100644 --- a/core/src/wallet.proto +++ b/core/src/wallet.proto @@ -99,6 +99,7 @@ message Zpiv{ optional int32 den = 4; optional bytes parentTxId = 5; optional int64 height = 6; + required Key key = 7; } @@ -186,6 +187,11 @@ message TransactionInput { optional uint32 sequence = 4; // Value of connected output, if known optional int64 value = 5; + + // Hash of the transaction this input is using. + optional bytes private_transaction_out_point_hash = 6; + // Index of transaction output used by this input. + optional uint32 private_transaction_out_point_index = 7; } message TransactionOutput { diff --git a/examples/src/main/java/org/pivxj/examples/BackupToMnemonicSeed.java b/examples/src/main/java/org/pivxj/examples/BackupToMnemonicSeed.java index 1013d2da1..0afe7357b 100644 --- a/examples/src/main/java/org/pivxj/examples/BackupToMnemonicSeed.java +++ b/examples/src/main/java/org/pivxj/examples/BackupToMnemonicSeed.java @@ -36,9 +36,9 @@ public static void main(String[] args) { Wallet wallet = new Wallet(params); DeterministicSeed seed = wallet.getKeyChainSeed(); - System.out.println("seed: " + seed.toString()); + //System.out.println("seed: " + seed.toString()); - System.out.println("creation time: " + seed.getCreationTimeSeconds()); - System.out.println("mnemonicCode: " + Utils.join(seed.getMnemonicCode())); + //System.out.println("creation time: " + seed.getCreationTimeSeconds()); + //System.out.println("mnemonicCode: " + Utils.join(seed.getMnemonicCode())); } } diff --git a/tools/src/main/java/org/pivxj/tools/BuildCheckpoints.java b/tools/src/main/java/org/pivxj/tools/BuildCheckpoints.java index 0baa5d99b..9611367ae 100644 --- a/tools/src/main/java/org/pivxj/tools/BuildCheckpoints.java +++ b/tools/src/main/java/org/pivxj/tools/BuildCheckpoints.java @@ -31,6 +31,7 @@ import joptsimple.OptionParser; import joptsimple.OptionSet; import joptsimple.OptionSpec; +import sun.applet.Main; import java.io.DataOutputStream; import java.io.File; @@ -94,7 +95,7 @@ public static void main(String[] args) throws Exception { //params = TestNet3Params.get(); //suffix = "-testnet"; - params = TestNet3Params.get(); + params = MainNetParams.get(); suffix = ""; @@ -109,7 +110,7 @@ public static void main(String[] args) throws Exception { return; }InetAddress.getLocalHost(); } else { - ipAddress = InetAddress.getByName("202.5.21.31"); // InetAddress.getLocalHost(); + ipAddress = InetAddress.getLocalHost(); //InetAddress.getByName("202.5.21.31"); // InetAddress.getLocalHost(); } final PeerAddress peerAddress = new PeerAddress(ipAddress, params.getPort()); @@ -129,14 +130,17 @@ public static void main(String[] args) throws Exception { long now = new Date().getTime() / 1000; peerGroup.setFastCatchupTimeSecs(now); - final long timeAgo = now - (86400 * 170);//options.valueOf(daysFlag)); + final long timeAgo = now - (86400 * options.valueOf(daysFlag)); System.out.println("Checkpointing up to " + Utils.dateTimeFormat(timeAgo * 1000)); chain.addNewBestBlockListener(Threading.SAME_THREAD, new NewBestBlockListener() { @Override public void notifyNewBestBlock(StoredBlock block) throws VerificationException { int height = block.getHeight(); - System.out.println("block height: "+block.getHeight()); + //System.out.println("block height: "+block.getHeight()); + if (height % 10000 == 0){ + System.out.println("height: " + height); + } if (height % CoinDefinition.getIntervalCheckpoints() == 0 && block.getHeader().getTimeSeconds() <= timeAgo) { //if(height == 201500){ System.out.println(String.format("Checkpointing block %s at height %d, time %s", @@ -176,7 +180,7 @@ private static void writeBinaryCheckpoints(TreeMap checkpo dataOutputStream.writeInt(0); // Number of signatures to read. Do this later. digestOutputStream.on(true); dataOutputStream.writeInt(checkpoints.size()); - ByteBuffer buffer = ByteBuffer.allocate(StoredBlock.COMPACT_SERIALIZED_SIZE); + ByteBuffer buffer = ByteBuffer.allocate(StoredBlock.COMPACT_SERIALIZED_SIZE_ZEROCOIN); for (StoredBlock block : checkpoints.values()) { block.serializeCompact(buffer); dataOutputStream.write(buffer.array()); @@ -195,7 +199,7 @@ private static void writeTextualCheckpoints(TreeMap checkp writer.println("TXT CHECKPOINTS 1"); writer.println("0"); // Number of signatures to read. Do this later. writer.println(checkpoints.size()); - ByteBuffer buffer = ByteBuffer.allocate(StoredBlock.COMPACT_SERIALIZED_SIZE); + ByteBuffer buffer = ByteBuffer.allocate(StoredBlock.COMPACT_SERIALIZED_SIZE_ZEROCOIN); for (StoredBlock block : checkpoints.values()) { block.serializeCompact(buffer); writer.println(CheckpointManager.BASE64.encode(buffer.array()));

cMvanp;z?5Zm}Eo ziZ|h~aKjO?9|pxca9X?zpNfNUQ5=FR;xJqj@4-#+KHL@`FeZ+$DdHm*Dh61DILe~M zF=iIWnN19`G%>`o#R=B#5+_-)IL#`=8P+JyvKH|fdrW-JR*4a|R-9*@;tNLN0_zqR z*$#1uxy6_4kobyyATF~ZafO`{*Vq~HHM=PO$*zj)?6$bUnYhXC6SsJ<_z#Z~-|$#* zn+x$BPZZzt6!8PkmW&rm&da4oJFk%5yixk_CDNC#koWN?JNUGF_{acCAI$XK0VgIofKOsddPCT9?eyUY0ppx6IXgWS-V5 zty-T<()wkxwolr$gEB=MPzRh)2MntNF3Ak-Uuyn4nd#vp=XnIlERRT;;}I`&JrZQT zdvn%i#-)=IauO%W67ZI#penWIWN^8Nw&j#^(^0yfQ@~9p^}hs_=GwUF9Iee&%msrP z)|u-RlvlvbU@*(`Qn`5w#S}%;k-VAQ9ICUM@)a3pkX8ALOfamQ@&z}iD;P$n@=e@4 zS3xH?=TT8X9yb?KS3xN^m(dpm`P^J%*s>kU)?~mAME>qShn(kE0PYt-# zsV-S-_;%@RCk;E5Z;K)3x|F!h5T9}>v4{Fy4sPB}-@D4W`GAqKtx$PBRGuK(Rj5*a zY`}jMs>e913rE~KY>L`w;Q$=dzmca%T3y!1fC@D_o=%);iL}HkFAE&`& z42SzM0;XaVgkv4w3j{ zh{g(ac_koLK>{v>Sy%(PSPM?9gF@9mhz(GKjnINk@CY`;Qq{L%3p|cLfwkBQPvgU| z9+yBDE`^tH8N7zeVJohH?brri1AqxUzzWgKePjMGYsbe_h@XQ$KCZH_R!{zf%Do0s zu^qDUmr#OFLM1*0&A1Mh;ICj6J`EdHC0wr#-2nZn{vJ2NQS5|ss$Rfn;Tm?qH%QDA zpJRcznZ@7>EM3)1+`@|RMOJ|?v&HxuwhUio+RyMc_k!|=csstXf^@5GYzIHwp~Cd2 zZR~^@*b5fi1vczco7e+6_@>&#UbTg{pbq<0u(zQV_rpqjM{VF;Sc3;tz=QBS9#R1h zzz+Na?8868VSEq%qVNzNfs^>53i=Uzg#&O);oEqW)dK#R`Qb4(4UenDgKQ>#!jf@_ z+3^I+#=o*$Jk84S46DYo>|uqM<7cc5KWD$dVb+Nw?0G!TUc|q#9e9ED;zjlr{+%7d zOYD98k~UTB=Xi~ZD@!=uq?am7Ietr*E2}vEKzUWA+~P^kRaJ3|FJ09;f6A;@U6AUc zsJ}XqzIFJKt2%=G7bb8^B+Xl>OmXy#UgBwFq2LxlzBO~X#YC=}+1#R*uila^HHlu9 zB$#ALrsFjaa?wH2wdzySL1lHpw4yftF6FT)B-rz-Z8pf3NhOu#7IX+SG zqR_@WM#tSdwl$9VuZ+XgrZIL+6YAdHrVKC95#YoAM9(&dP^}|CXM>tE^fJF$>Sa~4 d@zDE5%Z=u8KUofwZ08`vHVomm5n8Z#=zsVjw_5-J diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$TransactionConfidence$1.class b/core/out/production/classes/org/pivxj/wallet/Protos$TransactionConfidence$1.class index b9dd9d962a8bcf03697bed10327e9e8da0bca01b..3ab8abc815f6ae47dc456d141ca124a23d2d3364 100644 GIT binary patch delta 28 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 delta 140 zcmV;70CWGt9>X56nhOFVm6MzcE&?KzlgtY{0wS}M2@GHoBDMe=BDVk_BDeq~BDnx4 zBD#}%3`PPXz>~uaKLR4mlLQSq0wU0pKn+F$BGi+J4M7Sb+W-n8+yE3J-;>h~Q4S*I u00tuF01G1L01+bSlQIse79yGe4Y diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$TransactionConfidence$Source$1.class b/core/out/production/classes/org/pivxj/wallet/Protos$TransactionConfidence$Source$1.class index 4f3fd6e7a941bbac48db96a0657b7acd63924fa5..d4fb7dbfef5c1b90ce53f2d4c0a9ddd690c8fb07 100644 GIT binary patch delta 28 hcmZ3^xtw#uA!a5O(aA@ct(jEBCo{6Rfq0%QaR7I52RZ-% delta 28 hcmZ3^xtw#uA!a6}%*jWXt(lavCo{6Rfq0%QaR7qz2rvKu diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$TransactionConfidence$Source.class b/core/out/production/classes/org/pivxj/wallet/Protos$TransactionConfidence$Source.class index 1febf36da8e00d9d56294c90ed1bfdec8adb0ec0..1a65df0e2d2aaac9d8561cd64b289ae269556d88 100644 GIT binary patch delta 140 zcmcaBcUNx17H%fxbCb7m>w&0e+}2DgER&Ua5`r%Dlc(~y zF)5`^zRP3Jq*ORrj@ODwsdRD_FHo>@@*-YGE~N$rE~Q2W5v7*NZ+Qdxl)4z$l)4$X qm3kNim3k-p@U0Y6(q`aSGG>rdvS!d#QetpZ%3ugks+r8q9|Qmvgdzt3 diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$TransactionConfidence$Type$1.class b/core/out/production/classes/org/pivxj/wallet/Protos$TransactionConfidence$Type$1.class index 306ebfbb71e31283c67a77146c7782cbee4354b7..4c177c8ec597072989e7a3ac8a041c3e2389d94d 100644 GIT binary patch delta 28 icmbQuIh%9CHfAQ}d6RcATQeyynEaL54aBo$i30$SfeDEK delta 28 icmbQuIh%9CHfAQpPm^~rTQezsnf#U64aBo$i30$e0}6it diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$TransactionConfidence$Type.class b/core/out/production/classes/org/pivxj/wallet/Protos$TransactionConfidence$Type.class index c6834f23b5f28b9c086171776c1c3494fd582dec..641be8b1d61802cdee880c6eceb9d446dcf625d6 100644 GIT binary patch delta 164 zcmWm6I}1T^90uUG|6n-IIVhWwyb|TeK*=Qxlw_bRlJXI3K7m0wEI# z3W{ra8yUroM9qrgPWom^;}IH9@bWAdvtjZI2XAol4i6vVbG?GJ;9?4X=3%k?i|eSd Pg*HPNa)l`m5_UJg(g-Wq delta 164 zcmeyN@Izrk3=flH#pF01JrLE$W6h*^Z}MrL3OU7x3>u1$7<3dLGZ-j7VK7mA%3z`R zjKN0nIfH}Zi^+++o=l4GCa>YOXHxt%`7N&%lj6V0ntX0dN=%ar`5d{FI2pKs$&j0`b diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$TransactionConfidence.class b/core/out/production/classes/org/pivxj/wallet/Protos$TransactionConfidence.class index 509fd1c15ea84d4005fcc3f2fc8fae8fc9ad18d8..70c8b7483549737540f76e0375a43da172ffd376 100644 GIT binary patch delta 1395 zcmZ9LdrZ}37{|Zw>jh;7%Hgh|KELyDF>dF=)f*s!o6GCMGIfcNtyX!-VwO_kYG@1f zDQyaw%ES?%a-3M+B1_vW!={lr!*n!slPs+?MSIUt#QN*|{eFJm_j!JMf9Eu9n^(MevEAWJlPTea ze(4WYJHi9~GQ7F!-qD1Jl76n_|9~X8-MmT&rA#y;d%kjUl$;k@Yl4WyBWn`pw zIX(L#8~x34gC8t+qhp^Xa|C+77$m%2uG2dX<3bbm|hAgh;-u=;rX9R*5T{iM*D+RNuIQ^aA21;Kv0Rz%yXuClSt1VJOdpou9^IJPS^qEho|! zM)Nb~r!?2p3K7Ib7{bMf;b#%g^O0z>o1aGpzu+m(NK}(}f$1(pATPpTeg(`+Oy@PE za|yC}DIVw7QNYVk%*#|wlQ7*>`Ugh~EbEYcg_sq-+ zvwtlDc%6AoK@`7_XkL$G-hfp85F>db#`7jj>%Dd3Ujkv@fbn+h50+7!}6=~k@yEWJ7OwG;m z@@RAW$K>$n8Jdqv_!yH;%5!5(IxWrKbXEq9HL1;{p;A6JNprg)adL5NqUOtD%QBs- zGS4g5#FG`P`MR9T8l(9yc{JO6{Tse*FJ>q8*k>mN6vi-k+PiV zdn8Q0$g$tE!E!q%rrTzWyKil>WZVcZ-7>DwD}8c($&owNn|>c3Ayv7F-S*cWn>79b xE$Ok%-8R4b$n?Aiy~-Zjo)_;e*zz;IGC4mhzzTwY+%Sa14aeX(lB)cT{{qx#r1k&+ delta 1395 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 diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$TransactionInputOrBuilder.class b/core/out/production/classes/org/pivxj/wallet/Protos$TransactionInputOrBuilder.class index 602edbb122d21e7fbd61732b7f0bdf734d38ff0b..211e3a7590f5961841f5ea7aa334c5dbf6983c24 100644 GIT binary patch delta 200 zcmcc1($6M&>ff$?3=9m$4D##@lI#pJ>ff$?3=9m$4ASfjqU;P3>?7|FD*(=b<502 zWn|zED9SI%FV@RSEK6i(kYZ#ooSeWUKKUNwGDfb+txN$@3``6{K;xJggc-zvG#3LS L5Q;E}v2g+b6ZIEO diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$TransactionOutput$1.class b/core/out/production/classes/org/pivxj/wallet/Protos$TransactionOutput$1.class index f4dedf44f427dc83148c1a1a783be39f20958c86..5659b2b91dc94b4af33fd7aa38fdcca7d3b94add 100644 GIT binary patch delta 28 hcmaFL^^|KvHVc#ds>!)5j!g3FCvRYh2Jv`VBLI@T2}l3{ delta 28 hcmaFL^^|KvHVc#Nzsb2Qj!bgQlQ*zLgLu5G5de})2|oY; diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$TransactionOutput$Builder.class b/core/out/production/classes/org/pivxj/wallet/Protos$TransactionOutput$Builder.class index 136a8387b44609848e8692cdfd00ff5423d5dbcc..1b4faf0af4e4efce71062c16edea7216b343eb90 100644 GIT binary patch delta 986 zcmYk3TS(J!6vxm0G)2?7wzjpY?Hrx|{kN%Yri5ByVAEMz37HTDQjrA}WH)*!=!Q>$ zoSurJhi>Xail|*ksI(g-p+ROzg{fI|r^`cOXRFPg&iQ@M`Fzhg{Dy0XYujEX>lSpp zN`9y}=KK9RNUGbgVN*kcE8s8S9`jXQA@7?#$$sm6YlWxczj7eYpQnRu8kgw3{Mb@u zogaS3=sIWJP4RUGn!{;w5uG*}-g3ZCPo_IZie4Dr|k68V6=(u9{`2Casf)CeYQ z11q-kh`q{$ouC&vNn|s2fepKPk)tdQuRJkO}xiz&&!9kt~hbNqw7Bb*7;h#eij=(H@!TZyC zf;cL6uOS7;L>h-VI3c!^kcDp{8{dH+-;4DJD8Y|Vil3npzd#Lsg|+w%HsW{Kia%gG z{^SGc2Mzd34*m^BoB}I>oMGdPxyQVuhXjfPBgKQA5&$U?Jd^}}N`^v8ff6!8h)hsT zW*(SZXCfQKlU`Pppg%Jq6I`Nq5w}h&nZ;I zb(zS0s47&#?{S%df{;jMkV55PrVt0I#y~6ND^`l%D)Fo4778k~KEjzYgsbPGj5Su; zDSy@=pR-#o+5@SySBCE6iy0dYbV&HaV4)*&)ls%*3g0BWgj3v{DeQS+F9>@{*k)l{ zgl!d8^POZaZ#uW+NQT%leba0%bfj;!Sd8j^;mvf!{R_>6aD$SGRPt0>mG@b5?Di%g>tZ&_PdeR#+8l6_r7wIkcm4@dY_j$wNn(yo%-17{x delta 976 zcmYk3T}abm6vmH#o#xkE(`|0*o_}-x_hoJ~DV=3nI-9BVg?&*pw6ww`)_2J?A~|JGo_Y%e8m8DOES$ z=RVaLf`LE^cgJGRV4#xk=HE(L%7+U+EeKQxDpSbs=6apiQrqHbnQyF_J?o91 z@e5OXYCzBqQ=K8=iOjPFD{sck&lJV}gPW}WEc-NN*k?#84_MobNToE4Q8wO?5ou(G zj^A3_jmRXO$T=eCBa1A^<`uT)bmUSx@_1Ow=Mh_#f`$Ct)~CTFW;12MLM9YaF|6c* zjVe$?H7KS!lu!hA?kQ?e;NYu8Aq6h}I9q&NS{%{CFML3T1!*CcaDVaLFqTPNHRYj3 zq!1ONR$^CB8S1DUD=B~miC#tZSWS&+qBex71I@G@5$Zwwc690SQutT$4HL4}YqpjO|3P>uUwN!l*q_4w685*S)56XO`$t$e*EyH#)lAA( zv&f`olU2>(Q_eMtTFB$hu%bHHR@SOl%f+ym3~B`xsD3_F)}dExL<)&iE7EeFD63WM z-+9<$Vy~tp+HTDqZ?$l|xGnrmb0!XbuB5NW_1_1+KBs<3v=(0MPGUW7*T1mjz$tf< tF83re_a@poUqUgl>P`A~%(Z8{$)Kq@RrSTaYkZBfbBBE1*>c-={x1al{WSmp diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$TransactionOutput.class b/core/out/production/classes/org/pivxj/wallet/Protos$TransactionOutput.class index 64c5c95fd8f84832575df288454f0533d4fdbbda..cdae7a5fdfe3d82f0b09592a51f4bc3dd6cbf5a8 100644 GIT binary patch delta 891 zcmYk4YfQ~?7{|Z=AHva2os;BHJxPhr7d9@@+=06xeEH zlRaA=+N>&=B}2BB*z7=-fyj01*M}P$Q-Z-9bM(t=n^(H+QAVi0&;B7IIwuhLPYQ(k zFFD?iF=q6iO1NRzX(`5W3@khYQB;LES|+Qg!Ai?9R^y2p>n<;7o}y|=YaPTxF@^mmKAe|H8WrB~L$mS&Znbzm#bggF~id}kx2TAOOhkXdKAB7x58E2u2 zbFi92@;LoL3Fm4(PjAnMl?(JIg?jsJB=a0(a*^IT7c;pSMO=bXo{tJ%fNCzoT3(0^ zT!HOeiAG)|uQHY^UNL-?GFP7B8ae2yR9q|1T`LuD6u(lrv};QA^G9sC^tzG}>;AkE3;-t!-VtUQ~0yA#AU~{ delta 881 zcmYk4d2EbP6vfZ?P*l^JDXEFx+o3h>ES>pglvvvSVW~zCf(VLe4MD6;CDvME55cvz zc8N6-Qn3Xk_S#~JBDKd_MPio-?<-CHbJMBb09)(C=iWu63INB|P5++8|9@N#ip~l+Fy@W1`_6s{x6djaoXGcXxWm0Nv z$$DoGqmWMi7d{0$m7)oqfrHK>p3b2KokucVKn`8PFuIIfx`GLG4Fz-yg>)MW=?<1q zIabp>Y^3|xLKWCU4{?wl;SfDVDLunQdWkZs!fkqwa{7P=^a>U98qetsVqef(R8l3r zQk7xQd!qq;lqoH*Df%Q`69bX-9rfu4w92f+4vHJf@x)$=VvOR>Y6L&8a|6}zO! zB4#!DVv!8-w9=$oHJRV4jpBZC!XiVfNt`R)&bfMld5Gc>h~+Sv@kj}~#(H?P#$z-d z3pnPuD&VPuKAoh~b&KLm^u7Y+UNM%`5ejRl2(%k=G!V*Xpk8(2h5t6Bi+yi_w!eVIXhD zFy4X@yba@dJMwvlJW1)VcyIM6-Q9XK2V{X;Z|1Pvbq`Q{Tml|lot8q6uFlCEZ-RXD z1QeIaO|M(}c>Rj6YpOGMG|`#+;_>O~u}rh%nUwib6hD{GzD&h0BrUb0;#c~&P7(Z0 zUtEKUx;*eMpI`OGdxXM<%<<$s1UrK|Eg82mp`W2?GEC delta 28 hcmaFL^^|KvHVc!@iOIPvj!ZUZCvRYh2Jv`VBLJIU3Hbm3 diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$TransactionSigner$Builder.class b/core/out/production/classes/org/pivxj/wallet/Protos$TransactionSigner$Builder.class index 52824accdeb129bd5b014833ebb77ce5a9faa0ea..d841b5b705b0e022f2a83cd75acb51b2a03ddf96 100644 GIT binary patch delta 892 zcmYL_Ur1AN6vxl5Zqi(H&fPn=Ij8e(ZvM%uE_3#9e*M8BG)Tlh{R2@mi-?f^SU8X# zA}xA2{WU5DqX;U?tcQr+#3n@|LA{7Y4=NTRJzHniwx@IM_xJgJ&p9{R7;PN;YBGi^ zG%XEQb7oxtbB}0`~p@Tj2 z(N;=BHchvQrfm^JbxbT{v4qaa4rbVnvCr{IxhO@#7Fx+JGvWbA!-K$;iXC-UY=>0* z1V#~tOzZ#|JL#gM-iqCzXE~i^D;@y_kJ5r;hXId)0gqF^nngREAqh`V#JO9+lMJ7N zbUe-A8E|7S1n?|A5Rp#zFR60ux^5xmW17i#8zfR#zbd zud#F;vhfDw;4Sds5R~9;(C`j~@h%|VgKaoW6FGfm9OYx~g9RV(+lIn zPr->};KgU)$8jjd7f^*S+5L)^-AzV(&CWNBzNNZc^5Y~(IK{5_V8ai5!aML_l+T!k zV%Ex8tHBx4dqyRkqY-Z&O?!6b;sPJB$VV*k#>>3I4|e|KnZH2A6{^e|bmA%_f50RF zEJ6o1kpd2p3NB%w&w0IyutKWH;%6BYp|ETRkI1I3{0_75^6xJIS*Yyr(U<&YMQBWy zGhNAai0O??S5d9ERT5iyt6E9a(V~~ZCI*`sY-MmSgZmiVPfZ0Jdx&GZIQB5dcGFbB zW(gapzfdNp>W{b0YGAEZYuAe3PV=f7e{}g0T#N5N=b@3LIu~#4N~5b6 zBDzwDE;^bb9W5e?(u&H9ilDTD)J|kx6h-vT+IIE6|L6NX&-4Ai@y7ASp=rIYydo6R z!XFhh@Kd#wr_v0ZVoV-!FB?@G%0eL(=-b-cw|91Wi^^B>d(#P35qGD~X-Y!HD%iwN z%msYX98#6?gt1a-OZugqIgV8kn6!K>V7t2f~os6|c^*@QR2inn;iwoZe$L4$X=*PF`g?WGFd1|O_y_{{nBUrK6nw@$N2P+#xh*nY$*}OSqcj=ch-V7)I4!;Jc)`KT@q^rI z22yZVq&Y~(kKn}5;KMJFk6$5#-=G5Lp$fmlT3p~!XLmCGke~Sp2K*(>zq#7g?;#Z| zB?SzW0Cq|Q52?XVS}33;P)0haq9p$0YSK{(XvrvOD%WMOpX{KJQ(ReKCJ(sC1#ZfK z0J$Mgv?9?e$;WEi=&HQW;I*s zpwNeeJ}mSRq5FjH=dh<$q2qF^utEbo>k;sbfM*3fFW?0MFA6xsP1zEAO=7Q0> zuVjW0yZ>Yw_p& y3yT#_`eSZqPAs!Ey2iPvVqrrd#?{By{y;2fGOikei)?wYHqzS@%#DmQ!GXV-%lpy* diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$TransactionSigner.class b/core/out/production/classes/org/pivxj/wallet/Protos$TransactionSigner.class index 9fb93aefdebd9406d329f16cb4ae155a43acacb9..9c4b75da9771132b6b2283c4b1580b42f489aec2 100644 GIT binary patch delta 838 zcmYk4TS!!K5XQ%UskE88mYQw4UUuDG*S%y>Uh+H3rYWN4B``>{&5R;S%X;X3c`+~{ zn1_n8tmvsyX)A~x4C*109xSn_$byWbh@z{N(i|_;)6DOiZ{~kyIBkKpKu>FQ*dnht zgi1NZ6vqc6=kl%SjPS+YtPrZS^Q#Ca#~T-fFVT6+1n)MMg=g#Rncxv)l=x+YHqOD^ znBQU1Il2%LXlQ6`X|XKG@dgVM`lhLztYA!HYe)>N6p8^d;3GvLo#J8ROG(X&IZt6paL{ZIIe?}A8S^OypgHhS0{k=|%P0i}WJ4j9qKH_0)y6bPWOO zmHK_D_hSR`zLWulOi&qe)iT%12Xk6%O#d)N+M(?zSXzc3Mdij?1nmC;}(R zh*K1Y4l>~krQ)o7<2mk3Ynz8FV(Ah~H$|gIR=Fyx1jTlp3oRQJ?#Qs^3J>^)rNDrG z3d2L1g-2XytxLk7^gfo}Cvt|T()Wy#@SKwIf~*+g+t$PL@LDXxa_KiT7jNa|cjUx- zT8Ix^o8IBZCnSX3bhme)GID{NRW*&BUl;#n|!CHn}X^XfiLp-_MtA~7! za@v&!&T&F%KHlZbQ<|S|IQ?N-5gD{%9&=VGn7JZTeg!iha>erb%=D>r=wCYDHL1q) zYL{igFxfJj`&}8jGU{5Vhk$#W+TE2py>u5%gar0`+*4_rCsR*vda5GPLIz(m#rn39 L$+w*oyxac*TaWCP delta 838 zcmYk4SxD4T6vn@~)eMQbOm5?pljG=Y&Z4%Ac8-QgjyH?|kRn%jL#eW39t`Q_Mx-unBdN zYtN7!Nm+6`#b+rA7n{)Jk?};oWTqBb<{I2F$=#{-mU#w;Ci#16vd-%j6%!mUv;Hur z%r}h0*0#3xXw+2{SrD(bJ)fc?rE%-*y(TMlVH$goz?Dd*Ze&uAT*%p&M7@}*?djUq zTD*=bMLVR^;Zd|ljyo1Aip5_!Jf`i`_g}CdRyu?tk1iB9kJ%FyV-&v;Ug*oc`t~nCPtIeTzm`3lBNFR_& zACW~CP z#qDDEtWdmOHhVO6%0q*qGTW=EOFF!owrX<7TW?75ZtZxb!WUG$Pda@%b5QOYrC*Z$ z9>s^G)L*XnuypwsDn26D{gq}up+C!j{PH&{ib`Xl{t8jq8AzAYg#~}*>wj`q;E$Ur zs{*dcz@L$sG8XU|&dW^pf|yq$zqerQ1Gveg$fNh8fs3WCrBuNi1hMD Lu$Mm;TX@rN|IF$I diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Wallet$1.class b/core/out/production/classes/org/pivxj/wallet/Protos$Wallet$1.class index 60c56597c84a6d28373db7918b69f15beeb6d04e..467b34638d3f152c439a5893f029e82b655445be 100644 GIT binary patch delta 28 hcmZ3?wU}#zCJU2O-(+nTM<%Dqlk-@jLA=u}5deFM2+#lk delta 28 hcmZ3?wU}#zCJU3pqsiJVj!X{EC+D$5gLtP|A^?XA3B~{b diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Wallet$Builder.class b/core/out/production/classes/org/pivxj/wallet/Protos$Wallet$Builder.class index 9aab53486c5cab46300d3935f0ed44b505eae6c9..ff5a5af45b4ce803c86569f6d5980318e6054519 100644 GIT binary patch delta 5911 zcmY*cd0bW1_Fw1ROW*}BqH++F%M5~oOb$4UviChRPB?{uB&b=xm!^nHIHcl~)eg-u z=W^Dt9C8A&)N<%mA7Az=?e$)-Qp@ta%xCq!ocdMoAJ}JoziaKa)_3iF&i%(K*FRRd z_MgaiWoKsBH{|aPX_c3mDN#siS=sohQxmf@GewR4iIgiIDt!NeZkgEM{c&gMxNJF|xdH9eO-Mx@n>T=4>XL0(@3TWW!y7ESQG^yY%s#MM%Xq8 z8;P({2pfyAaR{4&uo(#36=8cKY%hczfUq24{RnFztc|e4S$i7AI*7aDCdD%!J-}ip zn8i{n7DwSMo}yR+#jr$5WJ#3DQbh5g2(h*-Q)a347s~cYH7uP1SO#3Wkis%4nq^T( zmQCp_hkCGF>chH{pLHXfb*CcMgC1r*=@HhOrm#L##ro1B)}Nkc`BcXS(mFPXb}~i> zn4biY?#zNf)zA?J;zQ-8(D+2i#1AzSd(;`y&+vEU_P*SUU6DEaK(^S`4)TNSL%D+eRi4T|MmMg>OWCLLv+Qqj z9s5j-dE^Bz`zNOU3k=Oyn1UPi(&W$GHS9LEVBf;_9fs%*#j}4=GW#BrahJNWdzg&> z5Mw{0SwB$`Co1L=P2@67<1VV^Zd%G8pcOoj*7Fv$m50!N-ja@TFE#K`dV{y3i#&`z z;H~K@Z$sC4Te`&+y2qm=iMN+p@(xl>B#)NjxKHZBW2GD(Ck@~UlAk9_!+44`mUooK z^HgaPPm`wbPEs}REIrB7r3E}gdX8sG8+fj?jdzs}@NUv^-d#Gwdr0r{p3)WGOZq$S zBi-QrrMrB9Ec1N11s^DT`5;;01#%o`ay;j9D)-mO-MA*_b4ymaEf3*?|W>dPx#oYz#jEI!jUn$L2T z^VzP)c(tpV*SO~LIj$9ao@*sv;M&X=x_0wLu6kbUI?NZlPVptKxA{`n1-{Jn9$)Ud z&R4i@a^bqepLY|lbBFMi?zViDJAtour|>oIu6&)lH-FLX=NsKa_$K!#zS%vNZ*iCN zt?nrb-{zjmx4UQZm)wi^4!7WY-0S$>`g>FUEY^QX_=nWUKcXhA&+}_iA0qNoAPIfi_sRTok~wCU-=ensYl`MyQVjo!I`SLT z3AQZQdh&0@gy~yl{QhSge#29B4A#rq8gx?pjmh++Z3w~rq1e6(SK#6sGC=! zsG|Xo0sJ7~V!#hkx>_nOtxOOZ^NSR90^o^&Ct;JxNcS;R^e3_DRGMg-k4mNkt|YHI z1Kw5eo<%8YwUAzj5f47)SJe4{pMv)SQq+YMt=3YKx@g z6ZH$zWc8S6cqUTZT{u=z8$fJCPu`$p^-b!co`neKMdn&tyuQfrs+TE5eTUkse+K-X zqkT>-cKrxmA7j^R&aNwK`+3yQVfrV9sb4zU|5yv{Z^QI0(!JxP`}ksLe;=kFQR`3C zMk9*QBuda^O4Hnwt3BXoAGD-Q(OOcV=A~dQl%lj&_%>=y8CqLtU+dGN0JR6y0TFzN z5JT}=ETwAkl&vK?y7yZ;!KZZstutuppmhN)6SOSQawtdZ>gfLY(o#k14O$=2`ckCU z406Jv`cTFbN9P>Kp~WT#@V1){$FV5A! zcAN2BKaX|=roT{_b`^S;c(m(y{1hpE=A<}OjPPkUV7iI=ZlOEhK!V%o&bQF|4z~NZ zqxF{pUHTEUpFsPWqI9A-UB)-C+d1b8pC9kjJrt-1Q?MRFZFDb1=(xP~R+Or@rfj{f zqjy~01fSj>v<{#}gBAl?ENF3{B~Xr@5umkH0B0+0SY1?Y7Yq(ATITe&7p*4H`b`q-MWioOZN&FH~){8)L3 zy67)cuD%l**UI`UV$-G=@xj^@SwAe~b)yvh1R|fL5WRug>5a(pG-PNJkFOi&)z8EH z7Rr7bJ-r~VuhV4xisNsr&-3WG2lS7@xF%MtpXSqX2k8GqwO_#DE5y1%G5Rg)sDFda zZ;SX1vlRUBJaC z$V7%w;-igbl#vHhPikrOrZA%q0`w)H(T@_00bE~3eKy=^(`eHVEUYgU43E90v z*~Ys#I*}rOdxg)q3fhOD{S~y2LHh)>YoL8fImTx=Itk*-?Inuw6=*j=y9tSIQLOO| zbvC{gB`;Me#t(q*0s0T1`+$C;bd$u_fXqM&G=nJEY(Z_zV2UzZQi2(Zqti+3c)3h5 z!vQPgH6sAEqc}5)I+`8OycjWHhd4_1_ z&U}yA9mF0KZZ?0IrHI8l^E~DNnDQyq9ON|q*3KM{sgv8po8Ht#r(Fdeb0`Iv!zjoc ziW3wgR_{uc%`rGZ?ZjVql`3Wlh^3Thjz>!6lx0>>H*=zR`lu~7@6MCWX&94O@#AjI zXVxIj911b#QkXd(nLdR~7f`&p2;PhFjj4*gd-9{qI?z^vwu)MrFHl=^4Mm!3slB-# z-O~P&Z%VNGP@2_`a;*W*P_z1RiiOM8 z!ewh|6lLiYXPJ~?+0Ia3t1tIi!vPlo9)T#M5M?yQTVs%AF=bm1IYV82u)=5I-D_2V zHUYFrpgjWGWY8X?9P3ZcP$#`wqF9xn%>b>6BCVMeYt5$4){_`&G`tyJ0C*wbMSyDo zFQIg683sE+n6DKnmH_-b;5uxw3hAy!MQfem{_M3f#ljtIZAK%v0NRR5wo^yzWi+!w zvGxMm2haVaSO?JOdP=fh#d{%DxDKbw)-h+Y2OmZwPlMTnMxJpR*>pJ1W8rOV;caX+ zzm4NX>X96eb%os4Utqo>%8wLytWPMwx<*0PC(dNQcO+G|K6fTN;%KR2-2m|>C0e(U z&$pCieMjA_e_^sWc&+~+-TTPrN3`na-*g}OdJm5sLVU5~xq*JI;b%x+I% zcC@2={IPtG-4Ui#3b#8s>DC<^>9e7`4c%?%ZbNq)y4%p*hVFK=?h6zfhtkI9w{20B zZBv{*m@@34j^<~Nm;3Buz+(YFgb1aGFplEwGD@|_Q?^|J&FA>+DWFURvbnf6niz`HGtOwUI%ysrP~`Ft-GEo zQfyqwHm+nFSF*hiX&yio_0alh#Xb(`1bOX~FrPy9jnvU@axSrl8~loW5%48=UM9tU zhobFwDan4{(fX@~blJWJtxG*Nu2=g88h6ua-0sFakBw{9zK4$AN5_YI3IoYq7({`E zfx#K>K}w>;!c^*5m_}KJov2%3x^r`#X-bos zOWbbi)%>sYT!bh%lia-AcrHdPJCoA9eDuu-@%EX-Uw9Fs#T(ADnakezl^Z8k{9?V` z6fVyHVr^aqzUdGg?wd)!1p95LhF`#q=i-Ft?62X&MZsCerP+Jl@5__FFYo`p%scmM g_&&d+T=4%n{&dcXmw0|qvt`ox<|6A?o-dUC3+wFyf&c&j delta 5933 zcmY*dd0DXcmO=G9Egr3G$ zyN23nw01>l?b>NOMvGxOT`;trpD8t6eot;Yoz6dU?)yCNbKdhl=bU>#Uo3ZhvD~%i zSb-}mFR%VY!LH!Yj+vPP1(%kU4X>z3%F64+t9$-c$l}lR`nXX}X0|{I7m}iRTwx#| z)H_Sa<%@b(2pzak*g@!se^YpIp%R$csexJW8}oc&yX4Hy4YB_SXJ_X9&tq0*!{hYd zGA{Rt;@^Y^^5Q;bqpSvK((j;!Jg`rTroTyLFcT3IAMh(Bq%*y$n$L#F?dCcPJMLr%<6vCe_ z@`~BH^~;OOJfd98e<*41k%v;CTt@iIJCxQG$|K3G801lQQJ9)V&D3m))Z!^hOQ2Xi zjNxXPl$o7-R&_H=Ce>8Md zf;^rY$rThNPoPkFB8AJ7C|aIOvGNp3k}D}qp2my!NAOq6GDW$n{$kl~p<13n0rE_w z%pysiO)>HuYAw&Dba@_imgiGf`9;#?m#C+_fQsaWG)!Jhe~_2ZczG#R$}iJA`4w6$ zFQZy{Ijxpg&^CD$?Uh&40eKCblGoCCc^!Q$Z=mb)Cb})ZM)&19dMs}i1bK_lSbkmT z6d`XDeDV$P!&`4gginxAd>bCw5;(7p0SEa(yi%aD1^vA3)L-|Afz&v zkj>meC)P;FXMuvr8VkLcN9fOjgfiAt7|%k4Di$itWX*&Hthw+qYay&>;lg$%3Hw>3 z@D7U>F0)p`CoD#|$zp}uEKYd9;)Ta7QFO5+(ZiC(NR}cdvQ)7>OB1`WwxY_?ML)}E zB@Slo#Stu1tYFz1mT z#8irA8YM8DQkY5U%%YCWPhDA0Qdn=YSs@j%zEsTm(X*_GCbIri#Rkv<_B7S7L9~Vy z(`&4R_OMbq#D>xdRz~l#VRVTNr>m@-K4By178^=oe=s})7IOl-oIi(a-ul-No!o~;rS*sEe1 zTU{-7WNXC&wo%mCCb5v!i38bYaVUFTe3oq$$FuEXCEFp+VLQ>tUE)f%TYR1E6?d>V z#6xVKc!KR0FR}yT6?Ra(!48R^vBTnBc0_#0j*5@iG4W^iwkw#Oa7D7yu2}Z2t1Wxa zmBY@sI_gWK_K~ZG{n@pQU3G0_pSX6g zPhIuwn(F|&?mEtHxGu22x-PPtu8-I)*Ddy$>mK{k^?-flCU)B$%JG)YNZhcDvha$;-ThB5c!m*6o+w&5=xm$7I^%N5TapTtdQSB)pG=51fSer(%jvF~v1ZaUE0K;BBWVqH@R4 z;M1V-fFGV_dX=B>#`>8;RKlx8;4Pjn@~S};qy|%{+LT(TUOwe{O;ja*@_9v6TX9d7 zJ&cXr9^&m`f#860^n-E z)1fjGDzhj-olR-#T*_AGbL&_nFP<^dr`CYB1hl1~anN1?troQ9l%uZXcaA0SfSIL| zx*oI*plzfmbrZ#@b<|GX!t<9!@!FXslDZ4>FS&O^0GvpF{?;Yj{rUj z_!uTRj&e_8MW^_N<8Anf>ZS|~rUB#J+pJ4DjLL6j&#i>4HSqpbZ7B z4Btn?C|)b43~eO5pYPK~0~!NpEEL8=p#sHEpfqg~WouI$-@7ju>C>t~n-1Cx&}M-) z8?-r~&7&OcMaTCq7nDlc63~`{_A)-kIK^qT)J|LO_&#}IiKMLsybkbsz#9N>qI9j! z@jY}=k)-Vayc6&)OtJ^1zJb;3b9~>t2&*^*_%M03Bgj6A?6)aZJK^}=ZLub4?*Tr8 z?6V|k=O{+IK*`!A$M;im`1m7o1dH@CLjVM9K?X3q)C0$fL(2BY{HnBxklMFL(FoZ4qimVR{DqF7fCc@Ys>U_0CR-eRzML zo{vxu3epRxxh_+L&L~k=sEw{+I>Yh$4lk4R-k=qN)`z0?zW5FC?x6HWsvTpjCi20knyrO{N^Z(((IjZKZP z=oi4ehz4Fl1JTbvk1Fe?NR`_$5L}6jv|bBervTM8f~3?YfYZVz&&7OgOST?)=cynxC4wQ zDah!GgznJFr&yzaS{pKcDKVa~cA8{Zpx6{*_(?K)QG!v3Up#$y{n`yF#y~(%QM(#&GIql=G?UCQHV1p#G7(#%KyR#-iZylx9@$!1aSXMkUIb zN}Ox);4^-vK$9rQ z6sWoBq6pJXiDm$`F#{>rY=Wbc$b;&JN@gf%VW2gmXtO!Ro8gpUM&Rfq@VdHkpBV$# z2N?dD@lZ*i1T&G+%w)ItY9ph8MF`|__Fph18J11g62GbpnZD=EX# zY0J01UM88(0v<(P^ACWY!wN=IYjZ4`7t4EW)g*Hg;K|6ILXufYG3GQ%Hmh)aibQiZ zj!rC>wiS5H1z;_taI@j7ES0~wEze`tBD9P`%oR@8?{CZTnCr-G;x%us<88MykGX{c z%-5;0xdq23map8NCYrl(d?NX^?WK~r55zYq$vlX94pEkQm^zwA`Qk%8`Nkc2qInj3 zB#!^M!|<6OLgyn2Hb15?^9suR3(CBT4t|R4>-fOb`L3M>(dKQ??tpfeLd}0r3-dl& z^)6z@Fxnkh$1b4Vl0v3Ef-E<6yLYY@>)#+c}cQDDB23;-rWNw zt0lRuRtWo$5sQpCWW*yQlGpBLqSfB1@`v3iqSb{b?XkU<3bICFmQLZ8f!*BSYZW2X zAE5yV4dj2{Q{uIrA+J>exl&5A%6{F+fqd-V&K?T~&-x>USYw>Nezdon$AU-JWC&DZ zH~aV#Zxnbe+_KgT=*@Br+4;r*p9PPsg%o5hqUKf&MOaHH(OODvEKa#rt+S(*`k|7A zo7TcjYpum1*I_jqD8t(1?C6{Ik`FT?^8SLPuS6DcmsSD@F##j z1$+(g4NA9eVpk_}`>i6$`V#P0fNx`xyD0Y_R`j*Av;Y29nPlMtw!T9n9|C%Wl{}`_ z)(>dr2+0;H&~{Of?Iy_%pcp%llI_rw-(K zY`ltXyo&9HS8)PQJDB6K+mhREhj3e7evoe<39G|KK8pP+8;oP{y=!WSn`JfYDQjvbA($^ykDZ$e*E^p4L0nA7Vb{~ zoQTXMlKjaO<4>hzKVQ4G4ZnK=|51|*t4lq8T&@0m3itPL`nKa_p2v?X)$gYee=jt= zpT|Fl-2TA`4dVWHn8!bY0{kPXv3~?C)gb>0 zTwJG5wGrk1{M%Dq8vc}?jo|EbO2csd*;u~tbZW!!kMBkB3#XHQ;YIK!?>fTFLA$#V3hj0IP n_``pPd1rr>@A^y0>_0XBbk@;JIwv+YbHnI$tRfIKs*7KH~@^i2#f## diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Wallet$EncryptionType.class b/core/out/production/classes/org/pivxj/wallet/Protos$Wallet$EncryptionType.class index fd95a2a70ec44def650b157c6d7cdd2425c3c9fd..5e84e4f9914295ce8638c1707ee8059cd501bbac 100644 GIT binary patch delta 132 zcmV-~0DJ$E9g-ce3kw25r;`l}E&@WQlRXPN0z%D`dJ9|*LeKylLeT&qLec;vLerDv z3q=A#*^?^_KLSGKlWYt+0z&DNs0>B|LhY0A3_%J)^Z*J%^#Bw?_>(&gQ4T`>00u(; m01HC^01-n0lbQ{b5<;*54??&A9zv%8F+$t`J3{c2Kn_w0mMTR6 delta 132 zcmWl~F%AJi6b9fw6H)A&86iq5B#S}_C6kT$6NE%#(K&(>IL1De6DS?Z0rcC5uldTf zOy43VR_bK>FPC80*SlOjGjupWk3(b}=|?t(6CK-?;X-eAX_)KFZVjnl%Y-{5+@sBd h26yx+?Op+SpotT5*cfoqMv_yM0aAGH7g diff --git a/core/out/production/classes/org/pivxj/wallet/Protos$Wallet.class b/core/out/production/classes/org/pivxj/wallet/Protos$Wallet.class index f597f885f0a37ca26d4f88dca009ac4fd64e59c9..18a96045cf4ab21e79df8cd5110d45c2d52384bb 100644 GIT binary patch delta 2776 zcmY+Gd0bT2701uLZv-SLyKJ&=g47v?#Rb&7^WFhOKtL>RAOk3ixG%Uw;1jLlzT7r3 z)|eWTMr~_o$HdgeYHLl>MABMQV-}M}6F+L)YD`_Cr1w2x(0}HBf9L$px#!-`n|X8a z96NZ9by%ZWy0Ar8uuQQjy4-E3&CZ}&9E*zFke?x{8-k7oXA zOo}Bn)n*qI7scAl(9PJ8Z3Epzl)I1E7@O^uZkQK$XB?s>F3Xxa+=zKOYHFr0SP*Bo zoBevFZ1-5!mMQ)er}I>sVDac{m>)}~rivr+;oeUM?c#Uw5iCQTj2~!h^|;@j`J}Wx zDTg|*#1HD{^JI<9=8Q?x`*_%G<~F55%^V;)J%fdHh@11}VeQ;c{Q&w915auKZ}lVu zshuJ_Yi@t_L$JtjUm2Dx4rl3H{nxhaL0ml}lC!h8dQO}w@OLiDZnw0m=O6Q406+C> z2v9FVhJy#k5qw{TFs28Yz^a9F(w@2a<;Q@sPH)w^&`y$2W6`*2Zx2shO( zxU2pMKOkooRG2qfSOB`Q1axOf=*jH(6dQ?N46#2eLvL1&eyp_u{aGyrum%idi!g|_ zVK7^bp=>RNvke%*wqqpQjnS+FW7r!Q%Z_3kdk+)XX-s5iFqwUYgV|+FVOP=0?x2lx zOywS!#zQfkhvQHli^I4Thw}^^!H3~UjyQ_v<7i%p$S0xJ${nclTFm8hFpoFm7`_Y( z_)09~o3MxrEatCb3Ezul+=&zTpYf;sZ#a>k!AblRoXWq(3Vs7C`S)0*xMQv2i8B>{ zY*Hd{wvvc*6g$pSM&f)W4;LyWxJa3b%}O0EQRd?^Wd$x*+HukfWh=HQzra>yJ5E=2 z;0$Fq)+u|iUfG8Y%0b!isBHMYYIIa{Ky44fg!5!CvT*YjC1jiS|e!YlmzG7=mlnAB#2rUfyXam7Z z3kP2<5(a3|5T?aIj1~)tTD*9c)`x1T(qfmEH1N^VAwbK75N)Wm4Ht?eiY<9=q9iYwYiqh? z2G=%Jjg{q{E;)OwG@h2_I@dli{gwh5`HzWZ1@b7D&7%bvOKQcm605- zbx9Q{mJ}v%-D2V!g=t*(H|?H9G8$<{a}69M@zKfKi;}r+b;-^mE7vp3@%_h1%rZBw zF%V63j?3WsIB{iMV}w2l`skCvOP>P1dIb#7r$Lxr1u?n<67?D}zj%G9K1W*SO3OU( z(dR>ez7Rt6Mbg$Rf=ZgWzD72R60erXk%T$jc>{O4#)&PJ)AinUeW{#dpE=zD17DXT z6>Pnp#G38HIgqBkROzjKTM?nsFb>vf?zfU!%_-? z77B$nsaI1tY@`Tyo+4o=$TTHcVt%S`qgYBX^_ItS=q6T)98l8(KcgO)}%K_)e+nfje zX}%nC0ff;)h^58w6KaMuS^~pp8RXJ(D57Uziev}1z+7sDW@>{~lGo9*@Eom_H@6C2 zq1DhqYv2&I!`rkD-lO&K58419(I&V+o8ep90(T{M(KhBqg4OuY&si`%$71Mtd5Z09 z2<>3m^h>7EPL@ZzSQ)*q%Iudr2;*U_)p3-lV>O?%k^$p>jaJ5Il0 zAJA{vS;=3}0d|RAXV<7hxK|$IbV&TYvXIje5j?Gk({WKht(?=l;xC5k6uwnbof3^z zQhh8A8|pKuB8A;y<@A+|B#8}MTyT z&F{p38mk-KldtdlVr)$@S5Jr+YvkMcgxFdeC~njw^k7P@3mbZ{+ZQChsf~N&^A{1* zlMT$DUTrJ~9;r{Kml&#~E=1(a7}A5Ad+}^9M%Q&4av%93#UJbBzXqc^QtM~ delta 2767 zcmY+Gdwfk-7RT4#=Snn_kcfzzXr68&X(}%vNLc5rlZPbtl1L}iD^GcdXArcNd>S;~ zV$YyO6*WVr)sXnmpbVvmM~T6B4q8+dpSCl6rkL6HNG|@l`}ig<`onaRaA73iR$}`jE=I)YQz07*u1=(lL&Bj7mI@voTBZS>8+VO(IdFCo1;s# zTtXyuPvKFqVt03)NA(fRqKVy>jyx(}9Jh2!lyjn98XF@Ay(FV!Uy(5}ugGXoZSj-0 zU1#aWV|q2*we)av@BOkPx^JI`pjf?K`{=&Lm@J|8?jlaObQO_3ofV=E{W(U9(;1!(vl41eRoMF_ zZy)G{@z5Fjff*B^8zw>^4uDV`2#u)1PSl_Yb@&#O;RL2b3ueF-w8Bla!7a>$hnNMA zaVY$be`F@iVI6T8>x^%+5FEk6a5Rg-F)R^tnTGi+8w*$tj%8J&u$UEM2`j}?HVwzI zYAk2-Z~~i;li4Di!d77gTaVLNJx*sku#)Y=8SDtoVlDU%JBPE`b*y4PVl}&mHS7`2 z;T-4k_V@w!!CL-0F66vGV!P~5}TD`Jg!W^lgfK|N~y)+r0L zlvVhZ@)0&E>v6ZT5%(xtaIexR8}5@0kI9BDvf)+P@JHG3H`(wh9yPVcW|Jo#H~Ha7 zQy88y^}^GpL_A~C@od8dZ3N?ZUc~8XHM5Pg0tn zIuY8blfYG-3?6C)bWx{)uR0xq)Jh0dXNvce7W$}jrDdM9d;sohEp%2FfLUEAZHq-{ zatT*g%Vx=3-6TI-UgCaoG*`Eaz!VwTV?<`B#ER7gZX(3$C0bHKxY}%l-BTr=wSOMP zvQ#ILnHtX3ORX}FtJlT4bT4r^HIl2h#kDMd5iv;OeFNVeBugJTO7{+urOzCar$utj zWR$1c(Z#4)Wk(MK@1%ur&Bx&nOAqH-phHebm&Q<8u5;~8!*9xvkzNL7XT)+XQTSQ| z#Fh-%g=ASO*D_=znQK{6d5IZTnHXl^4y&{m8+I3)j8+)Y6g$2v@%hbbZE}8%L!Pk7 zY4eTsJqJr%Y78#0;|c>C2FG!2qqsY`%uo9Q+G$(CRr?Y=v~AEuYXD!Z5rVWG5UTAI zQ-&<`(GE(>H_~zl+_l5dSvvw|?WnXh3-8Qwu3eIi0>q|FxzcT8yBl_V=vXH>OK$h# zS(jwVJ)RodZIwuhT*=1CMMMrw;^gfpTRJqHQ;evd0K8(@5E46a>&12&Y_#qdeIo9}=Y2s7Ur03prE_BdG*NOI=9g zU;>rHOd1cfX#!MBJ&z{CVwwUgsRGu}RQQ-GVKdEu2AT=GXcja{y`SELV>BB=|3Ou7 zk*eXc4BVg^xJPr~5zU1sG!LFp4KvYv_8Ki{$jy0&SJ6_r>@w&`bM(gwM}M%YW6;5hvSuF3NU+6=$a7I;d3 zW6tzB^PsKFpT1;aw2j5lb~cb2nT>X^Jb4z=PUbtEcCq;qmQoY@n0B*m^4v*#**^NZ zVcOgEa=`;~!GrQ?9)b>ZST6Z3_|g#wrep9XHOqJ8IKxHadfnm>mH)(7#r8UMah^P zuKS9=+f|_O$d$?>%5tT8Lp0e{q*VSQCNGlfaWWDn7UlKidOxuzPkKB1*lNMcHXnR#3&er( Gzx*H06?TjO diff --git a/core/out/production/classes/org/pivxj/wallet/Protos.class b/core/out/production/classes/org/pivxj/wallet/Protos.class index 9ac1cca027064cad5dca28b419456217f8b03d88..ab80aa6b34ef56d37ebfc1e6014e1b7239d0384d 100644 GIT binary patch delta 4836 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 delta 43 vcmaFK{gQjbZWcz4$$MCQS-BawMR_JCu!>JsWi?|J0P+NZJTIW^YF0Y{0`Lk^ diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$11.class b/core/out/production/classes/org/pivxj/wallet/Wallet$11.class index 64ce2abae7ab9f27225c3a98c41fd71e41046c0e..7dbd22a7d4e2099df2ce87987dc779c02ca86f6e 100644 GIT binary patch delta 13 UcmaFI_Kt0XEHmSc$#TpA03}ESmH+?% delta 13 UcmaFI_Kt0XEHmSl$#TpA03?(IasU7T diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$3.class b/core/out/production/classes/org/pivxj/wallet/Wallet$3.class index 6d482ba1486f09743dd673c01ef63b623e8537c0..def9a54647241395f4cf2aaa2a095b6eb4a3dac6 100644 GIT binary patch delta 23 fcmaFH@r+}`MP^2i$(NWTS-ly=xqT)Zu$Tb=Xe9?G delta 23 fcmaFH@r+}`MP^2o$(NWTS=AZDxiuymu$Tb=WDy3s diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$4.class b/core/out/production/classes/org/pivxj/wallet/Wallet$4.class index 3ffcee741a0e67c311d53deed0d87aca9eda19aa..ad39562a3f31f99830e924f70d0abb77c6f203c4 100644 GIT binary patch delta 23 ecmZ3L=J$un6JSu+^qxicsKXE6f+Ux^2f delta 23 fcmdnWwUukb3>HSm$un6JSzQ?9xm_p!XE6f+TXhE_ diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$6.class b/core/out/production/classes/org/pivxj/wallet/Wallet$6.class index 167387c6f17b1cce4db1c1cd2270329b464ac248..76ea28046d573beba6b4fcc67999bf25e7101dc4 100644 GIT binary patch delta 23 fcmZ3>wU%qc1Qy1^$rD);SxXq?xl1R1XE6f+UUdhG delta 23 fcmZ3>wU%qc1Qtf$$rD);Spyj4xdSJEXE6f+T44ts diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$7.class b/core/out/production/classes/org/pivxj/wallet/Wallet$7.class index b24f02e9a7313ebebf631b36f779a2dc20a3c7ed..35fa68feffb91cbb0b3c484fdc88392b04d770e6 100644 GIT binary patch delta 23 ecmZ3)zKDH;ATwj#WFh8I)sB%?zqW0%w_;be+7jA diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$8.class b/core/out/production/classes/org/pivxj/wallet/Wallet$8.class index 1b30e61b1fb3ff88f47d880d7792f64fb7c3d4bc..6388610bdc00434f83aa607c71e30ad0466866bf 100644 GIT binary patch delta 23 fcmcb_afxHYPG-ig$-9_iS$i3zx%(!|u$Tb=X;TM? delta 23 fcmcb_afxHYPG-im$-9_iSu+`=xw9tAu$Tb=Wj_ZT diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$9.class b/core/out/production/classes/org/pivxj/wallet/Wallet$9.class index f782fa78c9d05a0eac3ee58c4d9356b58d1f0acd..2d9063ea0fd304d94fe89cad8f190e3fb8f5c81e 100644 GIT binary patch delta 23 fcmX@eagbxf8fL~_lh-l_vhHEv=i57(nZ*tOX)On| delta 23 fcmX@eagbxf8fM06lh-l_vd&=O=bJg1nZ*tOWf=!Z diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$BalanceFutureRequest.class b/core/out/production/classes/org/pivxj/wallet/Wallet$BalanceFutureRequest.class index 0f0d2125be049bd8d4cd9166d2990b69e5d3b994..c0f9bffad2979f173985ceb8379d301121856997 100644 GIT binary patch delta 19 ZcmeBW?`7Y>$;{X=nTy#5NV+q-0RS@{1m*w$ delta 19 ZcmeBW?`7Y>$;=otnTy#5NV+q-0RS-F1fBo@ diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$BalanceType.class b/core/out/production/classes/org/pivxj/wallet/Wallet$BalanceType.class index 954728f30aebb78dbccfa27badef018d3fcc1fb4..577683b75dd5669f794ed019aac48524d03bcea9 100644 GIT binary patch delta 47 zcmcb{d5v?!0%k_N$qSkFf#gMIJ0K~*GFi}=ftSykL5k0gL7mTm!Guq5@)i~)06c*U AHUIzs delta 47 zcmcb{d5v?!0%k_8$qSkFf#gMIJ0K~*GFgzHftOF5L5fd`L7h*A!Gw=%@)i~)03~q> A761SM diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$CompletionException.class b/core/out/production/classes/org/pivxj/wallet/Wallet$CompletionException.class index caaa79a5aa2c881d7e9b3b496c8fed8c56fe1a88..608d2bc6af46c01afe5b0f731e125e034ec36ede 100644 GIT binary patch delta 13 UcmbQqJd=4t4kP2^$+?U=03dV(X8-^I delta 13 UcmbQqJd=4t4kP3K$+?U=03W~vLjV8( diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$CouldNotAdjustDownwards.class b/core/out/production/classes/org/pivxj/wallet/Wallet$CouldNotAdjustDownwards.class index 073817f0f255a002294e74d69ec457801f1b3da5..5f8d7be3f91457352c4e3c9f496f0912de916270 100644 GIT binary patch delta 13 Vcmcb@e1&<#d`8BPlNT_W001a^1z7+9 delta 13 Vcmcb@e1&<#d`8BzlNT_W001Y)1vLNw diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$DustySendRequested.class b/core/out/production/classes/org/pivxj/wallet/Wallet$DustySendRequested.class index 7616da5d31e2aaef8a2255c8ef6ee82a0f2f7ddc..0bd1398a127cf76c80e792c0d4902c8867c80b81 100644 GIT binary patch delta 13 VcmX@ge3W^^1V+Z^lP5Bo001UD1rq=O delta 13 VcmX@ge3W^^1V+ZglP5Bo001S31n&R< diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$ExceededMaxTransactionSize.class b/core/out/production/classes/org/pivxj/wallet/Wallet$ExceededMaxTransactionSize.class index 5af7c532cfbdded67df96cc5df9ae2ce444c90a2..5cf0ad41c90041753f4f474e4048b190e1f4d10a 100644 GIT binary patch delta 13 Vcmcc1e3yB{3P#4SlUFjD001e<1%Utn delta 13 Vcmcc1e3yB{3P#3@lUFjD001c#1zi9D diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$FeeCalculation.class b/core/out/production/classes/org/pivxj/wallet/Wallet$FeeCalculation.class index 4685bbdd3a50585ef6e9dd498dd0ddd5b3b036de..d0841753d0edccadd6037dcd28cd91fa3f1be96c 100644 GIT binary patch delta 19 ZcmdnSx{Y;%6%*r*$<|CZK(d0#4gf&-1}p#o delta 19 ZcmdnSx{Y;%6%*rx$<|CZK(d0#4gfxQ1>67t diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$FreeStandingTransactionOutput.class b/core/out/production/classes/org/pivxj/wallet/Wallet$FreeStandingTransactionOutput.class index df392eaeb324bcd5f0eadbcdbf8bd2e1d702ec65..19f932487fac33f7339a347f2cb9ed4ecb301f21 100644 GIT binary patch delta 53 zcmV-50LuUR3;GMNngkKh00j}z02UF_02>k003i|7ldA+;0o#)X1x5kolT8Ic0qT>E L1wR4rlg^Txx delta 53 zcmV-50LuUR3;GMNngkK300j}L02UFd02>jj03i{qldA+;0ke|^1x5kAlT8Ic0m74x L1wR4Dlg;2Qw4D;^Z!7JrK2v*%n0oWUlAqS7zYl*I;2Qw4j-^pFfdLU{Svn`1F$z0FJ_n(26pM^n+pOZlyDAdNH1OR|E4vYW* diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$MultipleOpReturnRequested.class b/core/out/production/classes/org/pivxj/wallet/Wallet$MultipleOpReturnRequested.class index cdaf013740eede72ea16fdd9312a69d1ce8e42e5..6349fcb521e76735bcc4191a65d542154a2b7f13 100644 GIT binary patch delta 13 Vcmcb`e2aO*Qbxwtlb11?001d31#18R delta 13 Vcmcb`e2aO*Qbxw(lb11?001a^1xEk? diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$SendResult.class b/core/out/production/classes/org/pivxj/wallet/Wallet$SendResult.class index 3133b2d1959b3b328e0f5e76c49b25083f43329c..df59f8dbc60d7633ba30e893254a2afb892d45a8 100644 GIT binary patch delta 14 VcmbQiI)imX784V{=;RzG9RMFO1F8T3 delta 14 VcmbQiI)imX784WS$H_TNIshYg1cd+q diff --git a/core/out/production/classes/org/pivxj/wallet/Wallet$TxOffsetPair.class b/core/out/production/classes/org/pivxj/wallet/Wallet$TxOffsetPair.class index b3b187eb79c55a6716469bc29e28e8e329cb90e4..2ae87d3ddb4c76d64bdc544d6ad28aeb1e1c547c 100644 GIT binary patch delta 38 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�`=Ed%#V`CfX_}GJV8p<!hh0w%EfJOY@i0N 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 C+6?#r delta 46 zcmaE<{!)EImXKl*gBf!+Lk_bk!v$t0MiZvHj4K$c81FF_GKnyTGDR|4ZtfO}V*~&> CCJZ(J diff --git a/core/out/production/classes/org/pivxj/wallet/WalletProtobufSerializer.class b/core/out/production/classes/org/pivxj/wallet/WalletProtobufSerializer.class index 5d68c44d2e03615ea35838bb6d47c9b05a4b9b77..791bbd5de9fb18e5a862b3ed741ba439517500de 100644 GIT binary patch delta 17453 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 delta 16719 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 M=+L=}e-Zxw1KGl8r2qf` diff --git a/core/out/test/classes/org/pivxj/wallet/MultiWalletTest.class b/core/out/test/classes/org/pivxj/wallet/MultiWalletTest.class index eb9b2564e394d61cbd6ca41c286eb9b794ad57c8..ebadd56f7267c3c99ff5f6d97e569b703694ec82 100644 GIT binary patch delta 5524 zcmai233yc175@LpOy11POMooEu!I?ikOUzRB9;jXVGm0PBp^h#AsND8G7~Zr7Hb_B zaIMz*tX8d3wH1X{h2XH&rBcPEMcl2{g(}c06xZTT&wVoq1KRe>m-p^+&OPUz^Z)nU zH}_7yvp)9hce@@1Fv8YN$K}|k<9Y1Y@PZRB>Uaq+JMoH+SMi#TG`z0iuP(fSH+8u1 zH`RJe!`nJC@s11c;(%)X-HG>{cwfgs9MW+Z|8R-+KXrV751lyT#8D0Z(&5H2_4r6f z>|=bQ<1&1z;WG`NYxuVgk8-0Qj_b(B7dpPgS4!e*)&0hWZ}FXu;W(jDyts_iX=9p> zBHDF2m@ZP()Whkbi@L@PQKq3rGDVMBs@28Gt`6BX5Ca@aPj-Kp*&1_nlrvX7^3+Io zjXiXXVXnrWIx4WwNw>V&OAU%d1$!$e`pDMVR~gE8vY+aB)STDJ{w@w+ff_kO86K!} z5DQheNM|tzXT*3WhiDwCu|&sQ?9(_*$2=8)c^s~@lp}PO@hq9+NcA{d^9Ha!v-%0w))${vt^d7i(Oi(civ{ zSK91p(KV&!82kAS=12tFH`smj`a1zRK0@!?>I(3NgtPSUPAfy6|Y=C!J!mh`u^1{y3UmI{Cso>W-t1pyKd zjSWOWb9hx?hA2;J4L4T@LJh%CV|6&(R2!ZXinIhm(dsnmnXfs-8gp_j8lM&6K5n$KM-# zfDg*HDnqOMO~D3FL!c$P+!G9WmNtd!FNhd?h+EWdwwm8Khi0~8y}@m~#NflSrL$dQ zVsUOaxI>NX#7zcwaknz?2cqk0e^XN+>RIY<@`vgJK99ji_^81+A0u*;lWkU>8vIL} zL_p)?2A|*_CHN-9*Zac z-vrTHIn!ZS{1GlFZg^UR4jR8Q_zk}`_#IDZHW)VAY=$k(W+(ccrk6<1Tq{48vSD-Z zTM2vzS_Cs~0Z&Az=81+q%>l!fZqp2#6A#F)en4oM5Y-ZM*)(&DKFDR$@ql5=uo>nd zeF{D1G@HlF>gLVKUg2NmFKLSgn@TF9fmXj9Fzsh%Otm>|nZkQvr`ycR%4pw^xiYQ2 zq}y8ALRR~x>>-?|H3p(n{E_8E-@>Bl;nv2Imf)&2D@r8%fs&f#{?fBXs%bfqvP81B z)gOxZ>s6kJQHB3Q-mK`>r%bfEiq-_hk;>3Giy=f>VNsOVeao?m}7eGU98L6i9=Binrw0Z zWDuqYBT=#L3?_p?bU$UjBS<2nE%!&N0&C<57RTxcd&uhK7MlHf68 zvTlwg6bwyBA)s(GAv#`BKXpbF2Goa}OD+twhLtl(l$HbE@VAI|=1J(tfRx|*a471Rlh4X?UMf~+E?pt#k~zXXxSuwsszyAk zO~BmBV~r%VHatV}IkHeybjLV`szf$Bg;gz{5isrUGP*6Eu5q86 zrfRMPWKoLe@X96da_iFO1R(`lo>xe}MBY-7;V9k?Zjpu!SIRTp8tjg%q-`Vwa5b)x z9&xQG+i->H>UDoi$xcEydG>}KeIZvRbdft~cMOof0=a4q#Apn{6cl4N24fM1U^#{& zB8Fo!do@aN14iH$lv%cx$qK+PleX-*2|vYkVzaxre?5LCb_bwMG=45O>fvat!;R9k zi-`p=Mc5&Rs__eHrHi>qxLFp~#NaSl@)kH{*)F&hx5?f2b}^$i`73!7cOkSno>ZE`2RNcu4>;U(~M9hUMAG*}r~Ai=UTXyqX$ zb%r&`M3k}|cVdJ1JedRWYjMJkD)v*?COE`IH~dCg>0%%Qzs0?vEZtXH8ztTn-(-sK zlbvQF?KoRB++U?(Q{PikV^dc$QBY7lg8p`~2HaRIfh>6#lZ&@vm?Lcm3W~R3avW3Q zs5FE5eU~KL=P9`nB9rzAhR0EQ-d5ywq+_b&A)z%bj_Hz-IJ&1y&qz*hMO7R#J0+3? zF%RVrDpAz%B>YM4MLe@2BKwop@9}_Sn0PQrm(l$yV%2fXiet7tj+(TcsI}p7%<)|oxUAQd|Fb{t)(#zzt8D*#_@xT zyRw(M?QYi&p z@Q`TQQHzDxigw{#2;*g?hlNiU3zg&8E)2R}h`K}2;lzCcpq--O5(%v%|9B)N|1Q{$ zW6(B9zIICTiCrDMOj|E2WeIMM3NK5~mI(deZtcZGEIe$-8AI#}7;y~rIoytI7$h-F zHy3ydnQpH47RQ9RL+R5Lf$Mid>Y<9^PRPl7EAmxq86`Q5K9}1S$MRdDxm`YOCJu?`ftPD6p%U!a^==+o6JfdXBjAfp2X83_~^ZsWhiB{O?v!qLp6qpfaf zB^?!D2rgnLfg$(v_d5@x+vEg?B+@PvcM8d~gy1h{o|d!X8998O z<+XT@H{dV49s9T$`}rhZ_6iT;RUX0X)&X@lx{474yXE*(N7Y*$=;huH z^zy+D^zvpwouUTU3L4*ANzP@P#Zf$tvi>QPxn6EEMvVdo=t>!;>1G(y&)6 z$I}{~0lZ(qb^^yh5mS%vapKtyPT00dLehm3?ZSz3Xg8;NgYN7|0%6fO+N@%=6RT|E z;%c+q85!l!#;4gpVXu z$0VkoU_U+;)z4()b2+z;GY?;|7+=wcuQ?UpunymH1x`pYg%p_+@|9bI?Maj|k()3&+ zO*eWgt;`%(aX&TYu|!~}ZN(*VTq-F_5HW>^^<35&$dKHyz-;k7M^KrIEQvx6dq_cc zqm;ccn!TkE=UXLsH9feCUTow5Y-a)X@(dx)K*SESP{LKjZX8T6&*X3pVFibB7KgE( zv)L1Q6!CLmcVA=3z!H7-x zzEa*k(SAdI-fJ1_#=Bh2wPW4#TjXzeue=8cz5XcgGQP$a;Fe$b%J`zZtNA6r9_#)O DAO}UU delta 2625 zcmZuz33yc175@LpOzxYPn*}7n2??1H2qXg8R3L;b1VSJoKmaA|$z;`#011MCjG`>= z)~DE(iei`4J@>wI&+?!1pJY#9 z-;CgEpB_5}AdmOhsKag>U&7-Gdn`O*<4Nqb@RW@&<7pcact&BL7hQPPh8O#d^qj&0 z8_{^)ix=<}BfV(hB?|{_bfd?{AsqI~>yV8j=(TXv!ZC&8Hhef?mXkJur*PUvEnZgm zs>0V4zHY;B!brg@HiqLHHeSUUqw!61{FWE5;oCNH@EwKkdgc0iHolJ^*vP;SZTtv7 zHd;S1%TK*{9d9W7%sf78ZhmgU_=S;vsqm(a>v7Hw%6i@e`j*14Y~oZVK&u#uXhn65Zla||;y zGkJ~TSj}-9@0_=0#Rr(Bnav!3R`UkbYu?Co%|#Mtw_Oyh;bP4t=4L56G?#I?v9N-OTVLDS z+R*8*t8J}q3pC{WHCM7$vxarVknqQKZ5^u{+UjfTT17!IpxMAiqu8X_tl46sxQRC_ zwrZ|on_{~GV>NMgpnX-=#)h@dx~LV&YuKr{PV*M7SG-koBR6So=53l=1hWsLQd0s9 zYTnK}#B*tTOIwG(c5Q>dt-aIVux4FtYlm|*dUOo8;y%qgd6(ukZg<{|F7MeHQ||I` z2Qku_GiYSb$8l>SnB+XkMvWYJ4?0GwW99{8aoUFkK&N<)Yo)beyxH!@&@g_U5 ziK?eCaUVUrn@Dp`4@+}&(ivxiKi7FHC0%->$nrU__zUMFRfte0;{%8UAzdeHgPgKt zmo|eZ^9XoQ1Q!~^NBD9jYGz+A zqbs5h`0Y|DV4~zSNg~Nd3?}0$Oc8jC1g2sX1W|$+n1(7$m!!(DS594+B?GepXHbbZ zFdOe+4nC3bG)SgWD&{i>3s{1MoQFkRg2ikQo;G6{Td-87MK&w!s8ZOOd_^%_X4J?7)0`K?Y=rC&X9{{*hcPv?8*$m5h+d4$JcOws zl!h?PxiBhO4ajln38np*PZzNJmC8bxA+U##AO#yJNqP8lH)e(~>#|0e0ZvQ$=q!VP zzu$j2bcv)dZ9|xcaWC!@D2V&Rd^nw65|n1B2%*v)!t98nsB+ zs1{+q^v{A27WzCP++da)^CQi+=s0R>e33`6IA4V|eJX+>EXlWgRtW#sxOebUpWEl{ z#gHyU4K;07+}B_x#)IdE$&XT38&a5g*AAVOU7=l7{HS=2k?}a0|ZIBOpy36L7G0piS7S| z6C1-YReUy}T=;_ca^Z_YF-S6z68J| list; private long requestNum; + private boolean hasRequestFailed; public PubcoinsMessage(NetworkParameters params, byte[] payload, int offset, int lenght) throws ProtocolException { super( @@ -40,12 +41,15 @@ public PubcoinsMessage(NetworkParameters params, BigInteger accValue, BigInteger protected void parse() throws ProtocolException { list = new ArrayList<>(); requestNum = readUint32(); - accValue = readBignum(); - accWitnessValue = readBignum(); - long size = readUint32(); - for (int i = 0; i < size; i++) { - list.add(readBignum()); - } + if (hasMoreBytes()) { + accValue = readBignum(); + accWitnessValue = readBignum(); + long size = readUint32(); + for (int i = 0; i < size; i++) { + list.add(readBignum()); + } + }else + hasRequestFailed = true; length = cursor; } @@ -65,6 +69,10 @@ public byte[] bitcoinSerialize() { } } + public boolean isHasRequestFailed() { + return hasRequestFailed; + } + public List getList() { return list; } diff --git a/core/src/main/java/host/furszy/zerocoinj/wallet/CannotSpendCoinsException.java b/core/src/main/java/host/furszy/zerocoinj/wallet/CannotSpendCoinsException.java new file mode 100644 index 000000000..8ed7cd3cf --- /dev/null +++ b/core/src/main/java/host/furszy/zerocoinj/wallet/CannotSpendCoinsException.java @@ -0,0 +1,18 @@ +package host.furszy.zerocoinj.wallet; + +public class CannotSpendCoinsException extends Exception { + public CannotSpendCoinsException() { + } + + public CannotSpendCoinsException(String message) { + super(message); + } + + public CannotSpendCoinsException(String message, Throwable cause) { + super(message, cause); + } + + public CannotSpendCoinsException(Throwable cause) { + super(cause); + } +} diff --git a/core/src/main/java/host/furszy/zerocoinj/wallet/InvalidSpendException.java b/core/src/main/java/host/furszy/zerocoinj/wallet/InvalidSpendException.java new file mode 100644 index 000000000..cd3f8d9a5 --- /dev/null +++ b/core/src/main/java/host/furszy/zerocoinj/wallet/InvalidSpendException.java @@ -0,0 +1,11 @@ +package host.furszy.zerocoinj.wallet; + +public class InvalidSpendException extends Exception { + public InvalidSpendException(String s) { + super(s); + } + + public InvalidSpendException(Throwable cause) { + super(cause); + } +} diff --git a/core/src/main/java/host/furszy/zerocoinj/wallet/MultiWallet.java b/core/src/main/java/host/furszy/zerocoinj/wallet/MultiWallet.java index 35a068429..2c99221ce 100644 --- a/core/src/main/java/host/furszy/zerocoinj/wallet/MultiWallet.java +++ b/core/src/main/java/host/furszy/zerocoinj/wallet/MultiWallet.java @@ -1,6 +1,8 @@ package host.furszy.zerocoinj.wallet; +import com.zerocoinj.core.ZCoin; import com.zerocoinj.core.context.ZerocoinContext; +import com.zerocoinj.utils.JniBridgeWrapper; import host.furszy.zerocoinj.MultiWalletFiles; import host.furszy.zerocoinj.WalletFilesInterface; import host.furszy.zerocoinj.wallet.files.Listener; @@ -20,6 +22,8 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.math.BigInteger; +import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Set; @@ -42,11 +46,22 @@ public class MultiWallet{ protected final ReentrantLock lock; + public enum WalletType{ + PIV, ZPIV, ALL + } + public MultiWallet(NetworkParameters params, ZerocoinContext zContext, DeterministicSeed seed){ + this(params,zContext,seed,-1); + } + + public MultiWallet(NetworkParameters params, ZerocoinContext zContext, DeterministicSeed seed, int lookaheadSize){ this.lock = Threading.lock("MultiWallet_1"); this.seed = seed; - this.pivWallet = new Wallet(params,new KeyChainGroup(params, seed, BIP44_PIV)); - this.zWallet = new ZWallet(params, zContext, seed); + KeyChainGroup keyChainGroup = new KeyChainGroup(params, seed, BIP44_PIV); + if (lookaheadSize > 0) + keyChainGroup.setLookaheadSize(lookaheadSize); + this.pivWallet = new Wallet(params,keyChainGroup); + this.zWallet = new ZWallet(params, zContext, seed, lookaheadSize); } public MultiWallet(DeterministicSeed seed, List wallets) { @@ -94,6 +109,18 @@ public void addWalletFrom(BlockChain blockChain) { zWallet.addWalletFrom(blockChain); } + public boolean isEveryOutputSpent(Transaction tx, WalletType walletType){ + if (walletType == WalletType.PIV){ + return tx.isEveryOwnedOutputSpent(pivWallet); + }else if (walletType == WalletType.ZPIV){ + return tx.isEveryOwnedOutputSpent(getZpivWallet()); + }else { + boolean isSpent = tx.isEveryOwnedOutputSpent(pivWallet); + if (!isSpent) return false; + return tx.isEveryOwnedOutputSpent(getZpivWallet()); + } + } + public void commitTx(Transaction tx) { boolean isZcMint = false; for (TransactionOutput output : tx.getOutputs()) { @@ -141,6 +168,21 @@ public Set listTransactions(){ return list; } + public Collection listPendingTransactions(){ + Collection list = pivWallet.getPendingTransactions(); + for (Transaction transaction : zWallet.getPendingTransactions()) { + if (!list.contains(transaction)){ + list.add(transaction); + } + } + return list; + } + + public void setKeyChainGroupLookaheadThreshold(int n) { + pivWallet.setKeyChainGroupLookaheadThreshold(n); + zWallet.getWallet().setKeyChainGroupLookaheadThreshold(n); + } + public void cleanup(){ pivWallet.cleanup(); zWallet.cleanup(); @@ -225,6 +267,10 @@ public List listUnspent() { return pivWallet.getUnspents(); } + public List listZpivUnspent() { + return zWallet.getUnspents(); + } + public boolean isAddressMine(Address address) { return pivWallet.isPubKeyHashMine(address.getHash160()); } @@ -260,6 +306,50 @@ public Coin getZpivUnspensableBalance() { return zWallet.getUnspendableBalance(); } + public ZCoin getZcoinAssociated(BigInteger commitmentValue){ + return zWallet.getZcoinAssociated(commitmentValue); + } + + public ZCoin getZcoinAssociatedToSerial(BigInteger serial){ + return zWallet.getZcoinAssociatedToSerial(serial); + } + + public List freshZcoins(int n) { + return zWallet.freshZcoins(n); + } + + public TransactionOutput getMintTransaction(BigInteger serial, WalletType walletType){ + ZCoin coin = zWallet.getZcoinAssociatedToSerial(serial); + if (coin == null) return null; + if (walletType == WalletType.ZPIV){ + return getMintTransaction(zWallet.getWallet(), coin); + }else if (walletType == WalletType.PIV){ + return getMintTransaction(pivWallet, coin); + }else { + TransactionOutput output = getMintTransaction(zWallet.getWallet(), coin); + if (output != null) return output; + return getMintTransaction(pivWallet, coin); + } + } + + private TransactionOutput getMintTransaction(Wallet wallet, ZCoin coin){ + for (Transaction transaction : wallet.getTransactions(true)) { + for (TransactionOutput output : transaction.getOutputs()) { + if (output.isZcMint() && Utils.areBigIntegersEqual(output.getScriptPubKey().getCommitmentValue(), coin.getCommitment().getCommitmentValue())){ + return output; + } + } + } + return null; + } + + public boolean addTx(Transaction tx, WalletType walletType){ + if (walletType == WalletType.ZPIV){ + return zWallet.getWallet().maybeCommitTx(tx); + } + return false; + } + /** * TODO: Add fee here... * @param amount @@ -276,11 +366,14 @@ public SendRequest createMintRequest(Coin amount) throws InsufficientMoneyExcept public SendRequest createSpendRequest(Address to, Coin amount) throws InsufficientMoneyException { Transaction tx = zWallet.createSpend(amount); tx.addOutput(amount, to); - return SendRequest.forTx(tx); + SendRequest sendRequest = SendRequest.forTx(tx); + // TODO: check if change this for a new zpiv mint is a good idea.. + sendRequest.changeAddress = pivWallet.freshReceiveAddress(); + return sendRequest; } - public void spendZpiv(SendRequest request, PeerGroup peerGroup, ExecutorService executor) throws InsufficientMoneyException{ - zWallet.completeSendRequestAndWaitSync(request,peerGroup,executor); + public Transaction spendZpiv(SendRequest request, PeerGroup peerGroup, ExecutorService executor, JniBridgeWrapper wrapper) throws InsufficientMoneyException, CannotSpendCoinsException { + return zWallet.completeSendRequestAndWaitSync(wrapper,request,peerGroup,executor); } diff --git a/core/src/main/java/host/furszy/zerocoinj/wallet/ZCSpendRequest.java b/core/src/main/java/host/furszy/zerocoinj/wallet/ZCSpendRequest.java index f61edbba9..8d87ac1b9 100644 --- a/core/src/main/java/host/furszy/zerocoinj/wallet/ZCSpendRequest.java +++ b/core/src/main/java/host/furszy/zerocoinj/wallet/ZCSpendRequest.java @@ -1,5 +1,6 @@ package host.furszy.zerocoinj.wallet; +import com.google.common.collect.Lists; import com.zerocoinj.core.CoinDenomination; import com.zerocoinj.core.CoinSpend; import com.zerocoinj.core.SpendType; @@ -17,17 +18,19 @@ import org.pivxj.script.ScriptOpCodes; import org.pivxj.utils.Pair; import org.pivxj.wallet.SendRequest; +import org.pivxj.wallet.exceptions.RequestFailedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.spongycastle.util.encoders.Hex; import java.math.BigInteger; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.locks.ReentrantLock; +import java.util.concurrent.*; + +import static com.google.common.primitives.Ints.min; public class ZCSpendRequest implements Callable,OnGetDataResponseEventListener { @@ -36,15 +39,22 @@ public class ZCSpendRequest implements Callable,OnGetDataResponseEv private SendRequest sendRequest; private PeerGroup peerGroup; private ZerocoinContext zerocoinContext; - private ConcurrentHashMap> waitingRequests = new ConcurrentHashMap<>(); + private List> waitingRequests = new ArrayList<>(); + private ConcurrentHashMap,GenWitMessage>> requests; + private LinkedBlockingQueue messagesQueue = new LinkedBlockingQueue<>(); private Transaction transaction; - private final Object lock; + private Sha256Hash txHashOutput; public ZCSpendRequest(SendRequest sendRequest, PeerGroup peerGroup) { this.sendRequest = sendRequest; + this.transaction = sendRequest.tx; + Transaction temp = new Transaction(this.transaction.getParams()); + for (TransactionOutput output : this.transaction.getOutputs()) { + temp.addOutput(output); + } + this.txHashOutput = temp.getHash(); this.peerGroup = peerGroup; this.zerocoinContext = Context.get().zerocoinContext; - this.lock = new ReentrantLock(); } public SendRequest getSendRequest() { @@ -56,27 +66,59 @@ public PeerGroup getPeerGroup() { } public void addWaitingRequest(GenWitMessage genWitMessage, ZCoin zCoin){ - if (waitingRequests.containsKey(genWitMessage.getRequestNum())) throw new IllegalArgumentException("Duplicated request num"); - waitingRequests.put(genWitMessage.getRequestNum(), new Pair<>(zCoin, genWitMessage)); + if (zCoin.getCoinDenomination() == CoinDenomination.ZQ_ERROR) throw new IllegalArgumentException("Invalid denomination"); + waitingRequests.add(new Pair<>(zCoin, genWitMessage)); } @Override public Transaction call() throws Exception { if (this.peerGroup.getConnectedPeers().isEmpty()) throw new IllegalStateException("No peers online"); + Map,GenWitMessage>> genWitByDenomination = new HashMap<>(); + + for (Pair entry : waitingRequests) { + GenWitMessage genWitMessage = entry.getSecond(); + if (genWitByDenomination.containsKey(genWitMessage.getDen())){ + Pair,GenWitMessage> pair = genWitByDenomination.get(genWitMessage.getDen()); + GenWitMessage currentGenWit = pair.getSecond(); + // merge the current one + currentGenWit.getFilter().merge(genWitMessage.getFilter()); + // start height must be the minimum + currentGenWit.setStartHeight(min(currentGenWit.getStartHeight(), genWitMessage.getStartHeight())); + pair.getFirst().add(entry.getFirst()); + }else { + // create a new one + Pair, GenWitMessage> pair = new Pair<>(Lists.newArrayList(entry.getFirst()),genWitMessage); + genWitByDenomination.put(genWitMessage.getDen(), pair); + genWitMessage.complete(); + } + } + + requests = new ConcurrentHashMap<>(); + for (Map.Entry, GenWitMessage>> entry : genWitByDenomination.entrySet()) { + requests.put(entry.getValue().getSecond().getRequestNum(), entry.getValue()); + } + // TODO: send this to several peers and not just one Peer peer0 = this.peerGroup.getConnectedPeers().get(0); peer0.addOnGetDataResponseEventListener(this); - - for (Map.Entry> entry : waitingRequests.entrySet()) { + for (Map.Entry, GenWitMessage>> entry : genWitByDenomination.entrySet()) { peer0.sendMessage(entry.getValue().getSecond()); } log.info("Waiting for node response.."); // Now wait for the completeness.. - synchronized (lock){ - lock.wait(); + while (true){ + // Now spend it if all of the inputs are completed + if (requests.size() == 0) { + break; + } + + PubcoinsMessage message = messagesQueue.take(); + onPubcoinReceived(message); + requests.remove((int) message.getRequestNum()); } + log.info("Transaction ready!"); for (Peer peer : peerGroup.getConnectedPeers()) { // Remove this listener now @@ -85,98 +127,123 @@ public Transaction call() throws Exception { return transaction; } - @Override - public void onResponseReceived(PubcoinsMessage pubcoinsMessage) { - log.info("onResponseReceived: " + pubcoinsMessage.toString()); - if (! waitingRequests.containsKey((int) pubcoinsMessage.getRequestNum())) return; - Pair pair = waitingRequests.get((int) pubcoinsMessage.getRequestNum()); - GenWitMessage request = pair.getSecond(); - ZCoin coinToSpend = pair.getFirst(); - if (request != null){ - List list = pubcoinsMessage.getList(); - System.out.println("amount of data received: " + list.size()); - // Create accumulator: - - // First check that my commitment is in the filtered list - if (!list.contains(coinToSpend.getCommitment().getCommitmentValue())) { - // TODO: Notify fail here.. - log.error("Pubcoins response list doesn't contains our commitment value.., check core sources"); - return; - } - - // Accumulator - Accumulator acc = new Accumulator( - zerocoinContext.accumulatorParams, - CoinDenomination.ZQ_ONE, - pubcoinsMessage.getAccValue() - ); - - // Now accumulate the pubcoins to the result to obtain the same witness that is created by the rpc method. - Accumulator accWit = new Accumulator( - zerocoinContext.accumulatorParams, - CoinDenomination.ZQ_ONE, - pubcoinsMessage.getAccWitnessValue() - - ); - AccumulatorWitness witness = new AccumulatorWitness(accWit, coinToSpend); - - int i = 0; - for (BigInteger bigInteger : list) { - witness.addElementUnchecked(bigInteger); - if (i % 100 == 0) - log.info("coin incremented: " + i); - i++; - } - - log.info("Witness: " + witness.getValue()); - if (!witness.verifyWitness(acc,coinToSpend)){ - log.error("Verify witness failed"); - return; - // Assert.assertTrue("Verify failed", witness.verifyWitness(acc, mintedCoin)); - } - log.info("Valid accumulator"); - + public void onPubcoinReceived(PubcoinsMessage pubcoinsMessage) throws InvalidSpendException { - // 3) Complete the tx - Transaction transaction = sendRequest.tx; - - // Accumulator checksum - BigInteger accChecksum = BigInteger.valueOf( - Accumulators.getChecksum(acc.getValue()) - ); - - CoinSpend coinSpend = new CoinSpend( - zerocoinContext, - coinToSpend, - acc, - accChecksum, - witness, - transaction.getHash(), - SpendType.SPEND, - null - ); - - - if (!coinSpend.verify(acc)){ - log.error("CoinSpend not valid"); - return; - // Assert.assertTrue("CoinSpend not valid",coinSpend.verify(acc)); - } - - transaction = add(transaction, coinSpend, coinToSpend.getCommitment().getCommitmentValue()); - - // Now spend it if all of the inputs are completed - waitingRequests.remove((int) pubcoinsMessage.getRequestNum()); - if (waitingRequests.size() == 0){ - synchronized (lock) { - this.transaction = transaction; - lock.notify(); + Pair,GenWitMessage> pair = requests.get((int) pubcoinsMessage.getRequestNum()); + GenWitMessage request = pair.getSecond(); + ArrayList coins = pair.getFirst(); + + if (request != null) { + for (ZCoin coinToSpend : coins) { + + try { + if (pubcoinsMessage.isHasRequestFailed()) { + log.info("Request have failed for {}", pair); + throw new RequestFailedException(); + } + List list = pubcoinsMessage.getList(); + System.out.println("amount of data received: " + list.size()); + // Create accumulator: + + // First check that my commitment is in the filtered list + if (!list.contains(coinToSpend.getCommitment().getCommitmentValue())) { + // TODO: Notify fail here.. + log.error("Pubcoins response list doesn't contains our commitment value.."); + throw new InvalidSpendException("Pubcoins response list doesn't contains our commitment value.., check core sources"); + } + + // Accumulator + Accumulator acc = new Accumulator( + zerocoinContext.accumulatorParams, + coinToSpend.getCoinDenomination(), + pubcoinsMessage.getAccValue() + ); + + // Now accumulate the pubcoins to the result to obtain the same witness that is created by the rpc method. + Accumulator accWit = new Accumulator( + zerocoinContext.accumulatorParams, + coinToSpend.getCoinDenomination(), + pubcoinsMessage.getAccWitnessValue() + + ); + AccumulatorWitness witness = new AccumulatorWitness(accWit, coinToSpend); + + int i = 0; + for (BigInteger bigInteger : list) { + witness.addElementUnchecked(bigInteger); + if (i % 100 == 0) + log.info("coin incremented: " + i); + i++; + } + + log.info("Witness: " + witness.getValue()); + if (!witness.verifyWitness(acc, coinToSpend)) { + log.error("Verify witness failed"); + throw new InvalidSpendException("Verify witness failed"); + } + log.info("Valid accumulator"); + + log.info("accumulator: " + acc.getValue()); + log.info("witness: " + witness.getValue()); + + + // 3) Complete the tx + + // Accumulator checksum + BigInteger accChecksum = BigInteger.valueOf( + Accumulators.getChecksum(acc.getValue()) + ); + + CoinSpend coinSpend = new CoinSpend( + zerocoinContext, + coinToSpend, + acc, + accChecksum, + witness, + txHashOutput, + SpendType.SPEND, + null + ); + + + if (!coinSpend.verify(acc)) { + log.error("CoinSpend not valid"); + throw new InvalidSpendException("CoinSpend verify failed"); + } + + if (!coinSpend.hasValidSignature()) { + log.error(String.format("CoinSpend signature invalid, coinSpend: %s", coinSpend)); + //throw new InvalidSpendException("CoinSpend signature invalid"); + } + + System.out.println("coin randomness: " + coinToSpend); + System.out.println("coin spend: " + coinSpend); + System.out.println("private key: " + coinSpend.getPubKey().getPrivateKeyAsHex()); + + add(coinSpend, coinToSpend.getCommitment().getCommitmentValue()); + + } catch (InvalidSpendException e) { + log.info("InvalidSpendException", e); + throw e; + } catch (Exception e) { + log.info("Exception creating a spend", e); + throw new InvalidSpendException(e); } } + }else { + log.warn("Request returned null for {}" + pubcoinsMessage); } + } - private Transaction add(Transaction transaction, CoinSpend coinSpend, BigInteger commitmentValue){ + @Override + public void onResponseReceived(final PubcoinsMessage pubcoinsMessage) { + log.info("onResponseReceived: " + pubcoinsMessage.toString()); + if (! requests.containsKey((int) pubcoinsMessage.getRequestNum())) return; + messagesQueue.offer(pubcoinsMessage); + } + + private synchronized void add(CoinSpend coinSpend, BigInteger commitmentValue){ // zc_spend input byte[] coinSpendBytes = coinSpend.bitcoinSerialize(); log.info("Coin spend bytes length: " + coinSpendBytes.length); @@ -195,6 +262,7 @@ private Transaction add(Transaction transaction, CoinSpend coinSpend, BigInteger log.info("program: " + Hex.toHexString(program)); TransactionInput transactionInput = new TransactionInput(transaction.getParams(), transaction, program); + //use nSequence as a shorthand lookup of denomination //NOTE that this should never be used in place of checking the value in the final blockchain acceptance/verification //of the transaction @@ -205,7 +273,13 @@ private Transaction add(Transaction transaction, CoinSpend coinSpend, BigInteger List realInputs = new ArrayList<>(); for (TransactionInput input : inputs) { - if (input.getConnectedOutput().isZcMint() && + if (input.getConnectedOutput() == null){ + log.info("Not connected input.. should be one of the new ones.."); + realInputs.add(input); + continue; + } + boolean isZcMint = input.getConnectedOutput().isZcMint(); + if (isZcMint && !( Utils.areBigIntegersEqual(input.getConnectedOutput().getScriptPubKey().getCommitmentValue(), commitmentValue)) ){ realInputs.add(input); } @@ -220,7 +294,5 @@ private Transaction add(Transaction transaction, CoinSpend coinSpend, BigInteger System.out.println(transaction); System.out.println("Coin spend inputs program: " + Hex.toHexString(transaction.getInput(0).getScriptBytes())); - - return transaction; } } diff --git a/core/src/main/java/host/furszy/zerocoinj/wallet/ZWallet.java b/core/src/main/java/host/furszy/zerocoinj/wallet/ZWallet.java index addccda54..903dbdbc4 100644 --- a/core/src/main/java/host/furszy/zerocoinj/wallet/ZWallet.java +++ b/core/src/main/java/host/furszy/zerocoinj/wallet/ZWallet.java @@ -5,6 +5,7 @@ import com.zerocoinj.core.ZCoin; import com.zerocoinj.core.context.ZerocoinContext; import com.zerocoinj.core.exceptions.InvalidSerialException; +import com.zerocoinj.utils.JniBridgeWrapper; import host.furszy.zerocoinj.MultiWalletFiles; import host.furszy.zerocoinj.WalletFilesInterface; import host.furszy.zerocoinj.wallet.files.Listener; @@ -34,10 +35,12 @@ public class ZWallet { private NetworkParameters params; private Wallet zPivWallet; - public ZWallet(NetworkParameters params, ZerocoinContext zContext, DeterministicSeed seed) { + public ZWallet(NetworkParameters params, ZerocoinContext zContext, DeterministicSeed seed, int lookaheadSize) { this.params = params; this.zContext = zContext; KeyChainGroup keyChainGroupZpiv = new KeyChainGroup(params, seed, BIP44_ZPIV); + if (lookaheadSize > 0) + keyChainGroupZpiv.setLookaheadSize(lookaheadSize); zPivWallet = new Wallet(params,keyChainGroupZpiv); } @@ -107,7 +110,7 @@ public Transaction createSpend(Coin amount) throws InsufficientMoneyException { // Now start, start from the bigger den and decrease it until the value is completed Coin temp = Coin.valueOf(amount.value); for (CoinDenomination coinDenomination : CoinDenomination.invertedValues()) { - if (!orderedUnspents.containsKey(coinDenomination))continue; + if (!orderedUnspents.containsKey(coinDenomination)) continue; List outputs = orderedUnspents.get(coinDenomination); if (temp.isZero()) break; Coin denValue = Coin.valueOf(coinDenomination.getDenomination(),0); @@ -118,7 +121,9 @@ public Transaction createSpend(Coin amount) throws InsufficientMoneyException { long amountOfThisDenom = divisibleForDenomination.divide(denValue); for (int i = 0; i < amountOfThisDenom; i++) { // todo: I should get the old one here.. - tx.addInput(outputs.get(i)); + TransactionOutput out = outputs.get(i); + if (out.getParentTransaction().getConfidence().getDepthInBlocks() >= CoinDefinition.MINT_REQUIRED_CONFIRMATIONS) + tx.addInput(outputs.get(i)); } temp = Coin.valueOf(mod); } @@ -172,22 +177,20 @@ public void addWalletFrom(BlockChain blockChain) { blockChain.addWallet(zPivWallet); } - public void completeSendRequestAndWaitSync(SendRequest request, PeerGroup peerGroup, ExecutorService executor) { + public Transaction completeSendRequestAndWaitSync(JniBridgeWrapper jniBridgeWrapper, SendRequest request, PeerGroup peerGroup, ExecutorService executor) throws CannotSpendCoinsException { try { + Context.get().zerocoinContext.jniBridge = jniBridgeWrapper; + if (request.tx.getOutputs().isEmpty()) throw new IllegalArgumentException("SendRequest transactions outputs cannot be null, add the outputs values before call this method"); ZCSpendRequest spendRequest = new ZCSpendRequest(request, peerGroup); zPivWallet.completeSendRequest(spendRequest); - Transaction tx = executor.submit(spendRequest).get(5, TimeUnit.MINUTES); + Transaction tx = executor.submit(spendRequest).get(15, TimeUnit.MINUTES); logger.info("Tx created!, " + tx); - peerGroup.broadcastTransaction(tx,1,false).future().get(1, TimeUnit.MINUTES); + tx = peerGroup.broadcastTransaction(tx,1,false).broadcast().get(1, TimeUnit.MINUTES); logger.info("Tx broadcasted!, " + tx); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } catch (TimeoutException e) { - e.printStackTrace(); + return tx; } catch (Exception e){ - e.printStackTrace(); + logger.info("Exception in completeSendRequestAndWaitSync", e); + throw new CannotSpendCoinsException(e); } } @@ -239,4 +242,24 @@ public Coin getUnspendableBalance() { public Coin getBalance(Wallet.BalanceType type) { return zPivWallet.getBalance(type); } + + public Collection getPendingTransactions() { + return zPivWallet.getPendingTransactions(); + } + + public List getUnspents() { + return zPivWallet.getUnspents(); + } + + public ZCoin getZcoinAssociated(BigInteger commitmentValue) { + return zPivWallet.getActiveKeyChain().getZcoinsAssociated(commitmentValue); + } + + public ZCoin getZcoinAssociatedToSerial(BigInteger serial) { + return zPivWallet.getActiveKeyChain().getZcoinsAssociatedToSerial(serial); + } + + public List freshZcoins(int n) { + return zPivWallet.freshZcoins(KeyChain.KeyPurpose.RECEIVE_FUNDS,n); + } } diff --git a/core/src/main/java/org/pivxj/core/AbstractBlockChain.java b/core/src/main/java/org/pivxj/core/AbstractBlockChain.java index ff0342505..79ca1c18a 100644 --- a/core/src/main/java/org/pivxj/core/AbstractBlockChain.java +++ b/core/src/main/java/org/pivxj/core/AbstractBlockChain.java @@ -459,18 +459,14 @@ private boolean add(Block block, boolean tryConnecting, // article here for more details: https://bitcoinj.github.io/security-model try { block.verifyHeader(); - //System.out.println("New block previous hash: "+block.getPrevBlockHash()); storedPrev = getStoredBlockInCurrentScope(block.getPrevBlockHash()); - if (storedPrev!=null) { - //System.out.println("New block, previous stored block from db: " + storedPrev.getHeader().getHashAsString()); + if (storedPrev != null) { checkArgument(block.getPrevBlockHash().equals(storedPrev.getHeader().getHash()), "Database saving shit.. prev hash block: " + block.getPrevBlockHash() + ", db prev hash: " + storedPrev.getHeader().getHashAsString()); } if (storedPrev != null) { height = storedPrev.getHeight() + 1; - //System.out.println("Adding Block: "+height+" hash "+block.getHashAsString()+", Prev block "+storedPrev.getHeight()+" hash: "+block.getPrevBlockHash().toString()); } else { - //System.out.println("block height unknown"); height = Block.BLOCK_HEIGHT_UNKNOWN; } flags = params.getBlockVerificationFlags(block, versionTally, height); @@ -496,10 +492,7 @@ private boolean add(Block block, boolean tryConnecting, checkState(lock.isHeldByCurrentThread()); // It connects to somewhere on the chain. Not necessarily the top of the best known chain. //context.checkDifficultyTransitions(storedPrev, block, blockStore); - //todo furszy: i'm not checking the difficulty yet - //todo: this should be checked on a MN wallet service. //checkDifficultyTransitions(storedPrev, block); - //System.out.println("going to connect block with accumulator: "+block.getAccumulator().toString()); connectBlock(block, storedPrev, shouldVerifyTransactions(), filteredTxHashList, filteredTxn); } @@ -547,9 +540,6 @@ private void connectBlock(final Block block, StoredBlock storedPrev, boolean exp } StoredBlock head = getChainHead(); - // System.out.println("New block: "+block.toString()); - //System.out.println("Head height: "+head.getHeight() + " hash: "+head.getHeader().getHashAsString() - // + " Previous block stored height: "+storedPrev.getHeight()); if (storedPrev.equals(head)) { if (filtered && filteredTxn.size() > 0) { log.debug("Block {} connects to top of best chain with {} transaction(s) of which we were sent {}", @@ -584,12 +574,6 @@ private void connectBlock(final Block block, StoredBlock storedPrev, boolean exp log.debug("Chain is now {} blocks high, running listeners", newStoredBlock.getHeight()); informListenersForNewBlock(block, NewBlockType.BEST_CHAIN, filteredTxHashList, filteredTxn, newStoredBlock); } else { - //System.out.println("#####################"); - //System.out.println("block not connect to the blockchain heads.."); - //System.out.println("head chain: "+head.getHeader().getHashAsString()); - //System.out.println("Stored block: "+storedPrev.getHeader().getHashAsString()); - //System.out.println("New block work: "+block.getHashAsString()); - //System.out.println("#####################"); // This block connects to somewhere other than the top of the best known chain. We treat these differently. // // Note that we send the transactions to the wallet FIRST, even if we're about to re-organize this block diff --git a/core/src/main/java/org/pivxj/core/BitcoinSerializer.java b/core/src/main/java/org/pivxj/core/BitcoinSerializer.java index aa80f15e0..20910c551 100644 --- a/core/src/main/java/org/pivxj/core/BitcoinSerializer.java +++ b/core/src/main/java/org/pivxj/core/BitcoinSerializer.java @@ -272,6 +272,9 @@ private Message makeMessage(String command, int length, byte[] payloadBytes, byt return new MasternodeBroadcast(params, payloadBytes); } else if( command.equals("mnp")) { return new MasternodePing(params, payloadBytes); + } else if (command.equals("mnget")){ + log.warn("mnget message arrived"); + return null; } else if (command.equals("spork")) { return new SporkMessage(params, payloadBytes, 0); } else if(command.equals("ssc")) { diff --git a/core/src/main/java/org/pivxj/core/BloomFilter.java b/core/src/main/java/org/pivxj/core/BloomFilter.java index 1ae89c202..4baf598c7 100644 --- a/core/src/main/java/org/pivxj/core/BloomFilter.java +++ b/core/src/main/java/org/pivxj/core/BloomFilter.java @@ -119,7 +119,18 @@ public BloomFilter(int elements, double falsePositiveRate, long randomNonce, Blo this.nTweak = randomNonce; this.nFlags = (byte)(0xff & updateFlag.ordinal()); } - + + public BloomFilter(int elements, double falsePositiveRate, long randomNonce, int hashFuncs) { + // The following formulas were stolen from Wikipedia's page on Bloom Filters (with the addition of min(..., MAX_...)) + // Size required for a given number of elements and false-positive rate + int size = (int)(-1 / (pow(log(2), 2)) * elements * log(falsePositiveRate)); + size = max(1, min(size, (int) MAX_FILTER_SIZE * 8) / 8); + data = new byte[size]; + this.hashFuncs = hashFuncs; + this.nTweak = randomNonce; + this.nFlags = (byte)(0xff & BloomUpdate.UPDATE_ALL.ordinal()); + } + /** * Returns the theoretical false positive rate of this filter if were to contain the given number of elements. */ diff --git a/core/src/main/java/org/pivxj/core/TransactionBag.java b/core/src/main/java/org/pivxj/core/TransactionBag.java index 128af84eb..1ad44338b 100644 --- a/core/src/main/java/org/pivxj/core/TransactionBag.java +++ b/core/src/main/java/org/pivxj/core/TransactionBag.java @@ -32,7 +32,7 @@ public interface TransactionBag { boolean isWatchedScript(Script script); /** Returns true if this wallet is watching transactions for outputs with the zc commitment value. */ - boolean isZcOutputMine(Script script); + boolean isZcScriptMine(Script script); /** Returns true if this wallet contains a keypair with the given public key. */ boolean isPubKeyMine(byte[] pubkey); diff --git a/core/src/main/java/org/pivxj/core/TransactionConfidence.java b/core/src/main/java/org/pivxj/core/TransactionConfidence.java index ad9bc8176..28840abed 100644 --- a/core/src/main/java/org/pivxj/core/TransactionConfidence.java +++ b/core/src/main/java/org/pivxj/core/TransactionConfidence.java @@ -21,6 +21,8 @@ import com.google.common.util.concurrent.*; import org.pivxj.utils.*; import org.pivxj.wallet.Wallet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.annotation.*; import java.util.*; @@ -61,6 +63,8 @@ */ public class TransactionConfidence { + private static final Logger log = LoggerFactory.getLogger(TransactionConfidence.class); + /** * The peers that have announced the transaction to us. Network nodes don't have stable identities, so we use * IP address as an approximation. It's obviously vulnerable to being gamed if we allow arbitrary people to connect @@ -76,6 +80,7 @@ public class TransactionConfidence { // The depth of the transaction on the best chain in blocks. An unconfirmed block has depth 0. private int depth; + private int lastBlockHeightUpdate; /** Describes the state of the transaction in general terms. Properties can be read to learn specifics. */ public enum ConfidenceType { @@ -259,6 +264,7 @@ public synchronized void setAppearedAtChainHeight(int appearedAtChainHeight) { this.appearedAtChainHeight = appearedAtChainHeight; this.depth = 1; setConfidenceType(ConfidenceType.BUILDING); + this.lastBlockHeightUpdate = appearedAtChainHeight; } /** @@ -282,6 +288,7 @@ public synchronized void setConfidenceType(ConfidenceType confidenceType) { if (confidenceType == ConfidenceType.PENDING || confidenceType == ConfidenceType.IN_CONFLICT) { depth = 0; appearedAtChainHeight = -1; + lastBlockHeightUpdate = -1; } } @@ -379,8 +386,16 @@ public synchronized String toString() { * * @return the new depth */ - public synchronized int incrementDepthInBlocks() { - return ++this.depth; + public synchronized int incrementDepthInBlocks(int seenBlockHeight) { + if (lastBlockHeightUpdate != seenBlockHeight){ + if (lastBlockHeightUpdate > seenBlockHeight){ + log.warn("trying to increase the tx depth with block with less height that the last depth update.."); + } + this.lastBlockHeightUpdate = seenBlockHeight; + return ++this.depth; + } + // This was increased already, return the current depth + return depth; } /** @@ -401,6 +416,7 @@ public synchronized int getDepthInBlocks() { * Set the depth in blocks. Having one block confirmation is a depth of one. */ public synchronized void setDepthInBlocks(int depth) { + // TODO: add block height to this method to update the lastBlockHeightUpdate.. this.depth = depth; } diff --git a/core/src/main/java/org/pivxj/core/TransactionInput.java b/core/src/main/java/org/pivxj/core/TransactionInput.java index df4b5bce6..3f1fa956a 100644 --- a/core/src/main/java/org/pivxj/core/TransactionInput.java +++ b/core/src/main/java/org/pivxj/core/TransactionInput.java @@ -18,6 +18,8 @@ package org.pivxj.core; import com.zerocoinj.core.CoinDenomination; +import com.zerocoinj.core.CoinSpend; +import com.zerocoinj.core.ZCoin; import org.pivxj.script.Script; import org.pivxj.wallet.DefaultRiskAnalysis; import org.pivxj.wallet.KeyBag; @@ -25,6 +27,9 @@ import com.google.common.base.Joiner; import com.google.common.base.Objects; +import org.pivxj.wallet.Wallet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.annotation.Nullable; import java.io.IOException; @@ -45,6 +50,9 @@ *