Registry Utility - Mint Offer API Example

This example shows how to offer a mint (as the admin) and then accept that mint offer (as the minter) on CNU 0.12.x and later using the HTTP JSON API.

It is assumed that the minter has all required credentials as holder/issuer of the specific instrument (as required by your instrument configuration).

Preparation

Add all the required information to the source.sh file:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Purpose: Configurations for this example, amend variables as needed.
 5## Script: source.sh
 6## =================================================================================================
 7
 8# Receiver's details
 9MINTER_TOKEN="<PASTE_MINTER_JWT_HERE>"
10MINTER_PARTY_ID="sender::1220c29185d554cfb68fc3b974795a0c3a86e01741467173f8155d40ccd4965998b5"
11MINTER_USER_ID="sender"
12
13# Admin/Registrar details
14ADMIN_TOKEN="<PASTE_ADMIN_JWT_HERE>"
15ADMIN_PARTY_ID="admin::122072410bc1f81b7ef6abf956f424531c74a2912d41dddeb1ca33dc89f83d834389"
16ADMIN_USER_ID="admin"
17
18# Unique reference for the action
19MINT_REF="mint-ref-003"
20
21# Update your asset and amount to be transferred
22ASSET_ID="INST"
23ASSET_AMOUNT="7.0"
24
25# Endpoints (pick one)
26# - Remote: BACKEND_API="https://<your-host>/api/utilities" HTTP_JSON_API="https://<your-host>/api/json-api"
27# - DevNet: BACKEND_API="https://api.utilities.digitalasset-dev.com/api/utilities" HTTP_JSON_API="https://utility.utility.cnu.devnet.da-int.net/api/json-api"
28# - Local:  BACKEND_API="http://localhost:8080/api/utilities" HTTP_JSON_API="http://localhost:8001/api/json-api"
29BACKEND_API_BASE="https://operator-utility-alice-lab-operator.vcluster.circus-dev.da-int.net"
30HTTP_JSON_API_ADMIN="https://utility-alice-lab-client2.vcluster.circus-dev.da-int.net/api/json-api"
31HTTP_JSON_API_MINTER="https://utility-alice-lab-client3.vcluster.circus-dev.da-int.net/api/json-api"
32
33# Utility templates
34ALLOCATIONFACTORY_TEMPLATE="#utility-registry-app-v0:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory"
35MINTOFFER_TEMPLATE="#utility-registry-app-v0:Utility.Registry.App.V0.Model.Mint:MintOffer"

The required information is:

Details of

Description

Minter

JWT, user ID, and party ID of the minter (MINTER_*)

Admin

JWT, user ID, and party ID of the admin/registrar (ADMIN_*)

Operator

Utility backend base URL (BACKEND_API_BASE) and JSON API base URLs (HTTP_JSON_API_*)

Mint

Instrument ID, amount to be minted, and a unique mint reference (MINT_REF)

All scripts live in ./scripts/ and write their outputs as response-step-*.json files.

Step 1: Admin Offers a Mint

Step 1a - Access the Backend API (Mint Offer Factory)

This calls the utility backend to obtain the factory contract ID and the choice context required for offering a mint.

Run the following script:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Mint offer
 5## Step 1a: Gets choice context and disclosure for mint offer
 6## Authorized by: anyone
 7## Script: step-1a-mint-offer.sh
 8## =================================================================================================
 9
10SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11DATAFILE="${SCRIPT_DIR}/source.sh"
12source "$DATAFILE"
13
14RESULT=$(
15    curl -sS --fail-with-body \
16    --url "${BACKEND_API_BASE}/api/utilities/v0/registry/mint/v0/offer" \
17    --header "Content-Type: application/json" \
18    --request POST \
19    --data @- <<EOF
20{
21  "holder": "${MINTER_PARTY_ID}",
22  "instrumentId": {
23    "admin": "${ADMIN_PARTY_ID}",
24    "id": "${ASSET_ID}"
25  }
26}
27EOF
28)
29
30echo "--- Endpoint response ---"
31echo "$RESULT" | jq
32
33OUTPUTFILE="${SCRIPT_DIR}/response-step-1a.json"
34echo "$RESULT" > "$OUTPUTFILE"

The result is stored in response-step-1a.json. For example:

 1{
 2    "factoryId": "00459ff699b7f5d615df55589cff296cb5df23ca56b30647d6ca3edce7c49a83d0ca121220df02611c5ad7b85d993a00ea5376cdee09ecc78407c4207f5669652f9183e6d0",
 3    "choiceContext": {
 4        "choiceContextData": {
 5            "values": {
 6                "utility.digitalasset.com/instrument-configuration": {
 7                    "tag": "AV_ContractId",
 8                    "value": "00473fed86df9273817d431822c7fa962c56b189c57d3f10fc97d7ff414b1646dbca121220e5d05499ef66afcb63c38d53418d74629952012757bf900dc7a471fc3d6e723e"
 9                },
10                "utility.digitalasset.com/issuer-credentials": {
11                    "tag": "AV_List",
12                    "value": [
13                        {
14                            "tag": "AV_ContractId",
15                            "value": "0023003ec37db94b50be06600d32b17d2454a88a91ca38fe3ec8ee4c1372601be2ca12122062b10f5a837189539e14223b8e90ad6505855efc9b4157ef0aff95e25cc62ef7"
16                        }
17                    ]
18                }
19            }
20        },
21        "disclosedContracts": [
22            {
23                "createdAt": "2026-03-14T15:33:15.527Z",
24                "contractId": "0023003ec37db94b50be06600d32b17d2454a88a91ca38fe3ec8ee4c1372601be2ca12122062b10f5a837189539e14223b8e90ad6505855efc9b4157ef0aff95e25cc62ef7",
25                "templateId": "5a29ead611a0abd5f5b3fc3caf7d0f67c0ff802032ab6d392824aa9060e56d70:Utility.Credential.V0.Credential:Credential",
26                "domainId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
27                "createdEventBlob": "CgMyLjESqAcKRQAjAD7DfblLUL4GYA0ysX0kVKiKkco4/j7I7kwTcmAb4soSEiBisQ9ag3GJU54UIjuOkK1lBYVe/JtBV+8K/5XiXMYu9xIVdXRpbGl0eS1jcmVkZW50aWFsLXYwGnMKQDVhMjllYWQ2MTFhMGFiZDVmNWIzZmMzY2FmN2QwZjY3YzBmZjgwMjAzMmFiNmQzOTI4MjRhYTkwNjBlNTZkNzASB1V0aWxpdHkSCkNyZWRlbnRpYWwSAlYwEgpDcmVkZW50aWFsGgpDcmVkZW50aWFsIqYDaqMDCk8KTTpLYWRtaW46OjEyMjA3MjQxMGJjMWY4MWI3ZWY2YWJmOTU2ZjQyNDUzMWM3NGEyOTEyZDQxZGRkZWIxY2EzM2RjODlmODNkODM0Mzg5ClAKTjpMc2VuZGVyOjoxMjIwYzI5MTg1ZDU1NGNmYjY4ZmMzYjk3NDc5NWEwYzNhODZlMDE3NDE0NjcxNzNmODE1NWQ0MGNjZDQ5NjU5OThiNQoFCgNCAWIKBQoDQgFiCgQKAlIACgQKAlIACnQKclpwCm5qbApQCk5CTHNlbmRlcjo6MTIyMGMyOTE4NWQ1NTRjZmI2OGZjM2I5NzQ3OTVhMGMzYTg2ZTAxNzQxNDY3MTczZjgxNTVkNDBjY2Q0OTY1OTk4YjUKDgoMQgppc0lzc3Vlck9mCggKBkIESU5TVApuCmxqagpoCmZiZApiClw6WmZyaWJlcmctbGFiLW9wZXJhdG9yOjoxMjIwYjc4NTk5NDNhYzc1NWMxMjI0OTJkMWU0OWRkYzFmY2EzNzk2NjdlZWI5NmVjYjhmOWFlNzQyZTMyNjAyYThkNxICCgAqS2FkbWluOjoxMjIwNzI0MTBiYzFmODFiN2VmNmFiZjk1NmY0MjQ1MzFjNzRhMjkxMmQ0MWRkZGViMWNhMzNkYzg5ZjgzZDgzNDM4OSpMc2VuZGVyOjoxMjIwYzI5MTg1ZDU1NGNmYjY4ZmMzYjk3NDc5NWEwYzNhODZlMDE3NDE0NjcxNzNmODE1NWQ0MGNjZDQ5NjU5OThiNTJaZnJpYmVyZy1sYWItb3BlcmF0b3I6OjEyMjBiNzg1OTk0M2FjNzU1YzEyMjQ5MmQxZTQ5ZGRjMWZjYTM3OTY2N2VlYjk2ZWNiOGY5YWU3NDJlMzI2MDJhOGQ3ORQ3Z57rTAYAQioKJgokCAESIHvxLRQFXaHaQL4yyb2Ea0/sLu1KMTOg42Zsdblxx4I4EB4="
28            }
29        ]
30    }
31}

Step 1b - Offer the Mint (JSON API submit)

Submit AllocationFactory_OfferMint as the admin:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Mint offer
 5## Step 1b: Executes the mint offer command
 6## Authorized by: Minter
 7## Script: step-1b-mint-offer.sh
 8## =================================================================================================
 9
10SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11DATAFILE="${SCRIPT_DIR}/source.sh"
12source "$DATAFILE"
13
14DATE_FORMAT='+%Y-%m-%dT%H:%M:%SZ'
15NOW_ISO_TIMESTAMP=$(date -u "$DATE_FORMAT")
16ONEHOUR_ISO_TIMESTAMP=$(date -u -d '+1 hour' "$DATE_FORMAT")
17
18JSONCONTENT=$(cat "${SCRIPT_DIR}/response-step-1a.json")
19FACTORYID=$(echo $JSONCONTENT | jq .factoryId)
20CHOICECONTEXTDATA=$(echo $JSONCONTENT | jq .choiceContext.choiceContextData)
21DISCLOSEDCONTRACTS=$(echo $JSONCONTENT | jq .choiceContext.disclosedContracts)
22
23RESULT=$(
24    curl -sS --fail-with-body \
25    --url "${HTTP_JSON_API_ADMIN}/v2/commands/submit-and-wait-for-transaction" \
26    --header "Authorization: Bearer ${ADMIN_TOKEN}" \
27    --header "Content-Type: application/json" \
28    --request POST \
29    --data @- <<EOF
30{
31   "commands":{
32        "commands":[
33            {
34                "ExerciseCommand":{
35                    "templateId":"${ALLOCATIONFACTORY_TEMPLATE}",
36                    "contractId":${FACTORYID},
37                    "choice":"AllocationFactory_OfferMint",
38                    "choiceArgument":{
39                        "expectedAdmin":"${ADMIN_PARTY_ID}",
40                        "mint": {
41                            "instrumentId": {
42                              "admin": "${ADMIN_PARTY_ID}",
43                              "id": "${ASSET_ID}"
44                            },
45                            "amount": "${ASSET_AMOUNT}",
46                            "holder": "${MINTER_PARTY_ID}",
47                            "reference": "${MINT_REF}",
48                            "requestedAt": "${NOW_ISO_TIMESTAMP}",
49                            "executeBefore": "${ONEHOUR_ISO_TIMESTAMP}",
50                            "meta": {
51                              "values": {}
52                            }
53                        },
54                        "extraArgs":{
55                            "context":${CHOICECONTEXTDATA},
56                            "meta":{
57                                "values":{
58                                }
59                            }
60                        }
61                    }
62                }
63            }
64        ],
65        "workflowId":"",
66        "userId":"${ADMIN_USER_ID}",
67        "commandId":"$(uuidgen | tr -d '\n')",
68        "deduplicationPeriod":{
69            "DeduplicationDuration":{
70                "value":{
71                    "seconds":30,
72                    "nanos":0
73                }
74            }
75        },
76        "actAs":[
77            "${ADMIN_PARTY_ID}"
78        ],
79        "readAs":[
80        ],
81        "submissionId":"$(uuidgen | tr -d '\n')",
82        "disclosedContracts": ${DISCLOSEDCONTRACTS},
83        "domainId":"",
84        "packageIdSelectionPreference":[
85        ]
86    }
87}
88EOF
89)
90
91echo "--- Command response ---"
92echo "$RESULT" | jq
93
94OUTPUTFILE="${SCRIPT_DIR}/response-step-1b.json"
95echo "$RESULT" > "$OUTPUTFILE"

The result is stored in response-step-1b.json (command response). For example:

 1{
 2    "transaction": {
 3        "updateId": "122044fb3d7234e153b5e9308bad20d2238b2cc1bf5bf00d1e41ae9fb5d01a565aa9",
 4        "commandId": "D9A528F1-FD8E-4BB4-B73C-73EE594FE44E",
 5        "workflowId": "",
 6        "effectiveAt": "2026-03-16T16:30:10.812748Z",
 7        "events": [
 8            {
 9                "CreatedEvent": {
10                    "offset": 16712,
11                    "nodeId": 3,
12                    "contractId": "00456f7f73d5902ae96179e78e7478e30b501d0a6e8d853a835293776b1935a235ca12122039f476dc593a4480bb96f8dd95f6b11aef0583cadecd89be1253743cc016c079",
13                    "templateId": "aca349df9f3c0e61d8b3e5d3282f0e6e1c60d89a70c96d21ed36414fe8c13a6a:Utility.Registry.App.V0.Model.Mint:MintOffer",
14                    "contractKey": null,
15                    "createArgument": {
16                        "operator": "alice-lab-operator::1220b7859943ac755c122492d1e49ddc1fca379667eeb96ecb8f9ae742e32602a8d7",
17                        "provider": "provider::1220d811ead419cd997d10794eb7c5fee7115d52d20d85606d2eb5a9bdccbcef4088",
18                        "mint": {
19                            "instrumentId": {
20                                "admin": "admin::122072410bc1f81b7ef6abf956f424531c74a2912d41dddeb1ca33dc89f83d834389",
21                                "id": "INST"
22                            },
23                            "amount": "7.0000000000",
24                            "holder": "sender::1220c29185d554cfb68fc3b974795a0c3a86e01741467173f8155d40ccd4965998b5",
25                            "reference": "mint-ref-003",
26                            "requestedAt": "2026-03-16T16:30:10Z",
27                            "executeBefore": "2026-03-16T17:30:10Z",
28                            "meta": {
29                                "values": {}
30                            }
31                        }
32                    },
33                    "createdEventBlob": "",
34                    "interfaceViews": [],
35                    "witnessParties": [
36                        "admin::122072410bc1f81b7ef6abf956f424531c74a2912d41dddeb1ca33dc89f83d834389"
37                    ],
38                    "signatories": [
39                        "admin::122072410bc1f81b7ef6abf956f424531c74a2912d41dddeb1ca33dc89f83d834389",
40                        "provider::1220d811ead419cd997d10794eb7c5fee7115d52d20d85606d2eb5a9bdccbcef4088"
41                    ],
42                    "observers": [
43                        "alice-lab-operator::1220b7859943ac755c122492d1e49ddc1fca379667eeb96ecb8f9ae742e32602a8d7",
44                        "sender::1220c29185d554cfb68fc3b974795a0c3a86e01741467173f8155d40ccd4965998b5"
45                    ],
46                    "createdAt": "2026-03-16T16:30:10.812748Z",
47                    "packageName": "utility-registry-app-v0",
48                    "representativePackageId": "aca349df9f3c0e61d8b3e5d3282f0e6e1c60d89a70c96d21ed36414fe8c13a6a",
49                    "acsDelta": true
50                }
51            }
52        ],
53        "offset": 16712,
54        "synchronizerId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
55        "traceContext": {
56            "traceparent": "00-22d5b5f8dbd7f1cf1352c235a95a900e-c4b794f29e0e5713-01",
57            "tracestate": null
58        },
59        "recordTime": "2026-03-16T16:30:11.281536Z",
60        "externalTransactionHash": null
61    }
62}

Step 2: Minter Accepts the Mint Offer

Step 2a - Obtain the Ledger End Offset

Run the following script to obtain the ledger end offset:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Accept mint offer
 5## Step 2a: Obtains ledger end offset
 6## Authorized by: Minter
 7## Script: step-2a-mint-offer-accept.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
15OFFSET=$(curl -sS --fail-with-body --request GET \
16    --url "${HTTP_JSON_API_MINTER}/v2/state/ledger-end" \
17    --header "Accept: application/json" \
18    --header "Authorization: Bearer ${MINTER_TOKEN}")
19
20echo "$OFFSET" | jq
21
22OUTPUTFILE="${SCRIPT_DIR}/response-step-2a.json"
23echo "$OFFSET" > "$OUTPUTFILE"

The result is stored in response-step-2a.json. For example:

1{
2    "offset": 16600
3}

Step 2b - Retrieve Mint Offer

To retrieve the Mint Offer created in step 1b, run:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Accept mint offer
 5## Step 2b: Retrieves the mint offer to accept
 6## Authorized by: Minter
 7## Script: step-2b-mint-offer-accept.sh
 8## =================================================================================================
 9
10SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11DATAFILE="${SCRIPT_DIR}/source.sh"
12source "$DATAFILE"
13
14JSONCONTENT=$(cat "${SCRIPT_DIR}/response-step-2a.json")
15OFFSET=$(echo "$JSONCONTENT" | jq -r ".offset")
16
17RESULT=$(
18    curl -sS --fail-with-body \
19    --url "${HTTP_JSON_API_MINTER}/v2/state/active-contracts" \
20    --header "Authorization: Bearer ${MINTER_TOKEN}" \
21    --header "Content-Type: application/json" \
22    --request POST \
23    --data @- <<EOF
24{
25    "verbose": false,
26    "activeAtOffset": "${OFFSET}",
27    "filter": {
28        "filtersByParty": {
29            "${MINTER_PARTY_ID}": {
30                "cumulative": [{
31                    "identifierFilter": {
32                        "TemplateFilter": {
33                            "value": {
34                                "templateId":"${MINTOFFER_TEMPLATE}",
35                                "includeCreatedEventBlob": false
36                            }
37                        }
38                    }
39                }]
40            }
41        }
42    }
43}
44EOF
45)
46
47echo "--- Mint Offer ---"
48echo "$RESULT" | jq
49
50OUTPUTFILE="${SCRIPT_DIR}/response-step-2b.json"
51echo "$RESULT" > "$OUTPUTFILE"

The result is stored in response-step-2b.json. For example:

 1[
 2    {
 3        "workflowId": "",
 4        "contractEntry": {
 5            "JsActiveContract": {
 6                "createdEvent": {
 7                    "offset": 16598,
 8                    "nodeId": 3,
 9                    "contractId": "00456f7f73d5902ae96179e78e7478e30b501d0a6e8d853a835293776b1935a235ca12122039f476dc593a4480bb96f8dd95f6b11aef0583cadecd89be1253743cc016c079",
10                    "templateId": "aca349df9f3c0e61d8b3e5d3282f0e6e1c60d89a70c96d21ed36414fe8c13a6a:Utility.Registry.App.V0.Model.Mint:MintOffer",
11                    "contractKey": null,
12                    "createArgument": {
13                        "operator": "alice-lab-operator::1220b7859943ac755c122492d1e49ddc1fca379667eeb96ecb8f9ae742e32602a8d7",
14                        "provider": "provider::1220d811ead419cd997d10794eb7c5fee7115d52d20d85606d2eb5a9bdccbcef4088",
15                        "mint": {
16                            "instrumentId": {
17                                "admin": "admin::122072410bc1f81b7ef6abf956f424531c74a2912d41dddeb1ca33dc89f83d834389",
18                                "id": "INST"
19                            },
20                            "amount": "7.0000000000",
21                            "holder": "sender::1220c29185d554cfb68fc3b974795a0c3a86e01741467173f8155d40ccd4965998b5",
22                            "reference": "mint-ref-003",
23                            "requestedAt": "2026-03-16T16:30:10Z",
24                            "executeBefore": "2026-03-16T17:30:10Z",
25                            "meta": {
26                                "values": {}
27                            }
28                        }
29                    },
30                    "createdEventBlob": "",
31                    "interfaceViews": [],
32                    "witnessParties": [
33                        "sender::1220c29185d554cfb68fc3b974795a0c3a86e01741467173f8155d40ccd4965998b5"
34                    ],
35                    "signatories": [
36                        "admin::122072410bc1f81b7ef6abf956f424531c74a2912d41dddeb1ca33dc89f83d834389",
37                        "provider::1220d811ead419cd997d10794eb7c5fee7115d52d20d85606d2eb5a9bdccbcef4088"
38                    ],
39                    "observers": [
40                        "alice-lab-operator::1220b7859943ac755c122492d1e49ddc1fca379667eeb96ecb8f9ae742e32602a8d7",
41                        "sender::1220c29185d554cfb68fc3b974795a0c3a86e01741467173f8155d40ccd4965998b5"
42                    ],
43                    "createdAt": "2026-03-16T16:30:10.812748Z",
44                    "packageName": "utility-registry-app-v0",
45                    "representativePackageId": "aca349df9f3c0e61d8b3e5d3282f0e6e1c60d89a70c96d21ed36414fe8c13a6a",
46                    "acsDelta": true
47                },
48                "synchronizerId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
49                "reassignmentCounter": 0
50            }
51        }
52    }
53]

Step 2c - Access the Backend API

This calls the utility backend to obtain the choice context and disclosed contracts required to accept the mint offer.

Run:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Accept mint offer
 5## Step 2c: Gets choice context and disclosure for the mint offer to accept
 6## Authorized by: anyone
 7## Script: step-2c-mint-offer-accept.sh
 8## =================================================================================================
 9
10SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11DATAFILE="${SCRIPT_DIR}/source.sh"
12source "$DATAFILE"
13
14MINTOFFERS=$(cat "${SCRIPT_DIR}/response-step-2b.json")
15MINTOFFER_CID=$(echo "$MINTOFFERS" | jq -r --arg MINT_REF "$MINT_REF" '[.[] | select(.contractEntry.JsActiveContract.createdEvent.createArgument.mint.reference == $MINT_REF)][0].contractEntry.JsActiveContract.createdEvent.contractId')
16
17RESULT=$(
18    curl -sS --fail-with-body \
19    --url "${BACKEND_API_BASE}/api/utilities/v0/registry/mint/v0/offer/${MINTOFFER_CID}/choice-contexts/accept" \
20    --header "Content-Type: application/json" \
21    --request POST \
22    --data @- <<EOF
23{
24   "meta":{
25
26   },
27   "excludeDebugFields": true
28}
29EOF
30)
31
32echo "--- Endpoint response ---"
33echo "$RESULT" | jq
34
35OUTPUTFILE="${SCRIPT_DIR}/response-step-2c.json"
36echo "$RESULT" > "$OUTPUTFILE"

The result is stored in response-step-2c.json. For example:

 1{
 2    "choiceContextData": {
 3        "values": {
 4            "utility.digitalasset.com/instrument-configuration": {
 5                "tag": "AV_ContractId",
 6                "value": "00473fed86df9273817d431822c7fa962c56b189c57d3f10fc97d7ff414b1646dbca121220e5d05499ef66afcb63c38d53418d74629952012757bf900dc7a471fc3d6e723e"
 7            },
 8            "utility.digitalasset.com/issuer-credentials": {
 9                "tag": "AV_List",
10                "value": [
11                    {
12                        "tag": "AV_ContractId",
13                        "value": "0023003ec37db94b50be06600d32b17d2454a88a91ca38fe3ec8ee4c1372601be2ca12122062b10f5a837189539e14223b8e90ad6505855efc9b4157ef0aff95e25cc62ef7"
14                    }
15                ]
16            },
17            "utility.digitalasset.com/enable-result-contracts": {
18                "tag": "AV_Bool",
19                "value": true
20            }
21        }
22    },
23    "disclosedContracts": [
24        {
25            "createdAt": "2026-03-14T15:33:15.527Z",
26            "contractId": "00473fed86df9273817d431822c7fa962c56b189c57d3f10fc97d7ff414b1646dbca121220e5d05499ef66afcb63c38d53418d74629952012757bf900dc7a471fc3d6e723e",
27            "templateId": "b83fe011748c9c0f07e0ad4c5bf72bfb6ca7a32296b5ec94cc615916aee30666:Utility.Registry.V0.Configuration.Instrument:InstrumentConfiguration",
28            "domainId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
29            "createdEventBlob": "CgMyLjESpwkKRQBHP+2G35JzgX1DGCLH+pYsVrGJxX0/EPyX1/9BSxZG28oSEiDl0FSZ72avy2PDjVNBjXRimVIBJ1e/kA3HpHH8PW5yPhITdXRpbGl0eS1yZWdpc3RyeS12MBqNAQpAYjgzZmUwMTE3NDhjOWMwZjA3ZTBhZDRjNWJmNzJiZmI2Y2E3YTMyMjk2YjVlYzk0Y2M2MTU5MTZhZWUzMDY2NhIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEgpJbnN0cnVtZW50GhdJbnN0cnVtZW50Q29uZmlndXJhdGlvbiKKBWqHBQpeClw6WmZyaWJlcmctbGFiLW9wZXJhdG9yOjoxMjIwYjc4NTk5NDNhYzc1NWMxMjI0OTJkMWU0OWRkYzFmY2EzNzk2NjdlZWI5NmVjYjhmOWFlNzQyZTMyNjAyYThkNwpSClA6TnByb3ZpZGVyOjoxMjIwZDgxMWVhZDQxOWNkOTk3ZDEwNzk0ZWI3YzVmZWU3MTE1ZDUyZDIwZDg1NjA2ZDJlYjVhOWJkY2NiY2VmNDA4OApPCk06S2FkbWluOjoxMjIwNzI0MTBiYzFmODFiN2VmNmFiZjk1NmY0MjQ1MzFjNzRhMjkxMmQ0MWRkZGViMWNhMzNkYzg5ZjgzZDgzNDM4OQp8CnpqeApPCk06S2FkbWluOjoxMjIwNzI0MTBiYzFmODFiN2VmNmFiZjk1NmY0MjQ1MzFjNzRhMjkxMmQ0MWRkZGViMWNhMzNkYzg5ZjgzZDgzNDM4OQoICgZCBElOU1QKGwoZQhdSZWdpc3RyYXJJbnRlcm5hbFNjaGVtZQoECgJaAAp9CntaeQp3anUKTwpNOkthZG1pbjo6MTIyMDcyNDEwYmMxZjgxYjdlZjZhYmY5NTZmNDI0NTMxYzc0YTI5MTJkNDFkZGRlYjFjYTMzZGM4OWY4M2Q4MzQzODkKIgogWh4KHGoaCg4KDEIKaXNJc3N1ZXJPZgoICgZCBElOU1QKfQp7WnkKd2p1Ck8KTTpLYWRtaW46OjEyMjA3MjQxMGJjMWY4MWI3ZWY2YWJmOTU2ZjQyNDUzMWM3NGEyOTEyZDQxZGRkZWIxY2EzM2RjODlmODNkODM0Mzg5CiIKIFoeChxqGgoOCgxCCmlzSG9sZGVyT2YKCAoGQgRJTlNUKkthZG1pbjo6MTIyMDcyNDEwYmMxZjgxYjdlZjZhYmY5NTZmNDI0NTMxYzc0YTI5MTJkNDFkZGRlYjFjYTMzZGM4OWY4M2Q4MzQzODkqTnByb3ZpZGVyOjoxMjIwZDgxMWVhZDQxOWNkOTk3ZDEwNzk0ZWI3YzVmZWU3MTE1ZDUyZDIwZDg1NjA2ZDJlYjVhOWJkY2NiY2VmNDA4ODJaZnJpYmVyZy1sYWItb3BlcmF0b3I6OjEyMjBiNzg1OTk0M2FjNzU1YzEyMjQ5MmQxZTQ5ZGRjMWZjYTM3OTY2N2VlYjk2ZWNiOGY5YWU3NDJlMzI2MDJhOGQ3ORCBkE3rTAYAQioKJgokCAESINP3jllGgJCRjyJ63mEcyVt+b5oy6xJ9x6y6Ra0uhoWjEB4="
30        },
31        {
32            "createdAt": "2026-03-14T15:33:15.527Z",
33            "contractId": "0023003ec37db94b50be06600d32b17d2454a88a91ca38fe3ec8ee4c1372601be2ca12122062b10f5a837189539e14223b8e90ad6505855efc9b4157ef0aff95e25cc62ef7",
34            "templateId": "5a29ead611a0abd5f5b3fc3caf7d0f67c0ff802032ab6d392824aa9060e56d70:Utility.Credential.V0.Credential:Credential",
35            "domainId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
36            "createdEventBlob": "CgMyLjESqAcKRQAjAD7DfblLUL4GYA0ysX0kVKiKkco4/j7I7kwTcmAb4soSEiBisQ9ag3GJU54UIjuOkK1lBYVe/JtBV+8K/5XiXMYu9xIVdXRpbGl0eS1jcmVkZW50aWFsLXYwGnMKQDVhMjllYWQ2MTFhMGFiZDVmNWIzZmMzY2FmN2QwZjY3YzBmZjgwMjAzMmFiNmQzOTI4MjRhYTkwNjBlNTZkNzASB1V0aWxpdHkSCkNyZWRlbnRpYWwSAlYwEgpDcmVkZW50aWFsGgpDcmVkZW50aWFsIqYDaqMDCk8KTTpLYWRtaW46OjEyMjA3MjQxMGJjMWY4MWI3ZWY2YWJmOTU2ZjQyNDUzMWM3NGEyOTEyZDQxZGRkZWIxY2EzM2RjODlmODNkODM0Mzg5ClAKTjpMc2VuZGVyOjoxMjIwYzI5MTg1ZDU1NGNmYjY4ZmMzYjk3NDc5NWEwYzNhODZlMDE3NDE0NjcxNzNmODE1NWQ0MGNjZDQ5NjU5OThiNQoFCgNCAWIKBQoDQgFiCgQKAlIACgQKAlIACnQKclpwCm5qbApQCk5CTHNlbmRlcjo6MTIyMGMyOTE4NWQ1NTRjZmI2OGZjM2I5NzQ3OTVhMGMzYTg2ZTAxNzQxNDY3MTczZjgxNTVkNDBjY2Q0OTY1OTk4YjUKDgoMQgppc0lzc3Vlck9mCggKBkIESU5TVApuCmxqagpoCmZiZApiClw6WmZyaWJlcmctbGFiLW9wZXJhdG9yOjoxMjIwYjc4NTk5NDNhYzc1NWMxMjI0OTJkMWU0OWRkYzFmY2EzNzk2NjdlZWI5NmVjYjhmOWFlNzQyZTMyNjAyYThkNxICCgAqS2FkbWluOjoxMjIwNzI0MTBiYzFmODFiN2VmNmFiZjk1NmY0MjQ1MzFjNzRhMjkxMmQ0MWRkZGViMWNhMzNkYzg5ZjgzZDgzNDM4OSpMc2VuZGVyOjoxMjIwYzI5MTg1ZDU1NGNmYjY4ZmMzYjk3NDc5NWEwYzNhODZlMDE3NDE0NjcxNzNmODE1NWQ0MGNjZDQ5NjU5OThiNTJaZnJpYmVyZy1sYWItb3BlcmF0b3I6OjEyMjBiNzg1OTk0M2FjNzU1YzEyMjQ5MmQxZTQ5ZGRjMWZjYTM3OTY2N2VlYjk2ZWNiOGY5YWU3NDJlMzI2MDJhOGQ3ORQ3Z57rTAYAQioKJgokCAESIHvxLRQFXaHaQL4yyb2Ea0/sLu1KMTOg42Zsdblxx4I4EB4="
37        }
38    ]
39}

Step 2d - Accept the Mint Offer (JSON API submit)

To accept the mint offer and finalize the mint, execute:

  1#!/usr/bin/env bash
  2
  3## =================================================================================================
  4## Accept mint offer
  5## Step 2d: Exercises the accept choice on the mint offer
  6## Authorized by: Minter
  7## Script: step-2d-mint-offer-accept.sh
  8## =================================================================================================
  9
 10set -euo pipefail
 11
 12trap 'echo "ERROR: step-2d-mint-offer-accept.sh failed at line $LINENO" >&2' ERR
 13
 14SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
 15DATAFILE="${SCRIPT_DIR}/source.sh"
 16source "$DATAFILE"
 17
 18MINTOFFERS=$(cat "${SCRIPT_DIR}/response-step-2b.json")
 19MINTOFFER=$(echo "$MINTOFFERS" | jq -r --arg MINT_REF "$MINT_REF" '[.[] | select(.contractEntry.JsActiveContract.createdEvent.createArgument.mint.reference == $MINT_REF)][0]')
 20MINTOFFER_CID=$(echo "$MINTOFFER" | jq -r .contractEntry.JsActiveContract.createdEvent.contractId)
 21MINTOFFER_TEMPLATE=$(echo "$MINTOFFER" | jq -r .contractEntry.JsActiveContract.createdEvent.templateId)
 22
 23if [[ -z "${MINTOFFER_CID}" || "${MINTOFFER_CID}" == "null" ]]; then
 24    echo "Error: no MintOffer found in response-step-2b.json for MINT_REF=${MINT_REF}" >&2
 25    echo "Hint: rerun step-2a and step-2b to refresh the active-contracts view." >&2
 26    exit 1
 27fi
 28
 29JSONCONTENT=$(cat "${SCRIPT_DIR}/response-step-2c.json")
 30CHOICECONTEXTDATA=$(jq -c -e '.choiceContextData' <<<"$JSONCONTENT")
 31DISCLOSEDCONTRACTS=$(jq -c -e '(.disclosedContracts // [])' <<<"$JSONCONTENT")
 32
 33OUTPUTFILE="${SCRIPT_DIR}/response-step-2d.json"
 34
 35if ! curl -sS --fail-with-body \
 36    --url "${HTTP_JSON_API_MINTER}/v2/commands/submit-and-wait-for-transaction" \
 37    --header "Authorization: Bearer ${MINTER_TOKEN}" \
 38    --header "Accept: application/json" \
 39    --header "Content-Type: application/json" \
 40    --request POST \
 41    --output "$OUTPUTFILE" \
 42    --data @- <<EOF
 43{
 44   "commands":{
 45        "commands":[
 46            {
 47                "ExerciseCommand":{
 48                    "templateId":"${MINTOFFER_TEMPLATE}",
 49                    "contractId":"${MINTOFFER_CID}",
 50                    "choice":"MintOffer_Accept",
 51                    "choiceArgument":{
 52                        "extraArgs": {
 53                            "context": $CHOICECONTEXTDATA,
 54                            "meta":{
 55                                "values":{
 56                                }
 57                            }
 58                        }
 59                    }
 60                }
 61            }
 62        ],
 63        "workflowId":"",
 64        "userId":"${MINTER_USER_ID}",
 65        "commandId":"$(uuidgen | tr -d '\n')",
 66        "deduplicationPeriod":{
 67            "DeduplicationDuration":{
 68                "value":{
 69                    "seconds":30,
 70                    "nanos":0
 71                }
 72            }
 73        },
 74        "actAs":[
 75            "${MINTER_PARTY_ID}"
 76        ],
 77        "readAs":[
 78        ],
 79        "submissionId":"$(uuidgen | tr -d '\n')",
 80        "disclosedContracts": ${DISCLOSEDCONTRACTS},
 81        "domainId":"",
 82        "packageIdSelectionPreference":[]
 83    }
 84}
 85EOF
 86then
 87    echo "Response body saved to: $OUTPUTFILE" >&2
 88    if [[ -s "$OUTPUTFILE" ]]; then
 89        echo "--- Response body ---" >&2
 90        cat "$OUTPUTFILE" >&2
 91        echo >&2
 92
 93                if jq -e --arg cid "$MINTOFFER_CID" '
 94                    (.code? == "CONTRACT_NOT_FOUND") and
 95                    ((.cause? // "") | contains($cid))
 96                ' >/dev/null 2>&1 <"$OUTPUTFILE"; then
 97                    echo "Hint: the MintOffer contract was likely already accepted/archived (re-running step 2d is not idempotent)." >&2
 98                    echo "Next:" >&2
 99                    echo "- Rerun steps 2a/2b/2c to refresh the MintOffer CID, then run 2d again." >&2
100                    echo "- If you want a brand new offer, pick a new MINT_REF in source.sh and rerun the offer-creation steps." >&2
101                fi
102    fi
103    exit 1
104fi
105
106RESULT=$(cat "$OUTPUTFILE")
107
108echo "--- Command response ---"
109echo "$RESULT" | jq

The result is stored in response-step-2d.json (command response). For example:

  1{
  2    "transaction": {
  3        "updateId": "1220c37dbda376eb639feb67155502b787b8fba56f23d04fb5c4077d66f7d75cd7d4",
  4        "commandId": "F3576323-037C-49C5-B17E-A43D4434E2F2",
  5        "workflowId": "",
  6        "effectiveAt": "2026-03-16T16:30:45.264033Z",
  7        "events": [
  8            {
  9                "ArchivedEvent": {
 10                    "offset": 16601,
 11                    "nodeId": 0,
 12                    "contractId": "00456f7f73d5902ae96179e78e7478e30b501d0a6e8d853a835293776b1935a235ca12122039f476dc593a4480bb96f8dd95f6b11aef0583cadecd89be1253743cc016c079",
 13                    "templateId": "aca349df9f3c0e61d8b3e5d3282f0e6e1c60d89a70c96d21ed36414fe8c13a6a:Utility.Registry.App.V0.Model.Mint:MintOffer",
 14                    "witnessParties": [
 15                        "sender::1220c29185d554cfb68fc3b974795a0c3a86e01741467173f8155d40ccd4965998b5"
 16                    ],
 17                    "packageName": "utility-registry-app-v0",
 18                    "implementedInterfaces": []
 19                }
 20            },
 21            {
 22                "CreatedEvent": {
 23                    "offset": 16601,
 24                    "nodeId": 3,
 25                    "contractId": "00f444d8b989430a83d44b697c04e0eb03dd7048eb697505fb3131275682c67595ca121220e077c69c1b8d489468baadbfb70c3049e6ed3019ab9d6c62743d811d3a4f1dfd",
 26                    "templateId": "8107899ac4723ce986bf7d27416534e576e54b92161e46150a595fb78ff3d3a1:Utility.Registry.Holding.V0.Holding:Holding",
 27                    "contractKey": null,
 28                    "createArgument": {
 29                        "operator": "alice-lab-operator::1220b7859943ac755c122492d1e49ddc1fca379667eeb96ecb8f9ae742e32602a8d7",
 30                        "provider": "provider::1220d811ead419cd997d10794eb7c5fee7115d52d20d85606d2eb5a9bdccbcef4088",
 31                        "registrar": "admin::122072410bc1f81b7ef6abf956f424531c74a2912d41dddeb1ca33dc89f83d834389",
 32                        "owner": "sender::1220c29185d554cfb68fc3b974795a0c3a86e01741467173f8155d40ccd4965998b5",
 33                        "instrument": {
 34                            "source": "admin::122072410bc1f81b7ef6abf956f424531c74a2912d41dddeb1ca33dc89f83d834389",
 35                            "id": "INST",
 36                            "scheme": "RegistrarInternalScheme"
 37                        },
 38                        "label": "",
 39                        "amount": "7.0000000000"
 40                    },
 41                    "createdEventBlob": "",
 42                    "interfaceViews": [],
 43                    "witnessParties": [
 44                        "sender::1220c29185d554cfb68fc3b974795a0c3a86e01741467173f8155d40ccd4965998b5"
 45                    ],
 46                    "signatories": [
 47                        "admin::122072410bc1f81b7ef6abf956f424531c74a2912d41dddeb1ca33dc89f83d834389",
 48                        "sender::1220c29185d554cfb68fc3b974795a0c3a86e01741467173f8155d40ccd4965998b5"
 49                    ],
 50                    "observers": [
 51                        "alice-lab-operator::1220b7859943ac755c122492d1e49ddc1fca379667eeb96ecb8f9ae742e32602a8d7",
 52                        "provider::1220d811ead419cd997d10794eb7c5fee7115d52d20d85606d2eb5a9bdccbcef4088"
 53                    ],
 54                    "createdAt": "2026-03-16T16:30:45.264033Z",
 55                    "packageName": "utility-registry-holding-v0",
 56                    "representativePackageId": "8107899ac4723ce986bf7d27416534e576e54b92161e46150a595fb78ff3d3a1",
 57                    "acsDelta": true
 58                }
 59            },
 60            {
 61                "CreatedEvent": {
 62                    "offset": 16601,
 63                    "nodeId": 4,
 64                    "contractId": "007231b08104145bf1ffcf74458350f67e9e74eeb6bdc2d33436a71a1ba2556861ca1212208da6f5d1c89f56e7746b68fe5cab0ba5471ea3c6a972a342153ef08b2c5cfd02",
 65                    "templateId": "aca349df9f3c0e61d8b3e5d3282f0e6e1c60d89a70c96d21ed36414fe8c13a6a:Utility.Registry.App.V0.Model.Mint:ExecutedMint",
 66                    "contractKey": null,
 67                    "createArgument": {
 68                        "operator": "alice-lab-operator::1220b7859943ac755c122492d1e49ddc1fca379667eeb96ecb8f9ae742e32602a8d7",
 69                        "provider": "provider::1220d811ead419cd997d10794eb7c5fee7115d52d20d85606d2eb5a9bdccbcef4088",
 70                        "mint": {
 71                            "instrumentId": {
 72                                "admin": "admin::122072410bc1f81b7ef6abf956f424531c74a2912d41dddeb1ca33dc89f83d834389",
 73                                "id": "INST"
 74                            },
 75                            "amount": "7.0000000000",
 76                            "holder": "sender::1220c29185d554cfb68fc3b974795a0c3a86e01741467173f8155d40ccd4965998b5",
 77                            "reference": "mint-ref-003",
 78                            "requestedAt": "2026-03-16T16:30:10Z",
 79                            "executeBefore": "2026-03-16T17:30:10Z",
 80                            "meta": {
 81                                "values": {}
 82                            }
 83                        },
 84                        "operatorIsObserver": false
 85                    },
 86                    "createdEventBlob": "",
 87                    "interfaceViews": [],
 88                    "witnessParties": [
 89                        "sender::1220c29185d554cfb68fc3b974795a0c3a86e01741467173f8155d40ccd4965998b5"
 90                    ],
 91                    "signatories": [
 92                        "admin::122072410bc1f81b7ef6abf956f424531c74a2912d41dddeb1ca33dc89f83d834389"
 93                    ],
 94                    "observers": [
 95                        "provider::1220d811ead419cd997d10794eb7c5fee7115d52d20d85606d2eb5a9bdccbcef4088",
 96                        "sender::1220c29185d554cfb68fc3b974795a0c3a86e01741467173f8155d40ccd4965998b5"
 97                    ],
 98                    "createdAt": "2026-03-16T16:30:45.264033Z",
 99                    "packageName": "utility-registry-app-v0",
100                    "representativePackageId": "aca349df9f3c0e61d8b3e5d3282f0e6e1c60d89a70c96d21ed36414fe8c13a6a",
101                    "acsDelta": true
102                }
103            }
104        ],
105        "offset": 16601,
106        "synchronizerId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
107        "traceContext": {
108            "traceparent": "00-00b5518caef4f3babe3d6cb4364f043c-8b34801247bf11c9-01",
109            "tracestate": null
110        },
111        "recordTime": "2026-03-16T16:30:43.378062Z",
112        "externalTransactionHash": null
113    }
114}

Note

If step 2d returns CONTRACT_NOT_FOUND, you may be using stale response files (for example, trying to accept an offer that has already been accepted/archived). Rerun steps 2a–2c to refresh the offer CID and choice context before accepting.