/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 Ġ 4 1 North . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġio . ex flo . ingest ion . tokens . pre compiled Ċ Ċ import Ġjava . util . Array Deque Ċ import Ġorg . hyperledger . bes u . ethereum . core . Gas Ċ import Ġorg . hyperledger . bes u . ethereum . main net . Main net Message Call Processor Ċ import Ġorg . hyperledger . bes u . ethereum . main net . Pre compile Contract Registry Ċ import Ġorg . hyperledger . bes u . ethereum . main net . Pre compiled Contract Ċ import Ġorg . hyperledger . bes u . ethereum . vm . Code Ċ import Ġorg . hyperledger . bes u . ethereum . vm . E VM Ċ import Ġorg . hyperledger . bes u . ethereum . vm . Message Frame Ċ import Ġorg . hyperledger . bes u . ethereum . vm . Operation Tracer Ċ import Ġorg . hyperledger . bes u . util . bytes . Bytes Value Ċ Ċ abstract Ġclass ĠAbstract Detector Pre compiled Contract ( ĊĠĠĠ Ġprivate Ġval Ġe vm : ĠE VM Ċ ) Ġ: ĠPre compiled Contract Ġ{ ĊĊĠĠĠ Ġabstract Ġval Ġcode : ĠCode ĊĊĠĠĠ Ġoverride Ġfun Ġcompute ( input : ĠBytes Value , Ġframe : ĠMessage Frame ): ĠBytes Value Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġan Ġempty ĠMessage Frame Ġto Ġuse Ġin Ġour Ġdis posable ĠE VM ĊĠĠĠĠĠĠĠ Ġval Ġmessage Frame Stack Ġ= ĠArray Deque < Message Frame >() ĊĠĠĠĠĠĠĠ Ġval Ġupdater Ġ= Ġframe . world State . updater () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġthe Ġinitial Ġframe ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UNUSED _ L AMBDA _ EXPRESSION ") ĊĠĠĠĠĠĠĠ Ġval Ġinitial Frame Ġ= ĠMessage Frame . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. type ( Message Frame . Type . MESSAGE _ CALL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. message Frame Stack ( message Frame Stack ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. blockchain ( frame . blockchain ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. world State ( updater ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. initial Gas ( frame . remaining Gas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. address ( frame . contract Address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. origin ator ( frame . sender Address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contract ( frame . contract Address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contract Account Version ( frame . contract Account Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. gas Price ( frame . gas Price ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. input Data ( frame . input Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sender ( frame . sender Address ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. value ( frame . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. app arent Value ( frame . app arent Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. code ( code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. block Header ( frame . block Header ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. depth ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. comp leter Ġ{ Ġ_ Ġ-> Ġ{} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. mining Bene ficiary ( frame . mining Bene ficiary ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. block Hash Lookup ( frame . block Hash Lookup ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. max Stack Size ( frame . max Stack Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Pers isting State ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġmessage Frame Stack . add First ( initial Frame ) ĊĊĠĠĠĠĠĠĠ Ġval Ġexecutor Ġ= ĠMain net Message Call Processor ( e vm , ĠPre compile Contract Registry ()) ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(! message Frame Stack . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecutor . process ( message Frame Stack . peek First (), ĠOperation Tracer . NO _ TR ACING ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinitial Frame . output Data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgas Requirement ( input : ĠBytes Value ?): ĠG as Ġ= ĠG as . of ( 1 L ) Ċ } Ċ