Assets

Documentation

  • Removed unnecessary dependency in the quickstart-java example project.
  • Removed the Configure Maven section from the installation instructions. This step is not needed anymore.

SDK tools

  • DAML Assistant: We've built a new and improved version of the SDK assistant, replacing da commands with daml commands. The documentation is updated to use the new assistant in this release.

    For a full guide to what's changed and how to migrate, see support/new-assistant`. To read about how to use the new daml Assistant, see tools/assistant.

DAML

  • BREAKING CHANGE - DAML Compiler: It is now an error to omit method bodies in class instance s if the method has no default. Almost all instances of such behaviour were an error - add in a suitable definition.

  • Contract keys: We've added documentation for contract keys, a way of specifying a primary key for contract instances. For information about how to use them, see daml/reference/contract-keys

  • BREAKING CHANGE - DAML Standard Library: Moved the Tuple and Either types to daml-prim:DA.Types rather than exposing internal locations.

    How to migrate:

    • You don't need to change DAML code as a result of this change.
    • People using the Java/Scala codegen need to replace import ghc.tuple.* or import da.internal.prelude.* with import da.types.*.
    • People using the Ledger API directly need to replace GHC.Tuple and DA.Internal.Prelude with DA.Types.
  • BREAKING CHANGE - DAML Standard Library: Don't expose the TextMap type via the Prelude anymore.

    How to migrate: Always import DA.TextMap when you want to use the TextMap type.

  • DAML Standard Library: Add String as a compatibility alias for Text.

Ledger API

  • BREAKING Removed the unused field com.digitalasset.ledger.api.v1.ExercisedEvent from com.digitalasset.ledger.api.v1.Event, because a :com.digitalasset.ledger.api.v1.Transaction never contains exercised events (only created and archived events): Issue #960

    This change is backwards compatible on the transport level, meaning:

    • new versions of ledger language bindings will work with previous versions of the Sandbox, because the field was never populated
    • previous versions of the ledger language bindings will work with new versions of the Sandbox, as the field was removed without any change in observable behavior

    How to migrate:

    • If you check for the presence of com.digitalasset.ledger.api.v1.ExercisedEvent when handling a com.digitalasset.ledger.api.v1.Transaction, you have to remove this code now.
  • Added the agreement text as a new field agreement_text to the CreatedEvent message. This means you now have access to the agreement text of contracts via the Ledger API. The type of this field is google.protobuf.StringValue to properly reflect the optionality on the wire for full backwards compatibility. See Google's wrappers.proto https://github.com/protocolbuffers/protobuf/blob/b4f193788c9f0f05d7e0879ea96cd738630e5d51/src/google/protobuf/wrappers.proto#L31-L34 for more information about StringValue.

    See #1110 for details.

  • Fixed: the CommandService.SubmitAndWait endpoint no longer rejects commands without a workflow identifier.

    See #572 for details.

Java Bindings

  • BREAKING Reflect the breaking change of Ledger API in the event class hierarchy:

    • Changed data.Event from an abstract class to an interface, representing events in a flat transaction.
    • Added interface data.TreeEvent, representing events in a transaction tree.
    • data.CreatedEvent and data.ArchivedEvent now implement data.Event.
    • data.CreatedEvent and data.ExercisedEvent now implement data.TreeEvent.
    • data.TransactionTree#eventsById is now Map<String, TreeEvent> (was previously Map<String, Event>).

    How to migrate:

    • If you are processing data.TransactionTree objects, you need to change the type of the processed events from data.Event to data.TreeEvent.
    • If you are checking for the presence of exercised events when processing data.Transaction objects, you can remove that code now. It would never have triggered in the first place, as transactions do not contain exercised events.
  • Java Codegen: You can now call a method to get a CreateAndExerciseCommand for each choice, for example:

.. code-block:: java CreateAndExerciseCommand cmd = new MyTemplate(owner, someText).createAndExerciseAccept(42L);

In this case MyTemplate is a DAML template with a choice Accept and the resulting command will create a contract and exercise the Accept choice within the same transaction.

See #1092 for details.

  • Added agreement text of contracts: #1110

    • Java Bindings

      • Added field Optional<String> agreementText to data.CreatedEvent, to reflect the change in Ledger API.
    • Java Codegen

      • Added generated field Optional<String> TemplateName.Contract#agreementText.
      • Added generated static method TemplateName.Contract.fromCreatedEvent(CreatedEvent). This is the preferred method to use for converting a CreatedEvent into a Contract.
      • Added generated static method TemplateName.Contract.fromIdAndRecord(String, Record, Optional<String>). This method is useful for setting up tests, when you want to convert a Record into a contract without having to create a CreatedEvent first.
      • Deprecated generated static method TemplateName.Contract.fromIdAndRecord(String, Record) in favor of the new static methods in the generated Contract classes.
      • Changed the generated :ref:decoder utility class <daml-codegen-java-decoder-class> to use the new fromCreatedEvent method.
      • BREAKING Changed the return type of the getDecoder method in the generated decoder utility class from Optional<BiFunction<String, Record, Contract>> to Optional<Function<CreatedEvent, Contract>>.

    How to migrate:

    • If you are manually constructing instances of data.CreatedEvent (for example, for testing), you need to add an Optional<String> value as constructor parameter for the agreementText field.

    • You should change all calls to Contract.fromIdAndRecord to Contract.fromCreatedEvent.

      .. code-block:: java

      // BEFORE
      CreatedEvent event = ...;
      Iou.Contract contract = Iou.Contract.fromIdAndRecord(event.getContractId(), event.getArguments()));
      
      // AFTER
      CreatedEvent event = ...;
      Iou.Contract contract = Iou.Contract.fromCreatedEvent(event);
      
    • Pass the data.CreatedEvent directly to the function returned by the decoder's getDecoder method. If you are using the decoder utility class method fromCreatedEvent, you don't need to change anything.

      .. code-block:: java

      CreatedEvent event = ...;
      // BEFORE
      Optional<BiFunction<String, Record, Contract>> decoder = MyDecoderUtility.getDecoder(MyTemplate.TEMPLATE_ID);
      if (decoder.isPresent()) {
          return decoder.get().apply(event.getContractId(), event.getArguments();
      }
      
      // AFTER
      Optional<Function<CreatedEvent, Contract>> decoder = MyDecoderUtility.getDecoder(MyTemplate.TEMPLATE_ID);
      if (decoder.isPresent()) {
          return decoder.get().apply(event);
      }
      

Scala Bindings

  • BREAKING You can now access the agreement text of a contract with the new field Contract#agreementText: Option[String].

    How to migrate:

    • If you are pattern matching on com.digitalasset.ledger.client.binding.Contract, you need to add a match clause for the added field.
    • If you are constructing com.digitalasset.ledger.client.binding.Contract values, for example for tests, you need to add a constructor parameter for the agreement text.
  • CreateAndExercise support via createAnd method, e.g. MyTemplate(owner, someText).createAnd.exerciseAccept(controller, 42). See issue #1092 for more information.

Ledger

  • Renamed --jdbcurl to --sql-backend-jdbcurl. Left --jdbcurl in place for backwards compat.
  • Fixed issue when loading scenarios making use of pass into the sandbox, see #1079.
  • Fixed issue when loading scenarios that involve contract divulgence, see #1166.
  • Contract visibility is now properly checked when looking up contracts in the SQL backend, see #784.
  • The sandbox now exposes the agreement text of contracts in :ref:CreatedEvents <com.digitalasset.ledger.api.v1.CreatedEvent>. See #1110

Navigator

  • Non-empty agreement texts are now shown on the contract page above the section Contract details, see #1110

SQL Extractor

  • BREAKING In JSON content, dates and timestamps are formatted like "2020-02-22" and "2020-02-22T12:13:14Z" rather than UNIX epoch offsets like 18314 or 1582373594000000. See #1174 for more details.