package Ġorg . ke v em . e vm . gas Ċ Ċ import Ġorg . ke v em . e vm . Opcode Ċ import Ġorg . ke v em . e vm . Opcode .* Ċ import Ġorg . ke v em . e vm . model . ExecutionContext Ċ import Ġorg . ke v em . e vm . model . Stack Ċ import Ġorg . ke v em . e vm . numbers . BigInt Math Ċ import Ġorg . ke v em . e vm . ops . Call Ops Ċ import Ġjava . lang . Integer . max Ċ import Ġjava . math . BigInteger Ċ Ċ class ĠMemory Usage Gas Cost Calculator ( private Ġval Ġmemory Use Gas Calc : ĠMemory Usage Gas Calc ) Ġ{ ĊĊĠĠĠ Ġfun Ġmemory Usage Cost ( opcode : ĠOpcode , Ġexecution Ctx : ĠExecutionContext ): ĠBigInteger Ġ= Ġwhen Ġ( opcode ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCALL Ġ-> Ġcall Cost ( execution Ctx , Ġtrue ) ĊĠĠĠĠĠĠĠ ĠCALL CODE Ġ-> Ġcall Cost ( execution Ctx , Ġtrue ) ĊĠĠĠĠĠĠĠ ĠDE LEG ATE CALL Ġ-> Ġcall Cost ( execution Ctx , Ġfalse ) ĊĠĠĠĠĠĠĠ ĠSTATIC CALL Ġ-> Ġcall Cost ( execution Ctx , Ġfalse ) ĊĠĠĠĠĠĠĠ ĠSHA 3 Ġ-> Ġcalculate ( execution Ctx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( from , Ġlength ) Ġ= Ġit . peek Words ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighest Byte OrNull ( from . to BigInt (), Ġlength . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠCALL DAT AC OP Y Ġ-> Ġcalculate ( execution Ctx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( to , Ġ_, Ġsize ) Ġ= Ġit . peek Words ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighest Byte OrNull ( to . to BigInt (), Ġsize . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠEXT CODE COPY Ġ-> Ġcalculate ( execution Ctx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġto , Ġ_, Ġsize ) Ġ= Ġit . peek Words ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighest Byte OrNull ( to . to BigInt (), Ġsize . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠRETURN DAT AC OP Y Ġ-> Ġcalculate ( execution Ctx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( to , Ġ_, Ġsize ) Ġ= Ġit . peek Words ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighest Byte OrNull ( to . to BigInt (), Ġsize . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠCODE COPY Ġ-> Ġcalculate ( execution Ctx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( to , Ġ_, Ġsize ) Ġ= Ġit . peek Words ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighest Byte OrNull ( to . to BigInt (), Ġsize . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠM LOAD Ġ-> Ġcalculate ( execution Ctx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( loc ) Ġ= Ġit . peek Words ( 1 ). map Ġ{ Ġw Ġ-> Ġw . to BigInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloc Ġ+ Ġ 3 2 . to BigInteger () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠM STORE Ġ-> Ġcalculate ( execution Ctx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( loc , Ġ_) Ġ= Ġit . peek Words ( 2 ). map Ġ{ Ġw Ġ-> Ġw . to BigInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloc Ġ+ Ġ 3 2 . to BigInteger () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠM STORE 8 Ġ-> Ġcalculate ( execution Ctx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( loc , Ġ_) Ġ= Ġit . peek Words ( 2 ). map Ġ{ Ġw Ġ-> Ġw . to BigInt () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġloc Ġ+ Ġ 1 . to BigInteger () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLOG 0 Ġ-> Ġlog Cost ( execution Ctx ) ĊĠĠĠĠĠĠĠ ĠLOG 1 Ġ-> Ġlog Cost ( execution Ctx ) ĊĠĠĠĠĠĠĠ ĠLOG 2 Ġ-> Ġlog Cost ( execution Ctx ) ĊĠĠĠĠĠĠĠ ĠLOG 3 Ġ-> Ġlog Cost ( execution Ctx ) ĊĠĠĠĠĠĠĠ ĠLOG 4 Ġ-> Ġlog Cost ( execution Ctx ) ĊĠĠĠĠĠĠĠ ĠCREATE Ġ-> Ġcalculate ( execution Ctx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġloc , Ġsize ) Ġ= Ġit . peek Words ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighest Byte OrNull ( loc . to BigInt (), Ġsize . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠRETURN Ġ-> Ġcalculate ( execution Ctx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( loc , Ġsize ) Ġ= Ġit . peek Words ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighest Byte OrNull ( loc . to BigInt (), Ġsize . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠCREATE 2 Ġ-> Ġcalculate ( execution Ctx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ(_, Ġ_, Ġloc , Ġsize ) Ġ= Ġit . peek Words ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighest Byte OrNull ( loc . to BigInt (), Ġsize . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠRE VERT Ġ-> Ġcalculate ( execution Ctx ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( loc , Ġsize ) Ġ= Ġit . peek Words ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighest Byte OrNull ( loc . to BigInt (), Ġsize . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠBigInteger . ZERO ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Cost ( executionContext : ĠExecutionContext ): ĠBigInteger Ġ= Ġcalculate ( executionContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( loc , Ġsize ) Ġ= Ġit . peek Words ( 2 ). map Ġ{ Ġw Ġ-> Ġw . to BigInt () Ġ} ĊĠĠĠĠĠĠĠ Ġloc Ġ+ Ġsize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcall Cost ( executionContext : ĠExecutionContext , Ġwith Value : ĠBoolean ): ĠBigInteger Ġ= ĊĠĠĠĠĠĠĠ Ġcalculate ( executionContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Args Ġ= ĠCall Ops . peek Call Args From Stack ( executionContext . stack , Ġwith Value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Max Byte Ġ= Ġhighest Byte OrNull ( call Args . in Location , Ġcall Args . in Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrite Max Byte Ġ= Ġhighest Byte OrNull ( call Args . out Location , Ġcall Args . out Size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Safe Max ( read Max Byte , Ġwrite Max Byte ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate ( executionContext : ĠExecutionContext , Ġmax Referenced : Ġ( Stack ) Ġ-> ĠBigInteger ?): ĠBigInteger Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Byte Referenced Ġ= Ġmax Referenced ( executionContext . stack ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( max Byte Referenced Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Max Ġ= Ġexecution Context . current Call Ctx . memory . max Index ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Max Ġ== Ġnull Ġ|| Ġmax Byte Referenced Ġ> Ġcurrent Max ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Use Gas Calc . memory Cost ( max Byte Referenced ) Ġ- Ġmemory Use Gas Calc . memory Cost ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Max Ġ?: ĠBigInteger . ZERO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠBigInteger . ZERO ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĠBigInteger . ZERO ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnull Safe Max ( a : ĠBigInteger ?, Ġb : ĠBigInteger ?) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġa Ġ== Ġnull Ġ-> Ġb ĊĠĠĠĠĠĠĠ Ġb Ġ== Ġnull Ġ-> Ġa ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠBigInt Math . max ( a , Ġb ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhighest Byte OrNull ( from : ĠBigInteger , Ġlength : ĠInt ): ĠBigInteger ? Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( length Ġ> Ġ 0 ) Ġfrom Ġ+ Ġlength . to BigInteger () ĊĠĠĠĠĠĠĠ Ġelse Ġnull Ċ } ĊĊ