// ĠVer i Block ĠBlock chain ĠProject Ċ // ĠCopyright Ġ 2 0 1 7 - 2 0 1 8 ĠVer i Block , ĠInc Ċ // ĠCopyright Ġ 2 0 1 8 - 2 0 2 1 ĠX en ios ĠSE ZC Ċ // ĠAll Ġrights Ġreserved . Ċ // Ġhttps :// www . ver ib lock . org Ċ // ĠDistributed Ġunder Ġthe ĠMIT Ġsoftware Ġlicense , Ġsee Ġthe Ġaccompanying Ċ // Ġfile ĠLICENSE Ġor Ġhttp :// www . opensource . org / licenses / mit - license . php . Ċ package Ġorg . ver ib lock . sp v . service Ċ Ċ import Ġcom . google . protobuf . ByteString Ċ import Ġnode core . api . grpc . Rpc Transaction Ċ import Ġorg . ver ib lock . core . types . Pair Ċ import Ġorg . ver ib lock . core . utilities . Address Utility Ċ import Ġorg . ver ib lock . core . utilities . Utility Ċ import Ġorg . ver ib lock . sdk . models . Coin Ċ import Ġorg . ver ib lock . core . crypto . Sha 2 5 6 Hash Ċ import Ġorg . ver ib lock . core . params . Network Parameters Ċ import Ġorg . ver ib lock . core . wallet . Address Manager Ċ import Ġorg . ver ib lock . sdk . models . as Coin Ċ import Ġorg . ver ib lock . sp v . model . Address Coins Index Ċ import Ġorg . ver ib lock . sp v . model . Output Ċ import Ġorg . ver ib lock . sp v . model . Signing Result Ċ import Ġorg . ver ib lock . sp v . model . Standard Transaction Ċ import Ġorg . ver ib lock . sp v . model . Transaction Ċ import Ġjava . util . ArrayList Ċ Ċ class ĠTransaction Service ( ĊĠĠĠ Ġprivate Ġval Ġaddress Manager : ĠAddress Manager , ĊĠĠĠ Ġprivate Ġval Ġnetwork Parameters : ĠNetwork Parameters Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġcalculate Fee ( ĊĠĠĠĠĠĠĠ Ġrequested Source Address : ĠString , ĊĠĠĠĠĠĠĠ Ġtotal Output Amount : ĠLong , ĊĠĠĠĠĠĠĠ Ġoutput List : ĠList < Output >, ĊĠĠĠĠĠĠĠ Ġsignature Index : ĠLong ĊĠĠĠ Ġ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġfor Ġover - estim ating Ġthe Ġsize Ġof Ġthe Ġtransaction Ġby Ġone Ġbyte Ġin Ġthe Ġedge Ġcase Ġwhere Ġtotal Output Amount ĊĠĠĠĠĠĠĠ Ġ// Ġis Ġright Ġbelow Ġa Ġpower - of - two Ġbarrier ĊĠĠĠĠĠĠĠ Ġval Ġfee F udge Factor Ġ= ĠDEFAULT _ TRANSACTION _ F EE Ġ* Ġ 5 0 0 L ĊĠĠĠĠĠĠĠ Ġval Ġpredicted Transaction Size Ġ= Ġpredict Standard Transaction To All Standard Output Size ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Output Amount Ġ+ Ġfee F udge Factor , Ġoutput List , Ġsignature Index Ġ+ Ġ 1 , Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġpredicted Transaction Size Ġ* ĠDEFAULT _ TRANSACTION _ F EE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Transactions By Output List ( ĊĠĠĠĠĠĠĠ Ġaddress Coins Index List : ĠList < Address Coins Index >, ĊĠĠĠĠĠĠĠ Ġoutput List : ĠList < Output > ĊĠĠĠ Ġ): ĠList < Transaction > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransactions : ĠMutable List < Transaction > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġvar Ġsorted Outputs Ġ= Ġoutput List . sorted By Ġ{ Ġit . amount . atomic Units Ġ}. to Mutable List () ĊĠĠĠĠĠĠĠ Ġval Ġsorted Address Coins Index List Ġ= Ġaddress Coins Index List . filter Ġ{ Ġit . coins Ġ> Ġ 0 Ġ}. sorted By Ġ{ Ġit . coins Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtotal Output Amount Ġ= Ġsorted Outputs . map Ġ{ Ġit . amount . atomic Units Ġ}. sum () ĊĠĠĠĠĠĠĠ Ġfor Ġ( source Addresses Index Ġin Ġsorted Address Coins Index List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfee Ġ= Ġcalculate Fee ( source Addresses Index . address , Ġtotal Output Amount , Ġsorted Outputs , Ġsource Addresses Index . index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfulfill And For Pay Ġ= Ġsplit Out Put s Acc ording Balance ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsorted Outputs , Ġ( source Addresses Index . coins Ġ- Ġfee ). as Coin () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsorted Outputs Ġ= Ġfulfill And For Pay . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutputs For Pay Ġ= Ġfulfill And For Pay . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransaction Input Amount Ġ= Ġoutputs For Pay . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . amount . atomic Units ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. sum () Ġ+ Ġfee ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġcreate Standard Transaction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Addresses Index . address , Ġtransaction Input Amount , Ġoutputs For Pay , Ġsource Addresses Index . index Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransactions . add ( transaction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sorted Outputs . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtransactions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsplit Out Put s Acc ording Balance ( ĊĠĠĠĠĠĠĠ Ġoutputs : ĠMutable List < Output >, ĊĠĠĠĠĠĠĠ Ġbalance : ĠCoin ĊĠĠĠ Ġ): ĠPair < Mutable List < Output >, ĠList < Output >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutputs Left : ĠMutable List < Output > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġoutputs For Pay : ĠMutable List < Output > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġvar Ġbalance Left Ġ= Ġbalance ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġoutputs . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġoutputs [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Left Ġ= Ġif Ġ( balance Left . atomic Units Ġ> Ġoutput . amount . atomic Units ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutputs For Pay . add ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance . subtract ( output . amount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpart For Pay Ġ= ĠOutput ( output . address , Ġbalance Left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutputs For Pay . add ( part For Pay ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft To Pay Ġ= Ġoutput . amount . subtract ( balance Left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutputs . add ( Output ( output . address , Ġleft To Pay )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutputs . remove ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġi Ġuntil Ġoutputs . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutputs Left . add ( outputs [ j ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutputs Left , Ġoutputs For Pay ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutputs Left , Ġoutputs For Pay ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġstandard Ġsigned Ġtransaction . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinput Address ĠĠ ĠThe Ġaddress Ġtokens Ġare Ġbeing Ġspent Ġfrom ĊĠĠĠĠ Ġ* Ġ@ param Ġinput Amount ĠĠĠ ĠThe Ġquantity Ġof Ġtokens Ġbeing Ġremoved Ġfrom Ġthe Ġinput Ġaddress ĊĠĠĠĠ Ġ* Ġ@ param Ġoutputs ĠĠĠĠĠĠĠ ĠAll Ġ_ outputs Ġ( with Ġtheir Ġcorresponding Ġshare Ġof Ġthe Ġsent Ġtokens ) ĊĠĠĠĠ Ġ* Ġ@ param Ġsignature Index ĠThe Ġindex Ġof Ġsignature Ġfor Ġinput Address ĊĠĠĠĠ Ġ* Ġ@ return ĠA ĠStandard Transaction Ġobject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate Standard Transaction ( ĊĠĠĠĠĠĠĠ Ġinput Address : ĠString , ĊĠĠĠĠĠĠĠ Ġinput Amount : ĠLong , ĊĠĠĠĠĠĠĠ Ġoutputs : ĠList < Output >, ĊĠĠĠĠĠĠĠ Ġsignature Index : ĠLong ĊĠĠĠ Ġ): ĠTransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( Address Utility . isValid Standard Address ( input Address )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" create Standard Transaction Ġcannot Ġbe Ġcalled Ġwith Ġan Ġinvalid Ġinput Address Ġ($ input Address ) !" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( Utility . is Positive ( input Amount )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" create Standard Transaction Ġcannot Ġbe Ġcalled Ġwith Ġa Ġnon - positive Ġinput Amount Ġ($ input Amount ) !" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġoutput Total Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġfor Ġ( output Count Ġin Ġoutputs . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġoutputs [ output Count ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Amount Ġ= Ġoutput . amount . atomic Units ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( Utility . is Positive ( output Amount )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" create Standard Transaction Ġcannot Ġbe Ġcalled Ġwith Ġan Ġoutput Ġ( at Ġindex Ġ$ output Count ) Ġwith Ġa Ġnon - positive Ġoutput Ġamount !" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Total Ġ+= Ġoutput Amount ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( output Total Ġ<= Ġinput Amount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" create Standard Transaction Ġcannot Ġbe Ġcalled Ġwith Ġan Ġoutput Ġtotal Ġwhich Ġis Ġlarger Ġthan Ġthe Ġinput Amount " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġ( output Total Ġ= Ġ$ output Total , Ġinput Amount Ġ= Ġ$ input Amount ) !" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtransaction : ĠTransaction Ġ= ĠStandard Transaction ( input Address , Ġinput Amount , Ġoutputs , Ġsignature Index , Ġnetwork Parameters ) ĊĠĠĠĠĠĠĠ Ġval Ġsigning Result Ġ= Ġsign Transaction ( transaction . tx Id , Ġinput Address ) ĊĠĠĠĠĠĠĠ Ġif Ġ( signing Result . succeeded ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . add Signature ( signing Result . signature , Ġsigning Result . publicKey ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtransaction ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO ( w arch ant ): Ġuse ĠAddress Ġinstead Ġof ĠString Ġfor Ġall Ġaddresses ĊĠĠĠ Ġfun Ġcreate Unsigned Alt Chain End orse ment Transaction ( ĊĠĠĠĠĠĠĠ Ġinput Address : ĠString , Ġfee : ĠLong , Ġpublication Data : ĠByteArray ?, Ġsignature Index : ĠLong ĊĠĠĠ Ġ): ĠTransaction Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( Address Utility . isValid Standard Address ( input Address )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" create Alt Chain End orse ment Transaction Ġcannot Ġbe Ġcalled Ġwith Ġan Ġinvalid Ġinput Address Ġ($ input Address ) !" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( Utility . is Positive ( fee )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" create Alt Chain End orse ment Transaction Ġcannot Ġbe Ġcalled Ġwith Ġa Ġnon - positive input Amount Ġ($ fee ) !" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠStandard Transaction ( null , Ġinput Address , Ġfee , Ġempty List (), Ġsignature Index , Ġpublication Data , Ġnetwork Parameters ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpredict Standard Transaction To All Standard Output Size ( ĊĠĠĠĠĠĠĠ Ġinput Amount : ĠLong , ĊĠĠĠĠĠĠĠ Ġoutputs : ĠList < Output >, ĊĠĠĠĠĠĠĠ Ġsig Index : ĠLong , ĊĠĠĠĠĠĠĠ Ġextra Data Length : ĠInt ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠTransaction ĠVersion ĊĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠType Ġof ĠInput ĠAddress ĊĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠStandard ĠInput ĠAddress ĠLength ĠByte ĊĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 2 2 Ġ// ĠStandard ĠInput ĠAddress ĠLength ĊĠĠĠĠĠĠĠ Ġval Ġinput Amount Bytes Ġ= ĠUtility . trimmed ByteArray From Long ( input Amount ) ĊĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠInput ĠAmount ĠLength ĠByte ĊĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġinput Amount Bytes . size Ġ// ĠInput ĠAmount ĠLength ĊĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠNumber Ġof ĠOutputs ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġoutputs . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠID Ġof ĠOutput ĠAddress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠOutput ĠAddress ĠLength ĠBytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 2 2 Ġ// ĠOutput ĠAddress ĠLength ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Amount Ġ= ĠUtility . trimmed ByteArray From Long ( outputs [ i ]. amount . atomic Units ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠOutput ĠAmount ĠLength ĠBytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġoutput Amount . size Ġ// ĠOutput ĠAmount ĠLength ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsig Index Bytes Ġ= ĠUtility . trimmed ByteArray From Long ( sig Index ) ĊĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠSig ĠIndex ĠLength ĠBytes ĊĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġsig Index Bytes . size Ġ// ĠSig ĠIndex ĠBytes ĊĠĠĠĠĠĠĠ Ġval Ġdata Length Bytes Ġ= ĠUtility . trimmed ByteArray From Integer ( extra Data Length ) ĊĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠData ĠLength ĠBytes ĠLength ĊĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġdata Length Bytes . size Ġ// ĠData ĠLength ĠBytes ĊĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġextra Data Length Ġ// ĠExtra Ġdata Ġsection ĊĠĠĠĠĠĠĠ Ġreturn Ġtotal Size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsign Transaction ( tx Id : ĠSh a 2 5 6 Hash , Ġaddress : ĠString ): ĠSign ing Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= Ġaddress Manager . sign Message ( tx Id . bytes , Ġaddress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠSign ing Result ( false , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= Ġaddress Manager . get PublicKey For Address ( address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠSign ing Result ( false , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSign ing Result ( true , Ġsignature , ĠpublicKey . encoded ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ TRANSACTION _ F EE Ġ= Ġ 1 0 0 0 L ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġpredict Alt Chain End orse ment Transaction Size ( data Length : ĠInt , Ġsig Index : ĠLong ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Size Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUsing Ġan Ġestimated Ġtotal Ġfee Ġof Ġ 1 ĠV BK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Amount Ġ= Ġ 1 0 0 0 0 0 0 0 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠTransaction ĠVersion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠType Ġof ĠInput ĠAddress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠStandard ĠInput ĠAddress ĠLength ĠByte ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 2 2 Ġ// ĠStandard ĠInput ĠAddress ĠLength ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Amount Bytes Ġ= ĠUtility . trimmed ByteArray From Long ( input Amount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Amount Length Ġ= Ġinput Amount Bytes . size . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠInput ĠAmount ĠLength ĠByte ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġinput Amount Length . toInt () Ġ// ĠInput ĠAmount ĠLength ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠNumber Ġof ĠOutputs , Ġwill Ġbe Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsig Index Bytes Ġ= ĠUtility . trimmed ByteArray From Long ( sig Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠSig ĠIndex ĠLength ĠBytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġsig Index Bytes . size Ġ// ĠSig ĠIndex ĠBytes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Size Bytes Ġ= ĠUtility . trimmed ByteArray From Integer ( data Length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġ 1 Ġ// ĠData ĠLength ĠBytes ĠLength ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġdata Size Bytes . size Ġ// ĠData ĠLength ĠBytes Ġ( value Ġwill Ġbe Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġdata Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtotal Size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Regular Transaction Message Builder ( tx : ĠStandard Transaction ): ĠRpc Transaction . Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠRpc Transaction . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . transaction Fee Ġ= Ġtx . getTransaction Fee () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . tx Id Ġ= ĠByte String . copyFrom ( tx . tx Id . bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . type Ġ= ĠRpc Transaction . Type . STANDARD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . source Amount Ġ= Ġtx . input Amount !!. atomic Units ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . source Address Ġ= ĠByte String . copyFrom ( tx . input Address !!. toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . data Ġ= ĠByte String . copyFrom ( tx . data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġbuilder . set Timestamp ( getTime Stamp ()); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġbuilder . setSize ( tx . getSize ()); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( output Ġin Ġtx . get Outputs ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Builder Ġ= Ġbuilder . add Outputs Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Builder . address Ġ= ĠByte String . copyFrom ( output . address . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Builder . amount Ġ= Ġoutput . amount . atomic Units ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuilder ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ