package Ġio . lun arch ain . lun ar coin . vm . program . invoke Ċ Ċ import Ġio . lun arch ain . lun ar coin . core . Block Ċ import Ġio . lun arch ain . lun ar coin . core . Transaction Ċ import Ġio . lun arch ain . lun ar coin . storage . Repository Ċ import Ġio . lun arch ain . lun ar coin . util . Byte Util Ċ import Ġl un ar . vm . Data Word Ċ import Ġl un ar . vm . program . Program Ċ import Ġl un ar . vm . program . invoke . Program Invoke Ċ import Ġjava . math . BigInteger Ċ Ċ class ĠProgram Invoke Factory Impl : ĠProgram Invoke Factory Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Program Invoke ( tx : ĠTransaction , Ġblock : ĠBlock , Ġblock Store : ĠRepository ): ĠProgram Invoke Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** * ĠĠĠĠĠĠĠĠ ĠADDRESS Ġop ĠĠĠĠĠĠ Ġ*** / ĊĠĠĠĠĠĠĠ Ġ// ĠY P : ĠGet Ġaddress Ġof Ġcurrently Ġexecuting Ġaccount . ĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġif Ġ( tx . is Contract Creation ()) Ġtx . get Contract Address () Ġelse Ġtx . receiver Address ĊĊĠĠĠĠĠĠĠ Ġ/** * ĠĠĠĠĠĠĠĠ ĠOR IGIN Ġop ĠĠĠĠĠĠ Ġ*** / ĊĠĠĠĠĠĠĠ Ġ// ĠY P : ĠThis Ġis Ġthe Ġsender Ġof Ġoriginal Ġtransaction ; Ġit Ġis Ġnever Ġa Ġcontract . ĊĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= Ġtx . get Sender () ĊĊĠĠĠĠĠĠĠ Ġ/** * ĠĠĠĠĠĠĠĠ ĠCALL ER Ġop ĠĠĠĠĠĠ Ġ*** / ĊĠĠĠĠĠĠĠ Ġ// ĠY P : ĠThis Ġis Ġthe Ġaddress Ġof Ġthe Ġaccount Ġthat Ġis Ġdirectly Ġresponsible Ġfor Ġthis Ġexecution . ĊĠĠĠĠĠĠĠ Ġval Ġcaller Ġ= Ġtx . get Sender () ĊĊĠĠĠĠĠĠĠ Ġ/** * ĠĠĠĠĠĠĠĠ ĠB AL ANCE Ġop ĠĠĠĠĠĠ Ġ*** / ĊĠĠĠĠĠĠĠ Ġval Ġbalance Ġ= Ġblock Store . get Balance ( address !! ). toByteArray () ĊĊĠĠĠĠĠĠĠ Ġ/** * ĠĠĠĠĠĠĠĠ ĠG AS PRICE Ġop ĠĠĠĠĠĠ Ġ*** / ĊĠĠĠĠĠĠĠ Ġval Ġgas Price Ġ= Ġtx . gas Price ĊĊĠĠĠĠĠĠĠ Ġ/** * ĠG AS Ġop Ġ*** / ĊĠĠĠĠĠĠĠ Ġval Ġgas Ġ= Ġtx . gas Limit ĊĊĠĠĠĠĠĠĠ Ġ/** * ĠĠĠĠĠĠĠ ĠCALL VALUE Ġop ĠĠĠĠĠ Ġ*** / ĊĠĠĠĠĠĠĠ Ġval Ġcall Value Ġ= Ġtx . amount . toByteArray () ĊĊĠĠĠĠĠĠĠ Ġ/** * ĠĠĠĠ ĠCALL DAT AL O AD Ġ Ġop ĠĠ Ġ*** / ĊĠĠĠĠĠĠĠ Ġ/** * ĠĠĠĠ ĠCALL DAT AC OP Y Ġ Ġop ĠĠ Ġ*** / ĊĠĠĠĠĠĠĠ Ġ/** * ĠĠĠĠ ĠCALL DAT AS IZE Ġ Ġop ĠĠ Ġ*** / ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġif Ġ( tx . is Contract Creation ()) ĠByte Util . EMPTY _ BYTE _ ARRAY Ġelse Ġtx . data ĊĊĠĠĠĠĠĠĠ Ġ/** * ĠĠĠ ĠPRE V HASH Ġ Ġop Ġ Ġ*** / ĊĠĠĠĠĠĠĠ Ġval Ġlast Hash Ġ= Ġblock . parent Hash ĊĊĠĠĠĠĠĠĠ Ġ/** * ĠĠ ĠCO IN BASE Ġ Ġop Ġ*** / ĊĠĠĠĠĠĠĠ Ġval Ġcoin base Ġ= Ġblock . coin Base ĊĊĠĠĠĠĠĠĠ Ġ/** * ĠTIMESTAMP Ġ Ġop Ġ Ġ*** / ĊĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġblock . time ĊĊĠĠĠĠĠĠĠ Ġ/** * ĠNUMBER Ġ Ġop Ġ Ġ*** / ĊĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= Ġblock . height ĊĊĠĠĠĠĠĠĠ Ġ/** * ĠDIFF IC UL TY Ġ Ġop Ġ Ġ*** / ĊĠĠĠĠĠĠĠ Ġval Ġdifficulty Ġ= Ġblock . difficulty ĊĊĠĠĠĠĠĠĠ Ġ/** * ĠG AS LIMIT Ġop Ġ*** / ĊĠĠĠĠĠĠĠ Ġval Ġgas limit Ġ= Ġblock . gas Limit ĊĊĠĠĠĠĠĠĠ Ġreturn ĠProgram Invoke Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaddress , Ġorigin !! , Ġcaller !! , Ġbalance , Ġgas Price , Ġgas , Ġcall Value , Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Hash , Ġcoin base , Ġtimestamp . millis , Ġnumber , Ġdifficulty . to BigInteger (). toByteArray (), Ġgas limit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Store , Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Program Invoke ( ĊĠĠĠĠĠĠĠ Ġprogram : ĠProgram , ĊĠĠĠĠĠĠĠ Ġto Address : ĠData Word , ĊĠĠĠĠĠĠĠ Ġcaller Address : ĠData Word , ĊĠĠĠĠĠĠĠ Ġin Value : ĠData Word , ĊĠĠĠĠĠĠĠ Ġin Gas : ĠData Word , ĊĠĠĠĠĠĠĠ Ġbalance Int : ĠBigInteger , ĊĠĠĠĠĠĠĠ Ġdata In : ĠByteArray , ĊĠĠĠĠĠĠĠ Ġblock Store : ĠRepository , ĊĠĠĠĠĠĠĠ Ġstatic Call : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġby Testing Suite : ĠBoolean ĊĠĠĠ Ġ): ĠProgram Invoke Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġto Address ĊĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= Ġprogram . get Origin Address () ĊĠĠĠĠĠĠĠ Ġval Ġcaller Ġ= Ġcaller Address ĊĊĠĠĠĠĠĠĠ Ġval Ġbalance Ġ= ĠData Word ( balance Int . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġval Ġgas Price Ġ= Ġprogram . get Gas Price () ĊĠĠĠĠĠĠĠ Ġval Ġgas Ġ= Ġin Gas ĊĠĠĠĠĠĠĠ Ġval Ġcall Value Ġ= Ġin Value ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġdata In ĊĠĠĠĠĠĠĠ Ġval Ġlast Hash Ġ= Ġprogram . get Prev Hash () ĊĠĠĠĠĠĠĠ Ġval Ġcoin base Ġ= Ġprogram . getC oin base () ĊĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= Ġprogram . getTimestamp () ĊĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= Ġprogram . getNumber () ĊĠĠĠĠĠĠĠ Ġval Ġdifficulty Ġ= Ġprogram . get Difficulty () ĊĠĠĠĠĠĠĠ Ġval Ġgas Limit Ġ= Ġprogram . get Gas Limit () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠProgram Invoke Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaddress , Ġorigin , Ġcaller , Ġbalance , Ġgas Price , Ġgas , Ġcall Value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata , Ġlast Hash , Ġcoin base , Ġtimestamp , Ġnumber , Ġdifficulty , Ġgas Limit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Store , Ġprogram . get Call Deep () Ġ+ Ġ 1 , Ġstatic Call , Ġby Testing Suite ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} Ċ }