Canton Network Quest 6
sudo apt update && sudo apt upgrade -y sudo apt install -y curl unzip jq openjdk-17-jdk screen
curl -sSL https://get.daml.com/ | sh -s 3.3.0-snapshot.20250930.0
echo 'export PATH=$HOME/.daml/bin:$PATH' >> ~/.bashrc source ~/.bashrc
daml version
daml new capstone --template quickstart-java cd capstone
daml build
screen -S daml-sandbox daml sandbox --json-api-port 7575
curl localhost:7575/docs/openapi | head -n 5
Должен показать openapi: 3.0.3.
curl -v -X POST 'http://localhost:7575/v2/packages' \ -H "Content-Type: application/octet-stream" \ --data-binary @.daml/dist/quickstart-0.0.1.dar
Создание Parties (Alice, Bob, EUR_Bank, USD_Bank)
Каждую команду выполняем и записываем Party ID:
# Alice
curl -d '{"partyIdHint":"Alice", "identityProviderId": ""}' \
-H "Content-Type: application/json" -X POST localhost:7575/v2/parties | jq .# Bob
curl -d '{"partyIdHint":"Bob", "identityProviderId": ""}' \
-H "Content-Type: application/json" -X POST localhost:7575/v2/parties | jq .# EUR_Bank
curl -d '{"partyIdHint":"EUR_Bank", "identityProviderId": ""}' \
-H "Content-Type: application/json" -X POST localhost:7575/v2/parties | jq .# USD_Bank
curl -d '{"partyIdHint":"USD_Bank", "identityProviderId": ""}' \
-H "Content-Type: application/json" -X POST localhost:7575/v2/parties | jq .daml ledger list-parties
curl -X GET 'http://localhost:7575/v2/interactive-submission/preferred-package-version?package-name=quickstart&parties=<ALICE_ID>' | jq .
!!!!!НЕ ЗАБЫВАЙТЕ УКАЗЫВАТЬ ВАШИ ID
nano issue_eur.json
{
  "commands": {
    "commands": [
      {
        "CreateAndExerciseCommand": {
          "templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:Iou:Iou",
          "createArguments": {
            "issuer": "EUR_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
            "owner": "EUR_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
            "currency": "EUR",
            "amount": "100.0",
            "observers": []
          },
          "choice": "Iou_Transfer",
          "choiceArgument": {
            "newOwner": "Alice::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
          }
        }
      }
    ],
    "userId": "eur-bank-user",
    "commandId": "issue-eur-to-alice-1",
    "actAs": [
      "EUR_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
    ]
  }
}
curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \ -H "Content-Type: application/json" \ -d @issue_eur.json | jq .
берем из вывода "contractId" и вставляем его в конфиг alice
nano alice_trf.json
{
  "commands": {
    "commands": [
      {
        "ExerciseCommand": {
          "templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:Iou:IouTransfer",
          "contractId": "СЮДА",
          "choice": "IouTransfer_Accept",
          "choiceArgument": {}
        }
      }
    ],
    "userId": "alice-user",
    "commandId": "alice-accept-eur-transfer",
    "actAs": [
      "Alice::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
    ]
  }
}
curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \ -H "Content-Type: application/json" \ -d @alice_trf.json | jq .
nano issue_usd.json
{
  "commands": {
    "commands": [
      {
        "CreateAndExerciseCommand": {
          "templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:Iou:Iou",
          "createArguments": {
            "issuer": "USD_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
            "owner": "USD_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
            "currency": "USD",
            "amount": "110.0",
            "observers": []
          },
          "choice": "Iou_Transfer",
          "choiceArgument": {
            "newOwner": "Bob::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
          }
        }
      }
    ],
    "userId": "usd-bank-user",
    "commandId": "issue-usd-to-bob-1",
    "actAs": [
      "USD_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
    ]
  }
}
curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \ -H "Content-Type: application/json" \ -d @issue_usd.json | jq .
берем из вывода "contractId" и вставляем его в конфиг bob
nano bob_trf.json
{
  "commands": {
    "commands": [
      {
        "ExerciseCommand": {
          "templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:Iou:IouTransfer",
          "contractId": "<BOB_TRANSFER_CID>",
          "choice": "IouTransfer_Accept",
          "choiceArgument": {}
        }
      }
    ],
    "userId": "bob-user",
    "commandId": "bob-accept-usd-transfer",
    "actAs": [
      "Bob::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
    ]
  }
}
curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \ -H "Content-Type: application/json" \ -d @bob_trf.json | jq .
Следующий шаг ( Add Observer)
Теперь у тебя есть оба:
<ALICE_ACCEPT_EUR>=00d28761210e104e2041648dbccbb4b1df5c60ad35e62d1577b6107018760e3862ca1112200cb42cb2df0a62a5f744b9dda228060f4e730b16f65e07072b0a5f98eb35ee94<BOB_ID>=Bob::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109
nano add_observer.json
{
  "commands": {
    "commands": [
      {
        "ExerciseCommand": {
          "templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:Iou:Iou",
          "contractId": "00d28761210e104e2041648dbccbb4b1df5c60ad35e62d1577b6107018760e3862ca1112200cb42cb2df0a62a5f744b9dda228060f4e730b16f65e07072b0a5f98eb35ee94",
          "choice": "Iou_AddObserver",
          "choiceArgument": {
            "newObserver": "Bob::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
          }
        }
      }
    ],
    "userId": "alice-user",
    "commandId": "iou-disclosure-split-1",
    "actAs": [
      "Alice::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
    ]
  }
}
curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \ -H "Content-Type: application/json" \ -d @add_observer.json | jq .
В ответе должен появиться CreatedEvent → это новый IOU с Bob в наблюдателях.
 Этот contractId мы будем называть <NEW_IOU> и использовать на Step 7.3 (Trade Proposal).  
Выглядит так
00c150e5e67fd561f512bac1c9b7ca4704400036a9e48abb2e5ae981253242d4d8ca111220df8ee3713c0312e5a0eca6fef60df7a50e99f75b28a4439c379d44796d9542e2
Создай файл propose_trade.json
{
  "commands": {
    "commands": [
      {
        "CreateCommand": {
          "templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:IouTrade:IouTrade",
          "createArguments": {
            "buyer": "Alice::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
            "seller": "Bob::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
            "baseIouCid": "00c150e5e67fd561f512bac1c9b7ca4704400036a9e48abb2e5ae981253242d4d8ca111220df8ee3713c0312e5a0eca6fef60df7a50e99f75b28a4439c379d44796d9542e2",
            "baseIssuer": "EUR_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
            "baseCurrency": "EUR",
            "baseAmount": "100.0",
            "quoteIssuer": "USD_Bank::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109",
            "quoteCurrency": "USD",
            "quoteAmount": "110.0"
          }
        }
      }
    ],
    "userId": "alice-user",
    "commandId": "trade-proposal-1",
    "actAs": [
      "Alice::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
    ]
  }
}
curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \ -H "Content-Type: application/json" \ -d @propose_trade.json | jq .
Вот этот контракт — твой <TRADE_PROPOSAL_CID>:
002d95e05d90a25d478d0b2ab01b33a2c81ad4abe178fb42089f20c30bc6218380ca11122061b5232006c3860e61a7876f743701de50bca6f0e1fcae889b9e1bb1bce4e494
{
  "commands": {
    "commands": [
      {
        "ExerciseCommand": {
          "templateId": "2fa7fec894ed2f78a52c03d35cd2bbd283dd2f415fd6bf40510c50a6445bbd2b:IouTrade:IouTrade",
          "contractId": "002d95e05d90a25d478d0b2ab01b33a2c81ad4abe178fb42089f20c30bc6218380ca11122061b5232006c3860e61a7876f743701de50bca6f0e1fcae889b9e1bb1bce4e494",
          "choice": "IouTrade_Accept",
          "choiceArgument": {
            "quoteIouCid": "00d4ebe87ee5d3d18e95fcec9661ddaaa916a2e39f57da36214062716a431a215eca111220d4357a4b8fdacac7a40d877d4a757105651c0a8f924a00e63fda603c5ec44634"
          }
        }
      }
    ],
    "userId": "bob-user",
    "commandId": "trade-acceptance-1",
    "actAs": [
      "Bob::12205a298e9f8f1edbd2dc60a452d30c768e70210bd46e0b8b8e1ee0437db01c7109"
    ]
  }
}
curl -X POST 'http://localhost:7575/v2/commands/submit-and-wait-for-transaction' \ -H "Content-Type: application/json" \ -d @accept_trade.json | jq .