[Speedy] move compilation of disclosure outside of the Machine. (#16453)

Machine is not supposed to compile anything.
This commit is contained in:
Remy 2023-03-06 19:04:31 +01:00 committed by GitHub
parent 518248425a
commit 39d816f657
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 328 additions and 403 deletions

View File

@ -279,7 +279,7 @@ class Engine(val config: EngineConfig = Engine.StableConfig) {
for {
sexpr <- runCompilerSafely(
NameOf.qualifiedNameOfCurrentFunc,
compiledPackages.compiler.unsafeCompile(commands),
compiledPackages.compiler.unsafeCompile(commands, disclosures),
)
result <- interpretExpression(
validating,
@ -322,7 +322,6 @@ class Engine(val config: EngineConfig = Engine.StableConfig) {
validating = validating,
contractKeyUniqueness = config.contractKeyUniqueness,
limits = config.limits,
disclosedContracts = disclosures,
)
interpretLoop(machine, ledgerTime, disclosures)
}

View File

@ -61,7 +61,6 @@ da_scala_library(
"//daml-lf/validation",
"//libs-scala/contextualized-logging",
"//libs-scala/scala-utils",
"@maven//:com_google_protobuf_protobuf_java",
],
)

View File

@ -124,15 +124,8 @@ private[lf] final class Compiler(
@throws[PackageNotFound]
@throws[CompilationError]
def unsafeCompile(cmds: ImmArray[Command]): t.SExpr = compileCommands(cmds)
@throws[PackageNotFound]
@throws[CompilationError]
def unsafeCompileWithContractDisclosures(
compiledCommands: t.SExpr,
disclosures: ImmArray[DisclosedContract],
): t.SExpr =
compileWithContractDisclosures(compiledCommands, disclosures)
def unsafeCompile(cmds: ImmArray[Command], disclosures: ImmArray[DisclosedContract]): t.SExpr =
compileCommands(cmds, disclosures)
@throws[PackageNotFound]
@throws[CompilationError]
@ -332,21 +325,16 @@ private[lf] final class Compiler(
private[this] def compileExp(expr: Expr): t.SExpr =
pipeline(translateExp(Env.Empty, expr))
private[this] def compileCommands(cmds: ImmArray[Command]): t.SExpr =
pipeline(translateCommands(Env.Empty, cmds))
private[this] def compileWithContractDisclosures(
sexpr: t.SExpr,
private[this] def compileCommands(
cmds: ImmArray[Command],
disclosures: ImmArray[DisclosedContract],
): t.SExpr = {
val disclosuresExpr = pipeline(
translateContractDisclosures(Env.Empty, disclosures)
): t.SExpr =
pipeline(
let(
Env.Empty,
translateContractDisclosures(Env.Empty, disclosures),
)((_, env) => translateCommands(env, cmds))
)
t.SELet1(
disclosuresExpr,
sexpr,
)
}
private[this] def compileCommandForReinterpretation(cmd: Command): t.SExpr =
pipeline(translateCommandForReinterpretation(cmd))

View File

@ -446,13 +446,9 @@ private[lf] object Speedy {
contractKeyUniqueness: ContractKeyUniquenessMode = ContractKeyUniquenessMode.Strict,
commitLocation: Option[Location] = None,
limits: interpretation.Limits = interpretation.Limits.Lenient,
disclosedContracts: ImmArray[speedy.DisclosedContract],
)(implicit loggingContext: LoggingContext): UpdateMachine = {
val exprWithDisclosures =
compiledPackages.compiler.unsafeCompileWithContractDisclosures(expr, disclosedContracts)
)(implicit loggingContext: LoggingContext): UpdateMachine =
new UpdateMachine(
sexpr = exprWithDisclosures,
sexpr = expr,
validating = validating,
submissionTime = submissionTime,
ptx = PartialTransaction
@ -473,7 +469,6 @@ private[lf] object Speedy {
iterationsBetweenInterruptions = iterationsBetweenInterruptions,
compiledPackages = compiledPackages,
)
}
private[lf] final case class Result(
tx: SubmittedTransaction,
@ -1129,7 +1124,6 @@ private[lf] object Speedy {
updateE: Expr,
committers: Set[Party],
authorizationChecker: AuthorizationChecker = DefaultAuthorizationChecker,
disclosedContracts: ImmArray[speedy.DisclosedContract] = ImmArray.Empty,
limits: interpretation.Limits = interpretation.Limits.Lenient,
)(implicit loggingContext: LoggingContext): UpdateMachine = {
val updateSE: SExpr = compiledPackages.compiler.unsafeCompile(updateE)
@ -1139,7 +1133,6 @@ private[lf] object Speedy {
updateSE,
committers,
authorizationChecker,
disclosedContracts,
limits,
)
}
@ -1153,7 +1146,6 @@ private[lf] object Speedy {
updateSE: SExpr,
committers: Set[Party],
authorizationChecker: AuthorizationChecker = DefaultAuthorizationChecker,
disclosedContracts: ImmArray[speedy.DisclosedContract] = ImmArray.Empty,
limits: interpretation.Limits = interpretation.Limits.Lenient,
traceLog: TraceLog = newTraceLog,
)(implicit loggingContext: LoggingContext): UpdateMachine = {
@ -1166,7 +1158,6 @@ private[lf] object Speedy {
readAs = Set.empty,
limits = limits,
traceLog = traceLog,
disclosedContracts = disclosedContracts,
authorizationChecker = authorizationChecker,
iterationsBetweenInterruptions = 10000,
)

View File

@ -33,7 +33,7 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
.fill(10 * 1000)(Command.Create(recordCon, contract()))
.toImmArray
compiledPackages.compiler.unsafeCompile(cmds) shouldBe a[SExpr]
compiledPackages.compiler.unsafeCompile(cmds, ImmArray.Empty) shouldBe a[SExpr]
}
"compile deeply nested lets" in {
@ -81,9 +81,8 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
)
"accept disclosed contracts with a valid precondition" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray.Empty)),
ImmArray(disclosedContract1),
val sexpr = tokenApp(
compiledPackages.compiler.unsafeCompile(ImmArray.Empty, ImmArray(disclosedContract1))
)
inside(evalSExpr(sexpr, getContract = Map(cid1 -> versionedContract1))) {
@ -94,9 +93,8 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
}
"reject disclosed contracts with an invalid precondition" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray.Empty)),
ImmArray(disclosedContract2),
val sexpr = tokenApp(
compiledPackages.compiler.unsafeCompile(ImmArray.Empty, ImmArray(disclosedContract2))
)
inside(evalSExpr(sexpr, getContract = Map(cid2 -> versionedContract2))) {
@ -126,10 +124,7 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
"with no commands" should {
"contract cache empty with no disclosures" in {
val sexpr =
compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray.Empty)),
ImmArray.Empty,
)
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray.Empty, ImmArray.Empty))
inside(evalSExpr(sexpr)) {
case Right((SValue.SUnit, contractCache, disclosedContracts)) =>
@ -139,9 +134,8 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
}
"contract cache contains single disclosure" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray.Empty)),
ImmArray(disclosedContract1),
val sexpr = tokenApp(
compiledPackages.compiler.unsafeCompile(ImmArray.Empty, ImmArray(disclosedContract1))
)
inside(evalSExpr(sexpr, getContract = Map(cid1 -> versionedContract1))) {
@ -152,9 +146,9 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
}
"contract cache contains multiple disclosures" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray.Empty)),
ImmArray(disclosedContract1, disclosedContract2),
val sexpr = tokenApp(
compiledPackages.compiler
.unsafeCompile(ImmArray.Empty, ImmArray(disclosedContract1, disclosedContract2))
)
inside(
@ -173,10 +167,8 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
val command = Command.Create(templateId, contract())
"contract cache contains created contract with no disclosures" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command))),
ImmArray.Empty,
)
val sexpr =
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command), ImmArray.Empty))
inside(evalSExpr(sexpr, committers = Set(alice))) {
case Right((SValue.SUnit, contractCache, disclosedContracts)) =>
@ -186,9 +178,8 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
}
"contract cache contains created contract and single disclosure" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command))),
ImmArray(disclosedContract1),
val sexpr = tokenApp(
compiledPackages.compiler.unsafeCompile(ImmArray(command), ImmArray(disclosedContract1))
)
inside(
@ -205,9 +196,9 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
}
"contract cache contains created contract and multiple disclosures" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command))),
ImmArray(disclosedContract1, disclosedContract2),
val sexpr = tokenApp(
compiledPackages.compiler
.unsafeCompile(ImmArray(command), ImmArray(disclosedContract1, disclosedContract2))
)
inside(
@ -230,9 +221,8 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
val command2 = Command.Create(templateId, contract())
"contract cache contains all created contracts with no disclosures" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command1, command2))),
ImmArray.Empty,
val sexpr = tokenApp(
compiledPackages.compiler.unsafeCompile(ImmArray(command1, command2), ImmArray.Empty)
)
inside(evalSExpr(sexpr, committers = Set(alice))) {
@ -243,9 +233,9 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
}
"contract cache contains all created contracts and single disclosure" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command1, command2))),
ImmArray(disclosedContract1),
val sexpr = tokenApp(
compiledPackages.compiler
.unsafeCompile(ImmArray(command1, command2), ImmArray(disclosedContract1))
)
inside(
@ -263,9 +253,11 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
}
"contract cache contains all created contracts and multiple disclosures" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command1, command2))),
ImmArray(disclosedContract1, disclosedContract2),
val sexpr = tokenApp(
compiledPackages.compiler.unsafeCompile(
ImmArray(command1, command2),
ImmArray(disclosedContract1, disclosedContract2),
)
)
inside(
@ -304,10 +296,7 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
"with no commands" should {
"contract cache is empty with no disclosures" in {
val sexpr =
compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray.Empty)),
ImmArray.Empty,
)
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray.Empty, ImmArray.Empty))
inside(evalSExpr(sexpr)) {
case Right((SValue.SUnit, contractCache, disclosedContracts)) =>
@ -317,9 +306,8 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
}
"contract cache contains single disclosure" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray.Empty)),
ImmArray(disclosedContract1),
val sexpr = tokenApp(
compiledPackages.compiler.unsafeCompile(ImmArray.Empty, ImmArray(disclosedContract1))
)
inside(evalSExpr(sexpr, getContract = Map(cid1 -> versionedContract1))) {
@ -330,9 +318,9 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
}
"contract cache contains multiple disclosures" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray.Empty)),
ImmArray(disclosedContract1, disclosedContract2),
val sexpr = tokenApp(
compiledPackages.compiler
.unsafeCompile(ImmArray.Empty, ImmArray(disclosedContract1, disclosedContract2))
)
inside(
@ -351,10 +339,8 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
val command = Command.Create(templateId, contract("test-label"))
"contract cache contains created contract with no disclosures" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command))),
ImmArray.Empty,
)
val sexpr =
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command), ImmArray.Empty))
inside(evalSExpr(sexpr, committers = Set(alice))) {
case Right((SValue.SUnit, contractCache, disclosedContracts)) =>
@ -364,9 +350,8 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
}
"contract cache contains created contract and single disclosure" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command))),
ImmArray(disclosedContract1),
val sexpr = tokenApp(
compiledPackages.compiler.unsafeCompile(ImmArray(command), ImmArray(disclosedContract1))
)
inside(
@ -383,9 +368,9 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
}
"contract cache contains created contract and multiple disclosures" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command))),
ImmArray(disclosedContract1, disclosedContract2),
val sexpr = tokenApp(
compiledPackages.compiler
.unsafeCompile(ImmArray(command), ImmArray(disclosedContract1, disclosedContract2))
)
inside(
@ -408,9 +393,8 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
val command2 = Command.Create(templateId, contract("test-label-2"))
"contract cache contains all created contracts with no disclosures" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command1, command2))),
ImmArray.Empty,
val sexpr = tokenApp(
compiledPackages.compiler.unsafeCompile(ImmArray(command1, command2), ImmArray.Empty)
)
inside(evalSExpr(sexpr, committers = Set(alice))) {
@ -421,9 +405,9 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
}
"contract cache contains all created contracts and single disclosure" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command1, command2))),
ImmArray(disclosedContract1),
val sexpr = tokenApp(
compiledPackages.compiler
.unsafeCompile(ImmArray(command1, command2), ImmArray(disclosedContract1))
)
inside(
@ -440,9 +424,11 @@ class CompilerTest extends AnyWordSpec with Matchers with Inside {
}
"contract cache contains all created contracts and multiple disclosures" in {
val sexpr = compiledPackages.compiler.unsafeCompileWithContractDisclosures(
tokenApp(compiledPackages.compiler.unsafeCompile(ImmArray(command1, command2))),
ImmArray(disclosedContract1, disclosedContract2),
val sexpr = tokenApp(
compiledPackages.compiler.unsafeCompile(
ImmArray(command1, command2),
ImmArray(disclosedContract1, disclosedContract2),
)
)
inside(
@ -543,7 +529,6 @@ object CompilerTest {
initialSeeding = InitialSeeding.TransactionSeed(crypto.Hash.hashPrivateKey("CompilerTest")),
expr = sexpr,
committers = committers,
disclosedContracts = ImmArray.Empty,
readAs = Set.empty,
)

View File

@ -4,8 +4,7 @@
package com.daml.lf
package speedy
import com.daml.lf.command.ContractMetadata
import com.daml.lf.data.{Bytes, FrontStack, ImmArray, Ref, Time}
import com.daml.lf.data.{FrontStack, ImmArray, Ref}
import com.daml.lf.data.Ref.{Location, Party}
import com.daml.lf.interpretation.{Error => IE}
import com.daml.lf.language.Ast._
@ -349,20 +348,24 @@ class EvaluationOrderTest extends AnyFreeSpec with Matchers with Inside {
),
)
private[this] def buildDisclosedContract(signatory: Party): Versioned[DisclosedContract] =
Versioned(
TransactionVersion.minExplicitDisclosure,
DisclosedContract(
Dummy,
SContractId(cId),
SRecord(
private[this] def buildDisclosedContract(
signatory: Party
): (Value.ContractId, Speedy.CachedContract) = {
cId ->
Speedy.CachedContract(
version = TransactionVersion.minExplicitDisclosure,
templateId = Dummy,
value = SRecord(
Dummy,
ImmArray(Ref.Name.assertFromString("signatory")),
ArrayList(SParty(signatory)),
),
ContractMetadata(Time.Timestamp.now(), None, Bytes.Empty),
),
)
agreementText = "",
signatories = Set(signatory),
observers = Set.empty,
keyOpt = None,
)
}
private[this] val visibleContract = buildContract(bob)
private[this] val nonVisibleContract = buildContract(alice)
@ -418,24 +421,27 @@ class EvaluationOrderTest extends AnyFreeSpec with Matchers with Inside {
e: Expr,
args: Array[SValue],
parties: Set[Party],
disclosedContracts: ImmArray[Versioned[DisclosedContract]] = ImmArray.Empty,
disclosedContracts: Iterable[(Value.ContractId, Speedy.CachedContract)] = Iterable.empty,
getContract: PartialFunction[Value.ContractId, Value.VersionedContractInstance] =
PartialFunction.empty,
getKey: PartialFunction[GlobalKeyWithMaintainers, Value.ContractId] = PartialFunction.empty,
): (Try[Either[SError, SValue]], Seq[String]) = {
val se = pkgs.compiler.unsafeCompile(e)
val traceLog = new TestTraceLog()
val machine = Speedy.Machine
.fromUpdateSExpr(
pkgs,
seed,
if (args.isEmpty) se else SEApp(se, args),
parties,
traceLog = traceLog,
)
disclosedContracts.foreach { case (cid, contract) =>
machine.addDisclosedContracts(cid, contract)
}
val res = Try(
SpeedyTestLib.run(
Speedy.Machine
.fromUpdateSExpr(
pkgs,
seed,
if (args.isEmpty) se else SEApp(se, args),
parties,
disclosedContracts = disclosedContracts.map(_.unversioned),
traceLog = traceLog,
),
machine,
getContract = traceLog.tracePF("queries contract", getContract),
getKey = traceLog.tracePF("queries key", getKey),
)
@ -2214,7 +2220,7 @@ class EvaluationOrderTest extends AnyFreeSpec with Matchers with Inside {
in Test:fetch_by_id fetchingParty cId2""",
Array(SParty(alice), SParty(alice), SContractId(cId)),
Set(alice),
disclosedContracts = ImmArray(buildDisclosedContract(alice)),
disclosedContracts = List(buildDisclosedContract(alice)),
)
inside(result) {

View File

@ -4,13 +4,11 @@
package com.daml.lf
package speedy
import com.daml.lf.command.ContractMetadata
import com.daml.lf.crypto.Hash
import com.daml.lf.data.Ref.{IdString, Party}
import com.daml.lf.data.{Bytes, FrontStack, ImmArray, Ref, Struct, Time}
import com.daml.lf.data.{FrontStack, ImmArray, Ref, Struct}
import com.daml.lf.language.Ast
import com.daml.lf.speedy.SExpr.SEMakeClo
import com.daml.lf.speedy.SValue.{SContractId, SToken}
import com.daml.lf.speedy.SValue.SToken
import com.daml.lf.speedy.Speedy.{CachedContract, CachedKey}
import com.daml.lf.transaction.{GlobalKey, GlobalKeyWithMaintainers, TransactionVersion, Versioned}
import com.daml.lf.value.Value
@ -96,63 +94,76 @@ object ExplicitDisclosureLib {
val caveTemplateType: Ref.TypeConName = Ref.TypeConName.assertFromString("-pkgId-:TestMod:Cave")
val keyType: Ref.TypeConName = Ref.TypeConName.assertFromString("-pkgId-:TestMod:Key")
val contractKey: GlobalKey = buildContractKey(maintainerParty)
val contractSKey: SValue = buildContractSKey(maintainerParty)
val contractSStructKey: SValue =
SValue.SStruct(
fieldNames =
Struct.assertFromNameSeq(Seq("globalKey", "maintainers").map(Ref.Name.assertFromString)),
values = ArrayList(
buildContractSKey(maintainerParty),
SValue.SList(FrontStack.from(ImmArray(SValue.SParty(maintainerParty)))),
),
)
val ledgerContractKey: GlobalKey = buildContractKey(ledgerParty)
val ledgerHouseContract: Value.VersionedContractInstance =
buildContract(ledgerParty, maintainerParty)
val ledgerCaveContract: Value.VersionedContractInstance =
buildContract(ledgerParty, maintainerParty, caveTemplateId)
val disclosedCaveContractNoHash: DisclosedContract =
buildDisclosedCaveContract(contractId, disclosureParty)
val disclosedHouseContract: DisclosedContract =
buildDisclosedHouseContract(disclosureContractId, disclosureParty, maintainerParty)
val disclosedCaveContract: DisclosedContract =
buildDisclosedCaveContract(contractId, disclosureParty)
val disclosedCaveContractNoHash: (Value.ContractId, Speedy.CachedContract) =
contractId -> buildDisclosedCaveContract(disclosureParty)
val disclosedHouseContract: (Value.ContractId, Speedy.CachedContract) =
disclosureContractId -> buildDisclosedHouseContract(disclosureParty, maintainerParty)
val disclosedCaveContract: (Value.ContractId, Speedy.CachedContract) =
contractId -> buildDisclosedCaveContract(disclosureParty)
def buildDisclosedHouseContract(
contractId: ContractId,
owner: Party,
maintainer: Party,
templateId: Ref.Identifier = houseTemplateId,
withHash: Boolean = true,
withKey: Boolean = true,
label: String = testKeyName,
): DisclosedContract = {
val key = Value.ValueRecord(
None,
ImmArray(
None -> Value.ValueText(label),
None -> Value.ValueList(FrontStack.from(ImmArray(Value.ValueParty(maintainer)))),
),
)
val keyHash: Option[Hash] =
if (withHash) Some(crypto.Hash.assertHashContractKey(houseTemplateType, key)) else None
DisclosedContract(
templateId,
SContractId(contractId),
SValue.SRecord(
): Speedy.CachedContract = {
val cachedKey: Option[Speedy.CachedKey] =
if (withKey)
Some(
Speedy.CachedKey(
globalKeyWithMaintainers =
GlobalKeyWithMaintainers(buildContractKey(maintainer, label), Set(maintainer)),
key = buildContractSKey(maintainer),
)
)
else
None
Speedy.CachedContract(
version = TransactionVersion.maxVersion,
templateId = templateId,
value = SValue.SRecord(
templateId,
ImmArray(Ref.Name.assertFromString("owner"), Ref.Name.assertFromString("key_maintainer")),
ArrayList(SValue.SParty(owner), SValue.SParty(maintainer)),
),
ContractMetadata(Time.Timestamp.now(), keyHash, Bytes.Empty),
agreementText = "",
signatories = Set(owner, maintainer),
observers = Set.empty,
keyOpt = cachedKey,
)
}
def buildDisclosedCaveContract(
contractId: ContractId,
owner: Party,
templateId: Ref.Identifier = caveTemplateId,
): DisclosedContract = {
DisclosedContract(
templateId,
SContractId(contractId),
SValue.SRecord(
): Speedy.CachedContract = {
Speedy.CachedContract(
version = TransactionVersion.maxVersion,
templateId = templateId,
value = SValue.SRecord(
templateId,
ImmArray(Ref.Name.assertFromString("owner")),
ArrayList(SValue.SParty(owner)),
),
ContractMetadata(Time.Timestamp.now(), None, Bytes.Empty),
agreementText = "",
signatories = Set(owner),
observers = Set.empty,
keyOpt = None,
)
}
@ -172,18 +183,11 @@ object ExplicitDisclosureLib {
)
def buildContractSKey(maintainer: Party, label: String = testKeyName): SValue =
SValue.SStruct(
fieldNames =
Struct.assertFromNameSeq(Seq("globalKey", "maintainers").map(Ref.Name.assertFromString)),
values = ArrayList(
SValue.SRecord(
keyType,
ImmArray("label", "maintainers").map(Ref.Name.assertFromString),
ArrayList(
SValue.SText(label),
SValue.SList(FrontStack.from(ImmArray(SValue.SParty(maintainer)))),
),
),
SValue.SRecord(
keyType,
ImmArray("label", "maintainers").map(Ref.Name.assertFromString),
ArrayList(
SValue.SText(label),
SValue.SList(FrontStack.from(ImmArray(SValue.SParty(maintainer)))),
),
)
@ -272,7 +276,7 @@ object ExplicitDisclosureLib {
)(
sexpr: SExpr.SExpr,
committers: Set[Party] = Set.empty,
disclosedContracts: ImmArray[DisclosedContract] = ImmArray.Empty,
disclosures: Iterable[(Value.ContractId, CachedContract)] = Iterable.empty,
getContract: PartialFunction[Value.ContractId, Value.VersionedContractInstance] =
PartialFunction.empty,
getKey: PartialFunction[GlobalKeyWithMaintainers, Value.ContractId] = PartialFunction.empty,
@ -289,16 +293,21 @@ object ExplicitDisclosureLib {
if (setupArgs.isEmpty) contextSExpr
else SExpr.SEApp(contextSExpr, setupArgs),
committers = committers,
disclosedContracts = disclosedContracts,
)
disclosures.foreach { case (cid, contract) => machine.addDisclosedContracts(cid, contract) }
val setupResult = SpeedyTestLib.run(
machine = machine,
getContract = getContract,
getKey = getKey,
)
assert(setupResult.isRight)
setupResult match {
case Right(_) => ()
case Left(SError.SErrorCrash(loc, err)) =>
throw new Exception(s"$loc: $err")
case Left(SError.SErrorDamlException(error)) =>
throw new Exception(s"$error")
}
machine.setExpressionToEvaluate(SExpr.SEApp(runUpdateSExpr(sexpr), Array(SToken)))
val result = SpeedyTestLib.run(
@ -313,7 +322,7 @@ object ExplicitDisclosureLib {
def evaluateSExpr(
sexpr: SExpr.SExpr,
committers: Set[Party] = Set.empty,
disclosedContracts: ImmArray[DisclosedContract] = ImmArray.Empty,
disclosures: Iterable[(Value.ContractId, CachedContract)] = Iterable.empty,
getContract: PartialFunction[Value.ContractId, Value.VersionedContractInstance] =
PartialFunction.empty,
getKey: PartialFunction[GlobalKeyWithMaintainers, Value.ContractId] = PartialFunction.empty,
@ -326,8 +335,8 @@ object ExplicitDisclosureLib {
transactionSeed = crypto.Hash.hashPrivateKey("ExplicitDisclosureLib"),
updateSE = runUpdateSExpr(sexpr),
committers = committers,
disclosedContracts = disclosedContracts,
)
disclosures.foreach { case (cid, contract) => machine.addDisclosedContracts(cid, contract) }
val result = SpeedyTestLib.run(
machine = machine,
getContract = getContract,
@ -358,14 +367,12 @@ object ExplicitDisclosureLib {
}
def haveDisclosedContracts(
disclosedContracts: DisclosedContract*
disclosures: (Value.ContractId, CachedContract)*
): Matcher[Speedy.UpdateMachine] =
Matcher { machine =>
val expectedResult = disclosedContracts.iterator
.map(c =>
c.contractId.value -> c.argument.toNormalizedValue(machine.tmplId2TxVersion(c.templateId))
)
.toMap
val expectedResult = disclosures.iterator.map { case (coid, contract) =>
coid -> contract.arg
}.toMap
val actualResult = machine.disclosedContracts.transform((_, c) => c.arg)
val debugMessage = {

View File

@ -4,9 +4,7 @@
package com.daml.lf
package speedy
import com.daml.lf.command.ContractMetadata
import com.daml.lf.data.Ref.Party
import com.daml.lf.data.{Bytes, Ref, ImmArray, Time}
import com.daml.lf.interpretation.Error.{ContractKeyNotFound, ContractNotActive}
import com.daml.lf.speedy.SExpr.SEValue
import com.daml.lf.value.Value
@ -16,7 +14,8 @@ import org.scalatest.freespec.AnyFreeSpec
import org.scalatest.matchers.should.Matchers
import com.daml.lf.speedy.SBuiltin.{SBUFetchKey, SBFetchAny, SBULookupKey}
import com.daml.lf.speedy.SValue.SContractId
import com.daml.lf.transaction.{GlobalKeyWithMaintainers, GlobalKey}
import com.daml.lf.speedy.Speedy.CachedContract
import com.daml.lf.transaction.GlobalKeyWithMaintainers
import com.daml.lf.testing.parser.Implicits._
class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
@ -30,8 +29,9 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
ledgerParty should not be maintainerParty
disclosureParty should not be maintainerParty
getOwner(ledgerCaveContract.unversioned.arg) shouldBe Some(ledgerParty)
disclosedCaveContract.contractId shouldBe SContractId(contractId)
getOwner(disclosedCaveContract.argument.toUnnormalizedValue) shouldBe Some(disclosureParty)
inside(disclosedCaveContract) { case (`contractId`, contract) =>
getOwner(contract.arg) shouldBe Some(disclosureParty)
}
}
"ledger queried when contract ID is not disclosed" in {
@ -51,7 +51,7 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
disclosureTableQueriedWhenContractDisclosed(
SBFetchAny(SEValue(SContractId(contractId)), SEValue.None),
disclosedCaveContract,
disclosedContracts = ImmArray(disclosedCaveContract),
disclosures = List(disclosedCaveContract),
)(result =>
inside(result) {
case Right(SValue.SAny(_, contract @ SValue.SRecord(`caveTemplateId`, _, _))) =>
@ -65,7 +65,7 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
SBFetchAny(SEValue(SContractId(contractId)), SEValue.None),
disclosedCaveContract,
getContract = Map(contractId -> ledgerCaveContract),
disclosedContracts = ImmArray(disclosedCaveContract),
disclosures = List(disclosedCaveContract),
)(result =>
inside(result) {
case Right(SValue.SAny(_, contract @ SValue.SRecord(`caveTemplateId`, _, _))) =>
@ -101,7 +101,7 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
contractId,
"TestMod:destroyCave",
committers = Set(disclosureParty),
disclosedContracts = ImmArray(disclosedCaveContract),
disclosures = List(disclosedCaveContract),
)(result =>
inside(result) {
case Left(
@ -122,7 +122,7 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
"TestMod:destroyCave",
committers = Set(disclosureParty, ledgerParty),
getContract = Map(contractId -> ledgerCaveContract),
disclosedContracts = ImmArray(disclosedCaveContract),
disclosures = List(disclosedCaveContract),
)(result =>
inside(result) {
case Left(
@ -144,16 +144,15 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
ledgerParty should not be maintainerParty
disclosureParty should not be maintainerParty
ledgerContractId should not be disclosureContractId
disclosedHouseContract.contractId shouldBe SContractId(disclosureContractId)
getOwner(disclosedHouseContract.argument.toUnnormalizedValue) shouldBe Some(disclosureParty)
getMaintainer(disclosedHouseContract.argument.toUnnormalizedValue) shouldBe Some(
maintainerParty
)
inside(disclosedHouseContract) { case (`disclosureContractId`, contract) =>
getOwner(contract.arg) shouldBe Some(disclosureParty)
getMaintainer(contract.arg) shouldBe Some(maintainerParty)
}
}
"ledger queried when contract key is not disclosed" in {
ledgerQueriedWhenContractNotDisclosed(
SBUFetchKey(houseTemplateId)(SEValue(contractSKey)),
SBUFetchKey(houseTemplateId)(SEValue(contractSStructKey)),
committers = Set(ledgerParty),
getKey = Map(
GlobalKeyWithMaintainers(contractKey, Set(maintainerParty)) -> ledgerContractId
@ -165,23 +164,23 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
"disclosure table queried when contract key is disclosed" - {
"contract key in disclosure table only" in {
disclosureTableQueriedWhenContractDisclosed(
SBUFetchKey(houseTemplateId)(SEValue(contractSKey)),
SBUFetchKey(houseTemplateId)(SEValue(contractSStructKey)),
disclosedHouseContract,
committers = Set(disclosureParty),
disclosedContracts = ImmArray(disclosedHouseContract),
disclosures = List(disclosedHouseContract),
)(_ shouldBe Right(SValue.SContractId(disclosureContractId)))
}
"contract key in ledger and disclosure table" in {
disclosureTableQueriedWhenContractDisclosed(
SBUFetchKey(houseTemplateId)(SEValue(contractSKey)),
SBUFetchKey(houseTemplateId)(SEValue(contractSStructKey)),
disclosedHouseContract,
committers = Set(disclosureParty, ledgerParty),
getKey = Map(
GlobalKeyWithMaintainers(contractKey, Set(maintainerParty)) -> ledgerContractId
),
getContract = Map(ledgerContractId -> ledgerHouseContract),
disclosedContracts = ImmArray(disclosedHouseContract),
disclosures = List(disclosedHouseContract),
)(_ shouldBe Right(SValue.SContractId(disclosureContractId)))
}
}
@ -189,7 +188,7 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
"disclosed contract keys that are inactive" - {
"ledger query fails when contract key is not disclosed" in {
ledgerQueryFailsWhenContractNotDisclosed(
SBUFetchKey(houseTemplateId)(SEValue(contractSKey)),
SBUFetchKey(houseTemplateId)(SEValue(contractSStructKey)),
ledgerContractId,
"TestMod:destroyHouse",
committers = Set(ledgerParty),
@ -208,12 +207,12 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
"disclosure table query fails when contract key is disclosed" - {
"contract key in disclosure table only" in {
disclosureTableQueryFailsWhenContractDisclosed(
SBUFetchKey(houseTemplateId)(SEValue(contractSKey)),
SBUFetchKey(houseTemplateId)(SEValue(contractSStructKey)),
disclosedHouseContract,
disclosureContractId,
"TestMod:destroyHouse",
committers = Set(disclosureParty, maintainerParty),
disclosedContracts = ImmArray(disclosedHouseContract),
disclosures = List(disclosedHouseContract),
)(result =>
inside(result) {
case Left(SError.SErrorDamlException(ContractKeyNotFound(`contractKey`))) =>
@ -226,7 +225,7 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
for (contractIdToBurn <- Set(ledgerContractId, disclosureContractId)) {
// Exercising a single contract ID is sufficient to make the key inactive
disclosureTableQueryFailsWhenContractDisclosed(
SBUFetchKey(houseTemplateId)(SEValue(contractSKey)),
SBUFetchKey(houseTemplateId)(SEValue(contractSStructKey)),
disclosedHouseContract,
contractIdToBurn,
"TestMod:destroyHouse",
@ -238,7 +237,7 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
) -> ledgerContractId
),
getContract = Map(ledgerContractId -> ledgerHouseContract),
disclosedContracts = ImmArray(disclosedHouseContract),
disclosures = List(disclosedHouseContract),
)(result =>
inside(result) {
case Left(SError.SErrorDamlException(ContractKeyNotFound(`contractKey`))) =>
@ -249,16 +248,6 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
}
}
}
"wrongly typed contract disclosures are not found" in {
wronglyTypedDisclosedContractsRejected(
SBUFetchKey(houseTemplateType)(SEValue(contractSKey))
) { result =>
inside(result) { case Left(SError.SErrorDamlException(ContractKeyNotFound(_))) =>
succeed
}
}
}
}
"looking up contract keys" - {
@ -267,16 +256,15 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
ledgerParty should not be maintainerParty
disclosureParty should not be maintainerParty
ledgerContractId should not be disclosureContractId
disclosedHouseContract.contractId shouldBe SContractId(disclosureContractId)
getOwner(disclosedHouseContract.argument.toUnnormalizedValue) shouldBe Some(disclosureParty)
getMaintainer(disclosedHouseContract.argument.toUnnormalizedValue) shouldBe Some(
maintainerParty
)
inside(disclosedHouseContract) { case (`disclosureContractId`, contract) =>
getOwner(contract.arg) shouldBe Some(disclosureParty)
getMaintainer(contract.arg) shouldBe Some(maintainerParty)
}
}
"ledger queried when contract key is not disclosed" in {
ledgerQueriedWhenContractNotDisclosed(
SBULookupKey(houseTemplateId)(SEValue(contractSKey)),
SBULookupKey(houseTemplateId)(SEValue(contractSStructKey)),
committers = Set(ledgerParty),
getKey = Map(
GlobalKeyWithMaintainers(contractKey, Set(maintainerParty)) -> ledgerContractId
@ -288,23 +276,23 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
"disclosure table queried when contract key is disclosed" - {
"contract key in disclosure table only" in {
disclosureTableQueriedWhenContractDisclosed(
SBULookupKey(houseTemplateId)(SEValue(contractSKey)),
SBULookupKey(houseTemplateId)(SEValue(contractSStructKey)),
disclosedHouseContract,
committers = Set(disclosureParty),
disclosedContracts = ImmArray(disclosedHouseContract),
disclosures = List(disclosedHouseContract),
)(_ shouldBe Right(SValue.SOptional(Some(SValue.SContractId(disclosureContractId)))))
}
"contract key in ledger and disclosure table" in {
disclosureTableQueriedWhenContractDisclosed(
SBULookupKey(houseTemplateId)(SEValue(contractSKey)),
SBULookupKey(houseTemplateId)(SEValue(contractSStructKey)),
disclosedHouseContract,
committers = Set(disclosureParty, ledgerParty),
getKey = Map(
GlobalKeyWithMaintainers(contractKey, Set(maintainerParty)) -> ledgerContractId
),
getContract = Map(ledgerContractId -> ledgerHouseContract),
disclosedContracts = ImmArray(disclosedHouseContract),
disclosures = List(disclosedHouseContract),
)(_ shouldBe Right(SValue.SOptional(Some(SValue.SContractId(disclosureContractId)))))
}
}
@ -312,7 +300,7 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
"disclosed contract keys that are inactive" - {
"ledger query fails when contract key is not disclosed" in {
ledgerQueryFailsWhenContractNotDisclosed(
SBULookupKey(houseTemplateId)(SEValue(contractSKey)),
SBULookupKey(houseTemplateId)(SEValue(contractSStructKey)),
ledgerContractId,
"TestMod:destroyHouse",
committers = Set(ledgerParty),
@ -330,12 +318,12 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
"disclosure table query fails when contract key is disclosed" - {
"contract key in disclosure table only" in {
disclosureTableQueryFailsWhenContractDisclosed(
SBULookupKey(houseTemplateId)(SEValue(contractSKey)),
SBULookupKey(houseTemplateId)(SEValue(contractSStructKey)),
disclosedHouseContract,
disclosureContractId,
"TestMod:destroyHouse",
committers = Set(disclosureParty, maintainerParty),
disclosedContracts = ImmArray(disclosedHouseContract),
disclosures = List(disclosedHouseContract),
)(result =>
inside(result) { case Right(SValue.SOptional(None)) =>
succeed
@ -347,7 +335,7 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
for (contractIdToBurn <- Set(ledgerContractId, disclosureContractId)) {
// Exercising a single contract ID is sufficient to make the key inactive
disclosureTableQueryFailsWhenContractDisclosed(
SBULookupKey(houseTemplateId)(SEValue(contractSKey)),
SBULookupKey(houseTemplateId)(SEValue(contractSStructKey)),
disclosedHouseContract,
contractIdToBurn,
"TestMod:destroyHouse",
@ -359,7 +347,7 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
) -> ledgerContractId
),
getContract = Map(ledgerContractId -> ledgerHouseContract),
disclosedContracts = ImmArray(disclosedHouseContract),
disclosures = List(disclosedHouseContract),
)(result =>
inside(result) { case Right(SValue.SOptional(None)) =>
succeed
@ -369,12 +357,6 @@ class ExplicitDisclosureTest extends ExplicitDisclosureTestMethods {
}
}
}
"wrongly typed contract disclosures are not found" in {
wronglyTypedDisclosedContractsRejected(
SBULookupKey(houseTemplateType)(SEValue(contractSKey))
)(_ shouldBe Right(SValue.SOptional(None)))
}
}
}
}
@ -386,7 +368,7 @@ private[lf] trait ExplicitDisclosureTestMethods extends AnyFreeSpec with Inside
def ledgerQueriedWhenContractNotDisclosed(
sexpr: SExpr.SExpr,
committers: Set[Party] = Set.empty,
disclosedContracts: ImmArray[DisclosedContract] = ImmArray.Empty,
disclosures: Iterable[(Value.ContractId, CachedContract)] = Iterable.empty,
getContract: PartialFunction[Value.ContractId, Value.VersionedContractInstance] =
PartialFunction.empty,
getKey: PartialFunction[GlobalKeyWithMaintainers, Value.ContractId] = PartialFunction.empty,
@ -395,7 +377,7 @@ private[lf] trait ExplicitDisclosureTestMethods extends AnyFreeSpec with Inside
evaluateSExpr(
sexpr,
committers = committers,
disclosedContracts = disclosedContracts,
disclosures = disclosures,
getContract = getContract,
getKey = getKey,
)
@ -407,9 +389,9 @@ private[lf] trait ExplicitDisclosureTestMethods extends AnyFreeSpec with Inside
def disclosureTableQueriedWhenContractDisclosed(
sexpr: SExpr.SExpr,
disclosedContract: DisclosedContract,
disclosedContract: (Value.ContractId, CachedContract),
committers: Set[Party] = Set.empty,
disclosedContracts: ImmArray[DisclosedContract] = ImmArray.Empty,
disclosures: Iterable[(Value.ContractId, CachedContract)] = Iterable.empty,
getContract: PartialFunction[Value.ContractId, Value.VersionedContractInstance] =
PartialFunction.empty,
getKey: PartialFunction[GlobalKeyWithMaintainers, Value.ContractId] = PartialFunction.empty,
@ -418,7 +400,7 @@ private[lf] trait ExplicitDisclosureTestMethods extends AnyFreeSpec with Inside
evaluateSExpr(
sexpr,
committers = committers,
disclosedContracts = disclosedContracts,
disclosures = disclosures,
getContract = getContract,
getKey = getKey,
)
@ -433,7 +415,7 @@ private[lf] trait ExplicitDisclosureTestMethods extends AnyFreeSpec with Inside
contractId: ContractId,
action: String,
committers: Set[Party] = Set.empty,
disclosedContracts: ImmArray[DisclosedContract] = ImmArray.Empty,
disclosures: Iterable[(Value.ContractId, CachedContract)] = Iterable.empty,
getContract: PartialFunction[Value.ContractId, Value.VersionedContractInstance] =
PartialFunction.empty,
getKey: PartialFunction[GlobalKeyWithMaintainers, Value.ContractId] = PartialFunction.empty,
@ -447,7 +429,7 @@ private[lf] trait ExplicitDisclosureTestMethods extends AnyFreeSpec with Inside
)(
sexpr,
committers = committers,
disclosedContracts = disclosedContracts,
disclosures = disclosures,
getContract = getContract,
getKey = getKey,
)
@ -459,11 +441,11 @@ private[lf] trait ExplicitDisclosureTestMethods extends AnyFreeSpec with Inside
def disclosureTableQueryFailsWhenContractDisclosed(
sexpr: SExpr.SExpr,
disclosedContract: DisclosedContract,
disclosedContract: (Value.ContractId, CachedContract),
contractToDestroy: ContractId,
action: String,
committers: Set[Party] = Set.empty,
disclosedContracts: ImmArray[DisclosedContract] = ImmArray.Empty,
disclosures: Iterable[(Value.ContractId, CachedContract)],
getContract: PartialFunction[Value.ContractId, Value.VersionedContractInstance] =
PartialFunction.empty,
getKey: PartialFunction[GlobalKeyWithMaintainers, Value.ContractId] = PartialFunction.empty,
@ -477,7 +459,7 @@ private[lf] trait ExplicitDisclosureTestMethods extends AnyFreeSpec with Inside
)(
sexpr,
committers = committers,
disclosedContracts = disclosedContracts,
disclosures = disclosures,
getContract = getContract,
getKey = getKey,
)
@ -486,35 +468,4 @@ private[lf] trait ExplicitDisclosureTestMethods extends AnyFreeSpec with Inside
machine should haveDisclosedContracts(disclosedContract)
machine should haveInactiveContractIds(contractToDestroy)
}
def wronglyTypedDisclosedContractsRejected(
sexpr: SExpr.SExpr
)(assertResult: Either[SError.SError, SValue] => Assertion): Assertion = {
val houseContractKey: GlobalKey = buildContractKey(maintainerParty)
// Here the disclosed contract has a caveTemplateType, but its key has a houseTemplateType
val malformedDisclosedContract: DisclosedContract =
DisclosedContract(
caveTemplateType,
SContractId(disclosureContractId),
SValue.SRecord(
caveTemplateType,
ImmArray(
Ref.Name.assertFromString("owner"),
Ref.Name.assertFromString("key_maintainer"),
),
ArrayList(SValue.SParty(disclosureParty), SValue.SParty(maintainerParty)),
),
ContractMetadata(Time.Timestamp.now(), Some(houseContractKey.hash), Bytes.Empty),
)
val (result, machine) =
evaluateSExpr(
sexpr,
committers = Set(disclosureParty),
disclosedContracts = ImmArray(malformedDisclosedContract),
)
assertResult(result)
machine should haveDisclosedContracts(malformedDisclosedContract)
machine should haveInactiveContractIds()
}
}

View File

@ -620,8 +620,8 @@ object SpeedyTest {
buildHouseCachedContract(alice, alice, label = "global-label")
val disclosedContractId: ContractId =
ContractId.V1(crypto.Hash.hashPrivateKey("test-disclosed-contract-id"))
val disclosedContract: DisclosedContract =
buildDisclosedHouseContract(disclosedContractId, alice, alice, label = "disclosed-label")
val disclosedContract: CachedContract =
buildDisclosedHouseContract(alice, alice, label = "disclosed-label")
val disclosedContractKey: GlobalKey = buildContractKey(alice, "disclosed-label")
val disclosedCachedContract: CachedContract =
buildHouseCachedContract(alice, alice, label = "disclosed-label")
@ -633,7 +633,7 @@ object SpeedyTest {
SEValue(SUnit),
// As committers is empty, our readers will be empty and so contracts and contract keys will *always* be non-visible to stakeholders
committers = Set.empty,
disclosedContracts = ImmArray(disclosedContract),
// disclosedContracts = ImmArray(disclosedContract),
)
.withWarningLog(testLogger)
.withCachedContracts(

View File

@ -438,7 +438,6 @@ private[lf] object ScenarioRunner {
warningLog = warningLog,
commitLocation = location,
limits = interpretation.Limits.Lenient,
disclosedContracts = ImmArray.Empty,
)
// TODO (drsk) validate and propagate errors back to submitter
// https://github.com/digital-asset/daml/issues/14108

View File

@ -264,7 +264,7 @@ class IdeLedgerClient(
} else {
val speedyCommands = preprocessor.unsafePreprocessApiCommands(commands.to(ImmArray))
val translated = compiledPackages.compiler.unsafeCompile(speedyCommands)
val translated = compiledPackages.compiler.unsafeCompile(speedyCommands, ImmArray.empty)
val ledgerApi = ScenarioRunner.ScenarioLedgerApi(ledger)
val result =

View File

@ -35,124 +35,124 @@
- ensure correct privacy for rollback subtree: [BlindingSpec.scala](daml-lf/engine/src/test/scala/com/digitalasset/daml/lf/engine/BlindingSpec.scala#L199)
## Integrity:
- Evaluation order of create with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L554)
- Evaluation order of create with contract ID in contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L577)
- Evaluation order of create with contract key exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L627)
- Evaluation order of create with create argument exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L604)
- Evaluation order of create with duplicate contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L505)
- Evaluation order of create with empty contract key maintainers: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L530)
- Evaluation order of create with failed precondition: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L487)
- Evaluation order of create_interface with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L748)
- Evaluation order of create_interface with contract ID in contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L771)
- Evaluation order of create_interface with contract key exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L821)
- Evaluation order of create_interface with create argument exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L798)
- Evaluation order of create_interface with duplicate contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L697)
- Evaluation order of create_interface with empty contract key maintainers: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L722)
- Evaluation order of create_interface with failed precondition: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L679)
- Evaluation order of exercise by interface of a cached global contract that does not implement the interface.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1751)
- Evaluation order of exercise by interface of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1733)
- Evaluation order of exercise by interface of cached global contract with failed authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1791)
- Evaluation order of exercise of a cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1124)
- Evaluation order of exercise of a non-cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L891)
- Evaluation order of exercise of a non-cached global contract with inconsistent key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L916)
- Evaluation order of exercise of a wrongly typed cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L988)
- Evaluation order of exercise of a wrongly typed non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L876)
- Evaluation order of exercise of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L971)
- Evaluation order of exercise of an inactive local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1066)
- Evaluation order of exercise of an unknown contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1148)
- Evaluation order of exercise of an wrongly typed local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1085)
- Evaluation order of exercise of cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1024)
- Evaluation order of exercise with argument exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1162)
- Evaluation order of exercise with output exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1186)
- Evaluation order of exercise-by-key of a cached global contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1403)
- Evaluation order of exercise-by-key of a non-cached global contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1285)
- Evaluation order of exercise_by_key of a cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1470)
- Evaluation order of exercise_by_key of a local contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1493)
- Evaluation order of exercise_by_key of a non-cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1259)
- Evaluation order of exercise_by_key of a wrongly typed cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1360)
- Evaluation order of exercise_by_key of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1341)
- Evaluation order of exercise_by_key of an inactive local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1450)
- Evaluation order of exercise_by_key of an unknown contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1527)
- Evaluation order of exercise_by_key of cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1379)
- Evaluation order of exercise_by_key with argument exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1542)
- Evaluation order of exercise_by_key with contract ID in contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1607)
- Evaluation order of exercise_by_key with result exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1567)
- Evaluation order of exercise_interface of a cached local contract with failed authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1903)
- Evaluation order of exercise_interface of a non-cached global contract with failed authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1678)
- Evaluation order of exercise_interface of an inactive local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1841)
- Evaluation order of exercise_interface of an local contract not implementing the interface: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1860)
- Evaluation order of exercise_vy_key with empty contract key maintainers: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1593)
- Evaluation order of fetch of a cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2188)
- Evaluation order of fetch of a non-cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1981)
- Evaluation order of fetch of a non-cached global contract with inconsistent key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2004)
- Evaluation order of fetch of a wrongly typed cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2067)
- Evaluation order of fetch of a wrongly typed disclosed contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2208)
- Evaluation order of fetch of a wrongly typed non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1966)
- Evaluation order of fetch of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2051)
- Evaluation order of fetch of an inactive local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2136)
- Evaluation order of fetch of an unknown contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2227)
- Evaluation order of fetch of an wrongly typed local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2153)
- Evaluation order of fetch of cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2101)
- Evaluation order of fetch-by-key of a cached global contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2398)
- Evaluation order of fetch-by-key of a non-cached global contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2314)
- Evaluation order of fetch_by_key of a cached global contract with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2381)
- Evaluation order of fetch_by_key of a local contract with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2457)
- Evaluation order of fetch_by_key of a non-cached global contract with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2291)
- Evaluation order of fetch_by_key of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2362)
- Evaluation order of fetch_by_key of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2439)
- Evaluation order of fetch_by_key of an unknown contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2486)
- Evaluation order of fetch_by_key with contract ID in contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2516)
- Evaluation order of fetch_by_key with contract key exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2530)
- Evaluation order of fetch_by_key with empty contract key maintainers: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2502)
- Evaluation order of fetch_interface of a cached global contract not implementing the interface.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2650)
- Evaluation order of fetch_interface of a cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2774)
- Evaluation order of fetch_interface of a non-cached global contract that doesn't implement interface.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2572)
- Evaluation order of fetch_interface of a non-cached global contract with failed authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2589)
- Evaluation order of fetch_interface of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2633)
- Evaluation order of fetch_interface of an inactive local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2721)
- Evaluation order of fetch_interface of an local contract not implementing the interface: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2738)
- Evaluation order of fetch_interface of an unknown contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2792)
- Evaluation order of fetch_interface of cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2686)
- Evaluation order of lookup of a cached global contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2942)
- Evaluation order of lookup of a non-cached global contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2859)
- Evaluation order of lookup_by_key of a cached global contract with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2925)
- Evaluation order of lookup_by_key of a local contract with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L3016)
- Evaluation order of lookup_by_key of a local contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L3000)
- Evaluation order of lookup_by_key of a non-cached global contract with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2836)
- Evaluation order of lookup_by_key of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2907)
- Evaluation order of lookup_by_key of an inactive local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2983)
- Evaluation order of lookup_by_key of an unknown contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L3046)
- Evaluation order of lookup_by_key with contract ID in contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L3076)
- Evaluation order of lookup_by_key with contract key exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L3090)
- Evaluation order of lookup_by_key with empty contract key maintainers: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L3062)
- Evaluation order of successful create: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L463)
- Evaluation order of successful create_interface: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L654)
- Evaluation order of successful exercise by interface of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1632)
- Evaluation order of successful exercise of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L948)
- Evaluation order of successful exercise of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1044)
- Evaluation order of successful exercise of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L850)
- Evaluation order of successful exercise_by_key of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1316)
- Evaluation order of successful exercise_by_key of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1427)
- Evaluation order of successful exercise_by_key of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1216)
- Evaluation order of successful exercise_interface of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1708)
- Evaluation order of successful exercise_interface of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1817)
- Evaluation order of successful fetch of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2034)
- Evaluation order of successful fetch of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2121)
- Evaluation order of successful fetch of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1943)
- Evaluation order of successful fetch_by_key of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2345)
- Evaluation order of successful fetch_by_key of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2423)
- Evaluation order of successful fetch_by_key of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2246)
- Evaluation order of successful fetch_interface of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2616)
- Evaluation order of successful fetch_interface of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2706)
- Evaluation order of successful fetch_interface of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2548)
- Evaluation order of successful lookup_by_key of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2890)
- Evaluation order of successful lookup_by_key of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2967)
- Evaluation order of successful lookup_by_key of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2812)
- Evaluation order of create with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L560)
- Evaluation order of create with contract ID in contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L583)
- Evaluation order of create with contract key exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L633)
- Evaluation order of create with create argument exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L610)
- Evaluation order of create with duplicate contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L511)
- Evaluation order of create with empty contract key maintainers: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L536)
- Evaluation order of create with failed precondition: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L493)
- Evaluation order of create_interface with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L754)
- Evaluation order of create_interface with contract ID in contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L777)
- Evaluation order of create_interface with contract key exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L827)
- Evaluation order of create_interface with create argument exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L804)
- Evaluation order of create_interface with duplicate contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L703)
- Evaluation order of create_interface with empty contract key maintainers: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L728)
- Evaluation order of create_interface with failed precondition: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L685)
- Evaluation order of exercise by interface of a cached global contract that does not implement the interface.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1757)
- Evaluation order of exercise by interface of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1739)
- Evaluation order of exercise by interface of cached global contract with failed authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1797)
- Evaluation order of exercise of a cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1130)
- Evaluation order of exercise of a non-cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L897)
- Evaluation order of exercise of a non-cached global contract with inconsistent key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L922)
- Evaluation order of exercise of a wrongly typed cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L994)
- Evaluation order of exercise of a wrongly typed non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L882)
- Evaluation order of exercise of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L977)
- Evaluation order of exercise of an inactive local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1072)
- Evaluation order of exercise of an unknown contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1154)
- Evaluation order of exercise of an wrongly typed local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1091)
- Evaluation order of exercise of cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1030)
- Evaluation order of exercise with argument exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1168)
- Evaluation order of exercise with output exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1192)
- Evaluation order of exercise-by-key of a cached global contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1409)
- Evaluation order of exercise-by-key of a non-cached global contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1291)
- Evaluation order of exercise_by_key of a cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1476)
- Evaluation order of exercise_by_key of a local contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1499)
- Evaluation order of exercise_by_key of a non-cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1265)
- Evaluation order of exercise_by_key of a wrongly typed cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1366)
- Evaluation order of exercise_by_key of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1347)
- Evaluation order of exercise_by_key of an inactive local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1456)
- Evaluation order of exercise_by_key of an unknown contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1533)
- Evaluation order of exercise_by_key of cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1385)
- Evaluation order of exercise_by_key with argument exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1548)
- Evaluation order of exercise_by_key with contract ID in contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1613)
- Evaluation order of exercise_by_key with result exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1573)
- Evaluation order of exercise_interface of a cached local contract with failed authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1909)
- Evaluation order of exercise_interface of a non-cached global contract with failed authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1684)
- Evaluation order of exercise_interface of an inactive local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1847)
- Evaluation order of exercise_interface of an local contract not implementing the interface: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1866)
- Evaluation order of exercise_vy_key with empty contract key maintainers: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1599)
- Evaluation order of fetch of a cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2194)
- Evaluation order of fetch of a non-cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1987)
- Evaluation order of fetch of a non-cached global contract with inconsistent key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2010)
- Evaluation order of fetch of a wrongly typed cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2073)
- Evaluation order of fetch of a wrongly typed disclosed contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2214)
- Evaluation order of fetch of a wrongly typed non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1972)
- Evaluation order of fetch of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2057)
- Evaluation order of fetch of an inactive local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2142)
- Evaluation order of fetch of an unknown contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2233)
- Evaluation order of fetch of an wrongly typed local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2159)
- Evaluation order of fetch of cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2107)
- Evaluation order of fetch-by-key of a cached global contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2404)
- Evaluation order of fetch-by-key of a non-cached global contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2320)
- Evaluation order of fetch_by_key of a cached global contract with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2387)
- Evaluation order of fetch_by_key of a local contract with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2463)
- Evaluation order of fetch_by_key of a non-cached global contract with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2297)
- Evaluation order of fetch_by_key of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2368)
- Evaluation order of fetch_by_key of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2445)
- Evaluation order of fetch_by_key of an unknown contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2492)
- Evaluation order of fetch_by_key with contract ID in contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2522)
- Evaluation order of fetch_by_key with contract key exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2536)
- Evaluation order of fetch_by_key with empty contract key maintainers: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2508)
- Evaluation order of fetch_interface of a cached global contract not implementing the interface.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2656)
- Evaluation order of fetch_interface of a cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2780)
- Evaluation order of fetch_interface of a non-cached global contract that doesn't implement interface.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2578)
- Evaluation order of fetch_interface of a non-cached global contract with failed authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2595)
- Evaluation order of fetch_interface of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2639)
- Evaluation order of fetch_interface of an inactive local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2727)
- Evaluation order of fetch_interface of an local contract not implementing the interface: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2744)
- Evaluation order of fetch_interface of an unknown contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2798)
- Evaluation order of fetch_interface of cached global contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2692)
- Evaluation order of lookup of a cached global contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2948)
- Evaluation order of lookup of a non-cached global contract with visibility failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2865)
- Evaluation order of lookup_by_key of a cached global contract with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2931)
- Evaluation order of lookup_by_key of a local contract with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L3022)
- Evaluation order of lookup_by_key of a local contract with failure authorization: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L3006)
- Evaluation order of lookup_by_key of a non-cached global contract with authorization failure: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2842)
- Evaluation order of lookup_by_key of an inactive global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2913)
- Evaluation order of lookup_by_key of an inactive local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2989)
- Evaluation order of lookup_by_key of an unknown contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L3052)
- Evaluation order of lookup_by_key with contract ID in contract key: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L3082)
- Evaluation order of lookup_by_key with contract key exceeding max nesting: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L3096)
- Evaluation order of lookup_by_key with empty contract key maintainers: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L3068)
- Evaluation order of successful create: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L469)
- Evaluation order of successful create_interface: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L660)
- Evaluation order of successful exercise by interface of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1638)
- Evaluation order of successful exercise of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L954)
- Evaluation order of successful exercise of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1050)
- Evaluation order of successful exercise of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L856)
- Evaluation order of successful exercise_by_key of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1322)
- Evaluation order of successful exercise_by_key of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1433)
- Evaluation order of successful exercise_by_key of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1222)
- Evaluation order of successful exercise_interface of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1714)
- Evaluation order of successful exercise_interface of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1823)
- Evaluation order of successful fetch of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2040)
- Evaluation order of successful fetch of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2127)
- Evaluation order of successful fetch of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1949)
- Evaluation order of successful fetch_by_key of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2351)
- Evaluation order of successful fetch_by_key of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2429)
- Evaluation order of successful fetch_by_key of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2252)
- Evaluation order of successful fetch_interface of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2622)
- Evaluation order of successful fetch_interface of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2712)
- Evaluation order of successful fetch_interface of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2554)
- Evaluation order of successful lookup_by_key of a cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2896)
- Evaluation order of successful lookup_by_key of a local contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2973)
- Evaluation order of successful lookup_by_key of a non-cached global contract: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2818)
- Exceptions, throw/catch.: [ExceptionTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/ExceptionTest.scala#L26)
- Rollback creates cannot be exercise: [EngineTest.scala](daml-lf/engine/src/test/scala/com/digitalasset/daml/lf/engine/EngineTest.scala#L2181)
- This checks that type checking in exercise_interface is done after checking activeness.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1883)
- This checks that type checking is done after checking activeness.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1773)
- This checks that type checking is done after checking activeness.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2756)
- This checks that type checking in exercise_interface is done after checking activeness.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1889)
- This checks that type checking is done after checking activeness.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1779)
- This checks that type checking is done after checking activeness.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L2762)
- contract key behaviour (non-unique mode): [ContractKeySpec.scala](daml-lf/engine/src/test/scala/com/digitalasset/daml/lf/engine/ContractKeySpec.scala#L410)
- contract key behaviour (unique mode): [ContractKeySpec.scala](daml-lf/engine/src/test/scala/com/digitalasset/daml/lf/engine/ContractKeySpec.scala#L420)
- contract keys must have a non-empty set of maintainers: [ContractKeySpec.scala](daml-lf/engine/src/test/scala/com/digitalasset/daml/lf/engine/ContractKeySpec.scala#L218)
@ -161,7 +161,7 @@
- ensure builtin operators have the correct type: [TypingSpec.scala](daml-lf/validation/src/test/scala/com/digitalasset/daml/lf/validation/TypingSpec.scala#L48)
- ensure expression forms have the correct type: [TypingSpec.scala](daml-lf/validation/src/test/scala/com/digitalasset/daml/lf/validation/TypingSpec.scala#L108)
- exercise-by-interface command is rejected for a: [ApiCommandPreprocessorSpec.scala](daml-lf/engine/src/test/scala/com/digitalasset/daml/lf/engine/ApiCommandPreprocessorSpec.scala#L171)
- exercise_interface with a contract instance that does not implement the interface fails.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1660)
- exercise_interface with a contract instance that does not implement the interface fails.: [EvaluationOrderTest.scala](daml-lf/interpreter/src/test/scala/com/digitalasset/daml/lf/speedy/EvaluationOrderTest.scala#L1666)
- ill-formed create API command is rejected: [ApiCommandPreprocessorSpec.scala](daml-lf/engine/src/test/scala/com/digitalasset/daml/lf/engine/ApiCommandPreprocessorSpec.scala#L159)
- ill-formed create replay command is rejected: [ReplayCommandPreprocessorSpec.scala](daml-lf/engine/src/test/scala/com/digitalasset/daml/lf/engine/ReplayCommandPreprocessorSpec.scala#L109)
- ill-formed create-and-exercise API command is rejected: [ApiCommandPreprocessorSpec.scala](daml-lf/engine/src/test/scala/com/digitalasset/daml/lf/engine/ApiCommandPreprocessorSpec.scala#L184)