package Ġorg . know ledger . ledger . storage . w itness Ċ Ċ import Ġkotlinx . serialization . Binary Format Ċ import Ġkotlinx . serialization . Transient Ċ import Ġkotlinx . serialization . cb or . Cb or Ċ import Ġorg . know ledger . collections . Mutable Sort edList Ċ import Ġorg . know ledger . collections . mutable Sort edList Of Ċ import Ġorg . know ledger . ledger . crypto . Encoded PublicKey Ċ import Ġorg . know ledger . ledger . crypto . Hash Ċ import Ġorg . know ledger . ledger . crypto . hash . Hash ers Ċ import Ġorg . know ledger . ledger . crypto . hash . Hash ers . Companion . DEFAULT _ HAS HER Ċ import Ġorg . know ledger . ledger . data . Pay out Ċ import Ġorg . know ledger . ledger . storage . Hash Update able Ċ import Ġorg . know ledger . ledger . storage . Indexed Ċ import Ġorg . know ledger . ledger . storage . Transaction Output Ċ Ċ internal Ġdata Ġclass ĠHas hed W itness Impl ( ĊĠĠĠ Ġprivate Ġval Ġw itness : ĠW itness Impl , ĊĠĠĠ Ġprivate Ġvar Ġ_ hash : ĠHash ? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġvar Ġ_ index : ĠInt Ġ= Ġ- 1 , ĊĠĠĠ Ġ@ Transient ĊĠĠĠ Ġprivate Ġvar Ġhash er : ĠHash ers Ġ= ĠDEFAULT _ HAS HER , ĊĠĠĠ Ġ@ Transient ĊĠĠĠ Ġprivate Ġvar Ġencoder : ĠBinary Format Ġ= ĠC bor Ċ ) Ġ: ĠHas hed W itness , ĠHash Update able , ĊĠĠĠ ĠIndexed , ĠPay out Adding , ĊĠĠĠ ĠW itness Ġby Ġw itness Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġcached Size : ĠLong ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġval Ġapproximate Size : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcached Size Ġ?: Ġre calculate Size ( hash er , Ġencoder ) ĊĊĠĠĠ Ġoverride Ġval Ġhash ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ hash Ġ?: Ġre calculate Hash ( hash er , Ġencoder ) ĊĊĠĠĠ Ġoverride Ġval Ġindex : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ index ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstructor Ġfor Ġinitial iz ating Ġtransaction Ġoutputs Ġwith ĊĠĠĠĠ Ġ* Ġthe Ġfirst Ġone Ġfor Ġthe Ġw itness . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ ĠpublicKey : ĠEn coded PublicKey , Ġprevious W itness Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġprevious Coin base : ĠHash , Ġhash er : ĠHash ers , ĊĠĠĠĠĠĠĠ Ġencoder : ĠBinary Format , Ġtransaction Output : ĠTransaction Output ĊĠĠĠ Ġ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġw itness Ġ= ĠW itness Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Ġ= ĠpublicKey , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious W itness Index Ġ= Ġprevious W itness Index , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Coin base Ġ= Ġprevious Coin base , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ pay out Ġ= Ġtransaction Output . pay out , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ transaction Outputs Ġ= Ġmutable Sort edList Of ( transaction Output ) ĊĠĠĠĠĠĠĠ Ġ), Ġhash er Ġ= Ġhash er , Ġencoder Ġ= Ġencoder ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Hash ( hash er , Ġencoder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ ĠpublicKey : ĠEn coded PublicKey , Ġprevious W itness Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġprevious Coin base : ĠHash , Ġpay out : ĠPay out , ĊĠĠĠĠĠĠĠ Ġtransaction Outputs : ĠMutable Sort edList < Transaction Output >, ĊĠĠĠĠĠĠĠ Ġhash : ĠHash , Ġhash er : ĠHash ers , Ġencoder : ĠBinary Format ĊĠĠĠ Ġ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġw itness Ġ= ĠW itness Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Ġ= ĠpublicKey , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious W itness Index Ġ= Ġprevious W itness Index , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Coin base Ġ= Ġprevious Coin base , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ pay out Ġ= Ġpay out , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ transaction Outputs Ġ= Ġtransaction Outputs ĊĠĠĠĠĠĠĠ Ġ), Ġ_ hash Ġ= Ġhash , Ġhash er Ġ= Ġhash er , Ġencoder Ġ= Ġencoder ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġclone (): ĠHas hed W itness Impl Ġ= ĊĠĠĠĠĠĠĠ Ġcopy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġw itness Ġ= Ġw itness . clone () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġupdate Hash ( ĊĠĠĠĠĠĠĠ Ġhash er : ĠHash ers , Ġencoder : ĠBinary Format ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġw itness . serialize ( encoder ) ĊĠĠĠĠĠĠĠ Ġ_ hash Ġ= Ġhash er . apply Hash ( bytes ) ĊĠĠĠĠĠĠĠ Ġcached Size Ġ= Ġcached Size Ġ?: Ġbytes . size . to Long () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ hash !!. bytes . size . to Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġre calculate Size ( ĊĠĠĠĠĠĠĠ Ġhash er : ĠHash ers , Ġencoder : ĠBinary Format ĊĠĠĠ Ġ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Hash ( hash er , Ġencoder ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcached Size Ġas ĠLong ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġre calculate Hash ( ĊĠĠĠĠĠĠĠ Ġhash er : ĠHash ers , Ġencoder : ĠBinary Format ĊĠĠĠ Ġ): ĠHash Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Hash ( hash er , Ġencoder ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ hash Ġas ĠHash ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠaddTo Pay out ( ĊĠĠĠĠĠĠĠ Ġtransaction Output : ĠTransaction Output ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġw itness . addTo Pay out ( transaction Output ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cached Size Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Size Ġ= Ġ( cached Size Ġas ĠLong ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Output . approx imate Size ( encoder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Hash ( hash er , Ġencoder ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmark Index ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ index Ġ= Ġindex ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠHas hed W itness ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( w itness Ġ!= Ġother ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ(_ hash Ġ!= Ġother . hash ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġw itness . hashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġ(_ hash ?. hashCode () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊ Ċ }