Assets
- daml-sdk-0.12.18-linux.tar.gz
- daml-sdk-0.12.18-macos.tar.gz
- daml-sdk-0.12.18-windows.exe
- daml-sdk-0.12.18-windows.tar.gz
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
dacommands withdamlcommands. 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
damlAssistant, see tools/assistant.
DAML
BREAKING CHANGE - DAML Compiler: It is now an error to omit method bodies in class
instances 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
TupleandEithertypes todaml-prim:DA.Typesrather 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.*orimport da.internal.prelude.*withimport da.types.*. - People using the Ledger API directly need to replace
GHC.TupleandDA.Internal.PreludewithDA.Types.
BREAKING CHANGE - DAML Standard Library: Don't expose the
TextMaptype via thePreludeanymore.How to migrate: Always import
DA.TextMapwhen you want to use theTextMaptype.DAML Standard Library: Add
Stringas a compatibility alias forText.
Ledger API
BREAKING Removed the unused field
com.digitalasset.ledger.api.v1.ExercisedEventfromcom.digitalasset.ledger.api.v1.Event, because a :com.digitalasset.ledger.api.v1.Transactionnever contains exercised events (only created and archived events): Issue #960This 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.ExercisedEventwhen handling acom.digitalasset.ledger.api.v1.Transaction, you have to remove this code now.
Added the
agreement textas a new fieldagreement_textto theCreatedEventmessage. This means you now have access to the agreement text of contracts via the Ledger API. The type of this field isgoogle.protobuf.StringValueto properly reflect the optionality on the wire for full backwards compatibility. See Google'swrappers.protohttps://github.com/protocolbuffers/protobuf/blob/b4f193788c9f0f05d7e0879ea96cd738630e5d51/src/google/protobuf/wrappers.proto#L31-L34 for more information aboutStringValue.See #1110 for details.
Fixed: the
CommandService.SubmitAndWaitendpoint 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.Eventfrom an abstract class to an interface, representing events in a flat transaction. - Added interface
data.TreeEvent, representing events in a transaction tree. data.CreatedEventanddata.ArchivedEventnow implementdata.Event.data.CreatedEventanddata.ExercisedEventnow implementdata.TreeEvent.data.TransactionTree#eventsByIdis nowMap<String, TreeEvent>(was previouslyMap<String, Event>).
How to migrate:
- If you are processing
data.TransactionTreeobjects, you need to change the type of the processed events fromdata.Eventtodata.TreeEvent. - If you are checking for the presence of exercised events when processing
data.Transactionobjects, you can remove that code now. It would never have triggered in the first place, as transactions do not contain exercised events.
- Changed
Java Codegen: You can now call a method to get a
CreateAndExerciseCommandfor 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> agreementTexttodata.CreatedEvent, to reflect the change in Ledger API.
- Added field
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 aCreatedEventinto aContract. - Added generated static method
TemplateName.Contract.fromIdAndRecord(String, Record, Optional<String>). This method is useful for setting up tests, when you want to convert aRecordinto a contract without having to create aCreatedEventfirst. - Deprecated generated static method
TemplateName.Contract.fromIdAndRecord(String, Record)in favor of the new static methods in the generatedContractclasses. - Changed the generated :ref:
decoder utility class <daml-codegen-java-decoder-class>to use the newfromCreatedEventmethod. - BREAKING Changed the return type of the
getDecodermethod in the generated decoder utility class fromOptional<BiFunction<String, Record, Contract>>toOptional<Function<CreatedEvent, Contract>>.
- Added generated field
How to migrate:
If you are manually constructing instances of
data.CreatedEvent(for example, for testing), you need to add anOptional<String>value as constructor parameter for theagreementTextfield.You should change all calls to
Contract.fromIdAndRecordtoContract.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.CreatedEventdirectly to the function returned by the decoder'sgetDecodermethod. If you are using the decoder utility class methodfromCreatedEvent, 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.Contractvalues, for example for tests, you need to add a constructor parameter for the agreement text.
- If you are pattern matching on
CreateAndExercisesupport viacreateAndmethod, e.g.MyTemplate(owner, someText).createAnd.exerciseAccept(controller, 42). See issue #1092 for more information.
Ledger
- Renamed
--jdbcurlto--sql-backend-jdbcurl. Left--jdbcurlin place for backwards compat. - Fixed issue when loading scenarios making use of
passinto 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 textsare now shown on the contract page above the sectionContract 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 like18314or1582373594000000. See #1174 for more details.