- Overview
- Setup
- Tutorials
- How Tos
- Reference
Registry Utility - Burn-Mint API Example¶
This example shows how to construct and submit a burn-mint instruction on CNU 0.12.x and later.
It uses:
The Canton HTTP JSON API for ledger reads and command submission
The Registry Utility backend (
/api/utilities/...) to obtain choice context and disclosed contracts forBurnMintFactory_BurnMint
All scripts live in ./scripts/ and write their outputs as response-step-*.json files.
Preparation¶
Prerequisites:
Access to a running Canton HTTP JSON API and Registry Utility backend.
Local tools:
bash,curl,jq, anduuidgen.
Add all the required information to source.sh:
1#!/usr/bin/env bash
2
3## =================================================================================================
4## Purpose: Configurations for this example, amend variables as needed.
5## Script: source.sh
6## =================================================================================================
7
8# Operator details
9OPERATOR_PARTY_ID="alice-lab-operator::1220b7859943ac755c122492d1e49ddc1fca379667eeb96ecb8f9ae742e32602a8d7"
10# You can retrieve the operator party ID from `http://<host>/api/utilities/v0/operator`, e.g.
11# - Local: `curl http://localhost:8080/api/utilities/v0/operator`
12# - DevNet: `curl https://api.utilities.digitalasset-dev.com/api/utilities/v0/operator`
13
14# Instrument admin (or registrar) details whose instruments are being preapproved.
15ADMIN_TOKEN="<PASTE_ADMIN_JWT_HERE>"
16ADMIN_PARTY_ID="alice-lab-client4-operator::122084bf90222a14ac1da9562eee51976a0811c8e41b08e06a10fc22e1f0432a89a4"
17ADMIN_USER_ID="alice-lab-client4-operator@clients"
18# NOTE: We let the admin have actAs rights of the sender and the receiver for simplicity.
19
20INSTRUMENT_ID="INST2"
21MINT_AMOUNT="10.0"
22
23# Sender details
24SENDER_TOKEN="<PASTE_SENDER_JWT_HERE>"
25SENDER_PARTY_ID="sender2::122084bf90222a14ac1da9562eee51976a0811c8e41b08e06a10fc22e1f0432a89a4"
26SENDER_USER_ID="sender2"
27
28# Receiver details
29RECEIVER_TOKEN="<PASTE_RECEIVER_JWT_HERE>"
30RECEIVER_PARTY_ID="receiver2::1220b62c9b0602dd188d247ef4124f184c97d7ffe250571221a71cd4cd725b49c1b0"
31RECEIVER_USER_ID="receiver2"
32
33# JSON API endpoint
34# Example (local): HTTP_JSON_API="http://localhost:8001/api/json-api"
35# Example (remote): HTTP_JSON_API="https://<your-host>/api/json-api"
36# HTTP_JSON_API="http://localhost:8001/api/json-api"
37BACKEND_API_BASE="https://operator-utility-alice-lab-operator.vcluster.circus-dev.da-int.net"
38BACKEND_API="https://operator-utility-alice-lab-operator.vcluster.circus-dev.da-int.net/api/token-standard" # for token standard endpoints
39HTTP_JSON_API="https://utility-alice-lab-client4.vcluster.circus-dev.da-int.net/api/json-api" # json api endpoint
40
41# Token standard holding interface, may change when new versions of splice exists
42BURNMINTFACTORY_INTERFACE="#splice-api-token-burn-mint-v1:Splice.Api.Token.BurnMintV1:BurnMintFactory"
43HOLDING_INTERFACE="#splice-api-token-holding-v1:Splice.Api.Token.HoldingV1:Holding"
The required information is:
Details of |
Description |
|---|---|
Admin |
Token admin JWT, user ID, and party ID ( |
Sender |
JWT, user ID, and party ID whose holdings are used as inputs ( |
Operator |
Operator party ID ( |
Instrument |
Instrument admin party ID + instrument ID ( |
Endpoints |
|
Step 1: Capture a ledger offset (JSON API)¶
Run:
1#!/usr/bin/env bash
2
3## =================================================================================================
4## How-to Tutorial: BurnMint factory
5## Step 1: Retrieves the current ledger end offset from the ledger
6## Authorized by: Token admin
7## Script: step-1-burnmint.sh
8## =================================================================================================
9
10set -euo pipefail
11
12SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13DATAFILE="${SCRIPT_DIR}/source.sh"
14source "$DATAFILE"
15
16OFFSET=$(curl -sS --fail-with-body \
17 --url "${HTTP_JSON_API}/v2/state/ledger-end" \
18 --header "Accept: application/json" \
19 --header "Authorization: Bearer ${ADMIN_TOKEN}" \
20 --request GET)
21
22echo "$OFFSET" | jq
23
24OUTPUTFILE="${SCRIPT_DIR}/response-step-1.json"
25echo "$OFFSET" > "$OUTPUTFILE"
The result is the current ledger end offset, stored in response-step-1.json. For example:
1{
2 "offset": 18122
3}
Step 2: Find sender holdings (input holding CIDs)¶
This queries unlocked holdings for the sender for the configured instrument at the offset from step 1, and writes the list of Holding contract IDs.
Run:
1#!/usr/bin/env bash
2
3## =================================================================================================
4## How-to Tutorial: BurnMint factory
5## Step 2: Retrieves sender's holdings for a specific instrument and extracts contract IDs
6## Authorized by: Sender
7## Script: step-2-burnmint.sh
8## =================================================================================================
9
10SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11DATAFILE="${SCRIPT_DIR}/source.sh"
12source "$DATAFILE"
13
14# Get offset from previous step
15if [[ -f "${SCRIPT_DIR}/response-step-1.json" ]]; then
16 JSONCONTENT=$(cat "${SCRIPT_DIR}/response-step-1.json")
17 OFFSET=$(echo "$JSONCONTENT" | jq -r '.offset // empty')
18 if [[ -z "${OFFSET}" || "${OFFSET}" == "null" ]]; then
19 echo "Error: response-step-1.json is missing a valid .offset" >&2
20 exit 1
21 fi
22else
23 echo "Error: response-step-1.json not found" >&2
24 exit 1
25fi
26
27RESULT=$(
28 curl -sS --fail-with-body \
29 --url "${HTTP_JSON_API}/v2/state/active-contracts" \
30 --header "Authorization: Bearer ${SENDER_TOKEN}" \
31 --header "Accept: application/json" \
32 --header "Content-Type: application/json" \
33 --request POST \
34 --data @- <<EOF
35{
36 "verbose": false,
37 "activeAtOffset": "${OFFSET}",
38 "filter": {
39 "filtersByParty": {
40 "${SENDER_PARTY_ID}": {
41 "cumulative": [{
42 "identifierFilter": {
43 "InterfaceFilter": {
44 "value": {
45 "interfaceId":"$HOLDING_INTERFACE",
46 "includeInterfaceView": true,
47 "includeCreatedEventBlob": false
48 }
49 }
50 }
51 }]
52 }
53 }
54 }
55}
56EOF
57)
58
59# Filter holdings for a specific holder, instrument ID, admin and extract contractId
60HOLDINGCIDS=$(echo "$RESULT" | jq \
61 --arg SENDER_PARTY_ID "$SENDER_PARTY_ID" \
62 --arg INSTRUMENT_ID "$INSTRUMENT_ID" \
63 --arg ADMIN_PARTY_ID "$ADMIN_PARTY_ID" \
64 '[
65 .[] as $c
66 | $c.contractEntry.JsActiveContract.createdEvent.interfaceViews[]
67 | select(
68 .viewValue.owner == $SENDER_PARTY_ID and
69 .viewValue.instrumentId.id == $INSTRUMENT_ID and
70 .viewValue.instrumentId.admin == $ADMIN_PARTY_ID and
71 .viewValue.lock == null
72 )
73 | $c.contractEntry.JsActiveContract.createdEvent.contractId
74 ]'
75)
76
77if [[ "$(echo "$HOLDINGCIDS" | jq 'length')" -eq 0 ]]; then
78 echo "No holdings found for party=${SENDER_PARTY_ID} instrument=${ADMIN_PARTY_ID}:${INSTRUMENT_ID} at offset ${OFFSET}" >&2
79 exit 1
80fi
81
82echo "--- Holdings of sender (${SENDER_USER_ID}) as of offset ${OFFSET} ---"
83echo "$HOLDINGCIDS" | jq
84
85OUTPUTFILE="${SCRIPT_DIR}/response-step-2.json"
86echo "$HOLDINGCIDS" > "$OUTPUTFILE"
The result is stored in response-step-2.json. For example:
1[
2 "00057c2874c14e045ed35051ad6657f47aba0a31b38f9110e62fdf411f7ff89fbcca1212206b4c7dc6fed0d3b2b98e9daa95b326b211b9771ffaea74d514131242a9950763"
3]
Step 3: Obtain choice context (utility backend)¶
This calls the utility backend to obtain the factory contract ID, choice context, and disclosed contracts required by the JSON API submission.
Run:
1#!/usr/bin/env bash
2
3## =================================================================================================
4## How-to Tutorial: BurnMint factory
5## Step 3: Get burn-mint choice context
6## Authorized by: anyone
7## Script: step-3-burnmint.sh
8## =================================================================================================
9
10set -euo pipefail
11
12SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13DATAFILE="${SCRIPT_DIR}/source.sh"
14source "$DATAFILE"
15
16SENDER_HOLDING_CIDS=$(cat "${SCRIPT_DIR}/response-step-2.json")
17
18if ! echo "$SENDER_HOLDING_CIDS" | jq -e 'type == "array"' >/dev/null 2>&1; then
19 echo "Error: response-step-2.json is not a JSON array of holding contract IDs" >&2
20 exit 1
21fi
22
23OUTPUTFILE="${SCRIPT_DIR}/response-step-3.json"
24
25URL="${BACKEND_API_BASE}/api/utilities/v0/registry/burn-mint-instruction/v0/burn-mint-factory"
26
27if ! curl -sS --fail-with-body \
28 --url "$URL" \
29 --header "Accept: application/json" \
30 --header "Content-Type: application/json" \
31 --request POST \
32 --output "$OUTPUTFILE" \
33 --data @- <<EOF
34{
35 "instrumentId": {
36 "admin": "${ADMIN_PARTY_ID}",
37 "id": "${INSTRUMENT_ID}"
38 },
39 "inputHoldingCids": ${SENDER_HOLDING_CIDS},
40 "outputs": [
41 {
42 "owner": "${SENDER_PARTY_ID}",
43 "amount": "${MINT_AMOUNT}"
44 }
45 ]
46}
47EOF
48then
49 echo "URL: $URL" >&2
50 echo "Response body saved to: $OUTPUTFILE" >&2
51 if [[ -s "$OUTPUTFILE" ]]; then
52 echo "--- Response body ---" >&2
53 cat "$OUTPUTFILE" >&2
54 echo >&2
55 fi
56 exit 1
57fi
58
59RESULT=$(cat "$OUTPUTFILE")
60
61echo "--- Endpoint response ---"
62echo "$RESULT" | jq
The result is stored in response-step-3.json. For example:
1{
2 "factoryId": "001958915d5347eb7069178a2f54b159ae1485d086abdd074136c22f85d4281206ca121220719c52129cd50596834117334734052d40236136eea5893fc2c5aebf01b221f7",
3 "choiceContext": {
4 "choiceContextData": {
5 "values": {
6 "utility.digitalasset.com/instrument-configuration": {
7 "tag": "AV_ContractId",
8 "value": "0077ad388c39670fb1a19a2e618b334ea120bd8bada94ca7bdac7dbaef955478d9ca121220b4693be6b307cf451594622e2e405ffecd039494279ef4aac10e8f74aa52c1f3"
9 },
10 "utility.digitalasset.com/issuer-credentials": {
11 "tag": "AV_List",
12 "value": [
13 {
14 "tag": "AV_ContractId",
15 "value": "0074ccdea7c1377581500bb0211960fdc7f553f1169d6145f70c98168616089bcdca12122065b1f6b5e1e8613458dfca8525c1c595dd485bed5e470b21c137b4e7e38fba81"
16 }
17 ]
18 },
19 "utility.digitalasset.com/featured-app-right": {
20 "tag": "AV_ContractId",
21 "value": "006e7d1f01d55f9825950c8fa3548fc5ae59bd26e59f12f5ed974b396671fad19eca12122085aa93f54944d490787dc84b880e9f56ace0bc036ebd16de64e108ff8dc4fca3"
22 },
23 "utility.digitalasset.com/app-reward-configuration": {
24 "tag": "AV_ContractId",
25 "value": "0012d2fdda91def1863c459f228859befb5860a5ad3b0a9945ad9686cf79ad0ac9ca121220cec5ddc54dc38dee46c784f47e31c6fd0e704a370545280965e333714de42be5"
26 }
27 }
28 },
29 "disclosedContracts": [
30 {
31 "createdAt": "2026-03-16T15:20:01.43Z",
32 "contractId": "0074ccdea7c1377581500bb0211960fdc7f553f1169d6145f70c98168616089bcdca12122065b1f6b5e1e8613458dfca8525c1c595dd485bed5e470b21c137b4e7e38fba81",
33 "templateId": "5a29ead611a0abd5f5b3fc3caf7d0f67c0ff802032ab6d392824aa9060e56d70:Utility.Credential.V0.Credential:Credential",
34 "domainId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
35 "createdEventBlob": "CgMyLjES1gcKRQB0zN6nwTd1gVALsCEZYP3H9VPxFp1hRfcMmBaGFgibzcoSEiBlsfa14ehhNFjfyoUlwcWV3Uhb7V5HCyHBN7Tn44+6gRIVdXRpbGl0eS1jcmVkZW50aWFsLXYwGnMKQDVhMjllYWQ2MTFhMGFiZDVmNWIzZmMzY2FmN2QwZjY3YzBmZjgwMjAzMmFiNmQzOTI4MjRhYTkwNjBlNTZkNzASB1V0aWxpdHkSCkNyZWRlbnRpYWwSAlYwEgpDcmVkZW50aWFsGgpDcmVkZW50aWFsIr4DarsDCmUKYzphc2pvZGluLWxhYi1jbGllbnQ0LW9wZXJhdG9yOjoxMjIwODRiZjkwMjIyYTE0YWMxZGE5NTYyZWVlNTE5NzZhMDgxMWM4ZTQxYjA4ZTA2YTEwZmMyMmUxZjA0MzJhODlhNApRCk86TXNlbmRlcjI6OjEyMjA4NGJmOTAyMjJhMTRhYzFkYTk1NjJlZWU1MTk3NmEwODExYzhlNDFiMDhlMDZhMTBmYzIyZTFmMDQzMmE4OWE0CgUKA0IBYQoFCgNCAWEKBAoCUgAKBAoCUgAKdgp0WnIKcGpuClEKT0JNc2VuZGVyMjo6MTIyMDg0YmY5MDIyMmExNGFjMWRhOTU2MmVlZTUxOTc2YTA4MTFjOGU0MWIwOGUwNmExMGZjMjJlMWYwNDMyYTg5YTQKDgoMQgppc0lzc3Vlck9mCgkKB0IFSU5TVDIKbQpramkKZwplYmMKYQpbOllzam9kaW4tbGFiLW9wZXJhdG9yOjoxMjIwOWZjODMyMDliYzA2ZDExZjA3ZTQ0MWVhNzg5MDU4MmNhNGJjYjQ3MTYyZWYzMGU1MzNjZWMwODA4NjAyN2JhNhICCgAqTXNlbmRlcjI6OjEyMjA4NGJmOTAyMjJhMTRhYzFkYTk1NjJlZWU1MTk3NmEwODExYzhlNDFiMDhlMDZhMTBmYzIyZTFmMDQzMmE4OWE0KmFzam9kaW4tbGFiLWNsaWVudDQtb3BlcmF0b3I6OjEyMjA4NGJmOTAyMjJhMTRhYzFkYTk1NjJlZWU1MTk3NmEwODExYzhlNDFiMDhlMDZhMTBmYzIyZTFmMDQzMmE4OWE0Mllzam9kaW4tbGFiLW9wZXJhdG9yOjoxMjIwOWZjODMyMDliYzA2ZDExZjA3ZTQ0MWVhNzg5MDU4MmNhNGJjYjQ3MTYyZWYzMGU1MzNjZWMwODA4NjAyN2JhNjkP/aTAJU0GAEIqCiYKJAgBEiDqAmCFfz5K8SUvKL4uUWO5H3mAh053JPiF5Ip3T0AziRAe"
36 },
37 {
38 "createdAt": "2026-03-14T08:30:23.746871Z",
39 "contractId": "006e7d1f01d55f9825950c8fa3548fc5ae59bd26e59f12f5ed974b396671fad19eca12122085aa93f54944d490787dc84b880e9f56ace0bc036ebd16de64e108ff8dc4fca3",
40 "templateId": "67fac2f853bce8dbf0b9817bb5ba7c59f10e8120b7c808696f7010e5f0c8a791:Splice.Amulet:FeaturedAppRight",
41 "domainId": null,
42 "createdEventBlob": "CgMyLjEStQQKRQBufR8B1V+YJZUMj6NUj8WuWb0m5Z8S9e2XSzlmcfrRnsoSEiCFqpP1SUTUkHh9yEuIDp9WrOC8A269Ft5k4Qj/jcT8oxINc3BsaWNlLWFtdWxldBpkCkA2N2ZhYzJmODUzYmNlOGRiZjBiOTgxN2JiNWJhN2M1OWYxMGU4MTIwYjdjODA4Njk2ZjcwMTBlNWYwYzhhNzkxEgZTcGxpY2USBkFtdWxldBoQRmVhdHVyZWRBcHBSaWdodCKmAWqjAQpNCks6SURTTzo6MTIyMDZjZjhlMWMwY2U2N2Q4MmQ5NjE0OTBmMWVjMzkyZjY3YzEzYmQ0OGJlNTcxZWVlZmJmYTc4MzRhNTg3YTYxMjcKUgpQOk5wcm92aWRlcjo6MTIyMDljNDY5ZGIyNDQ5Y2E1N2JhOTYxN2JmNTVmN2VlNTdiNmJlZGZlMGYxM2UyODY3N2U0MmExYWZjZTc2ZjQ4MzAqSURTTzo6MTIyMDZjZjhlMWMwY2U2N2Q4MmQ5NjE0OTBmMWVjMzkyZjY3YzEzYmQ0OGJlNTcxZWVlZmJmYTc4MzRhNTg3YTYxMjcyTnByb3ZpZGVyOjoxMjIwOWM0NjlkYjI0NDljYTU3YmE5NjE3YmY1NWY3ZWU1N2I2YmVkZmUwZjEzZTI4Njc3ZTQyYTFhZmNlNzZmNDgzMDk3iwTM90wGAEIqCiYKJAgBEiBC9aMxZOBMrVGNHzv3xRCV3H2/+M+XXxvWO4NsQL5pjBAe"
43 },
44 {
45 "createdAt": "2026-03-14T11:44:27.588Z",
46 "contractId": "0012d2fdda91def1863c459f228859befb5860a5ad3b0a9945ad9686cf79ad0ac9ca121220cec5ddc54dc38dee46c784f47e31c6fd0e704a370545280965e333714de42be5",
47 "templateId": "672e7c8762314b1ac44dabb6f7b15f53f7078a062257395618e71d07b35336eb:Utility.Registry.V0.Configuration.AppReward:AppRewardConfiguration",
48 "domainId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
49 "createdEventBlob": "CgMyLjES0gYKRQAS0v3akd7xhjxFnyKIWb77WGClrTsKmUWtlobPea0KycoSEiDOxd3FTcON7kbHhPR+Mcb9DnBKNwVFKAll4zNxTeQr5RITdXRpbGl0eS1yZWdpc3RyeS12MBqLAQpANjcyZTdjODc2MjMxNGIxYWM0NGRhYmI2ZjdiMTVmNTNmNzA3OGEwNjIyNTczOTU2MThlNzFkMDdiMzUzMzZlYhIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEglBcHBSZXdhcmQaFkFwcFJld2FyZENvbmZpZ3VyYXRpb24ihQNqggMKXQpbOllzam9kaW4tbGFiLW9wZXJhdG9yOjoxMjIwOWZjODMyMDliYzA2ZDExZjA3ZTQ0MWVhNzg5MDU4MmNhNGJjYjQ3MTYyZWYzMGU1MzNjZWMwODA4NjAyN2JhNgpSClA6TnByb3ZpZGVyOjoxMjIwOWM0NjlkYjI0NDljYTU3YmE5NjE3YmY1NWY3ZWU1N2I2YmVkZmUwZjEzZTI4Njc3ZTQyYTFhZmNlNzZmNDgzMArMAQrJAWrGAQpNCks6SURTTzo6MTIyMDZjZjhlMWMwY2U2N2Q4MmQ5NjE0OTBmMWVjMzkyZjY3YzEzYmQ0OGJlNTcxZWVlZmJmYTc4MzRhNTg3YTYxMjcKdQpzanEKXQpbOllzam9kaW4tbGFiLW9wZXJhdG9yOjoxMjIwOWZjODMyMDliYzA2ZDExZjA3ZTQ0MWVhNzg5MDU4MmNhNGJjYjQ3MTYyZWYzMGU1MzNjZWMwODA4NjAyN2JhNgoQCg4yDDAuNTAwMDAwMDAwMCpZc2pvZGluLWxhYi1vcGVyYXRvcjo6MTIyMDlmYzgzMjA5YmMwNmQxMWYwN2U0NDFlYTc4OTA1ODJjYTRiY2I0NzE2MmVmMzBlNTMzY2VjMDgwODYwMjdiYTYyTnByb3ZpZGVyOjoxMjIwOWM0NjlkYjI0NDljYTU3YmE5NjE3YmY1NWY3ZWU1N2I2YmVkZmUwZjEzZTI4Njc3ZTQyYTFhZmNlNzZmNDgzMDmg9hcw60wGAEIqCiYKJAgBEiC93ZXtGGQsp4hVlicBw/3QvNQ610YaBwbANzMiTdR4DhAe"
50 }
51 ]
52 }
53}
Step 4: Submit BurnMintFactory_BurnMint (JSON API)¶
This exercises BurnMintFactory_BurnMint on the factory contract from step 3, using the input
holding CIDs from step 2.
Run:
1#!/usr/bin/env bash
2
3## =================================================================================================
4## How-to Tutorial: BurnMint factory
5## Step 4: Exercise BurnMintFactory_BurnMint via JSON API
6## Authorized by: Token admin
7## Script: step-4-burnmint.sh
8## =================================================================================================
9
10set -euo pipefail
11
12trap 'echo "ERROR: step-4-burnmint.sh failed at line $LINENO" >&2' ERR
13
14SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
15DATAFILE="${SCRIPT_DIR}/source.sh"
16source "$DATAFILE"
17
18INPUT_HOLDING_CIDS=$(cat "${SCRIPT_DIR}/response-step-2.json")
19
20if ! echo "$INPUT_HOLDING_CIDS" | jq -e 'type == "array"' >/dev/null 2>&1; then
21 echo "Error: response-step-2.json is not a JSON array of holding contract IDs" >&2
22 exit 1
23fi
24
25FACTORYID=$(jq -c -e '.factoryId' "${SCRIPT_DIR}/response-step-3.json")
26CHOICECONTEXTDATA=$(jq -c -e '.choiceContext.choiceContextData' "${SCRIPT_DIR}/response-step-3.json")
27DISCLOSEDCONTRACTS=$(jq -c -e '.choiceContext.disclosedContracts' "${SCRIPT_DIR}/response-step-3.json")
28
29OUTPUTFILE="${SCRIPT_DIR}/response-step-4.json"
30
31if ! curl -sS --fail-with-body \
32 --url "${HTTP_JSON_API}/v2/commands/submit-and-wait-for-transaction" \
33 --header "Authorization: Bearer ${ADMIN_TOKEN}" \
34 --header "Accept: application/json" \
35 --header "Content-Type: application/json" \
36 --request POST \
37 --output "$OUTPUTFILE" \
38 --data @- <<EOF
39{
40 "commands":{
41 "commands":[
42 {
43 "ExerciseCommand":{
44 "templateId":"${BURNMINTFACTORY_INTERFACE}",
45 "contractId":${FACTORYID},
46 "choice":"BurnMintFactory_BurnMint",
47 "choiceArgument":{
48 "expectedAdmin":"${ADMIN_PARTY_ID}",
49 "instrumentId":{
50 "admin":"${ADMIN_PARTY_ID}",
51 "id":"${INSTRUMENT_ID}"
52 },
53 "inputHoldingCids":${INPUT_HOLDING_CIDS},
54 "outputs":[
55 {
56 "owner":"${SENDER_PARTY_ID}",
57 "amount":"${MINT_AMOUNT}",
58 "context":{
59 "values":{}
60 }
61 }
62 ],
63 "extraActors":[
64 "${SENDER_PARTY_ID}"
65 ],
66 "extraArgs":{
67 "context":${CHOICECONTEXTDATA},
68 "meta":{
69 "values":{}
70 }
71 }
72 }
73 }
74 }
75 ],
76 "workflowId":"",
77 "userId":"${ADMIN_USER_ID}",
78 "commandId":"$(uuidgen | tr -d '\n')",
79 "deduplicationPeriod":{
80 "DeduplicationDuration":{
81 "value":{
82 "seconds":30,
83 "nanos":0
84 }
85 }
86 },
87 "actAs":[
88 "${ADMIN_PARTY_ID}",
89 "${SENDER_PARTY_ID}"
90 ],
91 "readAs":[
92
93 ],
94 "submissionId":"$(uuidgen | tr -d '\n')",
95 "disclosedContracts": ${DISCLOSEDCONTRACTS},
96 "domainId":"",
97 "packageIdSelectionPreference":[]
98 }
99}
100EOF
101then
102 echo "Response body saved to: $OUTPUTFILE" >&2
103 if [[ -s "$OUTPUTFILE" ]]; then
104 echo "--- Response body ---" >&2
105 cat "$OUTPUTFILE" >&2
106 echo >&2
107 fi
108 exit 1
109fi
110
111RESULT=$(cat "$OUTPUTFILE")
112
113echo "--- Command response ---"
114echo "$RESULT" | jq
The result is stored in response-step-4.json. For example:
1{
2 "transaction": {
3 "updateId": "122083ca2caf3531e54f86593afdfe8c0513719ac72f6be1637a470ca8e9bae5d902",
4 "commandId": "3A9224CC-1227-4D9C-8D59-CC4F5D6581FD",
5 "workflowId": "",
6 "effectiveAt": "2026-03-16T15:27:15.928354Z",
7 "events": [
8 {
9 "ArchivedEvent": {
10 "offset": 18133,
11 "nodeId": 9,
12 "contractId": "00057c2874c14e045ed35051ad6657f47aba0a31b38f9110e62fdf411f7ff89fbcca1212206b4c7dc6fed0d3b2b98e9daa95b326b211b9771ffaea74d514131242a9950763",
13 "templateId": "112742269c282ab77490b7933f65582bc223e3bf6c120d81e0799cf0d99ecd9e:Utility.Registry.Holding.V0.Holding:Holding",
14 "witnessParties": [
15 "alice-lab-client4-operator::122084bf90222a14ac1da9562eee51976a0811c8e41b08e06a10fc22e1f0432a89a4",
16 "sender2::122084bf90222a14ac1da9562eee51976a0811c8e41b08e06a10fc22e1f0432a89a4"
17 ],
18 "packageName": "utility-registry-holding-v0",
19 "implementedInterfaces": []
20 }
21 },
22 {
23 "CreatedEvent": {
24 "offset": 18133,
25 "nodeId": 10,
26 "contractId": "0089183c8c031994f0064699332c9ca42a190075bf782d95100aaa269b3c9f75b1ca121220b4c1318b8116880e4718b1edbb076133d7b8bb8684a0ed48462d4f31205612d2",
27 "templateId": "112742269c282ab77490b7933f65582bc223e3bf6c120d81e0799cf0d99ecd9e:Utility.Registry.Holding.V0.Holding:Holding",
28 "contractKey": null,
29 "createArgument": {
30 "operator": "alice-lab-operator::12209fc83209bc06d11f07e441ea7890582ca4bcb47162ef30e533cec08086027ba6",
31 "provider": "provider::12209c469db2449ca57ba9617bf55f7ee57b6bedfe0f13e28677e42a1afce76f4830",
32 "registrar": "alice-lab-client4-operator::122084bf90222a14ac1da9562eee51976a0811c8e41b08e06a10fc22e1f0432a89a4",
33 "owner": "sender2::122084bf90222a14ac1da9562eee51976a0811c8e41b08e06a10fc22e1f0432a89a4",
34 "instrument": {
35 "source": "alice-lab-client4-operator::122084bf90222a14ac1da9562eee51976a0811c8e41b08e06a10fc22e1f0432a89a4",
36 "id": "INST2",
37 "scheme": "RegistrarInternalScheme"
38 },
39 "label": "",
40 "amount": "10.0000000000"
41 },
42 "createdEventBlob": "",
43 "interfaceViews": [],
44 "witnessParties": [
45 "alice-lab-client4-operator::122084bf90222a14ac1da9562eee51976a0811c8e41b08e06a10fc22e1f0432a89a4",
46 "sender2::122084bf90222a14ac1da9562eee51976a0811c8e41b08e06a10fc22e1f0432a89a4"
47 ],
48 "signatories": [
49 "sender2::122084bf90222a14ac1da9562eee51976a0811c8e41b08e06a10fc22e1f0432a89a4",
50 "alice-lab-client4-operator::122084bf90222a14ac1da9562eee51976a0811c8e41b08e06a10fc22e1f0432a89a4"
51 ],
52 "observers": [
53 "provider::12209c469db2449ca57ba9617bf55f7ee57b6bedfe0f13e28677e42a1afce76f4830",
54 "alice-lab-operator::12209fc83209bc06d11f07e441ea7890582ca4bcb47162ef30e533cec08086027ba6"
55 ],
56 "createdAt": "2026-03-16T15:27:15.928354Z",
57 "packageName": "utility-registry-holding-v0",
58 "representativePackageId": "112742269c282ab77490b7933f65582bc223e3bf6c120d81e0799cf0d99ecd9e",
59 "acsDelta": true
60 }
61 }
62 ],
63 "offset": 18133,
64 "synchronizerId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
65 "traceContext": {
66 "traceparent": "00-33322011fe275dfa922f20f806dacdbc-0fa98fcfd5adf0d4-01",
67 "tracestate": null
68 },
69 "recordTime": "2026-03-16T15:27:12.283677Z",
70 "externalTransactionHash": null
71 }
72}