- Overview
- Setup
- Tutorials
- How Tos
- Reference
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 ( |
Admin |
JWT, user ID, and party ID of the admin/registrar ( |
Operator |
Utility backend base URL ( |
Mint |
Instrument ID, amount to be minted, and a unique mint reference ( |
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.