11package io .iohk .ethereum .extvm
22
33import java .nio .ByteOrder
4-
54import akka .NotUsed
65import akka .actor .ActorSystem
76import akka .stream .OverflowStrategy
@@ -17,13 +16,12 @@ import scala.annotation.tailrec
1716import scala .util .Failure
1817import scala .util .Success
1918import scala .util .Try
20-
2119import com .google .protobuf .{ByteString => GByteString }
2220import com .typesafe .config .ConfigFactory
23-
2421import io .iohk .ethereum .domain .Address
2522import io .iohk .ethereum .domain .BlockHeader
2623import io .iohk .ethereum .extvm .Implicits ._
24+ import io .iohk .ethereum .extvm .msg .{AccessListData , StorageEntry }
2725import io .iohk .ethereum .utils ._
2826import io .iohk .ethereum .vm .BlockchainConfigForEvm
2927import io .iohk .ethereum .vm .EvmConfig
@@ -106,6 +104,7 @@ class VMServer(messageHandler: MessageHandler) extends Logger {
106104 messageHandler.close()
107105 }
108106
107+ // scalastyle:off method.length
109108 private def constructContextFromMsg (contextMsg : msg.CallContext ): ProgramContext [World , Storage ] = {
110109 import ByteString .{empty => irrelevant } // used for irrelevant BlockHeader fields
111110
@@ -136,6 +135,10 @@ class VMServer(messageHandler: MessageHandler) extends Logger {
136135 val recipientAddr : Option [Address ] =
137136 Option (contextMsg.recipientAddr).filterNot(_.isEmpty).map(bytes => Address (bytes : ByteString ))
138137
138+ val (warmAddresses : Set [Address ], warmStorage : Set [(Address , BigInt )]) = contextMsg.extraData.accessList
139+ .map(extractWarmAccessList)
140+ .getOrElse((Set .empty[Address ], Set .empty[(Address , BigInt )]))
141+
139142 ProgramContext (
140143 callerAddr = contextMsg.callerAddr,
141144 originAddr = contextMsg.callerAddr,
@@ -152,11 +155,19 @@ class VMServer(messageHandler: MessageHandler) extends Logger {
152155 initialAddressesToDelete = Set (),
153156 evmConfig = vmConfig,
154157 originalWorld = world,
155- // TODO ETCM-1202 use access list from CallContext
156- warmAddresses = Set .empty,
157- warmStorage = Set .empty
158+ warmAddresses = warmAddresses,
159+ warmStorage = warmStorage
158160 )
159161 }
162+ // scalastyle:on method.length
163+
164+ private def extractWarmAccessList (ald : AccessListData ): (Set [Address ], Set [(Address , BigInt )]) = {
165+ val warmAddresses : Set [Address ] = ald.addresses.toSet.map((bs : GByteString ) => Address (bs : ByteString ))
166+ val warmStorage : Set [(Address , BigInt )] = ald.storageLocations.toSet.map { (se : StorageEntry ) =>
167+ (Address (se.address: ByteString ), se.storageLocation: BigInt )
168+ }
169+ (warmAddresses, warmStorage)
170+ }
160171
161172 private def buildResultMsg (result : ProgramResult [World , Storage ]): msg.CallResult = {
162173
0 commit comments