package Ġcom . sol ana . core Ċ Ċ import Ġcom . sol ana . vendor . Short vec Encoding Ċ import Ġorg . bitcoin j . core . Base 5 8 Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . util .* Ċ Ċ class ĠMessage Ġ{ ĊĠĠĠ Ġprivate Ġclass ĠMessage Header Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġnum Required Signatures : ĠByte Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġnum Readonly Signed Accounts : ĠByte Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġnum Readonly Unsigned Accounts : ĠByte Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfun Ġto ByteArray (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Required Signatures , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Readonly Signed Accounts , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Readonly Unsigned Accounts ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠHEADER _ LENGTH Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠComp iled Instruction Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġprogram Id Index : ĠByte Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġkey Indices Count : ĠByteArray ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġkey Indices : ĠByteArray ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġdata Length : ĠByteArray ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġdata : ĠByteArray ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 1 Ġ= Ġprogram Id Index Ġlength ĊĠĠĠĠĠĠĠ Ġval Ġlength : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= // Ġ 1 Ġ= Ġprogram Id Index Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ+ Ġkey Indices Count . size Ġ+ Ġkey Indices . size Ġ+ Ġdata Length . size Ġ+ Ġdata . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġrecent Block hash : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġaccount Keys : ĠAccount Keys List ĊĠĠĠ Ġprivate Ġval Ġinstructions : ĠMutable List < Transaction Instruction > ĊĠĠĠ Ġprivate Ġvar Ġfee Pay er : ĠAccount ? Ġ= Ġnull ĊĠĠĠ Ġfun Ġadd Instruction ( instruction : ĠTransaction Instruction ): ĠMessage Ġ{ ĊĠĠĠĠĠĠĠ Ġaccount Keys . addAll ( instruction . keys ) ĊĠĠĠĠĠĠĠ Ġaccount Keys . add ( Account Meta ( instruction . program Id , Ġfalse , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġinstructions . add ( instruction ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Recent Block Hash ( recent Block hash : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . recent Block hash Ġ= Ġrecent Block hash ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġserialize (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire NotNull ( recent Block hash ) Ġ{ Ġ" recent Block hash Ġrequired " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( instructions . size Ġ!= Ġ 0 ) Ġ{ Ġ" No Ġinstructions Ġprovided " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmessage Header Ġ= ĠMessage Header () ĊĠĠĠĠĠĠĠ Ġval Ġkeys List Ġ= Ġget Account Keys () ĊĠĠĠĠĠĠĠ Ġval Ġaccount Keys Size Ġ= Ġkeys List . size ĊĠĠĠĠĠĠĠ Ġval Ġaccount Addresses Length Ġ= ĠShort vec Encoding . encode Length ( account Keys Size ) ĊĠĠĠĠĠĠĠ Ġvar Ġcompiled Instructions Length Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġcompiled Instructions : ĠMutable List < Compiled Instruction > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġfor Ġ( instruction Ġin Ġinstructions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeys Size Ġ= Ġinstruction . keys . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Indices Ġ= ĠByteArray ( keys Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġkeys Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Indices [ i ] Ġ= Ġfind Account Index ( keys List , Ġinstruction . keys [ i ]. publicKey ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompiled Instruction Ġ= ĠComp iled Instruction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Instruction . program Id Index Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Account Index ( keys List , Ġinstruction . program Id ). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Instruction . key Indices Count Ġ= ĠShort vec Encoding . encode Length ( keys Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Instruction . key Indices Ġ= Ġkey Indices ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Instruction . data Length Ġ= ĠShort vec Encoding . encode Length ( instruction . data . count ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Instruction . data Ġ= Ġinstruction . data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Instructions . add ( compiled Instruction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompiled Instructions Length Ġ+= Ġcompiled Instruction . length ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinstructions Length Ġ= ĠShort vec Encoding . encode Length ( compiled Instructions . size ) ĊĠĠĠĠĠĠĠ Ġval ĠbufferSize Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Message Header . HEADER _ LENGTH Ġ+ ĠREC ENT _ BLOCK _ HASH _ LENGTH Ġ+ Ġaccount Addresses Length . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġaccount Keys Size Ġ* ĠPublicKey . PUBLIC _ KEY _ LENGTH Ġ+ Ġinstructions Length . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġcompiled Instructions Length ) ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠByteBuffer . allocate ( buffer Size ) ĊĠĠĠĠĠĠĠ Ġval Ġaccount Keys Buff Ġ= ĠByteBuffer . allocate ( account Keys Size Ġ* ĠPublicKey . PUBLIC _ KEY _ LENGTH ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( account Meta Ġin Ġkeys List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Keys Buff . put ( account Meta . publicKey . toByteArray () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( account Meta . is Signer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Header . num Required Signatures Ġ= Ġ( message Header . num Required Signatures . plus ( 1 )). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! account Meta . is Writable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Header . num Readonly Signed Accounts Ġ= Ġ( message Header . num Readonly Signed Accounts . plus ( 1 )). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! account Meta . is Writable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Header . num Readonly Unsigned Accounts = Ġ( message Header . num Readonly Unsigned Accounts . plus ( 1 )). to Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġout . put ( message Header . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġout . put ( account Addresses Length ) ĊĠĠĠĠĠĠĠ Ġout . put ( account Keys Buff . array ()) ĊĠĠĠĠĠĠĠ Ġout . put ( Base 5 8 . decode ( recent Block hash )) ĊĠĠĠĠĠĠĠ Ġout . put ( instructions Length ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( compiled Instruction Ġin Ġcompiled Instructions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . put ( compiled Instruction . program Id Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . put ( compiled Instruction . key Indices Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . put ( compiled Instruction . key Indices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . put ( compiled Instruction . data Length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . put ( compiled Instruction . data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġout . array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Fee Pay er ( fee Pay er : ĠAccount ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . fee Pay er Ġ= Ġfee Pay er ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Account Keys (): ĠList < Account Meta > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkeys List : ĠMutable List < Account Meta > Ġ= Ġaccount Keys . list ĊĠĠĠĠĠĠĠ Ġval Ġfee Pay er Index Ġ= Ġfind Account Index ( keys List , Ġfee Pay er !!. publicKey ) ĊĠĠĠĠĠĠĠ Ġval Ġnew List : ĠMutable List < Account Meta > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġfee Pay er Meta Ġ= Ġkeys List [ fee Pay er Index ] ĊĠĠĠĠĠĠĠ Ġnew List . add ( Account Meta ( fee Pay er Meta . publicKey , Ġtrue , Ġtrue )) ĊĠĠĠĠĠĠĠ Ġkeys List . remove At ( fee Pay er Index ) ĊĠĠĠĠĠĠĠ Ġnew List . addAll ( keys List ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnew List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Account Index ( account Meta List : ĠList < Account Meta >, Ġkey : ĠPublicKey ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġaccount Meta List . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( account Meta List [ i ]. publicKey . equals ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" unable Ġto Ġfind Ġaccount Ġindex ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREC ENT _ BLOCK _ HASH _ LENGTH Ġ= Ġ 3 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġaccount Keys Ġ= ĠAccount Keys List () ĊĠĠĠĠĠĠĠ Ġinstructions Ġ= ĠArrayList () ĊĠĠĠ Ġ} Ċ }