From 85424a8e1bd3c048b5d02b76b7288ab20ce2c488 Mon Sep 17 00:00:00 2001 From: Brian W Bush Date: Thu, 16 Mar 2023 15:32:53 -0600 Subject: [PATCH] PLT-3027 Added escrow lesson. --- 00-preliminaries.ipynb | 121 +- 01-runtime-cli/ReadMe.ipynb | 8 +- 02-runtime-rest/ReadMe.ipynb | 16 +- 03-marlowe-cli/ReadMe.ipynb | 10 +- 04-escrow-rest/ReadMe.ipynb | 3064 ++++++++++++++++++++++++++++++ 04-escrow-rest/dismiss-claim.svg | 113 ++ ReadMe.md | 7 +- images/escrow-playground.png | Bin 0 -> 140095 bytes images/escrow-simulation.png | Bin 0 -> 51151 bytes 9 files changed, 3305 insertions(+), 34 deletions(-) create mode 100644 04-escrow-rest/ReadMe.ipynb create mode 100644 04-escrow-rest/dismiss-claim.svg create mode 100644 images/escrow-playground.png create mode 100644 images/escrow-simulation.png diff --git a/00-preliminaries.ipynb b/00-preliminaries.ipynb index 509b2cb..5185250 100644 --- a/00-preliminaries.ipynb +++ b/00-preliminaries.ipynb @@ -335,11 +335,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "block: 728210\n", + "block: 731649\n", "epoch: 57\n", "era: Babbage\n", - "hash: 7bdedcb169e17268b48669ac469b1901b702cab7014a5ef6c00011d7e7bcda2a\n", - "slot: 23218657\n", + "hash: ad9ed62386341677ada848804618b6198c1d4187a0bfbd008500d2ef9595943b\n", + "slot: 23307149\n", "syncProgress: '100.00'\n" ] } @@ -414,7 +414,7 @@ "output_type": "stream", "text": [ "HTTP/1.1 200 OK\n", - "\u001b[1mDate\u001b[0m: Wed, 15 Mar 2023 17:38:17 GMT\n", + "\u001b[1mDate\u001b[0m: Thu, 16 Mar 2023 18:12:51 GMT\n", "\u001b[1mServer\u001b[0m: Warp/3.3.24\n", "\u001b[1mContent-Type\u001b[0m: application/json;charset=utf-8\n", "\n" @@ -689,6 +689,87 @@ "echo \"BORROWER_ADDR = $BORROWER_ADDR\"" ] }, + { + "cell_type": "markdown", + "id": "a888e3e6-bdab-4763-8f7f-5c72c990ea90", + "metadata": {}, + "source": [ + "### The Mediator\n", + "\n", + "Set the file names for this party's signing key and verification key." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "89967b6a-01a0-42a6-ba70-258f67a2ddba", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "MEDIATOR_SKEY=keys/mediator.skey\n", + "MEDIATOR_VKEY=keys/mediator.vkey" + ] + }, + { + "cell_type": "markdown", + "id": "40dd9cf7-5931-47a4-a6c3-6bfcc7031963", + "metadata": {}, + "source": [ + "Generate the keys if they haven't already been generated." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "81238600-8ae9-43fd-881f-5bb1ab85688d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "if [[ ! -e \"$MEDIATOR_SKEY\" ]]\n", + "then\n", + " cardano-cli address key-gen \\\n", + " --signing-key-file \"$MEDIATOR_SKEY\" \\\n", + " --verification-key-file \"$MEDIATOR_VKEY\"\n", + "fi" + ] + }, + { + "cell_type": "markdown", + "id": "8ddf1475-a5a1-4d63-a83d-311cb7391500", + "metadata": {}, + "source": [ + "Compute the party's address on the testnet." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "16cd8dd9-153c-4abc-903e-a91e742044ca", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MEDIATOR_ADDR = addr_test1vr6tytqs3x8qgewhw89m3xrz58t3tqu2hfsecw0u06lf3hg052wsv\n" + ] + } + ], + "source": [ + "MEDIATOR_ADDR=$(cardano-cli address build --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --payment-verification-key-file \"$MEDIATOR_VKEY\" )\n", + "if [[ ! -e keys/mediator.address ]]\n", + "then\n", + " echo \"$MEDIATOR_ADDR\" > keys/mediator.address\n", + "fi\n", + "echo \"MEDIATOR_ADDR = $MEDIATOR_ADDR\"" + ] + }, { "cell_type": "markdown", "id": "74ea3de1-6c14-4ef6-a5ab-e8784cc879cc", @@ -705,7 +786,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 21, "id": "73e739b1-9d2f-4f36-b1ce-24e9e6c88f4b", "metadata": { "tags": [] @@ -735,7 +816,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 22, "id": "7c2069be-6817-4193-90bf-fd2a5fb26de7", "metadata": { "tags": [] @@ -746,13 +827,15 @@ "output_type": "stream", "text": [ "LENDER_ADDR = addr_test1vqd3yrtjyx49uld43lvwqaf7z4k03su8gf2x4yr7syzvckgfzm4ck\n", - "BORROWER_ADDR = addr_test1vpy4n4peh4suv0y55yptur0066j5kds8r4ncnuzm0vpzfgg0dhz6d\n" + "BORROWER_ADDR = addr_test1vpy4n4peh4suv0y55yptur0066j5kds8r4ncnuzm0vpzfgg0dhz6d\n", + "MEDIATOR_ADDR = addr_test1vr6tytqs3x8qgewhw89m3xrz58t3tqu2hfsecw0u06lf3hg052wsv\n" ] } ], "source": [ "echo \"LENDER_ADDR = $LENDER_ADDR\"\n", - "echo \"BORROWER_ADDR = $BORROWER_ADDR\"" + "echo \"BORROWER_ADDR = $BORROWER_ADDR\"\n", + "echo \"MEDIATOR_ADDR = $MEDIATOR_ADDR\"" ] }, { @@ -779,7 +862,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 23, "id": "5bcf4056-963b-41e1-b963-6af2c09498b5", "metadata": { "tags": [] @@ -789,7 +872,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "TxId \"78690d72c67960d4600889d7dd7da2069f14658ed6791c8838dccdd33fe3971f\"\n" + "TxId \"dd3a06e118f9ccfdc6d8721779228d1730a606cf183489e679f2584b4445d883\"\n" ] } ], @@ -808,7 +891,7 @@ " --out-file /dev/null \\\n", " --source-wallet-credentials \"$FAUCET_ADDR:$FAUCET_SKEY\" \\\n", " --submit 600 \\\n", - " \"$LENDER_ADDR\" \"$BORROWER_ADDR\"" + " \"$LENDER_ADDR\" \"$BORROWER_ADDR\" \"$MEDIATOR_ADDR\"" ] }, { @@ -821,7 +904,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 24, "id": "d4f822da-45bf-4222-95fa-5ce6a912869b", "metadata": { "tags": [] @@ -835,13 +918,19 @@ "Lender @ addr_test1vqd3yrtjyx49uld43lvwqaf7z4k03su8gf2x4yr7syzvckgfzm4ck\n", " TxHash TxIx Amount\n", "--------------------------------------------------------------------------------------\n", - "78690d72c67960d4600889d7dd7da2069f14658ed6791c8838dccdd33fe3971f 1 1000000000 lovelace + TxOutDatumNone\n", + "dd3a06e118f9ccfdc6d8721779228d1730a606cf183489e679f2584b4445d883 1 1000000000 lovelace + TxOutDatumNone\n", "\n", "\n", "Borrower @ addr_test1vpy4n4peh4suv0y55yptur0066j5kds8r4ncnuzm0vpzfgg0dhz6d\n", " TxHash TxIx Amount\n", "--------------------------------------------------------------------------------------\n", - "78690d72c67960d4600889d7dd7da2069f14658ed6791c8838dccdd33fe3971f 2 1000000000 lovelace + TxOutDatumNone\n", + "dd3a06e118f9ccfdc6d8721779228d1730a606cf183489e679f2584b4445d883 2 1000000000 lovelace + TxOutDatumNone\n", + "\n", + "\n", + "Borrower @ addr_test1vr6tytqs3x8qgewhw89m3xrz58t3tqu2hfsecw0u06lf3hg052wsv\n", + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "dd3a06e118f9ccfdc6d8721779228d1730a606cf183489e679f2584b4445d883 3 1000000000 lovelace + TxOutDatumNone\n", "\n" ] } @@ -855,6 +944,10 @@ "echo\n", "echo \"Borrower @ $BORROWER_ADDR\"\n", "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --address \"$BORROWER_ADDR\"\n", + "echo\n", + "echo\n", + "echo \"Borrower @ $MEDIATOR_ADDR\"\n", + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --address \"$MEDIATOR_ADDR\"\n", "echo" ] } diff --git a/01-runtime-cli/ReadMe.ipynb b/01-runtime-cli/ReadMe.ipynb index 4d12180..6b9a1b1 100644 --- a/01-runtime-cli/ReadMe.ipynb +++ b/01-runtime-cli/ReadMe.ipynb @@ -79,11 +79,11 @@ "\n", "It also assumes that the Lender and Borrower parties have addresses, signing keys, and funds.\n", "- Lender\n", - " - `LENDER_ADDR`: Cardano address for the lender\n", - " - `LENDER_SKEY`: location of signing key file for the lender\n", + " - [../keys/lender.address](../keys/lender.address): Cardano address for the lender\n", + " - [../keys/lender.skey](../keys/lender.skey): location of signing key file for the lender\n", "- Borrower\n", - " - `BORROWER_ADDR`: Cardano address for the borrower\n", - " - `BORROWER_SKEY`: locatio nof signing key file for the borrower" + " - [../keys/borrower.address](../keys/borrower.address): Cardano address for the borrower\n", + " - [../keys/borrower.skey](../keys/borrower.skey): location of signing key file for the borrower" ] }, { diff --git a/02-runtime-rest/ReadMe.ipynb b/02-runtime-rest/ReadMe.ipynb index e9bc565..4d45b6b 100644 --- a/02-runtime-rest/ReadMe.ipynb +++ b/02-runtime-rest/ReadMe.ipynb @@ -6,6 +6,7 @@ "metadata": {}, "source": [ "# Zero-Coupon Bond Using Marlowe Runtime\\'s REST API\n", + "\n", "The zero-coupon bond example is a simple Marlowe contract where a lender provides principal to a borrower who repays it back with interest.\n", "\n", "In this demonsration we use Marlowe Runtime\\'s REST API, served via `marlowe-web-server`, to run this contract on Cardano\\'s `preprod` public testnet. Marlowe contracts may use either addresses or role tokens for authorization: here we use role tokens and we have Marlowe Runtime mint them.\n", @@ -76,11 +77,11 @@ "\n", "It also assumes that the Lender and Borrower parties have addresses, signing keys, and funds.\n", "- Lender\n", - " - `LENDER_ADDR`: Cardano address for the lender\n", - " - `LENDER_SKEY`: location of signing key file for the lender\n", + " - [../keys/lender.address](../keys/lender.address): Cardano address for the lender\n", + " - [../keys/lender.skey](../keys/lender.skey): location of signing key file for the lender\n", "- Borrower\n", - " - `BORROWER_ADDR`: Cardano address for the borrower\n", - " - `BORROWER_SKEY`: locatio nof signing key file for the borrower" + " - [../keys/borrower.address](../keys/borrower.address): Cardano address for the borrower\n", + " - [../keys/borrower.skey](../keys/borrower.skey): location of signing key file for the borrower" ] }, { @@ -370,7 +371,7 @@ } ], "source": [ - "ADA=1000000 # 1 ada = 1,000,000 lovelace\n", + "ADA=1000000 # 1 ada = 1,000,000 lovelace\n", "PRINCIPAL=$((80 * ADA))\n", "INTEREST=$((5 * ADA))\n", "echo \"PRINCIPAL = $PRINCIPAL lovelace\"\n", @@ -438,7 +439,6 @@ "1. Visit https://play.marlowe-finance.io/ in a web browser.\n", "2. Select \"Open an Example\".\n", "3. Select \"Marlowe\" or \"Blockly\" under \"Zero Coupon Bond\".\n", - "4. Edit the contract set set\n", "4. Select \"Send to Simulator\".\n", "5. Set the \"Loan Deadline\" to one hour into the future.\n", "6. Set the \"Payback Deadline\" to three hours into the future.\n", @@ -673,7 +673,7 @@ "\n", "Here are the steps for checking the safety of a contract:\n", "\n", - "1. Understand the [Marlowe Language](https://marlowe-finance.io/)\n", + "1. Understand the [Marlowe Language](https://marlowe-finance.io/).\n", "2. Understand Cardano\\'s [Extended UTxO Model](https://docs.cardano.org/learn/eutxo-explainer).\n", "3. Read and understand the [Marlowe Best Practices Guide](https://github.com/input-output-hk/marlowe-cardano/blob/main/marlowe/best-practices.md).\n", "4. Read and understand the [Marlowe Security Guide](https://github.com/input-output-hk/marlowe-cardano/blob/main/marlowe/security.md).\n", @@ -1536,7 +1536,7 @@ "source": [ "## Transaction 3. The borrower withdraws the principal\n", "\n", - "The principal of 80 ada is help at Marlowe's role-payout address for the benefit of the borrower. The borrower can withdraw these funds at any time. The contract ID and role name are included in the request body for a withdrawal." + "The principal of 80 ada is held at Marlowe's role-payout address for the benefit of the borrower. The borrower can withdraw these funds at any time. The contract ID and role name are included in the request body for a withdrawal." ] }, { diff --git a/03-marlowe-cli/ReadMe.ipynb b/03-marlowe-cli/ReadMe.ipynb index a57bf73..cfa5127 100644 --- a/03-marlowe-cli/ReadMe.ipynb +++ b/03-marlowe-cli/ReadMe.ipynb @@ -77,11 +77,11 @@ "\n", "It also assumes that the Lender and Borrower parties have addresses, signing keys, and funds.\n", "- Lender\n", - " - `LENDER_ADDR`: Cardano address for the lender\n", - " - `LENDER_SKEY`: location of signing key file for the lender\n", + " - [../keys/lender.address](../keys/lender.address): Cardano address for the lender\n", + " - [../keys/lender.skey](../keys/lender.skey): location of signing key file for the lender\n", "- Borrower\n", - " - `BORROWER_ADDR`: Cardano address for the borrower\n", - " - `BORROWER_SKEY`: locatio nof signing key file for the borrower" + " - [../keys/borrower.address](../keys/borrower.address): Cardano address for the borrower\n", + " - [../keys/borrower.skey](../keys/borrower.skey): location of signing key file for the borrower" ] }, { @@ -621,7 +621,7 @@ "\n", "Here are the steps for checking the safety of a contract:\n", "\n", - "1. Understand the [Marlowe Language](https://marlowe-finance.io/)\n", + "1. Understand the [Marlowe Language](https://marlowe-finance.io/).\n", "2. Understand Cardano\\'s [Extended UTxO Model](https://docs.cardano.org/learn/eutxo-explainer).\n", "3. Read and understand the [Marlowe Best Practices Guide](https://github.com/input-output-hk/marlowe-cardano/blob/main/marlowe/best-practices.md).\n", "4. Read and understand the [Marlowe Security Guide](https://github.com/input-output-hk/marlowe-cardano/blob/main/marlowe/security.md).\n", diff --git a/04-escrow-rest/ReadMe.ipynb b/04-escrow-rest/ReadMe.ipynb new file mode 100644 index 0000000..66e55a3 --- /dev/null +++ b/04-escrow-rest/ReadMe.ipynb @@ -0,0 +1,3064 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a8b9d3ec-9b61-4c11-8465-504673116f9d", + "metadata": {}, + "source": [ + "# Escrow Using Marlowe Runtime\\'s REST API\n", + "\n", + "The escrow contract example is a simple Marlowe contract where a seller offers merchandise for sale and a buyer purchases it; if the buyer is not satisfied with the merchandise, they may dispute the purchase, in which case a mediator may rule for the buyer or seller.\n", + "\n", + "In this demonsration we use Marlowe Runtime\\'s REST API, served via `marlowe-web-server`, to run this contract on Cardano\\'s `preprod` public testnet. Marlowe contracts may use either addresses or role tokens for authorization: here we use role tokens and we have Marlowe Runtime mint them.\n", + "\n", + "In [Marlowe Playground](https://play.marlowe-finance.io/), the contract looks like this in Blockly format.\n", + "\n", + "![Marlowe contract for escrow](../images/escrow-playground.png)\n", + "\n", + "In Marlowe format it appears as\n", + "```\n", + "When [\n", + " (Case\n", + " (Deposit Role \"Seller\" Role \"Buyer\"\n", + " (Token \"\" \"\")\n", + " (ConstantParam \"Price\"))\n", + " (When [\n", + " (Case\n", + " (Choice\n", + " (ChoiceId \"Everything is alright\" Role \"Buyer\") [\n", + " (Bound 0 0)]) Close)\n", + " ,\n", + " (Case\n", + " (Choice\n", + " (ChoiceId \"Report problem\" Role \"Buyer\") [\n", + " (Bound 1 1)])\n", + " (Pay Role \"Seller\"\n", + " (Account Role \"Buyer\")\n", + " (Token \"\" \"\")\n", + " (ConstantParam \"Price\")\n", + " (When [\n", + " (Case\n", + " (Choice\n", + " (ChoiceId \"Confirm problem\" Role \"Seller\") [\n", + " (Bound 1 1)]) Close)\n", + " ,\n", + " (Case\n", + " (Choice\n", + " (ChoiceId \"Dispute problem\" Role \"Seller\") [\n", + " (Bound 0 0)])\n", + " (When [\n", + " (Case\n", + " (Choice\n", + " (ChoiceId \"Dismiss claim\" Role \"Mediator\") [\n", + " (Bound 0 0)])\n", + " (Pay Role \"Buyer\"\n", + " (Party Role \"Seller\")\n", + " (Token \"\" \"\")\n", + " (ConstantParam \"Price\") Close))\n", + " ,\n", + " (Case\n", + " (Choice\n", + " (ChoiceId \"Confirm problem\" Role \"Mediator\") [\n", + " (Bound 1 1)]) Close)]\n", + " (TimeParam \"Mediation deadline\") Close))] \n", + " (TimeParam \"Complaint response deadline\") Close)))] \n", + " (TimeParam \"Complaint deadline\") Close))] \n", + " (TimeParam \"Payment deadline\") Close\n", + "```\n", + "\n", + "The flow chart below shows the possible execution paths of the escrow contract. This example demonstrates the shaded path.\n", + "\n", + "![Flow chart for escrow contract, with the \"dismiss claim\" execution path highlighted](dismiss-claim.svg)" + ] + }, + { + "cell_type": "markdown", + "id": "f128e27a-afe6-4d03-8c46-ef6e5753e4a8", + "metadata": {}, + "source": [ + "## Prelminaries\n", + "\n", + "See [Lesson 0. Preliminaries](../00-preliminaries.ipynb) for information on setting up one's environment for using this tutorial.\n", + "\n", + "The lesson assumes that the following environment variables have been set.\n", + "- `CARDANO_NODE_SOCKET_PATH`: location of Cardano node's socket.\n", + "- `CARDANO_TESTNET_MAGIC`: testnet magic number.\n", + "- `CARDANO_RT_WEBSERVER_HOST`: IP address of the Marlowe Runtime web server.\n", + "- `CARDANO_RT_WEBSERVER_PORT`: Port number for the Marlowe Runtime web server.\n", + "\n", + "It also assumes that the Lender and Borrower parties have addresses, signing keys, and funds.\n", + "- Seller\n", + " - [../keys/lender.address](../keys/lender.address): Cardano address for the seller\n", + " - [../keys/lender.skey](../keys/lender.skey): location of signing key file for the seller\n", + "- Buyer\n", + " - [../keys/borrower.address](../keys/borrower.address): Cardano address for the buyer\n", + " - [../keys/borrower.skey](../keys/borrower.skey): location of signing key file for the buyer\n", + "- Mediator\n", + " - [../keys/mediator.address](../keys/mediator.address): Cardano address for the mediator\n", + " - [../keys/mediator.skey](../keys/mediator.skey): location of signing key file for the mediator" + ] + }, + { + "cell_type": "markdown", + "id": "053cac6c-9bfc-4c47-ba48-c5cc145734d7", + "metadata": {}, + "source": [ + "### Access to Cardano node and Marlowe Runtime\n", + "\n", + "***One can skip this section if one is using [demeter.run](https://demeter.run/)'s Cardano Marlowe Runtime extension.***\n", + "\n", + "If we're using [demeter.run](https://demeter.run/)'s Cardano Marlowe Runtime extension, then we already have access to Cardano Node and Marlowe Runtime. If not, set the required environment variables to use a local docker deployment on the default ports." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "e1859d35-ded3-4e16-be43-b1ef030d7f16", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CARDANO_NODE_SOCKET_PATH = /home/bbush/.local/share/containers/storage/volumes/marlowe-compose_shared/_data/node.socket\n", + "CARDANO_TESTNET_MAGIC = 1\n", + "MARLOWE_RT_WEBSERVER_HOST = 127.0.0.1\n", + "MARLOWE_RT_WEBSERVER_PORT = 3780\n", + "MARLOWE_RT_WEBSERVER_URL = http://127.0.0.1:3780\n" + ] + } + ], + "source": [ + "if [[ -z \"$MARLOWE_RT_WEBSERVER_PORT\" ]]\n", + "then\n", + "\n", + " if command -v podman > /dev/null\n", + " then\n", + " DOCKER_CLI=podman\n", + " else\n", + " DOCKER_CLI=docker\n", + " fi\n", + " \n", + " # Only required for `marlowe-cli` and `cardano-cli`.\n", + " export CARDANO_NODE_SOCKET_PATH=\"$($DOCKER_CLI volume inspect marlowe-compose_shared | jq -r '.[0].Mountpoint')/node.socket\"\n", + " export CARDANO_TESTNET_MAGIC=1 # Note that preprod=1 and preview=2. Do not set this variable if using mainnet.\n", + "\n", + " # Only required for `marlowe`.\n", + " export MARLOWE_RT_WEBSERVER_HOST=\"127.0.0.1\"\n", + " export MARLOWE_RT_WEBSERVER_PORT=3780\n", + "\n", + "fi\n", + "\n", + "case \"$CARDANO_TESTNET_MAGIC\" in\n", + " 1)\n", + " export \"EXPLORER_URL=https://preprod.cardanoscan.io\"\n", + " ;;\n", + " 2)\n", + " export \"EXPLORER_URL=https://preview.cardanoscan.io\"\n", + " ;;\n", + " *)\n", + " # Use `mainnet` as the default.\n", + " export \"EXPLORER_URL=https://cardanoscan.io\"\n", + " ;;\n", + "esac\n", + "\n", + "MARLOWE_RT_WEBSERVER_URL=\"http://$MARLOWE_RT_WEBSERVER_HOST:$MARLOWE_RT_WEBSERVER_PORT\"\n", + "\n", + "echo \"CARDANO_NODE_SOCKET_PATH = $CARDANO_NODE_SOCKET_PATH\"\n", + "echo \"CARDANO_TESTNET_MAGIC = $CARDANO_TESTNET_MAGIC\"\n", + "echo \"MARLOWE_RT_WEBSERVER_HOST = $MARLOWE_RT_WEBSERVER_HOST\"\n", + "echo \"MARLOWE_RT_WEBSERVER_PORT = $MARLOWE_RT_WEBSERVER_PORT\"\n", + "echo \"MARLOWE_RT_WEBSERVER_URL = $MARLOWE_RT_WEBSERVER_URL\"" + ] + }, + { + "cell_type": "markdown", + "id": "1f209e22-2e7c-444c-a72b-aa88d676e0f8", + "metadata": { + "tags": [] + }, + "source": [ + "### Seller address and funds\n", + "\n", + "Check that an address and key has been created for the seller. If not, see \"Creating Addresses and Signing Keys\" in [Lesson 0. Preliminaries](../00-preliminaries.ipynb)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "38d0bad1-3b9e-4d80-9aec-a4357c8dc79a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "SELLER_ADDR = addr_test1vqd3yrtjyx49uld43lvwqaf7z4k03su8gf2x4yr7syzvckgfzm4ck\n" + ] + } + ], + "source": [ + "SELLER_SKEY=../keys/lender.skey\n", + "SELLER_ADDR=$(cat ../keys/lender.address)\n", + "echo \"SELLER_ADDR = $SELLER_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "112cbd18-2567-4563-a452-e4a5c529a171", + "metadata": {}, + "source": [ + "Check that the seller has at least one hundred ada." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a16fd543-cabf-4540-879c-ed0594ca5ff1", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "b32eab58a670cc0164c9c2c615c81b40dc9229ab8d899db8f232bbede0984107 2 1000000000 lovelace + TxOutDatumNone\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --address \"$SELLER_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "d23a2695-2d68-4fa3-80cb-3afe5afe2196", + "metadata": {}, + "source": [ + "One can view the address on a Cardano explorer. It sometimes takes thirty seconds or so for the transaction to be visible in an explorer." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b1d78493-a1a1-4739-b911-02b901c73bda", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://preprod.cardanoscan.io/address/addr_test1vqd3yrtjyx49uld43lvwqaf7z4k03su8gf2x4yr7syzvckgfzm4ck\n" + ] + } + ], + "source": [ + "echo \"$EXPLORER_URL/address/$SELLER_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "754f546b-b42d-434c-ad78-b4e1fada39b9", + "metadata": { + "tags": [] + }, + "source": [ + "### Buyer address and funds\n", + "\n", + "Check that an address and key has been created for the buyer. If not, see \"Creating Addresses and Signing Keys\" in [Lesson 0. Preliminaries](../00-preliminaries.ipynb)." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5103b793-05a7-4a9c-bb5b-ed250bcbcc1e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "BUYER_ADDR = addr_test1vpy4n4peh4suv0y55yptur0066j5kds8r4ncnuzm0vpzfgg0dhz6d\n" + ] + } + ], + "source": [ + "BUYER_SKEY=../keys/borrower.skey\n", + "BUYER_ADDR=$(cat ../keys/borrower.address)\n", + "echo \"BUYER_ADDR = $BUYER_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "41a004a6-8681-4ce1-b07e-6d6d07ee1b38", + "metadata": {}, + "source": [ + "Check that the buyer has at least one hundred ada." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3af7a962-3038-4b55-a31a-cd7ade94b5ec", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "b32eab58a670cc0164c9c2c615c81b40dc9229ab8d899db8f232bbede0984107 3 1000000000 lovelace + TxOutDatumNone\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --address \"$BUYER_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "0bf7ec49-14c5-4f3a-9eb7-c97cd38fcfcf", + "metadata": {}, + "source": [ + "One can view the address on a Cardano explorer. It sometimes takes thirty seconds or so for the transaction to be visible in an explorer." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "3455b47d-45f9-4d31-aebe-ab0ea7b36aa9", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://preprod.cardanoscan.io/address/\n" + ] + } + ], + "source": [ + "echo \"$EXPLORER_URL/address/$BORROWER_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "e9e994d8-95b4-4175-a26e-1d1da2fe103a", + "metadata": { + "tags": [] + }, + "source": [ + "### Mediator address and funds\n", + "\n", + "Check that an address and key has been created for the mediator. If not, see \"Creating Addresses and Signing Keys\" in [Lesson 0. Preliminaries](../00-preliminaries.ipynb)." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "4f9e1680-77da-43f9-9495-14d8a8a9929b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MEDIATOR_ADDR = addr_test1vr6tytqs3x8qgewhw89m3xrz58t3tqu2hfsecw0u06lf3hg052wsv\n" + ] + } + ], + "source": [ + "MEDIATOR_SKEY=../keys/mediator.skey\n", + "MEDIATOR_ADDR=$(cat ../keys/mediator.address)\n", + "echo \"MEDIATOR_ADDR = $MEDIATOR_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "7ee5fc4d-f900-4d22-b0a4-bb2cc56fe025", + "metadata": {}, + "source": [ + "Check that the mediator has at least one hundred ada." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ca1d52a9-8499-4ccc-ab2a-ff9aed202944", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "b32eab58a670cc0164c9c2c615c81b40dc9229ab8d899db8f232bbede0984107 4 1000000000 lovelace + TxOutDatumNone\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --address \"$MEDIATOR_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "0650ca57-f643-4111-9741-e7c893f45bf4", + "metadata": {}, + "source": [ + "One can view the address on a Cardano explorer. It sometimes takes thirty seconds or so for the transaction to be visible in an explorer." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "d9d17190-eed0-456f-8aa0-6f0a2b4d83dc", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://preprod.cardanoscan.io/address/addr_test1vr6tytqs3x8qgewhw89m3xrz58t3tqu2hfsecw0u06lf3hg052wsv\n" + ] + } + ], + "source": [ + "echo \"$EXPLORER_URL/address/$MEDIATOR_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "00396fbb-ce2d-4666-9bac-85a8ccd7945b", + "metadata": {}, + "source": [ + "## Design the contract\n", + "\n", + "The escrow contract can be downloaded from the [Marlowe Playground](https://play.marlowe-finance.io/) as a JSON file, or it can be generated using [Marlowe CLI](https://github.com/input-output-hk/marlowe-cardano/tree/main/marlowe-cli#readme) using the `marlowe-cli template` command.\n", + "\n", + "Set the purchase prices to 75 ada." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "8d28fcbc-c73f-4c27-8d68-069d8ebe98ce", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PRICE = 75000000 lovelace\n" + ] + } + ], + "source": [ + "ADA=1000000 # 1 ada = 1,000,000 lovelace\n", + "PRICE=$((75 * ADA))\n", + "echo \"PRICE = $PRICE lovelace\"" + ] + }, + { + "cell_type": "markdown", + "id": "5a11195d-000f-44e4-a217-50e5d7de01ed", + "metadata": {}, + "source": [ + "On the Cardano blockchain, the protocol parameters require that each UTxO contain at least some ada. Here we will start the contract with 2 ada." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "8f699238-b0a0-4626-b04f-e93d93b0f458", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "MIN_LOVELACE = 2000000 lovelace\n" + ] + } + ], + "source": [ + "MIN_LOVELACE=\"$((2 * ADA))\"\n", + "echo \"MIN_LOVELACE = $MIN_LOVELACE lovelace\"" + ] + }, + { + "cell_type": "markdown", + "id": "0b4c28e3-3f4b-4fa8-8dd4-aa7b51921132", + "metadata": {}, + "source": [ + "Later in the example we will need some constants for converting times." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "d06a9229-9e53-4a00-accf-ae06b115ff39", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "SECOND=1000 # 1 second = 1000 milliseconds\n", + "MINUTE=$((60 * SECOND)) # 1 minute = 60 seconds\n", + "HOUR=$((60 * MINUTE)) # 1 hour = 60 minutes" + ] + }, + { + "cell_type": "markdown", + "id": "94d3ddb1-35e9-49ff-9062-1854febca9b7", + "metadata": {}, + "source": [ + "### *Alternative 1:* Use Marlowe Playground to design the contract\n", + "\n", + "If you want to create the contract in Marlowe Playground, do the following:\n", + "\n", + "1. Visit https://play.marlowe-finance.io/ in a web browser.\n", + "2. Select \"Open an Example\".\n", + "3. Select \"Marlowe\" or \"Blockly\" under \"Escrow\".\n", + "4. Select \"Send to Simulator\".\n", + "5. Set the \"Payment deadline\" to one hour into the future.\n", + "6. Set the \"Complaint deadline\" to two hours into the future\n", + "7. Set the \"Complaint response deadline\" to three hours into the future.\n", + "8. Set the \"Mediation deadline\" to four hours into the future.\n", + "9. Set the \"Price\" to 75 ada.\n", + "10. Select \"Download as JSON\", set the file name to \"escrow-contract.json\", and store the file in this folder, namely [marlowe-starter-kit/04-escrow-rest/](.).\n", + "\n", + "![Setting parameters for the escrow bond contract in Marlowe Playground](../images/escrow-simulation.png)" + ] + }, + { + "cell_type": "markdown", + "id": "0073090c-205c-4037-814c-b3053bbc81d6", + "metadata": {}, + "source": [ + "### *Alternative 2:* Use Marlowe CLI to generate the contract\n", + "\n", + "Below we generate the contract using Marlowe CLI.\n", + "\n", + "First find the current time, measured in [POSIX milliseconds](https://en.wikipedia.org/wiki/Unix_time)." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "327df025-16bf-4f69-acfc-02e3ce56e795", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NOW = 1679000784000 POSIX milliseconds = Thu Mar 16 03:06:24 PM MDT 2023\n" + ] + } + ], + "source": [ + "NOW=\"$(($(date -u +%s) * SECOND))\"\n", + "echo \"NOW = $NOW POSIX milliseconds = $(date -d @$((NOW / SECOND)))\"" + ] + }, + { + "cell_type": "markdown", + "id": "d3686e55-0139-4e49-a4cc-8d7e5ef4491a", + "metadata": {}, + "source": [ + "The contract has four deadlines. For convenience in this example, set the deadlines to the near future." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "f1797871-350b-400b-b12f-5bc877efca94", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "PAYMENT_DEADLINE = 1679004384000 POSIX milliseconds = Thu Mar 16 04:06:24 PM MDT 2023\n", + "COMPLAINT_DEADLINE = 1679007984000 POSIX milliseconds = Thu Mar 16 05:06:24 PM MDT 2023\n", + "DISPUTE_DEADLINE = 1679011584000 POSIX milliseconds = Thu Mar 16 06:06:24 PM MDT 2023\n", + "MEDIATION_DEADLINE = 1679015184000 POSIX milliseconds = Thu Mar 16 07:06:24 PM MDT 2023\n" + ] + } + ], + "source": [ + "PAYMENT_DEADLINE=$((NOW+1*HOUR)) # The payment deadline, one hour from now.\n", + "COMPLAINT_DEADLINE=$((NOW+2*HOUR)) # The complaint deadline, two hours from now.\n", + "DISPUTE_DEADLINE=$((NOW+3*HOUR)) # The dispute deadline, three hours from now.\n", + "MEDIATION_DEADLINE=$((NOW+4*HOUR)) # The mediation deadline, four hours from now.\n", + "\n", + "echo \"PAYMENT_DEADLINE = $PAYMENT_DEADLINE POSIX milliseconds = $(date -d @$((PAYMENT_DEADLINE / SECOND)))\"\n", + "echo \"COMPLAINT_DEADLINE = $COMPLAINT_DEADLINE POSIX milliseconds = $(date -d @$((COMPLAINT_DEADLINE / SECOND)))\"\n", + "echo \"DISPUTE_DEADLINE = $DISPUTE_DEADLINE POSIX milliseconds = $(date -d @$((DISPUTE_DEADLINE / SECOND)))\"\n", + "echo \"MEDIATION_DEADLINE = $MEDIATION_DEADLINE POSIX milliseconds = $(date -d @$((MEDIATION_DEADLINE / SECOND)))\"" + ] + }, + { + "cell_type": "markdown", + "id": "67bb8476-28d1-4bea-9a4e-d979a3b753c0", + "metadata": {}, + "source": [ + "Now create the JSON file for the contract, `zcb-contract.json`." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "efec81d2-4cd2-4b72-8fab-82a6e60741c7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "marlowe-cli template escrow \\\n", + " --minimum-ada \"$MIN_LOVELACE\" \\\n", + " --price \"$PRICE\" \\\n", + " --seller Seller \\\n", + " --buyer Buyer \\\n", + " --mediator Mediator \\\n", + " --payment-deadline \"$PAYMENT_DEADLINE\" \\\n", + " --complaint-deadline \"$COMPLAINT_DEADLINE\" \\\n", + " --dispute-deadline \"$DISPUTE_DEADLINE\" \\\n", + " --mediation-deadline \"$MEDIATION_DEADLINE\" \\\n", + " --out-contract-file escrow-contract.json \\\n", + " --out-state-file /dev/null" + ] + }, + { + "cell_type": "markdown", + "id": "ec5de5c3-848a-417c-aebd-276f10bbce8d", + "metadata": {}, + "source": [ + "The various command-line options are described by the help system." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "4b7754a1-3e13-4d54-81a3-9b98be4c87c9", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Usage: marlowe-cli template escrow --minimum-ada INTEGER --price INTEGER\n", + " --seller PARTY --buyer PARTY --mediator PARTY\n", + " --payment-deadline TIMEOUT\n", + " --complaint-deadline TIMEOUT\n", + " --dispute-deadline TIMEOUT\n", + " --mediation-deadline TIMEOUT\n", + "\n", + " Create an escrow contract.\n", + "\n", + "Available options:\n", + " --minimum-ada INTEGER Lovelace in the initial state.\n", + " --price INTEGER The price of the sale, in lovelace.\n", + " --seller PARTY The seller.\n", + " --buyer PARTY The buyer.\n", + " --mediator PARTY The mediator.\n", + " --payment-deadline TIMEOUT\n", + " The deadline for the buyer to pay. POSIX milliseconds\n", + " or duration: `INTEGER[s|m|d|w|h]`.\n", + " --complaint-deadline TIMEOUT\n", + " The deadline for the buyer to complain. POSIX\n", + " milliseconds or duration: `INTEGER[s|m|d|w|h]`.\n", + " --dispute-deadline TIMEOUT\n", + " The deadline for the seller to dispute a complaint.\n", + " POSIX milliseconds or duration: `INTEGER[s|m|d|w|h]`.\n", + " --mediation-deadline TIMEOUT\n", + " The deadline for the mediator to decide. POSIX\n", + " milliseconds or duration: `INTEGER[s|m|d|w|h]`.\n", + " -h,--help Show this help text\n" + ] + } + ], + "source": [ + "marlowe-cli template escrow --help" + ] + }, + { + "cell_type": "markdown", + "id": "b158c36f-c316-4a08-8db5-8464645f2466", + "metadata": {}, + "source": [ + "## Examine the contract\n", + "\n", + "View the contract file as YAML." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "58855a22-decd-4730-bac7-800d0f766034", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "timeout: 1679004384000\n", + "timeout_continuation: close\n", + "when:\n", + "- case:\n", + " deposits: 75000000\n", + " into_account:\n", + " role_token: Seller\n", + " of_token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + " party:\n", + " role_token: Buyer\n", + " then:\n", + " timeout: 1679007984000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Everything is alright\n", + " choice_owner:\n", + " role_token: Buyer\n", + " then: close\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Report problem\n", + " choice_owner:\n", + " role_token: Buyer\n", + " then:\n", + " from_account:\n", + " role_token: Seller\n", + " pay: 75000000\n", + " then:\n", + " timeout: 1679011584000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Confirm problem\n", + " choice_owner:\n", + " role_token: Seller\n", + " then: close\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Dispute problem\n", + " choice_owner:\n", + " role_token: Seller\n", + " then:\n", + " timeout: 1679015184000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Dismiss claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + " then:\n", + " from_account:\n", + " role_token: Buyer\n", + " pay: 75000000\n", + " then: close\n", + " to:\n", + " account:\n", + " role_token: Seller\n", + " token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Confirm claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + " then: close\n", + " to:\n", + " account:\n", + " role_token: Buyer\n", + " token:\n", + " currency_symbol: ''\n", + " token_name: ''\n" + ] + } + ], + "source": [ + "json2yaml escrow-contract.json" + ] + }, + { + "cell_type": "markdown", + "id": "4c4c1547-2bb6-4517-ba71-bf1ff35ad973", + "metadata": {}, + "source": [ + "### \\[Optional\\] Check the safety of the contract\n", + "\n", + "If we were running the contract on the Cardano `mainnet`, then we\\'d want to check its safety before creating it, so that there is no chance that we might lose funds.\n", + "\n", + "Here are the steps for checking the safety of a contract:\n", + "\n", + "1. Understand the [Marlowe Language](https://marlowe-finance.io/).\n", + "2. Understand Cardano\\'s [Extended UTxO Model](https://docs.cardano.org/learn/eutxo-explainer).\n", + "3. Read and understand the [Marlowe Best Practices Guide](https://github.com/input-output-hk/marlowe-cardano/blob/main/marlowe/best-practices.md).\n", + "4. Read and understand the [Marlowe Security Guide](https://github.com/input-output-hk/marlowe-cardano/blob/main/marlowe/security.md).\n", + "5. Use [Marlowe Playground](https://play.marlowe-finance.io/) to flag warnings, perform static analysis, and simulate the contract.\n", + "6. Use [Marlowe CLI\\'s](https://github.com/input-output-hk/marlowe-cardano/blob/main/marlowe-cli/ReadMe.md) `marlowe-cli run analyze` tool to study whether the contract can run on a Cardano network.\n", + "7. Run *all execution paths* of the contract on a [Cardano testnet](https://docs.cardano.org/cardano-testnet/overview).\n", + "\n", + "See [Lesson 1](../01-runtime-cli/ReadMe.ipynb) for an example of performing step 6." + ] + }, + { + "cell_type": "markdown", + "id": "87bb70c0-a8ed-4a9a-b0b7-732c40f0cad6", + "metadata": {}, + "source": [ + "## Transaction 1: Mediator Creates Escrow Contract with Initial ADA\n", + "\n", + "A `HTTP` `POST` request to Marlowe Runtime\\'s `/contracts` endpoint will build the creation transaction for a Marlowe contract. We provide it the JSON file containing the contract and tell it the `MIN_LOVELACE` value that we previously chose. Anyone could create the contract, but in this example the lender will be doing so, so we provide their address to fund the transaction and to receive the change from it.\n", + "\n", + "First we create the JSON body of the request to build the creation transaction." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "4314ece0-462f-4df8-b739-f9db58cbc6a9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"contract\":{\"timeout\":1679004384000,\"timeout_continuation\":\"close\",\"when\":[{\"case\":{\"deposits\":75000000,\"into_account\":{\"role_token\":\"Seller\"},\"of_token\":{\"currency_symbol\":\"\",\"token_name\":\"\"},\"party\":{\"role_token\":\"Buyer\"}},\"then\":{\"timeout\":1679007984000,\"timeout_continuation\":\"close\",\"when\":[{\"case\":{\"choose_between\":[{\"from\":0,\"to\":0}],\"for_choice\":{\"choice_name\":\"Everything is alright\",\"choice_owner\":{\"role_token\":\"Buyer\"}}},\"then\":\"close\"},{\"case\":{\"choose_between\":[{\"from\":1,\"to\":1}],\"for_choice\":{\"choice_name\":\"Report problem\",\"choice_owner\":{\"role_token\":\"Buyer\"}}},\"then\":{\"from_account\":{\"role_token\":\"Seller\"},\"pay\":75000000,\"then\":{\"timeout\":1679011584000,\"timeout_continuation\":\"close\",\"when\":[{\"case\":{\"choose_between\":[{\"from\":1,\"to\":1}],\"for_choice\":{\"choice_name\":\"Confirm problem\",\"choice_owner\":{\"role_token\":\"Seller\"}}},\"then\":\"close\"},{\"case\":{\"choose_between\":[{\"from\":0,\"to\":0}],\"for_choice\":{\"choice_name\":\"Dispute problem\",\"choice_owner\":{\"role_token\":\"Seller\"}}},\"then\":{\"timeout\":1679015184000,\"timeout_continuation\":\"close\",\"when\":[{\"case\":{\"choose_between\":[{\"from\":0,\"to\":0}],\"for_choice\":{\"choice_name\":\"Dismiss claim\",\"choice_owner\":{\"role_token\":\"Mediator\"}}},\"then\":{\"from_account\":{\"role_token\":\"Buyer\"},\"pay\":75000000,\"then\":\"close\",\"to\":{\"account\":{\"role_token\":\"Seller\"}},\"token\":{\"currency_symbol\":\"\",\"token_name\":\"\"}}},{\"case\":{\"choose_between\":[{\"from\":1,\"to\":1}],\"for_choice\":{\"choice_name\":\"Confirm claim\",\"choice_owner\":{\"role_token\":\"Mediator\"}}},\"then\":\"close\"}]}}]},\"to\":{\"account\":{\"role_token\":\"Buyer\"}},\"token\":{\"currency_symbol\":\"\",\"token_name\":\"\"}}}]}}]},\"metadata\":{},\"minUTxODeposit\":2000000,\"roles\":{\"Buyer\":\"addr_test1vpy4n4peh4suv0y55yptur0066j5kds8r4ncnuzm0vpzfgg0dhz6d\",\"Mediator\":\"addr_test1vr6tytqs3x8qgewhw89m3xrz58t3tqu2hfsecw0u06lf3hg052wsv\",\"Seller\":\"addr_test1vqd3yrtjyx49uld43lvwqaf7z4k03su8gf2x4yr7syzvckgfzm4ck\"},\"tags\":{},\"version\":\"v1\"}\n" + ] + } + ], + "source": [ + "yaml2json << EOI > request-1.json\n", + "version: v1\n", + "contract: $(cat escrow-contract.json)\n", + "roles:\n", + " Seller: $SELLER_ADDR\n", + " Buyer: $BUYER_ADDR\n", + " Mediator: $MEDIATOR_ADDR\n", + "minUTxODeposit: $MIN_LOVELACE\n", + "metadata: {}\n", + "tags: {}\n", + "EOI\n", + "cat request-1.json" + ] + }, + { + "cell_type": "markdown", + "id": "6b04626a-20d3-4b72-9cf0-0465e818311b", + "metadata": {}, + "source": [ + "Next we post the request and view the response." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "5843b85f-f87e-46d2-a6e8-2550328bb6c6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "links:\n", + " contract: contracts/3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20%231\n", + "resource:\n", + " contractId: 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n", + " txBody:\n", + " cborHex: 86a80081825820b32eab58a670cc0164c9c2c615c81b40dc9229ab8d899db8f232bbede0984107040d81825820b32eab58a670cc0164c9c2c615c81b40dc9229ab8d899db8f232bbede0984107040185a200581d60f4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98dd011a3b45a132a300581d702ed2631dbb277c84334453c5c437b86325d371f0835a28b910a91a6e011a001e8480028200582016d16bfee2695ec0e03c08ec1ca21e1493640130a0cbfcc9a15f2ff181f25a49a200581d604959d439bd61c63c94a102be0defd6a54b36071d6789f05b7b0224a101821a000fb7caa1581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060ba145427579657201a200581d60f4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98dd01821a000fea4ca1581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060ba1484d65646961746f7201a200581d601b120d7221aa5e7db58fd8e0753e156cf8c38742546a907e8104cc5901821a000fc8a0a1581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060ba14653656c6c65720110a200581d60f4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98dd011a3b8ff39c111a000ad664021a0007399809a1581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060ba345427579657201484d65646961746f72014653656c6c6572010b5820316e1ce5dfbb2b39b951bdb9fd205124acad9f03f48d446f01168d57ef8dd6029f8202590ddd590dda01000033323233223232323232332232323232323232323322323232323232323233322232323232323232322223223232325335001102813263202d33573892010350543500028323232533500313300b49010b4275726e206661696c656400323235004223335530101200132335012223335003220020020013500122001123300101b02e2350012222533530080032103210323500222222222222200a3200135503322533500115021221350022253353301700200713502600113006003300f0021335502c300b49010b4d696e74206661696c656400330163232323500322222222222233355301b120013233501d2233350032200200200135001220011233001225335002103b100103825335333573466e3c03cd400488d4008880080e40e04ccd5cd19b8700e35001223500222001039038103800c3500b220013500a22002500133010335502c33555017237246ecccdd2a400066ae80dd398170009bb102f3355501725335333355300d1200133500e22230033002001200122533500121350032235003223500222350295335333573466e3c0080180cc0c84cd540eccd540ec008cdc0000802801899aa81d80499a81c80200189a81119aa81a001281999919191919191919118011803800990009aa81d11299a800898011801a81d110a99a800880111098031803802990009aa81c91299a8008a81c910a99a800880191099a81e198038020011803000990009aa81c111299a8010800910a99a8018802110a999a99806002001099a81e00219803801802899a81e00119803803000899a81e002198038018029a8019110009a8011110011a80091100199918008009119091a990919980091a801911180180211a801911180100211a8019111800802091a98018021a8020008009801001091111998021299a80089a80a89119801281c800910a99a80089a80b89119801002800910a999a998050020010999803001119a81d80280080089998038011a80c891198010030008008999803001119a81d802800800911299a800899a81c19a81c0018011803281c910a999a99805002801099a81d19a81d0028021804001899980380119a81d002802000899a81d19a81d002802180400191119299a80109800a4c442a666a6601600c004266600e0044600c66a07800e002002260069309998038011180319a81e003800800919a81c98019a80c0911980100300098038011919111a801111a80191912999a999a80d8048028018999a80d8040020008a8010a8010999a80c80380180099999999a80a11199ab9a3370e00400205a05844a66a666ae68cdc3801000816816080c8a99a999ab9a3371200400205a058202e203044666ae68cdc400100081681611199ab9a3371200400205a05844666ae68cdc480100081601691199ab9a3371000400205805a44a66a666ae68cdc48010008168160800880111299a999ab9a3371200400205a0582004200266666666a02602244a66a666ae68cdc7801000816015880c0a99a999ab9a33722004002058056202c202e44666ae68cdc800100081601591199ab9a3372200400205805644666ae68cdc880100081581611199ab9a3372000400205605844a66a666ae68cdc88010008160158800880111299a999ab9a3372200400205805620042002002a03e426a0024466a0660040022a062400266aa05866aaa02e644a66a002420022004a06066aaa02e646446004002640026aa06644a66a0022a0424426a00444a66a6602e00400e26a04c0022600c006601e00466aaa02e400246a002444444444444010a00201426a002440046666ae68cdc39aab9d5003480008cc8848cc00400c008c8c8c8c8c8c8c8c8c8c8c8c8c8cccd5cd19b8735573aa018900011999999999999111111111110919999999999980080680600580500480400380300280200180119a8128131aba1500c33502502635742a01666a04a04e6ae854028ccd540a5d728141aba150093335502975ca0506ae854020cd40940c0d5d0a803999aa814818bad35742a00c6464646666ae68cdc39aab9d5002480008cc8848cc00400c008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a81dbad35742a00460786ae84d5d1280111931902219ab9c04003f042135573ca00226ea8004d5d0a8011919191999ab9a3370e6aae754009200023322123300100300233503b75a6ae854008c0f0d5d09aba2500223263204433573808007e08426aae7940044dd50009aba135744a004464c6408066ae700f00ec0f84d55cf280089baa00135742a00a66a04aeb8d5d0a802199aa81481690009aba150033335502975c40026ae854008c0bcd5d09aba2500223263203c33573807006e07426ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aab9e5001137540026ae85400cc07cd5d09aba2500323263202e3357380540520586666ae68cdc3a80224004424400446666ae68cdc3a802a40004244002464c6405c66ae700a80a40b00ac4d55cf280089baa001135573a6ea8004894cd400440804cd5ce00100f990009aa8131108911299a80089a80191000910999a802910011802001199aa98038900080280200089109198008018010919a800a811281191a800911999a80091931901219ab9c4901024c680001f20012326320243357389201024c680001f2326320243357389201024c680001f22333573466e3c00800406c06848d40048888888801c48888888848cccccccc00402402001c01801401000c008488800c48880084888004894cd400840044050444888c00cc00800448c88c008dd6000990009aa80d911999aab9f0012501c233501b30043574200460066ae880080548c8c8cccd5cd19b8735573aa004900011991091980080180118061aba150023005357426ae8940088c98c8068cd5ce00b00a80c09aab9e5001137540024646464646666ae68cdc39aab9d5004480008cccc888848cccc00401401000c008c8c8c8cccd5cd19b8735573aa0049000119910919800801801180a9aba1500233500d014357426ae8940088c98c807ccd5ce00d80d00e89aab9e5001137540026ae854010ccd54021d728039aba150033232323333573466e1d4005200423212223002004357426aae79400c8cccd5cd19b875002480088c84888c004010dd71aba135573ca00846666ae68cdc3a801a400042444006464c6404266ae7007407007c0780744d55cea80089baa00135742a00466a012eb8d5d09aba2500223263201b33573802e02c03226ae8940044d5d1280089aab9e500113754002266aa002eb9d6889119118011bab00132001355018223233335573e0044a034466a03266aa036600c6aae754008c014d55cf280118021aba200301313574200224464646666ae68cdc3a800a400046a00e600a6ae84d55cf280191999ab9a3370ea00490011280391931900c19ab9c014013016015135573aa00226ea800448488c00800c44880048c8c8cccd5cd19b875001480188c848888c010014c01cd5d09aab9e500323333573466e1d400920042321222230020053009357426aae7940108cccd5cd19b875003480088c848888c004014c01cd5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931900b19ab9c012011014013012011135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931900919ab9c00e00d010135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98c8040cd5ce00600580709baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98c8064cd5ce00a80a00b80b00a80a00980900889aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6402466ae7003803404003c4d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263200f33573801601401a01826aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6402066ae7003002c0380340304d55cea80089baa0012323333573466e1d40052002200523333573466e1d40092000200523263200c33573801000e01401226aae74dd500089100109100089000a481035054310011223002001320013550052253350011376200644266ae80d400888cdd2a400066ae80dd480119aba037500026ec401cc010005261122002122122330010040031122123300100300211232300100122330033002002001489207381bb21e6e7729681dfb5620376b3b4be92c5b83fce8ccb647dc75b624a17e5003351223300248920b32eab58a670cc0164c9c2c615c81b40dc9229ab8d899db8f232bbede098410700480208848cc00400c0088005ff81d8799fd8799f581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060bffd8799fa1d8799fd8799fd87980d8799fd8799f581cf4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98ddffd87a80ffffd8799f4040ffff1a001e8480a0a000ffd87c9f9fd8799fd8799fd87a9f4653656c6c6572ffd87a9f454275796572ffd8799f4040ffd87a9f1a047868c0ffffd87c9f9fd8799fd87a9fd8799f5545766572797468696e6720697320616c7269676874d87a9f454275796572ffff9fd8799f0000ffffffd87980ffd8799fd87a9fd8799f4e5265706f72742070726f626c656dd87a9f454275796572ffff9fd8799f0101ffffffd87a9fd87a9f4653656c6c6572ffd8799fd87a9f454275796572ffffd8799f4040ffd87a9f1a047868c0ffd87c9f9fd8799fd87a9fd8799f4f436f6e6669726d2070726f626c656dd87a9f4653656c6c6572ffff9fd8799f0101ffffffd87980ffd8799fd87a9fd8799f4f446973707574652070726f626c656dd87a9f4653656c6c6572ffff9fd8799f0000ffffffd87c9f9fd8799fd87a9fd8799f4d4469736d69737320636c61696dd87a9f484d65646961746f72ffff9fd8799f0000ffffffd87a9fd87a9f454275796572ffd8799fd87a9f4653656c6c6572ffffd8799f4040ffd87a9f1a047868c0ffd87980ffffd8799fd87a9fd8799f4d436f6e6669726d20636c61696dd87a9f484d65646961746f72ffff9fd8799f0101ffffffd87980ffff1b00000186ed1a8680d87980ffffff1b00000186ece39800d87980ffffffff1b00000186ecaca980d87980ffffff1b00000186ec75bb00d87980ffff81840100d87980821a001275ca1a16b619d7f5f6\n", + " description: ''\n", + " type: TxBodyBabbage\n" + ] + } + ], + "source": [ + "curl \"$MARLOWE_RT_WEBSERVER_URL/contracts\" \\\n", + " -X POST \\\n", + " -H 'Content-Type: application/json' \\\n", + " -H \"X-Change-Address: $MEDIATOR_ADDR\" \\\n", + " -d @request-1.json \\\n", + " -o response-1.json \\\n", + " -sS\n", + "json2yaml response-1.json" + ] + }, + { + "cell_type": "markdown", + "id": "fde4adcb-8e68-4cae-bc3a-c3ef077ff47c", + "metadata": {}, + "source": [ + "The identifier for the contract is embedded in the response." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "2e882a2e-07a0-4bf7-891d-cf99651c8c5a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CONTRACT_ID = 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n" + ] + } + ], + "source": [ + "CONTRACT_ID=\"$(jq -r '.resource.contractId' response-1.json)\"\n", + "echo \"CONTRACT_ID = $CONTRACT_ID\"" + ] + }, + { + "cell_type": "markdown", + "id": "c1be0970-cd75-484d-a745-6e88208b612a", + "metadata": {}, + "source": [ + "The CBOR serialization (in text-envelope format) is also embedded in the response." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "fb237371-071c-4b70-baca-c67f0751ac3e", + "metadata": {}, + "outputs": [], + "source": [ + "jq '.resource.txBody' response-1.json > tx-1.unsigned" + ] + }, + { + "cell_type": "markdown", + "id": "a59332a1-b1a0-4264-a84e-6b613eb20d72", + "metadata": {}, + "source": [ + "There are many ways to sign and submit Cardano transactions:\n", + "- `cardano-cli` at the command line\n", + "- `cardano-wallet` at the command line or as a REST service\n", + "- `cardano-hw-cli` for a hardware wallet at the command line\n", + "- a Babbage-compatible CIP-30 wallet in a web browser\n", + "- `marlowe-cli` at the command line\n", + "\n", + "For convenience, here we use `marlowe-cli transaction submit`. One may have to wait a minute or so for the transactions to be confirmed on the blockchain." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "89bb49ae-2353-4d85-9ae5-ad805061f2cd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TX_1 = 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20\n" + ] + } + ], + "source": [ + "TX_1=$(\n", + "marlowe-cli transaction submit \\\n", + " --tx-body-file tx-1.unsigned \\\n", + " --required-signer \"$MEDIATOR_SKEY\" \\\n", + " --timeout 600 \\\n", + "| sed -e 's/^TxId \"\\(.*\\)\"$/\\1/' \\\n", + ")\n", + "echo \"TX_1 = $TX_1\"" + ] + }, + { + "cell_type": "markdown", + "id": "df082e87-eeaf-4924-b55b-94a4ba50c327", + "metadata": {}, + "source": [ + "One can view the transaction on a Cardano explorer and see that the contract has been created and the parties have received their role tokens. It sometimes takes thirty seconds or so for the transaction to be visible in an explorer." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "006ca411-2088-439f-b735-b49892de22e8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://preprod.cardanoscan.io/transaction/3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20?tab=utxo\n" + ] + } + ], + "source": [ + "echo \"$EXPLORER_URL/transaction/$TX_1?tab=utxo\"" + ] + }, + { + "cell_type": "markdown", + "id": "9a1f44ce-de67-4b87-95d8-c1e052cc308a", + "metadata": {}, + "source": [ + "In particular, we see that the Marlowe contract holds the 2 ada that was set as `MINIMUM_LOVELACE`." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "bc7b2078-d23c-47f4-9f12-697de8469ce1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20 1 2000000 lovelace + TxOutDatumHash ScriptDataInBabbageEra \"16d16bfee2695ec0e03c08ec1ca21e1493640130a0cbfcc9a15f2ff181f25a49\"\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --tx-in \"$CONTRACT_ID\"" + ] + }, + { + "cell_type": "markdown", + "id": "9ce2b5b3-4c0b-4c53-ab6d-a1373499097c", + "metadata": {}, + "source": [ + "One can see that the seller, buyer, and mediator have received their role tokens. Note that `4c656e646572 = Seller`, `4275796572 = Buyer`, and `4d65646961746f72 = Mediator` in hexadecimal notation." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "613f0751-3bc5-4ca7-b208-ef5830eef61d", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20 4 1034400 lovelace + 1 bf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060b.53656c6c6572 + TxOutDatumNone\n", + "b32eab58a670cc0164c9c2c615c81b40dc9229ab8d899db8f232bbede0984107 2 1000000000 lovelace + TxOutDatumNone\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --address \"$SELLER_ADDR\"" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "7f6d2b5e-86c2-4f53-ba20-8f95b43c3145", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20 2 1030090 lovelace + 1 bf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060b.4275796572 + TxOutDatumNone\n", + "b32eab58a670cc0164c9c2c615c81b40dc9229ab8d899db8f232bbede0984107 3 1000000000 lovelace + TxOutDatumNone\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --address \"$BUYER_ADDR\"" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "cbfab192-5a28-4595-b3ef-aa8bfdcee154", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20 0 994418994 lovelace + TxOutDatumNone\n", + "3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20 3 1043020 lovelace + 1 bf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060b.4d65646961746f72 + TxOutDatumNone\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --address \"$MEDIATOR_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "3a7f985a-dba3-4b5f-aab8-8418270c5dda", + "metadata": {}, + "source": [ + "## View the details of the contract on the blockchain\n", + "\n", + "Marlowe Runtime\\'s `HTTP` `GET` endpoint `/contracts/{contractId}` can fetch a contract from the blockchain and return information about it." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "8328b458-43fb-4e53-8060-1740d25cf93b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CONTRACT_URL = http://127.0.0.1:3780/contracts/3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20%231\n" + ] + } + ], + "source": [ + "CONTRACT_URL=\"$MARLOWE_RT_WEBSERVER_URL/$(jq -r '.links.contract' response-1.json)\"\n", + "echo \"CONTRACT_URL = $CONTRACT_URL\"" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "e805f893-bcd8-4169-a2da-90f1cfa080b2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "links:\n", + " transactions: contracts/3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20%231/transactions\n", + "resource:\n", + " block:\n", + " blockHeaderHash: ac573deefb3e0762732f5b25d0d1c676d1d0b566c03b447223c882df2c55ba06\n", + " blockNo: 732030\n", + " slotNo: 23317627\n", + " continuations: null\n", + " contractId: 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n", + " currentContract:\n", + " timeout: 1679004384000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " deposits: 75000000\n", + " into_account:\n", + " role_token: Seller\n", + " of_token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + " party:\n", + " role_token: Buyer\n", + " then:\n", + " timeout: 1679007984000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Everything is alright\n", + " choice_owner:\n", + " role_token: Buyer\n", + " then: close\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Report problem\n", + " choice_owner:\n", + " role_token: Buyer\n", + " then:\n", + " from_account:\n", + " role_token: Seller\n", + " pay: 75000000\n", + " then:\n", + " timeout: 1679011584000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Confirm problem\n", + " choice_owner:\n", + " role_token: Seller\n", + " then: close\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Dispute problem\n", + " choice_owner:\n", + " role_token: Seller\n", + " then:\n", + " timeout: 1679015184000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Dismiss claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + " then:\n", + " from_account:\n", + " role_token: Buyer\n", + " pay: 75000000\n", + " then: close\n", + " to:\n", + " account:\n", + " role_token: Seller\n", + " token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Confirm claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + " then: close\n", + " to:\n", + " account:\n", + " role_token: Buyer\n", + " token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + " initialContract:\n", + " timeout: 1679004384000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " deposits: 75000000\n", + " into_account:\n", + " role_token: Seller\n", + " of_token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + " party:\n", + " role_token: Buyer\n", + " then:\n", + " timeout: 1679007984000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Everything is alright\n", + " choice_owner:\n", + " role_token: Buyer\n", + " then: close\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Report problem\n", + " choice_owner:\n", + " role_token: Buyer\n", + " then:\n", + " from_account:\n", + " role_token: Seller\n", + " pay: 75000000\n", + " then:\n", + " timeout: 1679011584000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Confirm problem\n", + " choice_owner:\n", + " role_token: Seller\n", + " then: close\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Dispute problem\n", + " choice_owner:\n", + " role_token: Seller\n", + " then:\n", + " timeout: 1679015184000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Dismiss claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + " then:\n", + " from_account:\n", + " role_token: Buyer\n", + " pay: 75000000\n", + " then: close\n", + " to:\n", + " account:\n", + " role_token: Seller\n", + " token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Confirm claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + " then: close\n", + " to:\n", + " account:\n", + " role_token: Buyer\n", + " token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + " metadata: {}\n", + " roleTokenMintingPolicyId: bf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060b\n", + " state:\n", + " accounts:\n", + " - - - address: addr_test1vr6tytqs3x8qgewhw89m3xrz58t3tqu2hfsecw0u06lf3hg052wsv\n", + " - currency_symbol: ''\n", + " token_name: ''\n", + " - 2000000\n", + " boundValues: []\n", + " choices: []\n", + " minTime: 0\n", + " status: confirmed\n", + " tags: {}\n", + " txBody: null\n", + " utxo: 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n", + " version: v1\n" + ] + } + ], + "source": [ + "curl -sS \"$CONTRACT_URL\" | json2yaml" + ] + }, + { + "cell_type": "markdown", + "id": "e2166e0c-108b-40e5-b720-00043d697e1a", + "metadata": {}, + "source": [ + "## Transaction 2: Buyer Deposits Funds into Seller’s Account\n", + "\n", + "The buyer deposits their 75 ada into the contract using Marlowe Runtime\\'s `HTTP` `POST` `/contract/{contractId}/transactions` endpoint. The buyer is providing the funding for and receiving the change from this transaction, so we provide their address.\n", + "\n", + "The deposit is represented as JSON input to the contract. The `marlowe-cli input deposit` tool conveniently formats the correct JSON for a deposit." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "1fbf5b90-ba80-44b9-83f5-791a7a10b2ab", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Usage: marlowe-cli input deposit --deposit-account PARTY --deposit-party PARTY \n", + " [--deposit-token TOKEN]\n", + " --deposit-amount INTEGER \n", + " [--out-file OUTPUT_FILE]\n", + "\n", + " Create Marlowe input for a deposit.\n", + "\n", + "Available options:\n", + " --deposit-account PARTY The account for the deposit.\n", + " --deposit-party PARTY The party making the deposit.\n", + " --deposit-token TOKEN The token being deposited, if not Ada.\n", + " --deposit-amount INTEGER The amount of token being deposited.\n", + " --out-file OUTPUT_FILE JSON output file for contract input.\n", + " -h,--help Show this help text\n" + ] + } + ], + "source": [ + "marlowe-cli input deposit --help" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "3c8a6076-f342-489c-939c-e9c017b6b445", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "input_from_party:\n", + " role_token: Buyer\n", + "into_account:\n", + " role_token: Seller\n", + "of_token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + "that_deposits: 75000000\n" + ] + } + ], + "source": [ + "marlowe-cli input deposit \\\n", + " --deposit-party Buyer \\\n", + " --deposit-account Seller \\\n", + " --deposit-amount \"$PRICE\" \\\n", + " --out-file input-2.json\n", + "json2yaml input-2.json" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "4fc16b02-358c-438f-9e5b-7d709da7eac5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"inputs\":[{\"input_from_party\":{\"role_token\":\"Buyer\"},\"into_account\":{\"role_token\":\"Seller\"},\"of_token\":{\"currency_symbol\":\"\",\"token_name\":\"\"},\"that_deposits\":75000000}],\"metadata\":{},\"tags\":{},\"version\":\"v1\"}\n" + ] + } + ], + "source": [ + "yaml2json << EOI > request-2.json\n", + "version: v1\n", + "inputs: [$(cat input-2.json)]\n", + "metadata: {}\n", + "tags: {}\n", + "EOI\n", + "cat request-2.json" + ] + }, + { + "cell_type": "markdown", + "id": "7f66252b-23fc-47e3-825d-7aba51a86368", + "metadata": {}, + "source": [ + "Next we post the request and store the response." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "465152a1-eaaa-4dab-9035-aa306c0022fa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "links:\n", + " transaction: contracts/3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20%231/transactions/a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e8\n", + "resource:\n", + " contractId: 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n", + " transactionId: a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e8\n", + " txBody:\n", + " cborHex: 86aa00838258203376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20018258203376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a2002825820b32eab58a670cc0164c9c2c615c81b40dc9229ab8d899db8f232bbede0984107030d81825820b32eab58a670cc0164c9c2c615c81b40dc9229ab8d899db8f232bbede09841070312818258209a8a6f387a3330b4141e1cb019380b9ac5c72151c0abc52aa4266245d3c555cd010183a200581d604959d439bd61c63c94a102be0defd6a54b36071d6789f05b7b0224a1011a3716a88ea300581d702ed2631dbb277c84334453c5c437b86325d371f0835a28b910a91a6e011a0496ed4002820058200655c39786c393d64a5eacdbf20396a43c166a4882ae57d1ac02daa450e2f620a200581d604959d439bd61c63c94a102be0defd6a54b36071d6789f05b7b0224a101821a000fb7caa1581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060ba14542757965720110a200581d604959d439bd61c63c94a102be0defd6a54b36071d6789f05b7b0224a1011a3b8934f5111a0011950b021a000bb8b2031a0163da60081a0163cc950b582025da31acd2181f5a9cdb2ab984ef98e9f891f5543eae8a0439d9b5c83eb07bd29fff82d8799fd8799f581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060bffd8799fa2d8799fd8799fd87980d8799fd8799f581cf4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98ddffd87a80ffffd8799f4040ffff1a001e8480d8799fd87a9f4653656c6c6572ffd8799f4040ffff1a047868c0a0a01b00000186ec3fda08ffd87c9f9fd8799fd87a9fd8799f5545766572797468696e6720697320616c7269676874d87a9f454275796572ffff9fd8799f0000ffffffd87980ffd8799fd87a9fd8799f4e5265706f72742070726f626c656dd87a9f454275796572ffff9fd8799f0101ffffffd87a9fd87a9f4653656c6c6572ffd8799fd87a9f454275796572ffffd8799f4040ffd87a9f1a047868c0ffd87c9f9fd8799fd87a9fd8799f4f436f6e6669726d2070726f626c656dd87a9f4653656c6c6572ffff9fd8799f0101ffffffd87980ffd8799fd87a9fd8799f4f446973707574652070726f626c656dd87a9f4653656c6c6572ffff9fd8799f0000ffffffd87c9f9fd8799fd87a9fd8799f4d4469736d69737320636c61696dd87a9f484d65646961746f72ffff9fd8799f0000ffffffd87a9fd87a9f454275796572ffd8799fd87a9f4653656c6c6572ffffd8799f4040ffd87a9f1a047868c0ffd87980ffffd8799fd87a9fd8799f4d436f6e6669726d20636c61696dd87a9f484d65646961746f72ffff9fd8799f0101ffffffd87980ffff1b00000186ed1a8680d87980ffffff1b00000186ece39800d87980ffffffff1b00000186ecaca980d87980ffffd8799fd8799f581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060bffd8799fa1d8799fd8799fd87980d8799fd8799f581cf4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98ddffd87a80ffffd8799f4040ffff1a001e8480a0a000ffd87c9f9fd8799fd8799fd87a9f4653656c6c6572ffd87a9f454275796572ffd8799f4040ffd87a9f1a047868c0ffffd87c9f9fd8799fd87a9fd8799f5545766572797468696e6720697320616c7269676874d87a9f454275796572ffff9fd8799f0000ffffffd87980ffd8799fd87a9fd8799f4e5265706f72742070726f626c656dd87a9f454275796572ffff9fd8799f0101ffffffd87a9fd87a9f4653656c6c6572ffd8799fd87a9f454275796572ffffd8799f4040ffd87a9f1a047868c0ffd87c9f9fd8799fd87a9fd8799f4f436f6e6669726d2070726f626c656dd87a9f4653656c6c6572ffff9fd8799f0101ffffffd87980ffd8799fd87a9fd8799f4f446973707574652070726f626c656dd87a9f4653656c6c6572ffff9fd8799f0000ffffffd87c9f9fd8799fd87a9fd8799f4d4469736d69737320636c61696dd87a9f484d65646961746f72ffff9fd8799f0000ffffffd87a9fd87a9f454275796572ffd8799fd87a9f4653656c6c6572ffffd8799f4040ffd87a9f1a047868c0ffd87980ffffd8799fd87a9fd8799f4d436f6e6669726d20636c61696dd87a9f484d65646961746f72ffff9fd8799f0101ffffffd87980ffff1b00000186ed1a8680d87980ffffff1b00000186ece39800d87980ffffffff1b00000186ecaca980d87980ffffff1b00000186ec75bb00d87980ffff818400009fd8799fd8799fd87a9f4653656c6c6572ffd87a9f454275796572ffd8799f4040ff1a047868c0ffffff821a006736961a6bf49e10f5f6\n", + " description: ''\n", + " type: TxBodyBabbage\n" + ] + } + ], + "source": [ + "curl \"$CONTRACT_URL/transactions\" \\\n", + " -X POST \\\n", + " -H 'Content-Type: application/json' \\\n", + " -H \"X-Change-Address: $BUYER_ADDR\" \\\n", + " -d @request-2.json \\\n", + " -o response-2.json \\\n", + " -sS\n", + "json2yaml response-2.json" + ] + }, + { + "cell_type": "markdown", + "id": "69e4024a-c61f-4e5a-8272-d1f958f82a15", + "metadata": {}, + "source": [ + "Once again, use `marlowe-cli` to submit the transaction and then wait for confirmation." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "6fb5d4c0-c158-434b-8dac-b2160f426e01", + "metadata": {}, + "outputs": [], + "source": [ + "jq '.resource.txBody' response-2.json > tx-2.unsigned" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "b2aa2f81-d6b7-4994-b90b-0812d5fb3fca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TX_2 = a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e8\n" + ] + } + ], + "source": [ + "TX_2=$(\n", + "marlowe-cli transaction submit \\\n", + " --tx-body-file tx-2.unsigned \\\n", + " --required-signer \"$BUYER_SKEY\" \\\n", + " --timeout 600 \\\n", + "| sed -e 's/^TxId \"\\(.*\\)\"$/\\1/' \\\n", + ")\n", + "echo \"TX_2 = $TX_2\"" + ] + }, + { + "cell_type": "markdown", + "id": "b7d1ac41-f3c3-47b0-b192-e0f8ad53fdfa", + "metadata": {}, + "source": [ + "One can view the transaction on a Cardano explorer. It sometimes takes thirty seconds or so for the transaction to be visible in an explorer." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "9b994073-d1b9-44a4-8149-9b307a69a4e4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://preprod.cardanoscan.io/transaction/a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e8?tab=utxo\n" + ] + } + ], + "source": [ + "echo \"$EXPLORER_URL/transaction/$TX_2?tab=utxo\"" + ] + }, + { + "cell_type": "markdown", + "id": "664d2826-7d6c-4564-9ef9-6b12e3e76f53", + "metadata": {}, + "source": [ + "One can see that the buyer has approximately 75 ada less than originally." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "b45dc15d-f54f-49cb-a36d-0524f47fd70e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e8 0 924231822 lovelace + TxOutDatumNone\n", + "a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e8 2 1030090 lovelace + 1 bf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060b.4275796572 + TxOutDatumNone\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --address \"$BUYER_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "4d2574d2-587f-46f7-8129-431694172296", + "metadata": {}, + "source": [ + "The Marlowe contract still has the 2 ada from its creation and an additional 75 ada." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "6485d605-dec4-4bab-86f6-81bf002041ed", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e8 1 77000000 lovelace + TxOutDatumHash ScriptDataInBabbageEra \"0655c39786c393d64a5eacdbf20396a43c166a4882ae57d1ac02daa450e2f620\"\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --tx-in \"$TX_2#1\"" + ] + }, + { + "cell_type": "markdown", + "id": "2bbf4214-ecf6-4d4f-a8ea-acdb6ff8bcb7", + "metadata": {}, + "source": [ + "## View the further progress of the contract on the blockchain\n", + "\n", + "Marlowe Runtime\\'s `HTTP` `GET` endpoint `/contracts/{contractId}/transactions/{transactionId}` can fetch a contract from the blockchain and return information about it." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "e0461725-7f2b-4256-ac83-8e681ecb3e35", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "links: {}\n", + "resource:\n", + " block:\n", + " blockHeaderHash: 139a50cd367cf8e04c1cadf4729cf9d3c8b03ae8456a33ab2198eceac72ea4d2\n", + " blockNo: 732033\n", + " slotNo: 23317666\n", + " consumingTx: null\n", + " continuations: null\n", + " contractId: 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n", + " inputUtxo: 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n", + " inputs:\n", + " - input_from_party:\n", + " role_token: Buyer\n", + " into_account:\n", + " role_token: Seller\n", + " of_token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + " that_deposits: 75000000\n", + " invalidBefore: 2023-03-16T21:07:33Z\n", + " invalidHereafter: 2023-03-16T22:06:24Z\n", + " metadata: {}\n", + " outputContract:\n", + " timeout: 1679007984000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Everything is alright\n", + " choice_owner:\n", + " role_token: Buyer\n", + " then: close\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Report problem\n", + " choice_owner:\n", + " role_token: Buyer\n", + " then:\n", + " from_account:\n", + " role_token: Seller\n", + " pay: 75000000\n", + " then:\n", + " timeout: 1679011584000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Confirm problem\n", + " choice_owner:\n", + " role_token: Seller\n", + " then: close\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Dispute problem\n", + " choice_owner:\n", + " role_token: Seller\n", + " then:\n", + " timeout: 1679015184000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Dismiss claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + " then:\n", + " from_account:\n", + " role_token: Buyer\n", + " pay: 75000000\n", + " then: close\n", + " to:\n", + " account:\n", + " role_token: Seller\n", + " token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Confirm claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + " then: close\n", + " to:\n", + " account:\n", + " role_token: Buyer\n", + " token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + " outputState:\n", + " accounts:\n", + " - - - address: addr_test1vr6tytqs3x8qgewhw89m3xrz58t3tqu2hfsecw0u06lf3hg052wsv\n", + " - currency_symbol: ''\n", + " token_name: ''\n", + " - 2000000\n", + " - - - role_token: Seller\n", + " - currency_symbol: ''\n", + " token_name: ''\n", + " - 75000000\n", + " boundValues: []\n", + " choices: []\n", + " minTime: 1679000853000\n", + " outputUtxo: a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e8#1\n", + " status: confirmed\n", + " tags: {}\n", + " transactionId: a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e8\n", + " txBody: null\n" + ] + } + ], + "source": [ + "curl -sS \"$CONTRACT_URL/transactions/$TX_2\" | json2yaml" + ] + }, + { + "cell_type": "markdown", + "id": "1a416c81-4ccb-4964-aab8-e2d76fc4512a", + "metadata": {}, + "source": [ + "## Transaction 3: The Buyer Reports That There is a Problem\n", + "\n", + "The buyer chooses to report a problem with the merchandise.\n", + "\n", + "The choice is represented as JSON input to the contract. The `marlowe-cli input choose` tool conveniently formats the correct JSON for a choice." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "b8a4045e-ceca-4272-90dc-72747e5329ab", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Usage: marlowe-cli input choose --choice-name NAME --choice-party PARTY\n", + " --choice-number INTEGER [--out-file OUTPUT_FILE]\n", + "\n", + " Create Marlowe input for a choice.\n", + "\n", + "Available options:\n", + " --choice-name NAME The name of the choice made.\n", + " --choice-party PARTY The party making the choice.\n", + " --choice-number INTEGER The number chosen.\n", + " --out-file OUTPUT_FILE JSON output file for contract input.\n", + " -h,--help Show this help text\n" + ] + } + ], + "source": [ + "marlowe-cli input choose --help" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "42aeee88-13e1-4170-b18a-727cd5cde877", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "for_choice_id:\n", + " choice_name: Report problem\n", + " choice_owner:\n", + " role_token: Buyer\n", + "input_that_chooses_num: 1\n" + ] + } + ], + "source": [ + "marlowe-cli input choose \\\n", + " --choice-name \"Report problem\" \\\n", + " --choice-party Buyer \\\n", + " --choice-number 1 \\\n", + " --out-file input-3.json\n", + "json2yaml input-3.json" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "3fee1c9b-c4d9-4ab4-9b47-061db363d31f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"inputs\":[{\"for_choice_id\":{\"choice_name\":\"Report problem\",\"choice_owner\":{\"role_token\":\"Buyer\"}},\"input_that_chooses_num\":1}],\"metadata\":{},\"tags\":{},\"version\":\"v1\"}\n" + ] + } + ], + "source": [ + "yaml2json << EOI > request-3.json\n", + "version: v1\n", + "inputs: [$(cat input-3.json)]\n", + "metadata: {}\n", + "tags: {}\n", + "EOI\n", + "cat request-3.json" + ] + }, + { + "cell_type": "markdown", + "id": "8787ec8b-f045-4fbc-adfd-f68bc88303b4", + "metadata": {}, + "source": [ + "Next we post the request and store the response." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "387362e6-8cb8-4a46-9222-4a065d964167", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "links:\n", + " transaction: contracts/3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20%231/transactions/5a448f6b4861e36a984e880c6e46a7dacd8513de0fa27daf46f9c1d0ccac50af\n", + "resource:\n", + " contractId: 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n", + " transactionId: 5a448f6b4861e36a984e880c6e46a7dacd8513de0fa27daf46f9c1d0ccac50af\n", + " txBody:\n", + " cborHex: 86aa0083825820a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e800825820a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e801825820a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e8020d81825820a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e80012818258209a8a6f387a3330b4141e1cb019380b9ac5c72151c0abc52aa4266245d3c555cd010183a200581d604959d439bd61c63c94a102be0defd6a54b36071d6789f05b7b0224a1011a370a9baea300581d702ed2631dbb277c84334453c5c437b86325d371f0835a28b910a91a6e011a0496ed400282005820c384ef66cdc894120d0f71b03aaa114fe3731b70f0c7155d9352a04a0aaec264a200581d604959d439bd61c63c94a102be0defd6a54b36071d6789f05b7b0224a101821a000fb7caa1581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060ba14542757965720110a200581d604959d439bd61c63c94a102be0defd6a54b36071d6789f05b7b0224a1011a3704953e111a00121350021a000c0ce0031a0163e870081a0163cca80b5820e83b04a449aadd0103a5c8e626f03a3e073cede8dec800cfa30bcafcee7ca3a39fff82d8799fd8799f581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060bffd8799fa2d8799fd8799fd87980d8799fd8799f581cf4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98ddffd87a80ffffd8799f4040ffff1a001e8480d8799fd87a9f4653656c6c6572ffd8799f4040ffff1a047868c0a0a01b00000186ec3fda08ffd87c9f9fd8799fd87a9fd8799f5545766572797468696e6720697320616c7269676874d87a9f454275796572ffff9fd8799f0000ffffffd87980ffd8799fd87a9fd8799f4e5265706f72742070726f626c656dd87a9f454275796572ffff9fd8799f0101ffffffd87a9fd87a9f4653656c6c6572ffd8799fd87a9f454275796572ffffd8799f4040ffd87a9f1a047868c0ffd87c9f9fd8799fd87a9fd8799f4f436f6e6669726d2070726f626c656dd87a9f4653656c6c6572ffff9fd8799f0101ffffffd87980ffd8799fd87a9fd8799f4f446973707574652070726f626c656dd87a9f4653656c6c6572ffff9fd8799f0000ffffffd87c9f9fd8799fd87a9fd8799f4d4469736d69737320636c61696dd87a9f484d65646961746f72ffff9fd8799f0000ffffffd87a9fd87a9f454275796572ffd8799fd87a9f4653656c6c6572ffffd8799f4040ffd87a9f1a047868c0ffd87980ffffd8799fd87a9fd8799f4d436f6e6669726d20636c61696dd87a9f484d65646961746f72ffff9fd8799f0101ffffffd87980ffff1b00000186ed1a8680d87980ffffff1b00000186ece39800d87980ffffffff1b00000186ecaca980d87980ffffd8799fd8799f581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060bffd8799fa2d8799fd8799fd87980d8799fd8799f581cf4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98ddffd87a80ffffd8799f4040ffff1a001e8480d8799fd87a9f454275796572ffd8799f4040ffff1a047868c0a1d8799f4e5265706f72742070726f626c656dd87a9f454275796572ffff01a01b00000186ec402440ffd87c9f9fd8799fd87a9fd8799f4f436f6e6669726d2070726f626c656dd87a9f4653656c6c6572ffff9fd8799f0101ffffffd87980ffd8799fd87a9fd8799f4f446973707574652070726f626c656dd87a9f4653656c6c6572ffff9fd8799f0000ffffffd87c9f9fd8799fd87a9fd8799f4d4469736d69737320636c61696dd87a9f484d65646961746f72ffff9fd8799f0000ffffffd87a9fd87a9f454275796572ffd8799fd87a9f4653656c6c6572ffffd8799f4040ffd87a9f1a047868c0ffd87980ffffd8799fd87a9fd8799f4d436f6e6669726d20636c61696dd87a9f484d65646961746f72ffff9fd8799f0101ffffffd87980ffff1b00000186ed1a8680d87980ffffff1b00000186ece39800d87980ffff818400019fd8799fd87a9fd8799f4e5265706f72742070726f626c656dd87a9f454275796572ffff01ffffff821a006d3cae1a70de7f55f5f6\n", + " description: ''\n", + " type: TxBodyBabbage\n" + ] + } + ], + "source": [ + "curl \"$CONTRACT_URL/transactions\" \\\n", + " -X POST \\\n", + " -H 'Content-Type: application/json' \\\n", + " -H \"X-Change-Address: $BUYER_ADDR\" \\\n", + " -d @request-3.json \\\n", + " -o response-3.json \\\n", + " -sS\n", + "json2yaml response-3.json" + ] + }, + { + "cell_type": "markdown", + "id": "29fe4142-1525-47ef-8270-571c3a5744fc", + "metadata": {}, + "source": [ + "Once again, use `marlowe-cli` to submit the transaction and then wait for confirmation." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "57490822-4650-481c-b2a3-beb73075ae6b", + "metadata": {}, + "outputs": [], + "source": [ + "jq '.resource.txBody' response-3.json > tx-3.unsigned" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "61733dd3-cac6-4ef3-bee8-9cb7ec4362ff", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TX_3 = 5a448f6b4861e36a984e880c6e46a7dacd8513de0fa27daf46f9c1d0ccac50af\n" + ] + } + ], + "source": [ + "TX_3=$(\n", + "marlowe-cli transaction submit \\\n", + " --tx-body-file tx-3.unsigned \\\n", + " --required-signer \"$BUYER_SKEY\" \\\n", + " --timeout 600 \\\n", + "| sed -e 's/^TxId \"\\(.*\\)\"$/\\1/' \\\n", + ")\n", + "echo \"TX_3 = $TX_3\"" + ] + }, + { + "cell_type": "markdown", + "id": "5aa0221d-485b-4c7f-b711-3dc2773d616d", + "metadata": {}, + "source": [ + "One can view the transaction on a Cardano explorer. It sometimes takes thirty seconds or so for the transaction to be visible in an explorer." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "b7424735-4fba-433d-99ee-ae9b5ec91ab2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://preprod.cardanoscan.io/transaction/5a448f6b4861e36a984e880c6e46a7dacd8513de0fa27daf46f9c1d0ccac50af?tab=utxo\n" + ] + } + ], + "source": [ + "echo \"$EXPLORER_URL/transaction/$TX_3?tab=utxo\"" + ] + }, + { + "cell_type": "markdown", + "id": "39055157-6c46-4b48-94ea-42fa54ec2fb5", + "metadata": {}, + "source": [ + "One can see that the buyer still has approximately 75 ada less than originally." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "1f831ae4-36e9-4fb6-9c7b-c6a19e6f249f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "5a448f6b4861e36a984e880c6e46a7dacd8513de0fa27daf46f9c1d0ccac50af 0 923442094 lovelace + TxOutDatumNone\n", + "5a448f6b4861e36a984e880c6e46a7dacd8513de0fa27daf46f9c1d0ccac50af 2 1030090 lovelace + 1 bf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060b.4275796572 + TxOutDatumNone\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --address \"$BUYER_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "3b092c43-548e-4ee4-8e0b-8898296d5cf5", + "metadata": {}, + "source": [ + "The Marlowe contract still has the 77 ada." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "0020850f-5700-4a2e-a1b6-f3486ab9eb14", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "5a448f6b4861e36a984e880c6e46a7dacd8513de0fa27daf46f9c1d0ccac50af 1 77000000 lovelace + TxOutDatumHash ScriptDataInBabbageEra \"c384ef66cdc894120d0f71b03aaa114fe3731b70f0c7155d9352a04a0aaec264\"\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --tx-in \"$TX_3#1\"" + ] + }, + { + "cell_type": "markdown", + "id": "4a2e8aac-9a19-48b9-97c7-5b0dc82e75c9", + "metadata": {}, + "source": [ + "## View the further progress of the contract on the blockchain\n", + "\n", + "Marlowe Runtime\\'s `HTTP` `GET` endpoint `/contracts/{contractId}/transactions/{transactionId}` can fetch a contract from the blockchain and return information about it." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "b91dc7ca-2cf8-4d8d-81a7-3d0880aafd90", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "links:\n", + " previous: contracts/3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20%231/transactions/a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e8\n", + "resource:\n", + " block:\n", + " blockHeaderHash: c58f330e1c27404c9643dd27694dd027301191b4c8fa8eca0960db85f1a70615\n", + " blockNo: 732035\n", + " slotNo: 23317702\n", + " consumingTx: null\n", + " continuations: null\n", + " contractId: 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n", + " inputUtxo: a3e9a21f95ebf3df23e2e5c3de14dc02b8a87cf4578aa6afefec92a7e526e0e8#1\n", + " inputs:\n", + " - for_choice_id:\n", + " choice_name: Report problem\n", + " choice_owner:\n", + " role_token: Buyer\n", + " input_that_chooses_num: 1\n", + " invalidBefore: 2023-03-16T21:07:52Z\n", + " invalidHereafter: 2023-03-16T23:06:24Z\n", + " metadata: {}\n", + " outputContract:\n", + " timeout: 1679011584000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Confirm problem\n", + " choice_owner:\n", + " role_token: Seller\n", + " then: close\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Dispute problem\n", + " choice_owner:\n", + " role_token: Seller\n", + " then:\n", + " timeout: 1679015184000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Dismiss claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + " then:\n", + " from_account:\n", + " role_token: Buyer\n", + " pay: 75000000\n", + " then: close\n", + " to:\n", + " account:\n", + " role_token: Seller\n", + " token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Confirm claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + " then: close\n", + " outputState:\n", + " accounts:\n", + " - - - address: addr_test1vr6tytqs3x8qgewhw89m3xrz58t3tqu2hfsecw0u06lf3hg052wsv\n", + " - currency_symbol: ''\n", + " token_name: ''\n", + " - 2000000\n", + " - - - role_token: Buyer\n", + " - currency_symbol: ''\n", + " token_name: ''\n", + " - 75000000\n", + " boundValues: []\n", + " choices:\n", + " - - choice_name: Report problem\n", + " choice_owner:\n", + " role_token: Buyer\n", + " - 1\n", + " minTime: 1679000872000\n", + " outputUtxo: 5a448f6b4861e36a984e880c6e46a7dacd8513de0fa27daf46f9c1d0ccac50af#1\n", + " status: confirmed\n", + " tags: {}\n", + " transactionId: 5a448f6b4861e36a984e880c6e46a7dacd8513de0fa27daf46f9c1d0ccac50af\n", + " txBody: null\n" + ] + } + ], + "source": [ + "curl -sS \"$CONTRACT_URL/transactions/$TX_3\" | json2yaml" + ] + }, + { + "cell_type": "markdown", + "id": "6429ba4f-da3b-485f-9515-fc4fd0fc8e05", + "metadata": {}, + "source": [ + "## Transaction 4: The Seller Disputes that There is a Problem\n", + "\n", + "Now the seller chooses to dispute that there is a problem with the merchandise." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "f726d751-dee2-46e3-8d95-066fbb3c4a8f", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "for_choice_id:\n", + " choice_name: Dispute problem\n", + " choice_owner:\n", + " role_token: Seller\n", + "input_that_chooses_num: 0\n" + ] + } + ], + "source": [ + "marlowe-cli input choose \\\n", + " --choice-name \"Dispute problem\" \\\n", + " --choice-party Seller \\\n", + " --choice-number 0 \\\n", + " --out-file input-4.json\n", + "json2yaml input-4.json" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "10fe530d-ba44-4ef8-bc8f-a4fa9f301c1f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"inputs\":[{\"for_choice_id\":{\"choice_name\":\"Dispute problem\",\"choice_owner\":{\"role_token\":\"Seller\"}},\"input_that_chooses_num\":0}],\"metadata\":{},\"tags\":{},\"version\":\"v1\"}\n" + ] + } + ], + "source": [ + "yaml2json << EOI > request-4.json\n", + "version: v1\n", + "inputs: [$(cat input-4.json)]\n", + "metadata: {}\n", + "tags: {}\n", + "EOI\n", + "cat request-4.json" + ] + }, + { + "cell_type": "markdown", + "id": "9566de68-290f-4f24-a9f7-a160aea60d17", + "metadata": {}, + "source": [ + "Next we post the request and store the response." + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "f430a724-b919-432b-a06d-1d179a746f7d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "links:\n", + " transaction: contracts/3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20%231/transactions/0f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c\n", + "resource:\n", + " contractId: 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n", + " transactionId: 0f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c\n", + " txBody:\n", + " cborHex: 86aa00838258203376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20048258205a448f6b4861e36a984e880c6e46a7dacd8513de0fa27daf46f9c1d0ccac50af01825820b32eab58a670cc0164c9c2c615c81b40dc9229ab8d899db8f232bbede0984107020d81825820b32eab58a670cc0164c9c2c615c81b40dc9229ab8d899db8f232bbede09841070212818258209a8a6f387a3330b4141e1cb019380b9ac5c72151c0abc52aa4266245d3c555cd010183a200581d601b120d7221aa5e7db58fd8e0753e156cf8c38742546a907e8104cc59011a3b9025c2a300581d702ed2631dbb277c84334453c5c437b86325d371f0835a28b910a91a6e011a0496ed4002820058203431d4dd22e93ac8a724511fd960b137d98905a2aad7b59ee299790f9c9f7f2ca200581d601b120d7221aa5e7db58fd8e0753e156cf8c38742546a907e8104cc5901821a000fc8a0a1581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060ba14653656c6c65720110a200581d601b120d7221aa5e7db58fd8e0753e156cf8c38742546a907e8104cc59011a3b8ad3a3111a000ff65d021a000aa43e031a0163f680081a0163ccc90b58207d8c2b031e4986d6400c5957fa3d3f3208d07830146098b46a9b5f7515642cb59fff82d8799fd8799f581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060bffd8799fa2d8799fd8799fd87980d8799fd8799f581cf4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98ddffd87a80ffffd8799f4040ffff1a001e8480d8799fd87a9f454275796572ffd8799f4040ffff1a047868c0a2d8799f4e5265706f72742070726f626c656dd87a9f454275796572ffff01d8799f4f446973707574652070726f626c656dd87a9f4653656c6c6572ffff00a01b00000186ec40a528ffd87c9f9fd8799fd87a9fd8799f4d4469736d69737320636c61696dd87a9f484d65646961746f72ffff9fd8799f0000ffffffd87a9fd87a9f454275796572ffd8799fd87a9f4653656c6c6572ffffd8799f4040ffd87a9f1a047868c0ffd87980ffffd8799fd87a9fd8799f4d436f6e6669726d20636c61696dd87a9f484d65646961746f72ffff9fd8799f0101ffffffd87980ffff1b00000186ed1a8680d87980ffffd8799fd8799f581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060bffd8799fa2d8799fd8799fd87980d8799fd8799f581cf4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98ddffd87a80ffffd8799f4040ffff1a001e8480d8799fd87a9f454275796572ffd8799f4040ffff1a047868c0a1d8799f4e5265706f72742070726f626c656dd87a9f454275796572ffff01a01b00000186ec402440ffd87c9f9fd8799fd87a9fd8799f4f436f6e6669726d2070726f626c656dd87a9f4653656c6c6572ffff9fd8799f0101ffffffd87980ffd8799fd87a9fd8799f4f446973707574652070726f626c656dd87a9f4653656c6c6572ffff9fd8799f0000ffffffd87c9f9fd8799fd87a9fd8799f4d4469736d69737320636c61696dd87a9f484d65646961746f72ffff9fd8799f0000ffffffd87a9fd87a9f454275796572ffd8799fd87a9f4653656c6c6572ffffd8799f4040ffd87a9f1a047868c0ffd87980ffffd8799fd87a9fd8799f4d436f6e6669726d20636c61696dd87a9f484d65646961746f72ffff9fd8799f0101ffffffd87980ffff1b00000186ed1a8680d87980ffffff1b00000186ece39800d87980ffff818400019fd8799fd87a9fd8799f4f446973707574652070726f626c656dd87a9f4653656c6c6572ffff00ffffff821a005cded61a5f755401f5f6\n", + " description: ''\n", + " type: TxBodyBabbage\n" + ] + } + ], + "source": [ + "curl \"$CONTRACT_URL/transactions\" \\\n", + " -X POST \\\n", + " -H 'Content-Type: application/json' \\\n", + " -H \"X-Change-Address: $SELLER_ADDR\" \\\n", + " -d @request-4.json \\\n", + " -o response-4.json \\\n", + " -sS\n", + "json2yaml response-4.json" + ] + }, + { + "cell_type": "markdown", + "id": "28044680-041a-453b-8447-e4f210d8813d", + "metadata": {}, + "source": [ + "Once again, use `marlowe-cli` to submit the transaction and then wait for confirmation." + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "b6a98bfc-6ffd-4d4b-97a0-89e380f23f15", + "metadata": {}, + "outputs": [], + "source": [ + "jq '.resource.txBody' response-4.json > tx-4.unsigned" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "01de4b62-c225-4675-8945-97292798286b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TX_4 = 0f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c\n" + ] + } + ], + "source": [ + "TX_4=$(\n", + "marlowe-cli transaction submit \\\n", + " --tx-body-file tx-4.unsigned \\\n", + " --required-signer \"$SELLER_SKEY\" \\\n", + " --timeout 600 \\\n", + "| sed -e 's/^TxId \"\\(.*\\)\"$/\\1/' \\\n", + ")\n", + "echo \"TX_4 = $TX_4\"" + ] + }, + { + "cell_type": "markdown", + "id": "75f2da2a-27b4-42c4-9215-c793a4501d85", + "metadata": {}, + "source": [ + "One can view the transaction on a Cardano explorer. It sometimes takes thirty seconds or so for the transaction to be visible in an explorer." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "3bc43634-af98-43a7-bcd1-0d2bc8ab6a88", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://preprod.cardanoscan.io/transaction/0f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c?tab=utxo\n" + ] + } + ], + "source": [ + "echo \"$EXPLORER_URL/transaction/$TX_4?tab=utxo\"" + ] + }, + { + "cell_type": "markdown", + "id": "fb5a46df-5530-4e8e-9684-05d228cc4a25", + "metadata": {}, + "source": [ + "One can see that the seller still has approximately their original balance." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "99a542df-cd08-4cc3-b835-24498d673969", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "0f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c 0 999302594 lovelace + TxOutDatumNone\n", + "0f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c 2 1034400 lovelace + 1 bf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060b.53656c6c6572 + TxOutDatumNone\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --address \"$SELLER_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "d94596e2-757a-4ead-b81f-89187f481908", + "metadata": {}, + "source": [ + "The Marlowe contract still has the 77 ada." + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "4d076dc7-1768-4a3d-b11f-61ed2c5f1318", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "0f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c 1 77000000 lovelace + TxOutDatumHash ScriptDataInBabbageEra \"3431d4dd22e93ac8a724511fd960b137d98905a2aad7b59ee299790f9c9f7f2c\"\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --tx-in \"$TX_4#1\"" + ] + }, + { + "cell_type": "markdown", + "id": "2dba77ee-2f74-4d31-a825-39383a6cd1c7", + "metadata": {}, + "source": [ + "## View the further progress of the contract on the blockchain\n", + "\n", + "Marlowe Runtime\\'s `HTTP` `GET` endpoint `/contracts/{contractId}/transactions/{transactionId}` can fetch a contract from the blockchain and return information about it." + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "92f51247-9285-45a4-93b9-1d561425a4cf", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "links:\n", + " previous: contracts/3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20%231/transactions/5a448f6b4861e36a984e880c6e46a7dacd8513de0fa27daf46f9c1d0ccac50af\n", + "resource:\n", + " block:\n", + " blockHeaderHash: d46d1d6a3554c29d439fd818cec68a8deb0c46f31efdc17c7161a2287fe15103\n", + " blockNo: 732037\n", + " slotNo: 23317731\n", + " consumingTx: null\n", + " continuations: null\n", + " contractId: 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n", + " inputUtxo: 5a448f6b4861e36a984e880c6e46a7dacd8513de0fa27daf46f9c1d0ccac50af#1\n", + " inputs:\n", + " - for_choice_id:\n", + " choice_name: Dispute problem\n", + " choice_owner:\n", + " role_token: Seller\n", + " input_that_chooses_num: 0\n", + " invalidBefore: 2023-03-16T21:08:25Z\n", + " invalidHereafter: 2023-03-17T00:06:24Z\n", + " metadata: {}\n", + " outputContract:\n", + " timeout: 1679015184000\n", + " timeout_continuation: close\n", + " when:\n", + " - case:\n", + " choose_between:\n", + " - from: 0\n", + " to: 0\n", + " for_choice:\n", + " choice_name: Dismiss claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + " then:\n", + " from_account:\n", + " role_token: Buyer\n", + " pay: 75000000\n", + " then: close\n", + " to:\n", + " account:\n", + " role_token: Seller\n", + " token:\n", + " currency_symbol: ''\n", + " token_name: ''\n", + " - case:\n", + " choose_between:\n", + " - from: 1\n", + " to: 1\n", + " for_choice:\n", + " choice_name: Confirm claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + " then: close\n", + " outputState:\n", + " accounts:\n", + " - - - address: addr_test1vr6tytqs3x8qgewhw89m3xrz58t3tqu2hfsecw0u06lf3hg052wsv\n", + " - currency_symbol: ''\n", + " token_name: ''\n", + " - 2000000\n", + " - - - role_token: Buyer\n", + " - currency_symbol: ''\n", + " token_name: ''\n", + " - 75000000\n", + " boundValues: []\n", + " choices:\n", + " - - choice_name: Report problem\n", + " choice_owner:\n", + " role_token: Buyer\n", + " - 1\n", + " - - choice_name: Dispute problem\n", + " choice_owner:\n", + " role_token: Seller\n", + " - 0\n", + " minTime: 1679000905000\n", + " outputUtxo: 0f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c#1\n", + " status: confirmed\n", + " tags: {}\n", + " transactionId: 0f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c\n", + " txBody: null\n" + ] + } + ], + "source": [ + "curl -sS \"$CONTRACT_URL/transactions/$TX_4\" | json2yaml" + ] + }, + { + "cell_type": "markdown", + "id": "29edde4f-b562-4310-8ffb-0f083fe5d247", + "metadata": {}, + "source": [ + "## Transaction 5: The Mediator Dismisses the Claim\n", + "\n", + "The mediator rules in favor or the seller and dismisses the buyer's claim." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "3b6ea2d9-22f3-4cf8-a6c2-f4f4acadad70", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "for_choice_id:\n", + " choice_name: Dismiss claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + "input_that_chooses_num: 0\n" + ] + } + ], + "source": [ + "marlowe-cli input choose \\\n", + " --choice-name \"Dismiss claim\" \\\n", + " --choice-party Mediator \\\n", + " --choice-number 0 \\\n", + " --out-file input-5.json\n", + "json2yaml input-5.json" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "91be787b-0a96-4ea9-8f50-e942abb381b8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"inputs\":[{\"for_choice_id\":{\"choice_name\":\"Dismiss claim\",\"choice_owner\":{\"role_token\":\"Mediator\"}},\"input_that_chooses_num\":0}],\"metadata\":{},\"tags\":{},\"version\":\"v1\"}\n" + ] + } + ], + "source": [ + "yaml2json << EOI > request-5.json\n", + "version: v1\n", + "inputs: [$(cat input-5.json)]\n", + "metadata: {}\n", + "tags: {}\n", + "EOI\n", + "cat request-5.json" + ] + }, + { + "cell_type": "markdown", + "id": "a9f003fb-7d2b-4f4b-bf4b-ed1b7821d84e", + "metadata": {}, + "source": [ + "Next we post the request and store the response." + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "e5d6e036-aa13-4b93-9d9d-499787d05341", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "links:\n", + " transaction: contracts/3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20%231/transactions/182a53706d9eedb1b66d8e86d54351ba8a7822fc2361e1cdb6a129f265d22040\n", + "resource:\n", + " contractId: 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n", + " transactionId: 182a53706d9eedb1b66d8e86d54351ba8a7822fc2361e1cdb6a129f265d22040\n", + " txBody:\n", + " cborHex: 86aa00838258200f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c018258203376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20008258203376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20030d818258203376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a200012818258209a8a6f387a3330b4141e1cb019380b9ac5c72151c0abc52aa4266245d3c555cd010184a200581d60f4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98dd011a3b39ea31a200581d60f4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98dd01821a000fea4ca1581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060ba1484d65646961746f7201a300581d70e165610232235bbbbeff5b998b233daae42979dec92a6722d9cda989011a047868c002820058201fc22e57cbb141ffcba4d63f002e03cb55031186880e32e5448e526044eaacd5a200581d60f4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98dd011a001e848010a200581d60f4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98dd011a3b340eb0111a00119282021a000bb701031a01640490081a0163cce30b5820795ec7b34bc6976b470472b6f6baa2715f9e0b08b71f9a28ff1d4a3700f30e0c9fff82d8799f581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060b4653656c6c6572ffd8799fd8799f581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060bffd8799fa2d8799fd8799fd87980d8799fd8799f581cf4b22c10898e0465d771cbb89862a1d715838aba619c39fc7ebe98ddffd87a80ffffd8799f4040ffff1a001e8480d8799fd87a9f454275796572ffd8799f4040ffff1a047868c0a2d8799f4e5265706f72742070726f626c656dd87a9f454275796572ffff01d8799f4f446973707574652070726f626c656dd87a9f4653656c6c6572ffff00a01b00000186ec40a528ffd87c9f9fd8799fd87a9fd8799f4d4469736d69737320636c61696dd87a9f484d65646961746f72ffff9fd8799f0000ffffffd87a9fd87a9f454275796572ffd8799fd87a9f4653656c6c6572ffffd8799f4040ffd87a9f1a047868c0ffd87980ffffd8799fd87a9fd8799f4d436f6e6669726d20636c61696dd87a9f484d65646961746f72ffff9fd8799f0101ffffffd87980ffff1b00000186ed1a8680d87980ffff818400009fd8799fd87a9fd8799f4d4469736d69737320636c61696dd87a9f484d65646961746f72ffff00ffffff821a006eb82c1a6f28ce7df5f6\n", + " description: ''\n", + " type: TxBodyBabbage\n" + ] + } + ], + "source": [ + "curl \"$CONTRACT_URL/transactions\" \\\n", + " -X POST \\\n", + " -H 'Content-Type: application/json' \\\n", + " -H \"X-Change-Address: $MEDIATOR_ADDR\" \\\n", + " -d @request-5.json \\\n", + " -o response-5.json \\\n", + " -sS\n", + "json2yaml response-5.json" + ] + }, + { + "cell_type": "markdown", + "id": "e013214d-0294-467b-a13f-9b80eb837b4e", + "metadata": {}, + "source": [ + "Once again, use `marlowe-cli` to submit the transaction and then wait for confirmation." + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "6f48a296-9751-4496-9d4b-e9278104b437", + "metadata": {}, + "outputs": [], + "source": [ + "jq '.resource.txBody' response-5.json > tx-5.unsigned" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "6c725733-bc6a-4903-a5cd-60766b258a40", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TX_5 = 182a53706d9eedb1b66d8e86d54351ba8a7822fc2361e1cdb6a129f265d22040\n" + ] + } + ], + "source": [ + "TX_5=$(\n", + "marlowe-cli transaction submit \\\n", + " --tx-body-file tx-5.unsigned \\\n", + " --required-signer \"$MEDIATOR_SKEY\" \\\n", + " --timeout 600 \\\n", + "| sed -e 's/^TxId \"\\(.*\\)\"$/\\1/' \\\n", + ")\n", + "echo \"TX_5 = $TX_5\"" + ] + }, + { + "cell_type": "markdown", + "id": "69c913d9-8a05-4cbc-b229-b0e0ec22e0ee", + "metadata": {}, + "source": [ + "One can view the transaction on a Cardano explorer. It sometimes takes thirty seconds or so for the transaction to be visible in an explorer." + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "05eaf50a-f7c9-4af8-9bd1-fdc72c6e3cd2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://preprod.cardanoscan.io/transaction/182a53706d9eedb1b66d8e86d54351ba8a7822fc2361e1cdb6a129f265d22040?tab=utxo\n" + ] + } + ], + "source": [ + "echo \"$EXPLORER_URL/transaction/$TX_5?tab=utxo\"" + ] + }, + { + "cell_type": "markdown", + "id": "dffff587-c8c3-43d2-b08c-cc881153234b", + "metadata": {}, + "source": [ + "One can see that the mediator still has approximately their original balance, which includes the 2 ada they just received, refunding the 2 ada they used to create the contract." + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "ee3f2e7f-0268-4c4a-84fe-bfc5ca2cf297", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "182a53706d9eedb1b66d8e86d54351ba8a7822fc2361e1cdb6a129f265d22040 0 993651249 lovelace + TxOutDatumNone\n", + "182a53706d9eedb1b66d8e86d54351ba8a7822fc2361e1cdb6a129f265d22040 1 1043020 lovelace + 1 bf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060b.4d65646961746f72 + TxOutDatumNone\n", + "182a53706d9eedb1b66d8e86d54351ba8a7822fc2361e1cdb6a129f265d22040 3 2000000 lovelace + TxOutDatumNone\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --address \"$MEDIATOR_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "ff85a692-9d89-40c2-a8bd-76f5b5eedcad", + "metadata": {}, + "source": [ + "The Marlowe contract is closed, but the role-payout address has the 75 ada for the benefit of the seller." + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "de0b22dd-6563-4376-a9f7-fda2dd58939f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "182a53706d9eedb1b66d8e86d54351ba8a7822fc2361e1cdb6a129f265d22040 2 75000000 lovelace + TxOutDatumHash ScriptDataInBabbageEra \"1fc22e57cbb141ffcba4d63f002e03cb55031186880e32e5448e526044eaacd5\"\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --tx-in \"$TX_5#2\"" + ] + }, + { + "cell_type": "markdown", + "id": "55eab573-dd77-4a93-ac7f-53db59265233", + "metadata": {}, + "source": [ + "## View the further progress of the contract on the blockchain\n", + "\n", + "Marlowe Runtime\\'s `HTTP` `GET` endpoint `/contracts/{contractId}/transactions/{transactionId}` can fetch a contract from the blockchain and return information about it." + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "6c5841e6-f94b-4f62-9a9e-efab8b427aa2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "links:\n", + " previous: contracts/3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20%231/transactions/0f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c\n", + "resource:\n", + " block:\n", + " blockHeaderHash: 23a80ec90982f747cba7f17992e673572a3d4b06d94bbfa13e1a62f3c9054396\n", + " blockNo: 732038\n", + " slotNo: 23317766\n", + " consumingTx: null\n", + " continuations: null\n", + " contractId: 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n", + " inputUtxo: 0f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c#1\n", + " inputs:\n", + " - for_choice_id:\n", + " choice_name: Dismiss claim\n", + " choice_owner:\n", + " role_token: Mediator\n", + " input_that_chooses_num: 0\n", + " invalidBefore: 2023-03-16T21:08:51Z\n", + " invalidHereafter: 2023-03-17T01:06:24Z\n", + " metadata: {}\n", + " outputContract: null\n", + " outputState: null\n", + " outputUtxo: null\n", + " status: confirmed\n", + " tags: {}\n", + " transactionId: 182a53706d9eedb1b66d8e86d54351ba8a7822fc2361e1cdb6a129f265d22040\n", + " txBody: null\n" + ] + } + ], + "source": [ + "curl -sS \"$CONTRACT_URL/transactions/$TX_5\" | json2yaml" + ] + }, + { + "cell_type": "markdown", + "id": "1111ac65-fd60-429a-811f-dfe3440e6b95", + "metadata": {}, + "source": [ + "## Transaction 6: The Seller Withdraws Their Funds\n", + "\n", + "The price of 75 ada is held at Marlowe's role-payout address for the benefit of the seller. The seller can withdraw these funds at any time. The contract ID and role name are included in the request body for a withdrawal." + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "223cd7b7-30d5-4e7d-b99d-76a5926ff737", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"contractId\":\"3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\",\"role\":\"Seller\"}\n" + ] + } + ], + "source": [ + "yaml2json << EOI > request-6.json\n", + "contractId: \"$CONTRACT_ID\"\n", + "role: Seller\n", + "EOI\n", + "cat request-6.json" + ] + }, + { + "cell_type": "markdown", + "id": "7b3c9b1f-b55a-4a09-b0da-6a33ec67fb2c", + "metadata": {}, + "source": [ + "Next we post the request and store the response." + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "fae22f06-a0b5-4366-88c1-4926948dfb50", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "links:\n", + " withdrawal: withdrawals/850e4ce20d1c1b07f05c28d7d6c9d961597d1c29b90d6cf57f35f4629461ab5a\n", + "resource:\n", + " txBody:\n", + " cborHex: 86a800838258200f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c008258200f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c02825820182a53706d9eedb1b66d8e86d54351ba8a7822fc2361e1cdb6a129f265d22040020d818258200f40ff5e41521e03a15837f3f1ee1436103ed64a1b55c5698bdd8a8db6ab043c0012818258209a8a6f387a3330b4141e1cb019380b9ac5c72151c0abc52aa4266245d3c555cd020182a200581d601b120d7221aa5e7db58fd8e0753e156cf8c38742546a907e8104cc59011a40037f60a200581d601b120d7221aa5e7db58fd8e0753e156cf8c38742546a907e8104cc5901821a000fc8a0a1581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060ba14653656c6c65720110a200581d601b120d7221aa5e7db58fd8e0753e156cf8c38742546a907e8104cc59011a3b888f0f111a000796b3021a00050f220b5820eb4a2171f8674f1256d443350ae57c518900b0398bdd259564e6935869d5c35e9fff81d8799f581cbf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060b4653656c6c6572ff81840002d87980821a001b8ea21a1df5686ff5f6\n", + " description: ''\n", + " type: TxBodyBabbage\n", + " withdrawalId: 850e4ce20d1c1b07f05c28d7d6c9d961597d1c29b90d6cf57f35f4629461ab5a\n" + ] + } + ], + "source": [ + "curl \"$MARLOWE_RT_WEBSERVER_URL/withdrawals\" \\\n", + " -X POST \\\n", + " -H 'Content-Type: application/json' \\\n", + " -H \"X-Change-Address: $SELLER_ADDR\" \\\n", + " -d @request-6.json \\\n", + " -o response-6.json \\\n", + " -sS\n", + "json2yaml response-6.json" + ] + }, + { + "cell_type": "markdown", + "id": "afefec57-7bba-4c88-82db-6a0f429bf6bb", + "metadata": {}, + "source": [ + "Once again, use `marlowe-cli` to submit the transaction and then wait for confirmation." + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "e5d6f45f-89cf-402b-8a17-520a85d9f757", + "metadata": {}, + "outputs": [], + "source": [ + "jq '.resource.txBody' response-6.json > tx-6.unsigned" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "c7fa907d-07d8-46b2-9ece-a6f52320e628", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "TX_6 = 850e4ce20d1c1b07f05c28d7d6c9d961597d1c29b90d6cf57f35f4629461ab5a\n" + ] + } + ], + "source": [ + "TX_6=$(\n", + "marlowe-cli transaction submit \\\n", + " --tx-body-file tx-6.unsigned \\\n", + " --required-signer \"$SELLER_SKEY\" \\\n", + " --timeout 600 \\\n", + "| sed -e 's/^TxId \"\\(.*\\)\"$/\\1/' \\\n", + ")\n", + "echo \"TX_6 = $TX_6\"" + ] + }, + { + "cell_type": "markdown", + "id": "89158154-d547-4378-806b-de1d7662503e", + "metadata": {}, + "source": [ + "On can view the transaction on a Cardano explorer. It sometimes takes thirty seconds or so for the transaction to be visible in an explorer." + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "331d652b-e7fa-4eb0-96a3-e5cfa565b1b9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://preprod.cardanoscan.io/transaction/850e4ce20d1c1b07f05c28d7d6c9d961597d1c29b90d6cf57f35f4629461ab5a?tab=utxo\n" + ] + } + ], + "source": [ + "echo \"$EXPLORER_URL/transaction/$TX_6?tab=utxo\"" + ] + }, + { + "cell_type": "markdown", + "id": "2dfa5c8a-938f-4d0d-a806-ca65b688ae32", + "metadata": {}, + "source": [ + "The seller now has about an additional 75 ada." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "18fabe44-1bd2-40ba-8764-f0b384fb5739", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TxHash TxIx Amount\n", + "--------------------------------------------------------------------------------------\n", + "850e4ce20d1c1b07f05c28d7d6c9d961597d1c29b90d6cf57f35f4629461ab5a 0 1073971040 lovelace + TxOutDatumNone\n", + "850e4ce20d1c1b07f05c28d7d6c9d961597d1c29b90d6cf57f35f4629461ab5a 1 1034400 lovelace + 1 bf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060b.53656c6c6572 + TxOutDatumNone\n" + ] + } + ], + "source": [ + "cardano-cli query utxo --testnet-magic \"$CARDANO_TESTNET_MAGIC\" --address \"$SELLER_ADDR\"" + ] + }, + { + "cell_type": "markdown", + "id": "97b64a91-527f-4456-9798-c214a8a795b8", + "metadata": {}, + "source": [ + "## View the withdrawal\n", + "\n", + "Marlowe Runtime\\'s `HTTP` `GET` endpoint `/withdrawals/{transactionId}` can fetch a withdrawal from the blockchain and return information about it." + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "72ca3c23-4074-4581-ac08-30f46fca17b4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "block:\n", + " blockHeaderHash: 4dfa1ea56ce98d4f8a476e808ce5f5c2803ffd76d4b8ba3ee83f57ec816d9f66\n", + " blockNo: 732039\n", + " slotNo: 23317779\n", + "payouts:\n", + "- contractId: 3376c0eae5aa40e75e5d1d2264faa1a30a314a3d8ca9b6da99c5c04de9349a20#1\n", + " payout: 182a53706d9eedb1b66d8e86d54351ba8a7822fc2361e1cdb6a129f265d22040#2\n", + " role: Seller\n", + " roleTokenMintingPolicyId: bf35f1fb673d65bd7fc65e90e52213e7c70ceadfab633e9765be060b\n", + "status: confirmed\n", + "withdrawalId: 850e4ce20d1c1b07f05c28d7d6c9d961597d1c29b90d6cf57f35f4629461ab5a\n" + ] + } + ], + "source": [ + "curl -sS \"$MARLOWE_RT_WEBSERVER_URL/withdrawals/$TX_6\" | json2yaml" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash with Marlowe Tools", + "language": "bash", + "name": "bash-minimal" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/04-escrow-rest/dismiss-claim.svg b/04-escrow-rest/dismiss-claim.svg new file mode 100644 index 0000000..e58576a --- /dev/null +++ b/04-escrow-rest/dismiss-claim.svg @@ -0,0 +1,113 @@ + + + + + + +escrow + + + +minAda + +Mediator deposits minimum ADA. + + + +deposit + +Buyer deposits funds. + + + +minAda->deposit + + + + + +problem + +Does the buyer +report a problem? + + + +deposit->problem + + + + + +dispute + +Does the seller dispute +that there is a problem? + + + +problem->dispute + + +Report problem. + + + +sale + +Seller receives purchase price. +Mediator receives minimum ADA. + + + +problem->sale + + +Everything is alright. + + + +mediate + +Mediator decides. + + + +dispute->mediate + + +Dispute problem. + + + +refund + +Buyer receives refund. +Mediator receives minimum ADA. + + + +dispute->refund + + +Confirm problem. + + + +mediate->sale + + +Dismiss claim. + + + +mediate->refund + + +Confirm claim. + + + diff --git a/ReadMe.md b/ReadMe.md index 9314195..736acf0 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -6,7 +6,8 @@ - [1. ZCB using the Marlowe Runtime command-line client](01-runtime-cli/ReadMe.ipynb) - [2. ZCB using the Marlowe Runtime REST API](02-runtime-rest/ReadMe.ipynb) - [3. ZCB using the Marlowe command-line tool](03-marlowe-cli/ReadMe.ipynb) -- Additional Information + - [4. Escrow using Marlow Runtime REST API](04-escrow-rest/ReadMe.ipynb) +- [Additional Information](#additional-information) - [Overview of Marlowe Tools](#marlowe-tools) - [Overview of Marlowe Runtime](#marlowe-runtime) - [Using Marlowe Safely](#using-marlowe-safely) @@ -29,7 +30,7 @@ If you are unfamiliar with the Marlowe smart-contract language or with the Carda - [Lesson 1. Marlowe Runtime's Command-Line Interface](01-runtime-cli/ReadMe.ipynb): This lesson shows how to use Marlowe Runtime to execute a zero-coupon bond contract using the command line for a Cardano testnet. - [Lesson 2. Marlowe Runtime's REST Interface](02-runtime-rest/ReadMe.ipynb): This lesson shows how to use the REST API for Marlowe Runtime to execute a zero-coupon bond contract on a Cardano testnet. - [Lesson 3. Marlowe CLI](03-marlowe-cli/ReadMe.ipynb): This lesson shows how to use the Marlowe CLI without Marlowe Runtime to execute a zero-coupon bond contract on a Cardano testnet. - +- [Lesson 4. Escrow](04-escrow-rest/ReadMe.ipynb): This lessons shows how to use the REST API of Marlowe Runtime to execute an escrow contract on a Cardano testnet. ## Additional Information @@ -61,7 +62,7 @@ If one plans to run a Marlowe contract on the Cardano `mainnet`, then one should Here are the steps for checking the safety of a contract: -1. Understand the [Marlowe Language](https://marlowe-finance.io/) +1. Understand the [Marlowe Language](https://marlowe-finance.io/). 2. Understand Cardano\'s [Extended UTxO Model](https://docs.cardano.org/learn/eutxo-explainer). 3. Read and understand the [Marlowe Best Practices Guide](https://github.com/input-output-hk/marlowe-cardano/blob/main/marlowe/best-practices.md). 4. Read and understand the [Marlowe Security Guide](https://github.com/input-output-hk/marlowe-cardano/blob/main/marlowe/security.md). diff --git a/images/escrow-playground.png b/images/escrow-playground.png new file mode 100644 index 0000000000000000000000000000000000000000..5bd10162e9a164a08dea2e9a1de2d7b539c99f99 GIT binary patch literal 140095 zcmYhi1ymeM7p~p74est5ELd=N*8suYArRalSkT}OL4xZ93GVLh?iPYO+&Skv_y2FL zHEW<(cXf4j&HGmEdiFO}Wf@dtB4hvnP~~JL)d2u{8uB?pgoYf!tpAt@`GWZ(E~klz zh`6$)vIzhbfSjb5rf1e^n^zjn+}wSD?a^`Bx(|;f0fFTrKBko@=4avv;?{n+jo;sY zZxOvG_8p_@vi{4xUw&a1XuTaJ?KepPBX>=2OGP0oDrO}aVuCyFDIdy}a zdu9}*(MVjB4tH{Oe-Bz~oDe$5X_>1m`@%i~?(F+t*&F?O*8t7>zp{a|>JT3FZ&5(s zaum@2U-3rtSlQbCw@gd?UO~hEx1^E^lYz$eN0=%M^~ zN(BW}Czx4F3$^Em%`$j%#0`N6tyfDIrqgxq&;eCVmhP@C{Ox3S!p%S%Cp4cSZeV5) zeI+w`$AJ8SAS|zpNeqK54xy)pb)=-M%!Wv523E{fx06drN{tHLOl-Xs#+RJHGIgO*jQpjexn7X57|JZuqs#3BvLjXyo#hK58YK5Y#mQlcb3b z2M02k*1l^hl^!p+q}wZnjgX`&8KRAy-&|CaYU1-`wHrrlyEl@Pg7 zPnRecy94T3ypelZ5Xjs{ZTCwE-%SM(&$rx1)S9&$d^N1*GlS!-L=~ zSsEHS@em$NSW2=u>JaOUesBdtWCTY(L%->JgN1Blg0Of+I!%NN?bT z?)-Mls3>C^0hekr6%1t*@!?LoW$*Cj9AJu18@f-=b1CHJ*<;LizqJ5w$g)fwiiwJg@hgvx>==v$609x!;fQ!UD0Q$ zRCIadFr7YL_J>jfY0{KAq)isnJ(D(Pqy6SmYW8f@{O(N2k$t9!O5k)a4rIB^tlG6n zP8DxCH!P|Vju9}JSpYZi)RHWAN4*qBd?lK0rH4IT(UNnCAGd~ng*jCd3pllNj?B+M z`*PzpCJxO_euIJ-{P)3^EN%eIT-;@Ru9baj0f;8h^sq-bv>WsvT=6+%K>V8=yD0lK8AYO8AVfcK7wR*4GkD|Lo{-aFaEtZCt@p{-Lr5aK(7pjjWilWhm`$w!DFc+?QV8wp4fdIp5eCKV% zvm&+-y4z63WpmdSF?YHZ1ein2ka;}FkQLXLg8{@aZrLTH_oDqcg#6r!RknE@$w5Ct z&0W8@6}lIj!2}NM3|a1rH9Dk_60c=*u$C?Ri%Z^)ZH(rT+dqZ~^ zs5({4XiB|b`WFMsK36TF9~ne7-BV4FrK zmt1?Hvzn6~zMofesL4idZepj|6FfW_vwzh#nwu*wlBuW4WpKzU^j_$kRJ*=75^CVS zRlozt@XEaB_sv94g}wIcs#oLit*-NhT~8uU=BY?tdmFZb;H~-|EI>`zcE7Jr;Epst zkck*7CZ?-v&vQo@8(vGFS8d~VI7OO}t)hzmZMyduogaCK$Q8v>1K@aI9N~B=&;O+; zn_E_LZawWma*fKxM~}NFkKKEt?)dIl2JQGgrJu}7mZqzGhHFVQ1-rz_XM_j_Hl}Fu zl^JX3z-FiOa3`|;l3*}&RaMvrKy>ep+P!aZQl*~sD9mrve4Sc#j1Cve79_U|+hWu(iaM_KH%9Dty%>G#i%Y@50^m&jiYUrxQ zCX|rB-VfIB?U^wL^SQ7)LIVT{remD&NwoqEj^rL&t0-Nt)_e^&*^;?vTKoUIjZ38Q zSx>aRZrjsjYE0QS!FqA^)-`nHe|<^bs|0uOf1Mkn<8iK9aRvvLGFiS44MksLm|d9? zqQN^;^oqn@mk`nWLK1G0rt!P8Zs@QM$GufYa)|1!q{&RDZ&a|gQ^w0VfD=0eTL<)#J-dV2 zSyBG+CFqGOL`wH#WJw%vVAE^e@FA;)n26L1yga4^MB6sh29)ARV|1?qX*q zPUMS~pm7i4Nu2WI$Q+vglc)?gO-IdD8=jY4H36B^_)YT=s?qH{nxacwn`f@j)^qbV z7uoQ}Eq)fOoWK@{h(y;C3$r{+PIF*Lbx&84iD>_Ug8A5L?gAarPsInm44>T8L zPSz7;cXzoz*oUwAVfq-Zn1gySoNrKjYN`=2F;}O(WTwO?`8cMR-m;JjNkbyat55j1 zKW!z2m~#kUt3jTYt+_GcipsI8r5b8UQNg!PflVyW#|HXw^PgENX zOH@W)c6S@GuFBZMQSwr%$A4P(l;vU%Qje93x_v>( z@XNlN{(rMz&SAz5QQ}B;@Zy#(z3J)ibZr?VfPtaoG9G1|r7q$9lE-Tr5{v}?Di_U! zpVY$tCgyN}ve}9lCrC70fUY0YkOh$g(A1se&6gQr0G#SXorJw@KYaXefjJlP8NoK{o3+6xn#UH;Vy}zqC<`CiK21N>$WS1w^&G z9@Z@X>&jo@^KeEpTr*slL8FthGLqZNzKiaPaBX`f@7uA^+UFkN@c2p*!(%Ia*u;|1 ziKMSAr)+HP!)c)a$wRCjc2|Q&>RR5=Wu)rkyXty?FYi8GovGJ(1460!mzCyZ%n#k zn5V3Uuiy)CW#t;3GMYTXtr&_}2=PR_8MU|oOkmYXMv+&WVF-qRFmtzHM zOd4|QQWZwIyz44TQpX%>nS1enT68Kq&V3A!=NMh>{Vy{Tf-7B!;U%1 z_yfYUIK~k(g$LTOWj}o3R}QqE93ypSJyVW!h_-%iUO}@qp(Rowiw8t`sbH!avT%g; z*1Qf?jTe(WK5A))*W+n2+j2EDxT_--b0pC8nZB1&!=Rk=%#o29(!!x7i&IDlVW377 zS5QC^$5xurN!jxvqm;zyOG&|#^mQ~?fJjMrK#B!Km`ejKbRqN5_kIo#U6-`Zl>f<* zG3uN}foPp*R!czj{OioZHOodfW#{5I^N6y=w4t%c`OrG7oH?05M{sc6ik+P8!$Im&`lX5*cDJc&dP`CaN)+?-SUZ0K6P&DC8b(*c1+FXZiTK+RL-gnMxSIL{IW07yRRev#K& zil0IX7VS-f1AOir@c)1TZw>pe>ygV8JRUrU?~dvkB4RkhOm4|I3ov?dDeKasC+ArM zc?kXHpwCE>Vj8RwEbR4G#3DG{2gapkJ(lO)Ra5-1Oq_20rjPVmgr?AfnH3v|$=9+c z4`_J~-A9re+@;p=ga0tuuocM2^t+F&n@d6sF7HN*b9gT`5E)=X)*bXK_R=!_OGpM3 zJ0Zp@MuenEwdLlg%D1D5wQCqN?MnSacuqZ~ija$k61?SSv?0bg!}T8Ybo$ap__bi> zfk4*0c#@QlzH5NY`%%EaKY1Q+O8T~H?1-1a0G_3{ilG1l5LKzrwT=4ogRp)~9kDsu zub?uM?m#kP&2g=QfnMC+;cN-HlI2r`f!c=_`IKe%4zm@jJienvNLvzXL00|*`=6N$ zM$Au{mQaS|TJ{Rf?gAV5xSBG1*u%}5o|gAjWveX7u$Fl|l%<}CmaH>lAS>(L!hEtB z9(wV~mbDz51f>>>f9|wNTeIQAa}Qy@pUk~|Fh z<*kR3s_#dRWP=t@aORmgx~*O%ZT+(9{k50_A;eU7pJ<~D!(c?@@<(lp+DmT zIyJG=K62)l*qAQ`06?!0|B5T!>>yd!1?q#aeBd7kR2Q)hyIaG&^ZQ4|`|@+0RP0BC zRN;~3jh{xJr5i|LqB?Gm-7>a3y-jq9WD!`7Hq%R9xF+ksm(SYDBA-5?n-Y3Qd!x*} znI8E%olG0x@HlPuKRt;R++lf>QD(Pb9=f$v4k97PuAB8YV`|q36|rjJ@62x~(xxLO#IwM=ei`cJh)%n!PIKoOrD1)E;sl>Du-I^nv5xaSa)g*>_=@}<`3l9b4wcl= zcr%FU`DK`Qdc?}WFC~rjVf@U2mOoyxyFL5I!M^i3d{xuwa+d6|#O7~=D7j6NzqN6J zPz=|=@WP7sZ{Mqb15j!>XEhIm0mix?`&Ek)x;zh z!Dn+gq!-x~%R}M@%0Ub`QkYUxkT`*bf*f0EkZ7k|M3GHCgF4P$68s>TSvSQ(S2~k9 zGT#BLA*GvPpHZ}N?tztGR>lws>fud?{7)m7Q3MAKMeo3^lt?qQbMbvL1th+3V~++u zm8U{VSro!%bQTIf0?U5VJ8@8mRqTbIMAAk_F=lGU>6fRpUE4o?jH;8N-OO+Ji@$*O zW(?!fKndd<&YHbq@`!P#f>sPf8UdHKDw~M2WBip?fF4ZAOL%@tzP}K!eEASW+)Q$6h1lxJO3RYk zRMp@TE*@Us;Oea=2F{ro+ zZ)BZV$Tmn^$CLTc@Prsl5ot<+@tMiEIPc=Ym+S1lSDq=^RCoT|Bg>0RNr5hrH}=Ul z7C|h5rj}Vj4M$4N08f^!G@>nvd4zdHnhKNN;XP=_OE_7cQn8`_r%i?l$wEd}8gnEh za!4cR-L}q(vgj48sU-#RE#wh!o@xXvKr%obj|hpH^cBkd+i7QZRhL~+U*9YWpw%3i})x~q3}Y{f1E{B;gpwJlU{-CF)7pKYQ^X6Js;MwaBR?X|EY z)1=wGQVAMl-pn4-J5_~rIL%^~7c^$I)BSjMXgqjhLH$^yh#3g%oU{F%I6vBNl>;#q zIt<(-b22ia)mj^e0r^KC-^11tA}v$yZu(t*Km7#n&90Ucdiv&43yl(3$68wgGMJt*w>d8|Lgs#W3K|0cOW6WOQ=}B ztkvn+%_Va(Qj%*Y)aoDfRe9-Hyuxg+S}>e8j6J|%=EDSjS>=h;dm)oh5$MgB;}**z z=yz0b6(-4>(lJ$1-;8V9%|3E`T&lV_Ae30Rf6zTOF)nIV`146x@lzlYDgo*H+f`b) zGjDAd86qek_)Cx07rCskSq?}1d-;C#_&!%(G5+KtM^Rp3j9qVaZtAyK=s>6e0YZsY z|J;c?vC9mWqQ<0$8Q%?DBc!+CKXTCd-o`LG2FpP_V& z(AT7$mkPGg643+wOfC$_t9EAOIhJfp(jzB3naph}plz2MAs`Yp8VP7m$eO&pODQ(l zjob`m*hF%BB7wp?sJCk@^sp!lYd!fMfk>&;{#A6iR{<8iwuA-Mj z2(Pxd%U;CyF8!8LVTKoS(`EAfCa$3!SKo(LT7IVouzwcxGb}X>U>I>=#gjd!xD|Sv zUO!2#Xr@IDH*C5=I5&K`4agnm2I1Ypge@Vg7>qth?tOzlowc6dZcWUlqD^a^`}UYV zAw zAz}GYY_&iN#9otcs8VVXtsdXk667&pd)N;-mJsu7_zS*AFGE5=13O~$aijfW?p3@T zFT}2uO}+fqWoijk*KyhT_Sx|XMd54)vL7m7OE4SPD?Q0ZGr3X=i>J4r@At6Y=L zBT-{6f~D*~7+jvHlZy6-p0>UO>@~Me+8)arTle=&DoqHAV~d{(KJc9@;K2D(63xGC z<~`;zH&s4&Ms4_;t)7Rs{w~>U(ym56dz^V;Q}X>&RgEw7OeupcrTumvFVIK3@j8aK zB=S6BH$7F>&Y#ruKEVmA^W$@3)MX$lq$E$_ghT|)4eA*8t}A%IUju)OC;yl zq5k%R>+hg>bm8X*jn_Qt(MZ<^{9Tj8Z(kVSMl-Or3)%trvOR%;yEn(ndnokU>A0M! zj+c>5u3_87w8!78A6gJw)$C8~R%db`@e5;A=8xNuU9*~Cs_uJqkpPx$D3I=Mmj(#I zu>Ez;k3+-#YOyCbN%(^J?F7<~XoNqWFCRJxo$s{+{OwYat~cNO|Abw2TZ_N|ld}B_izu>qE|?mX^9NyOX?u%ZvEfo$PDVm%X;YZ{@$oMrx<* zx?$iC^RQhu?=9^|nV(f-KDekZEp0L7_U0cV$kyh0Ae=WLQ@8$p6n?wsxC%Cca}q>= z?M$DrU?}|KHU9yJf@FT9RY7MXYpK0%v93%C_1iyVua@K!iNgZRosM3 zPHq)#n4mbS?&t0EZiMt;rPXHo>rUziE%byIfw_L2fpg_k<@=(_>x5ssMMNb=Mazz; zf&_vWJuN@S-qrc?H&yrO;>e+OkFlZ)wSc2;15JYIaP5&PuO!GP1$_ZGdTZ6-)^N zDmWN9CC$DP&Y14FGZV{WK|MJWnKdnwQ4ALd?3zmh=sYmepzF7O6uUAB1%8a1bDQt( zRT17k(+Tb`Hk99Rh4Y(%ZS^l+$D$qZxk3NHbbeYB7E5=!me&zY!em|k;oaL-#4wn3 zZ|?P>J*vZ}=l%r$gL1~F)r<1WW7~%vrHb0~w&pHvbg#F7b<)=rTDIq#_^tDo3qL#x zHSd{~fKfpW*G~IMFGA*d4(o1hvE7M@7IUS#3Rpqh%I5T#6eq{)1djsh;%x#zwrCb8 zGG{~$gEy8BcnC(T*c#l0Tsivi2Ww0 z$;=d4KBQYcFN~ai899o&Vd2ep@}7GiPL<-K`jZv8k#;d3iYNZQ-C=n3$+m(Mc&}qW zPjGI3MCA#nI9;cH&BG&xJ$52HaP(FWmM_CuPOfHOf0(^@aj@k^F%R*6E*%u;h-&8@ zd!Aw9W;1QOg8p!j`n-(jmPbxuT&deFT!#rA-s|H(w$?CQQ9;uNtW#e;TP2it!kmPV zw-u)7ZysIN@YG)%bi8g^bUbcpy{VF?`Kb|5sJY&31bA=!!~wY4Fa9iO2fTgjc-|eK zvfoL$(Spgof*Q1Vr3q9-J-=aszhZvn8jXe{@STOUCN?}itz!qh<+usTThQG1NAc&hyM9~m zaoqLy84Y`gnjmU*fg}%}vZuD)`;xWq_f6C_FM7#yxrDRqE}KK#xa$x1-NP@{>tC+= zb~-xD4LE%-mZ$r5Cthxr@c%@2+_zLOFPwFs4L2XC`(zjKn*jrvqh)oC0g?QncB1hTsYr+v0Io8Psil znZ!-0aD$^JjIh1i+Y`J*ygoI=}gRPZ5|6 z0E_o143~%>83>Gu0MQMWNto7;S=_ial5Q%AUB{RjpgH3>*n^kjx=V< za@G`=40B*&vqkF5QW8<^GZSbYi(32s$P(oAr1ypeZH8!H|EHX03|=D6-TuQth6aMb zb4_{9JI0mneJ?^q>-Fl2b@V;#k_&J$S8ZM$?heoyiNro>brJ~Y=P8!#0Skoc(Vt%@ zJ*vc_`EOdW3I65$dGR9k_ELN!A~(PA$Masm35KTW(z6A-SLdZ`CR>i5%eYvYQ{WF$ z7QIUOOLU&=X~=DL#8G=*^!*fQ>B{)E&#b09{l1oug}d%8K}*q-Z^E*;T%qG9LL=$! z=;odP4De&2NI17V9bDVO%I|<}7C2Y;otr99`?0v%rqZD0n}TazW_z)M3weY~<}WrN^guvf)$qICBhW zW4WEBq9E$$w#CC-0$j|r)yO9ir7Eq`z9}0{mWWTDbt5RMzxU%=AL*{gv&TDG|3EkK!5?zNjqAU$Y5p_Fn zg(J8RiSNj?GZ<~N$cchTaM?dFoVoQEX>Qr2)Iu!^Ha8c|FTPKWlC=}kFp5XLSPt?ru>{9x*yBIM?8!e_qGEFq# zq8u0X02fb%@b1cLKqI`Ny{(-2DhEdN;~lHTxKXBvc!O!w5?wk$Emy$f*DzL(THm4+ zlmYFK@&zEU-70p;WF^n_JM~vDSI&=Wc_inj_}B`cBztwqtM4A|DnB^xdZ6A4T`?2f z!0Ri7iH2iJ=HQ3lC{uq8i@j+|_xU2}&Vgq+GGk`&;XL zQT{kl6AKeRrxxpGT`asyH4#FWoLbw;E($$@9=Q1Enb?Q2pEEHF1261CfG6O^v~>6A zw64PJb$nd%L7l)9QAO@(lQA*(=|%HA58bGe_(-T$=Kx*!EWOuuBaoDMEU=GM9@&lE z-Ai=E9gOj!(?Te5Jc|Scbe55t+D(tgW7 zFV@8qqh=_k1Iw>stH5;G?l=4cTaC=39M4PBfr=DThky^`vH-vw?Z%x^v2*q5b*}W7 zXzx(YLx&yXXN(w_$hAHwhEVZ^qWbDa-n8RmKN-E9Rv>oa2x<^)%e#% zHd`VCX)AWhrw$-&!Ak9x`hfPG?EvpC)wEKS*H7t*XV zHm`N0mO>6Bo_v4-NLp5IWyAZ!t+wC%_j^0$tDym7{C;6Lz`AlF%xJty&wo32#nN@T z$e3VoDjTF_9klvGfnAZ2kL1X8$-Kf-?vrc4z0t-m(3t*J#$UGi)sFEektnJ==-GhI z>KVVr2D@ZG=GW2u!8Rr?r(F-Qxo_dyx1sKSI`6Fsac5K*c4UFuzq@J$yH%SGE&P>L z`&I%K1Lx@3nb0D}-x{<&@|B#mFWqfVSi`Xkg;M9jHPkUn=;CZ}d>QmpAbUU&Q~G_G zcQSk>;&l;!@}?yAH=lmS>9=*s3>=2x!F*fJD}IN+eG5V2?W8r1NJ9%$`JXJ@mGoEl zoR{gKdZ&*hz>lva0DD}urgB+2k!sx8P$Te3vmjkF%%_`7!pWnw+`9heT4+QfD;SC( z{$+bbsY~WWO7@#{t0Diu+71ps$S7|2K1c-mhV219;qQUeMbLG{yxID8^;B2JDNa0Bo*I^ z6#)o0YCXGg4tQMByk;!%s_WyOY?cw|wnuu*J?Wr~3Dv@mbzo-w?Veg3%;0I2qPy{6 zk>ZaecTd&|#U@SyGLL#bMtJ;YTk{VuTwlas zTK*nXl-+k~Sr@E9NLuZs5Z2MxcR%~{i-NbgOT|jB2&z62nS_o z)e|(nPs99flzObc3;yYxx}8PL$S7AXmVUF<=Sf3{Gd23U`xmLfjC*pT23llptdu=% z$)ORvBou(bKC~+}ntBv_y#Ar;sps~DEN5>i0OVF%QDVuQuJGcW+=;p( zy9RjOvRLGAXTNRVXCb zlCitg{m7BR=&FC{ss|_rjpLgw_Wr2(DJ|IEZHHnG4yp3BSYoC6%iDc+o#A@Y{;}E~ z*N2Sv&YWSl!*}kjiKGJWN+&Fs)sI|ZuCB7>pG~%Px&!P|$E?z9>yC^|r5P?IY|Qi? z!$ANTa4zO3vLOmHk%<$9?6bFlxx1WK8D+J-<)mOY!OSD8g@yigbzY6{D;u1YupyBw;37pBLpKXygPZ!h1}LRSk}4xrt)o+@R&-1 z1w-!oUlM4(c2RUgXsN5q%PiAh$Iau;BtQt{3cmyzISBuRgUkn~+6dv7x!KqzsMzd!_{M>OuUrPa+ibJDCmqKwSF1z2ta1W_r8g`9XW~~5POt3J}2E-H$0B11D(}pRk}olL*XxpA3V~!ej>le+1nGIq4x{COHJ*#%Q_RAlCZvyo!Lx^4>MuDAr+lZFChod z1qq`7^i^3z$CQc4p^_NatIltT4v+WzSLFL8uyWp8Ss90UmMZ^lg?!CFJkcd8Wk)0K z=OMnfrnCFzA$nM0Sz2e^S*{035(*Fu9dCiONC(w#_Tx&qp~*u1GLAU93`V){ijuPx ziQl!3vW|ya!6cz+uKyuT@NEre7&MbtZ_Hd<;`vuk)G2VL>hoF~{yN8VaKmQuAJat2 zO28VD4*%_j`-@gP2xxK|B@L@rm>qj*&AZKE2;l$(8J_atB>&|G_|uk&z8HlOxu)Mkohq}Mh1`Y--JVCPi~QuXJ}7-a+ks?oAyEE&*0dwD;SLn*j!_ZVKj@DZ+0l#P=ZT zWO=y+bAE)J#?ZrNvm~AwE?PPHpXw2jTuM7$hFV(1&<&|xIp;+~VCI5)2seo%RX60G zq^~rS#RO(n!0G#kCQSH;O7ux=*`Zj0z=OZuL-6-o!;d&{TNDB=oXfkKOv$xoUr17G z&8)c64<4fF3c^j6&5NNS82LP&!@oG>-tb6-uuWz(hUuMLNb0ZCMLq}?pONLf&qvE< zm1RGLHf-&ZVmR)y@67bwP@QvJ&^qyKh$r&~Zmss$h07iN%4w?RY87`nM8Aes>EH89 z%~A^{ffzutV=Rvs1(w!|X>#B!B;zviRagxT*Hvsw=)C7Ly|Q-h@<1v%A_Of}5Fo)# zsj->FRb+!4-04ixocfD7>JOga1U=Tb=$Y>fk%*L#WP}~(YuQcS*aNkPQb;e+U>!P| z_z()ALdeRTY>iS)K{6SfNv;@+CCC#`nM)>_8Z3C_9C(rCIi%28T|-Dqj!RlbF^ugC zUT;N9GYAi4JtjVh8)j06CShf+t4xCx5xNRy7Q=urs&_*WOh`$3f&!wS#B2ozE#@3U zSAyRA7P=p`wCEwbz{9+tv)GuNY)fD<=>nK=U4BDDU{ zVrG@)1-{_$HnN^rBpiT%sy2z3HtS#`bvdAuee~eUguoqEhQ(e;EDKwl8hN*8#Z49c zs<-~3zZgMJ?;WWkb19;|##p387F)n5pXD$!e~dRf$c!M&gg|naJ8l3QExgT;jcTxU z;-G*5nKFcCNR(pp!V{x**E)j^5gKzF!Y*}e#Ki_GsA;|AyVNW=gq)+Lbf&&XskI2No^NSZt|5H1R5p|B&xG%L8lI=$LQ*G!L@9RIqooT7t#YCb(L%*RJrvzBoFEA`9B%^nuVRt; zlXQ@@m8p@#p?My{vpvXI##-KQS#R%wq+jvpPNugOWFZ4e6_R@>;Wy*xKRyo}-{yYV z%GLrfHlA^hBRdIK%mGo5ecZqfq!;0UKobJj_S|ciP{YBgcWrAdlj5z0Y~DHG1A#h> z6?4~gh=Gh~NhfAQ2(VxZ4*rOI1|I?n_<$5c=~NQ}cmoPz1dD4I9zPD^#4p8J<$&GqzPmq0y#GP9Hh8rVE1&n$iD3ou-zge+Zn45evMYx8V~&MXpW&MMi( z5vA0Y(xR2+4{p4Fy(eU$QAp&hVuJuv*lfkAniVgOW+TUILMg~qLBy^)zE`_CCQVWw ze>$yw)D<3%Q9u3{Q=NXgUPh_=Ps2C3{-6A=snl(EUNhYk$HOqM?LX*YCWb2b=m=>= zdB??ft^Z|#jimo1w-+#%A`v#7i4c1dl*D3gx>3XF;hooSFxxNy=*f)bxJB^h4e00ad=qHJ2LR(NxLyI_p8j*04NU8ry&iUt| z+U6=b+nwapN|a7|X)qM1whdz-HQqp9-}}2nOk5KrKP}aX*Ux*!1mZ}SYO2rSLZ8#u@XCbG3 z!kY2$9xMQiKSlnGQl>S~U#1=uRTJs#dJk606%VKO-xvs6U0jLWC3DpYb|n<;hZ&TP zH2~B`!OX6poGj~vpRiAHe@2G-&0P;;v(lnJ!ninaG>f9AWhtfSa5Y&m4eQWVA|W}L zC~0ZcXPFh;BIDuFBaP4UX%ddWvP_vVHDz(*y#Mvy@aQH4SW=xJ59{1tpQpN8jPFM6 zK@9Iv&LcS6rFK7@W4(iQU$lpqlC#svWPpMI#LqW4 z4uu1PKP&Mzu(d0`ijbsI7KgA-uwAi>`*l~pz5o_nOK8qvpD`fheBzm~jV@j{MDVh^ zKmSaf{mdKv7fgZ3r9}N$NP(Eou)nuQsfY*L1v!6`CtY#bM5~3_I1>Utks2(^A^t0r zh7I)&G3vI($6~N^=PaPa-b&4lW#pzT7M&s}FtVS0`Abaqcv`5im6n!P0*z~$ly1sY z6AKrFnL_eQpd0}U^$FnC9LPx)+5)OLQVE5|?1zPwEWKPxA$$!DhwSZ;IdwwFBoA?- zg99dHYHX4j{hj(B=m$b<9my|@bA`!vn%ljLq@ucQ$hHBUS^UF&feR7}>ZK5CHM%IN zd?oZ+C~viBw`x${UcV0l#%%n`4NA?XB3jtc-EXv+!5Sj z7+zjp1Yx9oa57K&;GRSeD1%F*H2T$*$Sf0Pi72P|6ipp?^!GjYMGAMGzX<{Lranc2lW<-aO#<$$>~&huP3x0msYZeI$MkQ~R3-Cr9$i>x7<2h4;(ASJD8B z)5oFKM{>acFE4~j_!&S`tv-)LJ99pphHE>s0qeL=oA-L#32VBHDV9!DH{$Uj7qy7Y?Bzt8ef?keI&Sud%~4V$59LP;(KjI}c~k;P-}?t0toH zpYQwL?YA-}hjpsvT~dC8lk6s zc{^8b8z1ekohx(86rZFm{uDY_M=`I!Ml2=Xs9`!OFBi(5`=bLz9KXD-zEOH<7z+64 zhRMxg?3;7;KrT#yUeYkd<<`}a+Z-9Tf6(#vmpDd)oI(0^8jAUJ;Ht;6qQ#1=ZE^D- zccGtoYarD;Qat&qs09P)u5ok5*51p8ku-AzSR++c8-EZsOJa?Qt$-#O?Lh}Wz3ax; z`uX~6n$ww30_M=}fh8)>RH}vxn(kcyH$CpJg`5bdWjg6<&Nf<4dlO%DSXLdy_&^QR zQWeYcuM3jMIz3EXF+>JYSY4)m0~Lkroci^Fy);oq{c}~ro|YX?eY6v(ZExtDf-5-& zmvJM1I=tS9Mcz_nvA5pguX?upehljiw+Jx7?Lm9pd%44_&aN+1Fisa&B*l?>KC}&w1n^ z7=ZWsIAJ42_`2{e7rk{E_j__JEL5oY%{*VfaWP`VYq|5jBTSF`yg zo3!7f_mPCkFEePh}+YWNmvL zX)FgDm~7YKw1s=!%gv<$J#f(1xZv4eiHH^f{Z9xRv!c)ItM-70j5zi|Jn-F@|3ZpX z=>JExASvqKHJ%SdBxVBBxx202mB@XWi}5%qu)91A9pgp~iXxl68*cx?G>Wsy_0A!i z`UzjAU%5+hvLk0;PFvcFxzkN|gZ=qCCz22>U}hP{ zngLCwyY@ajE{1RFRS$0`F{LL(H(!|3cS_Ob>eI$g6!tu*0_y%8K7F&$w{9zIb!e4P zH{h?B0^}gT-oNl=3C3;wvE}z~Ux_0RK3(fkn4(qp?{+orovy!Z#O&9ullU^xRFI;X z<9SqKDl?rxpGH*yKxYVA+JL}FBw2te{^1ME*W(0Y%U)aC!>KPSi*X~%?MvU@1S|2^ zHj!{LZ@!qF6oUuk5AzWLGj0}H`%fhZOm$~puzZMw`VvdkP%e5t^zsaIm_0;L(8d&YED+gQ-zwo-Boj{-4@pdDlAne(m z0%MF|RCoL{^KC*a=Z2g%&+AF%^}@qIgFDZ58J*P>5XAn|95AP_km6LewAS1*wYy!m zA@u(4K|$}eR_p0{g185L%;)9dt$ljqA#c-w7#(NB^F%?xv6W{Qk9~bJ7T@Uh^6IYo zb!pOpoYe6}HI+(xwf*rM3Op3R)q08L@stp57|?1fdg86=JD_n_?e9BVT#g>sJUw4F zlLHe7K}1x0{J5xJ_dYSJf+!$JQ=jlBYn=5>BoPAU#oo$Hq9<2u?nf~!ATVEgwC8pr zy0U|kHrX?b`8s`~_rs_xNi_(Kc;+}p48_{n-*;`+)9+gV?@vTr&B8R~sm)yZ$6}w^ z`ZA=n-;pbVQ4S16QEV6g@?e-N_pl%X*+jt8z_w@h7J_+ADlSc{rYAxH#JW-&ykB3} zX~~Xj8ZbqUQYXS%ZDtHFZ1Ms zM|0U3kr|$TM+fJmz{8BvfOnJIM9}^$kzflY z;8x1QX{z@@jrt(rY$af~FfqfX__v$8sSk@Te=2N8keIk6}Sxwp!=* z{OOHCj0%X(F8v>--Z~(P?~NNBLPA1H8l*vKB&DU6E)kH1MRG~$2I=mQP$>aPg{8Zf zZde3qk?s<>!}oXJ_g?;5HqOrM?4I*HpE?rH0)QXV_3lNoDmY14+$zObU;R< zEWy)yo#FxDZ8?jaBB+|UATt=C#F4tc#?Jq3)8^=Hy+G1VKIEO=-u|=FZ1^KRDuBZh zIJg>;w)rHH(~;Mm0ASL#1%AwFQR3pYrvO%vfKb*Nh5#%;ZpTQ{h4$`zZO^eLflM&q z=N;mZtgBa&dim@mY%l)STJjI2a-1W21WC9JaQ*dYsjtqF(StXANxmzsZaEZziIQ-~ zQ&L<0H5X!*fuZ3mp^?-S=iQ5Y0(i>DQY&yZU(iA$W249R7mg|$I7BgX{t{H&9cn061NaC znCkx4Bq2iww)#G{Ddh|jUNzwa98at0U_HV>l{qTzDGFxb6;IofHqXaqCnz{>@z;OV88s{M~=WjmH|EwR{OtpZ)(B@{jUlq&iRv#dQ)Yu}}1- zh3>X50*%YoCQD3j&bhlL=x_E^qb95=O}F_>`S;^92HxR7V@0t(fAdN6?&BVPrn-Yk zD=Qv+078qZh08haf$sL4DV(3h0D>>_T<2Q~qP{R1{%T%YZa{O}j3^8pFpY}U`}P=( zPN4$p(WlrcrTsOEYIQQ@*iW(NPsVC*W7CI==e(-pt#F*@pWB5cmTF%N#eveoMYxtK z^kqky?~U(%{OB`U0Sh(~Qrzcx|0I?718z(7g^XU=LmDBc*<}NJ>g5-PUSBYQi8AOc zw-Ve>-}w9V-Yk&Rbj~X32Zvc8KIYwe?(L*^EyI82rtB_XE`BN9N+0sOyEeCO!!5qZ z^Yj%GMaPr1N94-UZD`kA!*r} z$)CaAE-hC)v*pvq68ZA&3G}J;MV8-~#s)zdf zEG1^TP8DW+!JjgGbQ*7J4^9i>N^PQh0E9!0)|fE2npg$!_d5PjI}@Rx=4%HdJ?EF@ zUg*v+rOg>FVV?c+Azd5#RnDOScjQ@EgtM3K7)fv|DN3@ES)?0F%SL{%WA~A*cVGP``^1gHuyd5Z!foG0QrG$jFpmy7d2%sYx@e}>i#E*g+d=+j{)g! zr&d>VN7c_by?St#GKJKtW&@@3xufq-Mji>65!e{*{`Klfy4k$kZ?+m>56zVq-i{nk zD4!lnujB>*gtZTv@jH6{%7>H4*IcMWXV`PM>vUMA3uT?!bH&xe{aoskKCx9f z{EXh9x@WfoV<-6k3M_V?Wu8TE3?PonP=+X1ehh!E%4$f6nf-e$ZBI~!MRQ?3qg(RJ zZQSM)IokK4(C_1CFSCnUaelD81Bz^D)oYju`^e@yAb*g;2i=cvZ(Dj3j+X2I6}9Dr zz(nA!)^e|Qx``~gDGjpF?Mh>`sF=I$N*#zY^!%07B-6t=eHd-fdb|G{>thiR=<#=Y zTy8Y}%8gg*=we^L_Rol8+e+vkowk;4%^WV_S`5q`Yf_oOZ^tH86AJxGzYH0xON?&r z4cMC*y;oQ&lYkA=t+(PedR#_nCY+h%c+Fpn89JVS^2N|o*!1`%41PqzIwJvjRcIKJ*DKKVbiDY|CSe`u06}#*4%e}^4e$z3izCQZ;ynaRfL>Z5 z7!s7_$HS@ICiChvYNiI8@wWH~*;Urox+Zz*8sEzBo&x-$1D(E;$KgxYXediZXt{R& z#`Y4iS)z~azum9EUcuTU<}KxJcBqdR_1?L#W>Dmg?P_O`I$qO;1e>AxD#+>dHcQrO z36nQOYS{|*R^R8f2*swCHXh&2Qk4FkGIZO*Nmpc%Rw3v?;g7P8$>@F#d$pjbGGxlY z%R4vFW+0*HL8~J9t9i`{mnHnP64l znu6;#BjOb8t3`2BVdG*O%~*ZGqMh^%T!;G8sCTFD0R27 zqGAX5ox0Ov{tDQ%-Y?6GnjpZR}Lmdzn6c;11#9gWlx+KMvhb)5R zpjZftg-ZhXZ{+$*+Bw-881j;zAJ>9Txnxav!)2a-xbd4h?{Rg3xYc>jx!2)@7*L25 z%Sm##7yb9gaX?az&D=2*13JNcSf<=B3I9}__^(7Ff(7IJ1D8~}gB!svn)o@&y)Eon z+vYP#e86%4dod?+zM~GNNkY>{A1PV}wzcJNUN9#sR=$ZTSPw5PEiW(cPy4FDCYwM0 zX7J?wXAZlx9%q|5VhuR1}rD8D;q#K4#N9F)~SBn=%or z2UBAWm=Dz0gZzOz#3>ufB;w6R(%DijOYtP3lF%IGLXb3iMNwqn`O^bZBD!v@(GzJV z##@X&rW*{bbQKIi^N*)g#;xIN!mE2ys%cO@YyfC6HuX^R=^sLj5e(&?V4Jd zT=wU|l_@QvFYbjf1uxz(%l8|h6sQVQvsgK=OMz~1+W56-mInP`a(aO`i5MJ+q#ja{ zgi7eFTewP%V_-1k{Om0O`np1F6udr>QeGqiy6lhk;afsEx&P-ZSrO9c9`kBxd42FH zv&6!~Ho{eDS4Gfb4S8a06ur%rsmqmfMz-(e8)3-sg^*{ z^WXio_DLWAbp7}Ap{^n6jb?eA9>Fi(MJ^3C@P$MXnl*c#wN?vA&SkF_l=BE9Q@W8ABSE-7^HgNBg>Yv^<&=-(pj$obVw+4K#nV#Q z!0YUyr8(=iye;v3Pu$zQhz~x z-=~jraQS{eliQK1|JZmYw#K-DozBp696EPC^8VhX;Lgxzf6A^%{Sm<9UjA<-etCHN z2(f=Nv9}clRD3cMt8uW%`#Akr6vcl~ChybbX{9lJoItO|g&{9DEjC)pvfu7A-F=Qv zv9kf&2adLz0Pyx;>1JZ&mjHnj_~DQY5@=l<48P*~Q1Z`4tf1q4#nsr<3?+@GU`+>bx8+V?#!X8@%5NpgSjZpLtq?voS8e?$TBn-5*~iyZIr`XnTeYEuI! z=fs9Ztx(S`!C%)G4S6QCfpJTHLDfmT!<~?wMhWgMe381H1y�EboEx(UG{v6Lrj^ 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%0A9EZ6c0;xon*brbXwB~Z!mZw` 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 literal 0 HcmV?d00001 diff --git a/images/escrow-simulation.png b/images/escrow-simulation.png new file mode 100644 index 0000000000000000000000000000000000000000..08594be37fb1af97e1cbf3817339626eb59654e3 GIT binary patch literal 51151 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Ξ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 Pj{(x+3ZJS(jROA%rTu4B literal 0 HcmV?d00001