package Ġorg . block stack . android . stack str ans actions . message ĊĊ Ċ import Ġorg . k omp uting . kb ign umbers . big integer . BigInteger Ċ import Ġorg . k omp uting . kb ign umbers . big integer . extensions . to HexString Zero P added Ċ import Ġorg . k omp uting . k hex . extensions . hex To ByteArray Ċ import Ġorg . k omp uting . k hex . extensions . to No Prefix HexString Ċ import Ġorg . open int ents . block stack . stack str ans actions . Cl arity Value Ċ import Ġorg . open int ents . block stack . stack str ans actions . serialize CV Ċ Ċ open Ġclass ĠPayload ( ĊĠ Ġval Ġpayload Type : ĠPayload Type ?, ĊĊĠ Ġval Ġasset Type : ĠAsset Type ? Ġ= Ġnull , ĊĠ Ġval Ġasset Info : ĠAsset Info ? Ġ= Ġnull , ĊĠ Ġval Ġasset Name : ĠLength Prefix edString ? Ġ= Ġnull , ĊĠ Ġval Ġrecipient : ĠPrincipal ? Ġ= Ġnull , ĊĠ Ġval Ġamount : ĠBigInteger ? Ġ= Ġnull , ĊĠ Ġval Ġmemo : ĠM emo String ? Ġ= Ġnull , ĊĊĠ Ġval Ġcontract Address : ĠAddress ? Ġ= Ġnull , ĊĠ Ġval Ġcontract Name : ĠLength Prefix edString ? Ġ= Ġnull , ĊĠ Ġval Ġfunction Name : ĠLength Prefix edString ? Ġ= Ġnull , ĊĠ Ġval Ġfunction Args : ĠArray < Cl arity Value >? Ġ= Ġnull , ĊĊĠ Ġval Ġcode Body : ĠCode Body String ? Ġ= Ġnull , ĊĊĠ Ġval Ġcoin base Buffer : ĠByteArray ? Ġ= Ġnull Ċ Ċ ) Ġ: ĠStack s Message Codec Ġ{ ĊĠ Ġ@ Opt In ( Experimental Std lib Api :: class ) ĊĠ Ġoverride Ġfun Ġserialize (): ĠByteArray Ġ{ ĊĠĠĠ Ġif Ġ( payload Type Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġerror ("' payload Type ' Ġnot Ġspecified ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġwhen Ġ( payload Type ) Ġ{ ĊĊĠĠĠĠĠ ĠPayload Type . Token Transfer Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( recipient Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerror ("' recipient Address ' Ġnot Ġspecified ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( amount Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerror ("' amount ' Ġnot Ġspecified ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( memo Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerror ("' memo ' Ġnot Ġspecified ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠ Ġpayload Type . type , ĊĠĠĠĠĠĠĠĠĠ Ġ* recipient . serialize (), ĊĠĠĠĠĠĠĠĠĠ Ġ* amount . to HexString Zero P added ( 1 6 , Ġfalse ). hex To ByteArray (), ĊĠĠĠĠĠĠĠĠĠ Ġ* memo . serialize () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠPayload Type . Smart Contract Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( contract Name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnot Specified Error (" contract Name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( code Body Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnot Specified Error (" code Bo y ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠ Ġpayload Type . type , ĊĠĠĠĠĠĠĠĠĠ Ġ* contract Name . serialize (), ĊĠĠĠĠĠĠĠĠĠ Ġ* code Body . serialize () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠPayload Type . Contract Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this . contract Address Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnot Specified Error (" contract Address ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( this . contract Name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnot Specified Error (" contract Name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( this . function Name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnot Specified Error (" function Name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( this . function Args Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnot Specified Error (" function Args ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġargs Bytes Ġ= Ġfunction Args . map { Ġserialize CV ( it )} ĊĠĠĠĠĠĠĠ Ġval ĠnumberOf Bytes Ġ= Ġargs Bytes . fold ( 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsum , Ġit Ġ-> Ġsum Ġ+ Ġit . size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfunction Args Bytes Ġ= ĠByteArray ( numberOf Bytes ) ĊĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( arg Ġin Ġargs Bytes Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġarg . copy Into ( function Args Bytes , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠ Ġoffset Ġ+= Ġarg . size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠ Ġpayload Type . type , ĊĠĠĠĠĠĠĠĠĠ Ġ* contract Address . serialize (), ĊĠĠĠĠĠĠĠĠĠ Ġ* contract Name . serialize (), ĊĠĠĠĠĠĠĠĠĠ Ġ* function Name . serialize (), ĊĠĠĠĠĠĠĠĠĠ Ġ* int To HexString ( function Args . size , Ġ 4 ). hex To ByteArray (), ĊĠĠĠĠĠĠĠĠĠ Ġ* function Args Bytes ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠError (" Unsupported Ġpayload Ġtype ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Opt In ( Experimental Std lib Api :: class ) ĊĠĠĠ Ġfun Ġdeserialize ( reader : ĠByteArray Reader ): ĠPayload Ġ{ ĊĠĠĠĠĠ Ġval Ġpayload Type Ġ= ĠPayload Type . getBy Value ( reader . read Byte ()) ĊĠĠĠĠĠ Ġreturn Ġwhen Ġ( payload Type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPayload Type . Token Transfer Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġrecipient Address Ġ= ĠPrincipal ( reader ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġamount Ġ= ĠBigInteger ( reader . read ( 8 ). decode ToString ()) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġmemo Ġ= ĠM emo String . deserialize ( reader ) ĊĠĠĠĠĠĠĠĠĠ ĠToken Transfer Payload ( recipient Address , Ġamount , Ġmemo ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġerror (" unsupported Ġpayload Ġtype ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ class ĠToken Transfer Payload ( recipient : ĠPrincipal , Ġamount : ĠBigInteger , Ġmemo : ĠM emo String ) Ġ: ĊĠ ĠPayload ( ĊĠĠĠ ĠPayload Type . Token Transfer , Ġrecipient Ġ= Ġrecipient , Ġamount Ġ= Ġamount , Ġmemo Ġ= Ġmemo ĊĠ Ġ) Ġ{ ĊĠ Ġconstructor ( recipient Address : ĠString , Ġamount : ĠBigInteger , Ġmemo : ĠString ?) Ġ: ĊĠĠĠ Ġthis ( Standard Principal ( Address ( recipient Address )), Ġamount , ĠM emo String ( memo )) Ċ } Ċ Ċ class ĠSmart Contract Payload ( contract Name : ĠLength Prefix edString , Ġcode Body : ĠCode Body String ) Ġ: ĊĠ ĠPayload ( Payload Type . Smart Contract , Ġcontract Name Ġ= Ġcontract Name , Ġcode Body Ġ= Ġcode Body ) Ġ{ ĊĠ Ġconstructor ( contract Name : ĠString , Ġcode Body : ĠString ) Ġ: ĊĠĠĠ Ġthis ( Length Prefix edString ( contract Name ), ĠCode Body String ( code Body )) Ċ } Ċ Ċ class ĠPo ison Payload Ġ: ĠPayload ( Payload Type . Po ison Micro block ) Ċ Ċ class ĠCoin base Payload ( coin base Buffer : ĠByteArray ) Ġ: ĊĠ ĠPayload ( Payload Type . Coin base , Ġcoin base Buffer Ġ= Ġcoin base Buffer ) Ċ Ċ class ĠContract Call Payload ( ĊĠ Ġcontract Address : ĠString , ĊĠ Ġcontract Name : ĠString , ĊĠ Ġfunction Name : ĠString , ĊĠ Ġfunction Args : ĠArray < Cl arity Value > Ċ ) Ġ: ĊĠ ĠPayload ( ĊĠĠĠ ĠPayload Type . Contract Call , Ġcontract Address Ġ= ĠAddress ( contract Address ), ĊĠĠĠ Ġcontract Name Ġ= ĠLength Prefix edString ( contract Name ), ĊĠĠĠ Ġfunction Name Ġ= ĠLength Prefix edString ( function Name ), ĊĠĠĠ Ġfunction Args Ġ= Ġfunction Args ĊĠ Ġ) Ċ Ċ class ĠM emo String ( val Ġcontent : ĠString ? Ġ= Ġnull ) Ġ: ĠStack s Message Codec Ġ{ ĊĠ Ġ@ Opt In ( Experimental Std lib Api :: class ) ĊĠ Ġoverride Ġfun Ġserialize (): ĠByteArray Ġ{ ĊĠĠĠ Ġif Ġ( content Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġerror ("' content ' Ġnot Ġdefined ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġcontent . encode To ByteArray () ĊĠĠĠĠĠ Ġ. to No Prefix HexString () ĊĠĠĠĠĠ Ġ. pad End ( Constants . ME MO _ MAX _ LENGTH _ BYTES Ġ* Ġ 2 , Ġ' 0 ') ĊĠĠĠĠĠ Ġ. hex To ByteArray () ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Opt In ( Experimental Std lib Api :: class ) ĊĠĠĠ Ġfun Ġdeserialize ( reader : ĠByteArray Reader ): ĠM emo String Ġ{ ĊĠĠĠĠĠ Ġval Ġcontent Ġ= Ġreader . read ( Constants . ME MO _ MAX _ LENGTH _ BYTES ). decode ToString () ĊĠĠĠĠĠĠĠ Ġ. drop Last Hex Z eros () ĊĠĠĠĠĠ Ġreturn ĠM emo String ( content ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠString . drop Last Hex Z eros (): String Ġ{ ĊĠ Ġfor Ġ( index Ġin Ġlast Index Ġdown To Ġ 0 ) ĊĠĠĠ Ġif Ġ( index Ġ% Ġ 2 Ġ== Ġ 0 Ġ&& Ġthis [ index ] Ġ!= Ġ 0 . to Char ()) ĊĠĠĠĠĠ Ġreturn Ġsubstring ( 0 , Ġindex Ġ+ Ġ 1 ) ĊĠ Ġreturn Ġ"" Ċ } Ċ Ċ class ĠCode Body String ( content : ĠString ? Ġ= Ġnull ) Ġ: ĠLength Prefix edString ( content , Ġ 4 , Ġ 1 0 0 0 0 0 ) Ċ