Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ import com.digitalasset.daml.lf.engine.script.ledgerinteraction.{
IdeLedgerClient,
ScriptLedgerClient,
}
import com.digitalasset.daml.lf.engine.script.v2.ledgerinteraction.grpcLedgerClient.AdminLedgerClient
import com.digitalasset.daml.lf.language.Ast._
import com.digitalasset.daml.lf.script.{IdeLedger, IdeLedgerRunner}
import com.digitalasset.daml.lf.engine.ScriptEngine.{
Expand Down Expand Up @@ -278,16 +277,7 @@ object Runner {
clientChannelConfig,
namedLoggerFactory,
)
maybeAdminLedgerClient <- params.adminPort
.traverse(adminPort =>
AdminLedgerClient.singleHostWithUnknownParticipantId(
params.host,
adminPort,
clientConfig.token(),
clientChannelConfig,
)
)
} yield GrpcLedgerClient(ledgerClient, userId, maybeAdminLedgerClient)
} yield GrpcLedgerClient(ledgerClient, userId)
}
// We might want to have one config per participant at some point but for now this should be sufficient.
def connect(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,14 @@ package engine.script.ledgerinteraction

import com.digitalasset.canton.ledger.client.LedgerClient
import com.digitalasset.daml.lf.data.Ref
import com.digitalasset.daml.lf.engine.script.v2.ledgerinteraction.grpcLedgerClient.AdminLedgerClient
import com.digitalasset.daml.lf.engine.ScriptEngine.{TraceLog, WarningLog}

// Ledger clients before implementation is chosen
sealed trait ScriptLedgerClient extends Product with Serializable

final case class GrpcLedgerClient(
grpcClient: LedgerClient,
val userId: Option[Ref.UserId],
val grpcAdminClient: Option[AdminLedgerClient] = None,
userId: Option[Ref.UserId],
) extends ScriptLedgerClient

object GrpcLedgerClient {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -513,41 +513,16 @@ object ScriptF {
*/
final case class AllocParty(
partyHint: String,
participants: Option[
(Participant, List[Participant])
],
owningParticipant: Option[Participant],
) extends Cmd {
override def execute(env: Env)(implicit
ec: ExecutionContext,
mat: Materializer,
esf: ExecutionSequencerFactory,
): Future[ExtendedValue] = {
val owningParticipant = participants.map(_._1)
for {
owningClient <- env.clients.assertGetParticipantFuture(owningParticipant)

party <-
if (participants.map(_._2.isEmpty).getOrElse(true)) {
owningClient.allocateParty(partyHint)
} else {
for {
otherClients <- Future.traverse(participants.map(_._2).getOrElse(List.empty))(
participant => env.clients.assertGetParticipantFuture(participant)
)
clients = owningClient +: otherClients
participantIds = clients.map(_.getParticipantUid)

p <- owningClient.aggregateAllocatePartyOnMultipleParticipants(
clients,
partyHint,
owningClient.getParticipantUid.split("::").last,
participantIds,
)
_ <- Future.traverse(env.clients.participants.values)(
_.waitUntilHostingVisible(p, participantIds)
)
} yield p
}
party <- owningClient.allocateParty(partyHint)
} yield {
owningParticipant.foreach(env.addPartyParticipantMapping(party, _))
ValueParty(party)
Expand Down Expand Up @@ -883,8 +858,9 @@ object ScriptF {
for {
client <- Converter.toFuture(env.clients.getParticipant(participant))
_ <- client.vetPackages(packages)
participantUid <- client.getParticipantUid()
_ <- Future.traverse(env.clients.participants.values)(
_.waitUntilVettingVisible(packages, client.getParticipantUid)
_.waitUntilVettingVisible(packages, participantUid)
)
} yield ValueUnit
}
Expand All @@ -901,8 +877,9 @@ object ScriptF {
for {
client <- Converter.toFuture(env.clients.getParticipant(participant))
_ <- client.unvetPackages(packages)
participantUid <- client.getParticipantUid()
_ <- Future.traverse(env.clients.participants.values)(
_.waitUntilUnvettingVisible(packages, client.getParticipantUid)
_.waitUntilUnvettingVisible(packages, participantUid)
)
} yield ValueUnit
}
Expand Down Expand Up @@ -1128,7 +1105,7 @@ object ScriptF {
for {
participantName <- Converter.toOptionalParticipantName(participantName)
idHint <- Converter.toPartyIdHint(givenHint, requestedName, globalRandom)
} yield AllocParty(idHint, participantName.map(p => (p, List.empty)))
} yield AllocParty(idHint, participantName)
case _ => Left(s"Expected AllocParty payload but got $v")
}

Expand All @@ -1139,17 +1116,22 @@ object ScriptF {
ImmArray(
(_, ValueText(requestedName)),
(_, ValueText(givenHint)),
(_, participantNames),
(_, participantNames @ ValueList(vs)),
),
) =>
) if vs.length <= 1 =>
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need to allow for an empty list case as well as the singleton list case (since daml-script tests sometimes use an empty list)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please (if you havent already) verify this is backwards compatible manually, i.e. build a script dar with some 3.4 version and run it (via dpm script --dar <my-dar> --all --ide-ledger) using HEAD of main

for {
participantNames <- Converter.toParticipantNames(participantNames)
idHint <- Converter.toPartyIdHint(givenHint, requestedName, globalRandom)
allocArg = participantNames match {
case head :: tail => Some((head, tail))
case Nil => None
}
} yield AllocParty(idHint, allocArg)
} yield AllocParty(idHint, participantNames.headOption)
case ValueRecord(
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ensure all other AllocParty payloads result in a non-generic error message

_,
ImmArray(
(_, ValueText(_)),
(_, ValueText(_)),
(_, ValueList(_)),
),
) =>
Left(s"Expected AllocParty payload with at most one participant name but got $v")
case _ => Left(s"Expected AllocParty payload but got $v")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ import com.digitalasset.daml.lf.command.ApiCommand
import com.digitalasset.daml.lf.data.Ref._
import com.digitalasset.daml.lf.data.{Bytes, ImmArray, Ref, Time}
import com.digitalasset.daml.lf.engine.ScriptEngine.{
ExtendedValueComputationMode,
TraceLog,
WarningLog,
runExtendedValueComputation,
ExtendedValueComputationMode,
}
import com.digitalasset.daml.lf.interpretation.Error.ContractIdInContractKey
import com.digitalasset.daml.lf.language.{Ast, LanguageVersion, LookupError, Reference}
Expand Down Expand Up @@ -1084,33 +1084,6 @@ class IdeLedgerClient(
): Future[List[ScriptLedgerClient.ReadablePackageId]] =
Future.successful(getPackageIdMap().keys.toList)

override def allocatePartyOnMultipleParticipants(
party: Ref.Party,
toParticipantIds: Iterable[String],
)(implicit
ec: ExecutionContext,
mat: Materializer,
): Future[Unit] = Future.failed(
new RuntimeException(
"allocatePartyOnMultipleParticipants should not be called on IDE ledger, use aggregateAllocatePartyOnMultipleParticipants instead"
)
)

override def aggregateAllocatePartyOnMultipleParticipants(
clients: List[ScriptLedgerClient],
partyHint: String,
namespace: String,
toParticipantIds: Iterable[String],
)(implicit
ec: ExecutionContext,
mat: Materializer,
): Future[Ref.Party] = allocateParty(partyHint)

override def waitUntilHostingVisible(
party: Ref.Party,
onParticipantUid: Iterable[String],
): Future[Unit] =
Future.successful(())

override def getParticipantUid: String = ""
override def getParticipantUid()(implicit ec: ExecutionContext): Future[String] =
Future.successful("")
}
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,10 @@ object ScriptLedgerClient {
compiledPackages: CompiledPackages,
)(implicit namedLoggerFactory: NamedLoggerFactory): ScriptLedgerClient =
ledger match {
case abstractLedgers.GrpcLedgerClient(grpcClient, userId, oAdminClient) =>
case abstractLedgers.GrpcLedgerClient(grpcClient, userId) =>
new grpcLedgerClient.GrpcLedgerClient(
grpcClient,
userId,
oAdminClient,
compiledPackages,
)
case abstractLedgers.IdeLedgerClient(pureCompiledPackages, traceLog, warningLog, canceled) =>
Expand All @@ -104,6 +103,25 @@ object ScriptLedgerClient {
name: PackageName,
version: PackageVersion,
)

object ReadablePackageId {
private val versionedNamePattern = raw"(.+)-(\d+\.\d+\.\d+)".r

@throws[IllegalArgumentException]
def assertFromString(versionedName: String): ReadablePackageId =
versionedName match {
case versionedNamePattern(pkgName, pkgVersion) =>
ReadablePackageId(
name = PackageName.assertFromString(pkgName),
version = PackageVersion.assertFromString(pkgVersion),
)

case _ =>
throw new IllegalArgumentException(
s"""versioned name "$versionedName" does not match regex "$versionedNamePattern""""
)
}
}
}

// This abstracts over the interaction with the ledger. This allows
Expand Down Expand Up @@ -293,23 +311,5 @@ trait ScriptLedgerClient {
mat: Materializer,
): Future[List[ScriptLedgerClient.ReadablePackageId]]

def allocatePartyOnMultipleParticipants(party: Ref.Party, toParticipantIds: Iterable[String])(
implicit
ec: ExecutionContext,
mat: Materializer,
): Future[Unit]

def aggregateAllocatePartyOnMultipleParticipants(
clients: List[ScriptLedgerClient],
partyHint: String,
namespace: String,
toParticipantIds: Iterable[String],
)(implicit
ec: ExecutionContext,
mat: Materializer,
): Future[Ref.Party]

def waitUntilHostingVisible(party: Ref.Party, onParticipantUid: Iterable[String]): Future[Unit]

def getParticipantUid: String
def getParticipantUid()(implicit ec: ExecutionContext): Future[String]
}
Loading