Registry Utility - Mint Request API Example

This example shows how to perform a mint request on CNU 0.9.x using the HTTP JSON API.

It is assumed that the minter has all the required credentials as issuer of the specific instrument.

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="eyJhbGciOiJIUzI1NiJ9.eyJzY29wZSI6ImRhbWxfbGVkZ2VyX2FwaSIsImlhdCI6MTc1OTk5MjEzMiwiYXVkIjoiaHR0cHM6Ly91dGlsaXR5LmNhbnRvbi5uZXR3b3JrIiwic3ViIjoiaXNzdWVyIn0.6wP8xNyQopoyKk_rGv9agcIK8TLyJVYLq3oRo983z8Q"
10MINTER_PARTY_ID="issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
11MINTER_USER_ID="issuer"
12
13# admin/registrar details
14ADMIN_TOKEN="eyJhbGciOiJIUzI1NiJ9.eyJzY29wZSI6ImRhbWxfbGVkZ2VyX2FwaSIsImlhdCI6MTc1OTk5Nzk3OSwiYXVkIjoiaHR0cHM6Ly91dGlsaXR5LmNhbnRvbi5uZXR3b3JrIiwic3ViIjoicmVnaXN0cmFyIn0.zveSqMNH9LQIcGOXlyKoidGWJm0ldsj2R1gXiPzmAQk"
15ADMIN_PARTY_ID="registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
16ADMIN_USER_ID="registrar"
17
18# unique reference for the action
19MINT_REF="mint-ref-002"
20
21# update your asset and amount to be transferred
22ASSET_ID="INST"
23ASSET_AMOUNT="5.0"
24
25# example 1
26# BACKEND_API="https://api.utilities.digitalasset-dev.com/api/token-standard"
27# HTTP_JSON_API="https://utility.demo.registry.digitalasset.com/api/json-api"
28# example 2
29BACKEND_API="http://localhost:8080/api/utilities"
30HTTP_JSON_API="http://localhost:8001/api/json-api"
31
32# token standard holding interface, may change when new versions of splice exists
33# TRANSFERFACTORY_INTERFACE="55ba4deb0ad4662c4168b39859738a0e91388d252286480c7331b3f71a517281:Splice.Api.Token.TransferInstructionV1:TransferFactory"
34HOLDING_INTERFACE="718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b:Splice.Api.Token.HoldingV1:Holding"
35TRANSFER_INSTRUCTION_INTERFACE="55ba4deb0ad4662c4168b39859738a0e91388d252286480c7331b3f71a517281:Splice.Api.Token.TransferInstructionV1:TransferInstruction"
36
37# utility templates
38ALLOCATIONFACTORY_TEMPLATE="#utility-registry-app-v0:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory"
39MINTREQUEST_TEMPLATE="#utility-registry-app-v0:Utility.Registry.App.V0.Model.Mint:MintRequest"

The required information is:

Required Information

Details of

Description

Minter

JWT, user ID, and party ID of the sender

Admin

JWT, user ID, and party ID of the receiver

Operator

Backend API and JSON Ledger API

Mint

Instrument ID, amount to be burned, and reference

If possible, open the CNU UIs for both the minter and the admin, to observe the request and change in holdings. These are the initial holdings of the minter (issuer) for INST.

Initial positions before mint

Step 1: Minter Requests a Mint

Step 1a - Access the Backend API

The request URL is ${BACKEND_API}/v0/registry/mint/v0/request. To hit this endpoint, run the following script:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Minter requests a mint
 5## Step 1a: Gets choice context and disclosure for mint request
 6## Authorized by: Minter
 7## Script: step-1a-minter-requests.sh
 8## =================================================================================================
 9
10DATAFILE="source.sh"
11source "$DATAFILE"
12
13DATE_FORMAT='+%Y-%m-%dT%H:%M:%SZ'
14NOW_ISO_TIMESTAMP=$(date -u "$DATE_FORMAT")
15ONEHOUR_ISO_TIMESTAMP=$(date -u -d '+1 hour' "$DATE_FORMAT")
16
17RESULT=$(
18    curl -s \
19    --url "${BACKEND_API}/v0/registry/mint/v0/request" \
20    --header "Content-Type: application/json" \
21    --request POST \
22    --data @- <<EOF
23{
24  "holder": "${MINTER_PARTY_ID}",
25  "instrumentId": {
26    "admin": "${ADMIN_PARTY_ID}",
27    "id": "${ASSET_ID}"
28  }
29}
30EOF
31)
32
33echo "--- Endpoint response ---"
34echo $RESULT | jq
35
36OUTPUTFILE="response-step-1a.json"
37echo "$RESULT" > "$OUTPUTFILE"

The result contains the required information when constructing the command, stored in response-step-1a.json. For example:

 1{
 2  "factoryId": "000b99a12b36d9d3b865060c19eab4558b63b105ea8f6917442aef10394712ee7dca1112205046662015ee57e20143d8ae8f9985e069d1db31e3d8540c0543f3e4ccb8e863",
 3  "choiceContext": {
 4    "choiceContextData": {
 5      "values": {
 6        "utility.digitalasset.com/instrument-configuration": {
 7          "tag": "AV_ContractId",
 8          "value": "00eca75bf1e14e192de69b58054cf62f2a60a9c0aae8f4d3491a4b2fad9f9731eaca111220b5fd51ccd498385b0ceaef63243fdfef6c2e62dd8d3a2f59fdb61a9099956481"
 9        },
10        "utility.digitalasset.com/issuer-credentials": {
11          "tag": "AV_List",
12          "value": [
13            {
14              "tag": "AV_ContractId",
15              "value": "0031a2300ef5833a5dd1204c603ea296ae9558645bc354721e5e01e618d00c1495ca1112206f197de929cdb48f2509cb72249c1040f67f8e64bb2d6c7ec7b17bcd761e045c"
16            }
17          ]
18        }
19      }
20    },
21    "disclosedContracts": [
22      {
23        "createdAt": "2025-10-08T20:41:44.939Z",
24        "contractId": "000b99a12b36d9d3b865060c19eab4558b63b105ea8f6917442aef10394712ee7dca1112205046662015ee57e20143d8ae8f9985e069d1db31e3d8540c0543f3e4ccb8e863",
25        "templateId": "170929b11d5f0ed1385f890f42887c31ff7e289c0f4bc482aff193a7173d576c:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory",
26        "domainId": null,
27        "createdEventBlob": "CgMyLjESmQYKRQALmaErNtnTuGUGDBnqtFWLY7EF6o9pF0Qq7xA5RxLufcoREiBQRmYgFe5X4gFD2K6PmYXgadHbMePYVAwFQ/PkzLjoYxIXdXRpbGl0eS1yZWdpc3RyeS1hcHAtdjAajQEKQDE3MDkyOWIxMWQ1ZjBlZDEzODVmODkwZjQyODg3YzMxZmY3ZTI4OWMwZjRiYzQ4MmFmZjE5M2E3MTczZDU3NmMSB1V0aWxpdHkSCFJlZ2lzdHJ5EgNBcHASAlYwEgdTZXJ2aWNlEhFBbGxvY2F0aW9uRmFjdG9yeRoRQWxsb2NhdGlvbkZhY3RvcnkigAJq/QEKUgpQOk5wcm92aWRlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKUwpROk9yZWdpc3RyYXI6OjEyMjBkMzAxYWJhYmJlZDdiYzhkNmY2YTgwY2UxNmYzMzkzM2E3Mjc0YTMwMTMyNDFiN2ZiMzczY2E3ZTRmMGQ2NTY3ClIKUDpOb3BlcmF0b3I6OjEyMjBiMzlkZjVlZDBlM2M1ODRjZDk3ZTg2ZTc3OWRlZjkzM2Q1NDViZjlhNGZhYjNjMGZkM2U0YWQzZjdhMzZiOGZlKk5wcm92aWRlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcqT3JlZ2lzdHJhcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcyTm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZTnKhnS2q0AGAEIqCiYKJAgBEiCdfF/uuVvbYVGCBftUb6P/SwJDPzwGmCDQ4jzAdtOMPBAe"
28      },
29      {
30        "createdAt": "2025-10-08T20:41:44.51Z",
31        "contractId": "00eca75bf1e14e192de69b58054cf62f2a60a9c0aae8f4d3491a4b2fad9f9731eaca111220b5fd51ccd498385b0ceaef63243fdfef6c2e62dd8d3a2f59fdb61a9099956481",
32        "templateId": "ed73d5b9ab717333f3dbd122de7be3156f8bf2614a67360c3dd61fc0135133fa:Utility.Registry.V0.Configuration.Instrument:InstrumentConfiguration",
33        "domainId": null,
34        "createdEventBlob": "CgMyLjESpgkKRQDsp1vx4U4ZLeabWAVM9i8qYKnAquj000kaSy+tn5cx6soREiC1/VHM1Jg4Wwzq72MkP9/vbC5i3Y06L1n9thqQmZVkgRITdXRpbGl0eS1yZWdpc3RyeS12MBqNAQpAZWQ3M2Q1YjlhYjcxNzMzM2YzZGJkMTIyZGU3YmUzMTU2ZjhiZjI2MTRhNjczNjBjM2RkNjFmYzAxMzUxMzNmYRIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEgpJbnN0cnVtZW50GhdJbnN0cnVtZW50Q29uZmlndXJhdGlvbiKRBWqOBQpSClA6Tm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZQpSClA6TnByb3ZpZGVyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwpTClE6T3JlZ2lzdHJhcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKgAEKfmp8ClMKUTpPcmVnaXN0cmFyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwoICgZCBElOU1QKGwoZQhdSZWdpc3RyYXJJbnRlcm5hbFNjaGVtZQoECgJaAAqBAQp/Wn0Ke2p5ClMKUTpPcmVnaXN0cmFyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwoiCiBaHgocahoKDgoMQgppc0lzc3Vlck9mCggKBkIESU5TVAqBAQp/Wn0Ke2p5ClMKUTpPcmVnaXN0cmFyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwoiCiBaHgocahoKDgoMQgppc0hvbGRlck9mCggKBkIESU5TVCpOcHJvdmlkZXI6OjEyMjBkMzAxYWJhYmJlZDdiYzhkNmY2YTgwY2UxNmYzMzkzM2E3Mjc0YTMwMTMyNDFiN2ZiMzczY2E3ZTRmMGQ2NTY3Kk9yZWdpc3RyYXI6OjEyMjBkMzAxYWJhYmJlZDdiYzhkNmY2YTgwY2UxNmYzMzkzM2E3Mjc0YTMwMTMyNDFiN2ZiMzczY2E3ZTRmMGQ2NTY3Mk5vcGVyYXRvcjo6MTIyMGIzOWRmNWVkMGUzYzU4NGNkOTdlODZlNzc5ZGVmOTMzZDU0NWJmOWE0ZmFiM2MwZmQzZTRhZDNmN2EzNmI4ZmU5rPtttqtABgBCKgomCiQIARIgQ1DsOZLYGVRiscestTBDQ3CqU27WvKQODudfxMesKCEQHg=="
35      },
36      {
37        "createdAt": "2025-10-08T20:41:34.877Z",
38        "contractId": "0031a2300ef5833a5dd1204c603ea296ae9558645bc354721e5e01e618d00c1495ca1112206f197de929cdb48f2509cb72249c1040f67f8e64bb2d6c7ec7b17bcd761e045c",
39        "templateId": "77df4e7b980c12de438d7b052141a762215fae790d81f71179c8fb534beb68f7:Utility.Credential.V0.Credential:Credential",
40        "domainId": null,
41        "createdEventBlob": "CgMyLjESrAcKRQAxojAO9YM6XdEgTGA+opaulVhkW8NUch5eAeYY0AwUlcoREiBvGX3pKc20jyUJy3IknBBA9n+OZLstbH7HsXvNdh4EXBIVdXRpbGl0eS1jcmVkZW50aWFsLXYwGnMKQDc3ZGY0ZTdiOTgwYzEyZGU0MzhkN2IwNTIxNDFhNzYyMjE1ZmFlNzkwZDgxZjcxMTc5YzhmYjUzNGJlYjY4ZjcSB1V0aWxpdHkSCkNyZWRlbnRpYWwSAlYwEgpDcmVkZW50aWFsGgpDcmVkZW50aWFsIrIDaq8DClMKUTpPcmVnaXN0cmFyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwpQCk46TGlzc3Vlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKDwoNQgtJTlNUX0lzc3VlcgoPCg1CC0lOU1RfSXNzdWVyCgQKAlIACgQKAlIACnQKclpwCm5qbApQCk5CTGlzc3Vlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKDgoMQgppc0lzc3Vlck9mCggKBkIESU5TVApiCmBqXgpcClpiWApWClA6Tm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZRICCgAqTGlzc3Vlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcqT3JlZ2lzdHJhcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcyTm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZTl8/9q1q0AGAEIqCiYKJAgBEiBikJteQ0a37UH10AsBGGTcDTteF7QH0nxSmVQemm0uLRAe"
42      }
43    ]
44  }
45}

Step 1b - Request the Mint

Finally, run the following script to request the mint:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Minter requests a mint
 5## Step 1b: Executes the mint request command
 6## Authorized by: Minter
 7## Script: step-1b-minter-requests.sh
 8## =================================================================================================
 9
10DATAFILE="source.sh"
11source "$DATAFILE"
12
13DATE_FORMAT='+%Y-%m-%dT%H:%M:%SZ'
14NOW_ISO_TIMESTAMP=$(date -u "$DATE_FORMAT")
15ONEHOUR_ISO_TIMESTAMP=$(date -u -d '+1 hour' "$DATE_FORMAT")
16
17JSONCONTENT=$(cat "response-step-1a.json")
18FACTORYID=$(echo $JSONCONTENT | jq .factoryId)
19CHOICECONTEXTDATA=$(echo $JSONCONTENT | jq .choiceContext.choiceContextData)
20DISCLOSEDCONTRACTS=$(echo $JSONCONTENT | jq .choiceContext.disclosedContracts)
21DISCLOSEDCONTRACTS=$(echo $JSONCONTENT | jq '.choiceContext.disclosedContracts // [] | map(. + {"synchronizerId": ""})')
22
23RESULT=$(
24    curl -s \
25    --url "${HTTP_JSON_API}/v2/commands/submit-and-wait-for-transaction" \
26    --header "Authorization: Bearer ${MINTER_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_RequestMint",
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":"${MINTER_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            "${MINTER_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="response-step-1b.json"
95echo "$RESULT" > "$OUTPUTFILE"

For example, this is the response of this command:

 1{
 2  "transaction": {
 3    "updateId": "12201f759a9133404044c8a6f928f7c605997307ddbf6f085b0c65a6a05e8f008318",
 4    "commandId": "467A1903-116E-43FE-A9DE-380B779BA570",
 5    "workflowId": "",
 6    "effectiveAt": "2025-10-10T10:05:05.935431Z",
 7    "events": [
 8      {
 9        "CreatedEvent": {
10          "offset": 4113,
11          "nodeId": 3,
12          "contractId": "00113ba9d39c4b568ecaf2308c4448dc3f5bccf011cf89f6b7d769b05c4a43b16bca111220f4265b962e7bf2e7b5d20156366216bcbf09fafc0733ce97ea209aaaa7f13b55",
13          "templateId": "170929b11d5f0ed1385f890f42887c31ff7e289c0f4bc482aff193a7173d576c:Utility.Registry.App.V0.Model.Mint:MintRequest",
14          "contractKey": null,
15          "createArgument": {
16            "operator": "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
17            "provider": "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
18            "mint": {
19              "instrumentId": {
20                "admin": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
21                "id": "INST"
22              },
23              "amount": "5.0000000000",
24              "holder": "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
25              "reference": "mint-ref-002",
26              "requestedAt": "2025-10-10T10:05:05Z",
27              "executeBefore": "2025-10-10T11:05:05Z",
28              "meta": {
29                "values": {}
30              }
31            }
32          },
33          "createdEventBlob": "",
34          "interfaceViews": [],
35          "witnessParties": [
36            "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
37          ],
38          "signatories": [
39            "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
40            "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
41          ],
42          "observers": [
43            "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
44            "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
45          ],
46          "createdAt": "2025-10-10T10:05:05.935431Z",
47          "packageName": "utility-registry-app-v0"
48        }
49      }
50    ],
51    "offset": 4113,
52    "synchronizerId": "global-domain::1220f0c14212edfc6ca9b0dfc6f5943b51a80efe71de8abf5759c8f57b7510f633eb",
53    "traceContext": {
54      "traceparent": "00-ad94136df03eda595740bf1eb1d9a68b-e00ab527f2a3ca18-01",
55      "tracestate": null
56    },
57    "recordTime": "2025-10-10T10:05:05.965264Z"
58  }
59}

Step 2: Admin Accepts Mint Request

Step 2a - Obtain the Ledger End Offset

To obtain the ledger end offset, run the following script:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Admin accepts the mint request
 5## Step 2a: Obtains ledger end offset
 6## Authorized by: Admin
 7## Script: step-2a-admin-accepts.sh
 8## =================================================================================================
 9
10DATAFILE="source.sh"
11source "$DATAFILE"
12
13# Get offset from previous step
14OFFSET=$(curl -s GET \
15    --url "${HTTP_JSON_API}/v2/state/ledger-end" \
16    --header "Accept: application/json" \
17    --header "Authorization: Bearer ${ADMIN_TOKEN}")
18
19echo "$OFFSET" | jq
20
21OUTPUTFILE="response-step-2a.json"
22echo "$OFFSET" > "$OUTPUTFILE"

The result is the ledger end offset at this moment, stored in response-step-2a.json. For example:

1{
2  "offset": 4118
3}

Step 2b - Retrieve Mint Request

To retrieve the Mint Request created in Step 1d, run the following script:

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

The result is the Mint Request, stored in response-step-2b.json. For example,

 1[
 2  {
 3    "workflowId": "",
 4    "contractEntry": {
 5      "JsActiveContract": {
 6        "createdEvent": {
 7          "offset": 4113,
 8          "nodeId": 3,
 9          "contractId": "00113ba9d39c4b568ecaf2308c4448dc3f5bccf011cf89f6b7d769b05c4a43b16bca111220f4265b962e7bf2e7b5d20156366216bcbf09fafc0733ce97ea209aaaa7f13b55",
10          "templateId": "170929b11d5f0ed1385f890f42887c31ff7e289c0f4bc482aff193a7173d576c:Utility.Registry.App.V0.Model.Mint:MintRequest",
11          "contractKey": null,
12          "createArgument": {
13            "operator": "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
14            "provider": "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
15            "mint": {
16              "instrumentId": {
17                "admin": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
18                "id": "INST"
19              },
20              "amount": "5.0000000000",
21              "holder": "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
22              "reference": "mint-ref-002",
23              "requestedAt": "2025-10-10T10:05:05Z",
24              "executeBefore": "2025-10-10T11:05:05Z",
25              "meta": {
26                "values": {}
27              }
28            }
29          },
30          "createdEventBlob": "",
31          "interfaceViews": [],
32          "witnessParties": [
33            "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
34          ],
35          "signatories": [
36            "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
37            "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
38          ],
39          "observers": [
40            "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
41            "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
42          ],
43          "createdAt": "2025-10-10T10:05:05.935431Z",
44          "packageName": "utility-registry-app-v0"
45        },
46        "synchronizerId": "global-domain::1220f0c14212edfc6ca9b0dfc6f5943b51a80efe71de8abf5759c8f57b7510f633eb",
47        "reassignmentCounter": 0
48      }
49    }
50  }
51]

Step 2c - Access the Backend API

The request URL is “${BACKEND_API}/v0/registry/mint/v0/request/${MINTREQUEST_CID}/choice-contexts/accept”. To hit this endpoint, run the following script:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Admin accepts the mint request
 5## Step 2c: Gets choice context and disclosure for the accept-mint-request command
 6## Authorized by: anyone
 7## Script: step-2c-admin-accepts.sh
 8## =================================================================================================
 9
10DATAFILE="source.sh"
11source "$DATAFILE"
12
13DATE_FORMAT='+%Y-%m-%dT%H:%M:%SZ'
14NOW_ISO_TIMESTAMP=$(date -u "$DATE_FORMAT")
15ONEHOUR_ISO_TIMESTAMP=$(date -u -d '+1 hour' "$DATE_FORMAT")
16
17MINTREQUESTS=$(cat "response-step-2b.json")
18MINTREQUEST_CID=$(echo "$MINTREQUESTS" | jq -r --arg MINT_REF "$MINT_REF" '[.[] | select(.contractEntry.JsActiveContract.createdEvent.createArgument.mint.reference == $MINT_REF)][0].contractEntry.JsActiveContract.createdEvent.contractId')
19
20RESULT=$(
21    curl -s \
22    --url "${BACKEND_API}/v0/registry/mint/v0/request/${MINTREQUEST_CID}/choice-contexts/accept" \
23    --header "Content-Type: application/json" \
24    --request POST \
25    --data @- <<EOF
26{
27   "meta":{
28
29   },
30   "excludeDebugFields": true
31}
32EOF
33)
34
35echo "--- Endpoint response ---"
36echo $RESULT | jq
37
38OUTPUTFILE="response-step-2c.json"
39echo "$RESULT" > "$OUTPUTFILE"

The result contains the required choice context for executing the command, 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": "00eca75bf1e14e192de69b58054cf62f2a60a9c0aae8f4d3491a4b2fad9f9731eaca111220b5fd51ccd498385b0ceaef63243fdfef6c2e62dd8d3a2f59fdb61a9099956481"
 7      },
 8      "utility.digitalasset.com/issuer-credentials": {
 9        "tag": "AV_List",
10        "value": [
11          {
12            "tag": "AV_ContractId",
13            "value": "0031a2300ef5833a5dd1204c603ea296ae9558645bc354721e5e01e618d00c1495ca1112206f197de929cdb48f2509cb72249c1040f67f8e64bb2d6c7ec7b17bcd761e045c"
14          }
15        ]
16      },
17      "utility.digitalasset.com/app-reward-configuration": {
18        "tag": "AV_ContractId",
19        "value": "00525af6a6fd8c1580b6d80aad3dbcc298218ffcd501c9f30e126836a3bb9ada8bca111220c22ce1c7f07a549ad6c6739c7953dd8847f69773b5996169b7afd8c6d66438b9"
20      }
21    }
22  },
23  "disclosedContracts": [
24    {
25      "createdAt": "2025-10-08T20:41:34.877Z",
26      "contractId": "0031a2300ef5833a5dd1204c603ea296ae9558645bc354721e5e01e618d00c1495ca1112206f197de929cdb48f2509cb72249c1040f67f8e64bb2d6c7ec7b17bcd761e045c",
27      "templateId": "77df4e7b980c12de438d7b052141a762215fae790d81f71179c8fb534beb68f7:Utility.Credential.V0.Credential:Credential",
28      "domainId": null,
29      "createdEventBlob": "CgMyLjESrAcKRQAxojAO9YM6XdEgTGA+opaulVhkW8NUch5eAeYY0AwUlcoREiBvGX3pKc20jyUJy3IknBBA9n+OZLstbH7HsXvNdh4EXBIVdXRpbGl0eS1jcmVkZW50aWFsLXYwGnMKQDc3ZGY0ZTdiOTgwYzEyZGU0MzhkN2IwNTIxNDFhNzYyMjE1ZmFlNzkwZDgxZjcxMTc5YzhmYjUzNGJlYjY4ZjcSB1V0aWxpdHkSCkNyZWRlbnRpYWwSAlYwEgpDcmVkZW50aWFsGgpDcmVkZW50aWFsIrIDaq8DClMKUTpPcmVnaXN0cmFyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwpQCk46TGlzc3Vlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKDwoNQgtJTlNUX0lzc3VlcgoPCg1CC0lOU1RfSXNzdWVyCgQKAlIACgQKAlIACnQKclpwCm5qbApQCk5CTGlzc3Vlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKDgoMQgppc0lzc3Vlck9mCggKBkIESU5TVApiCmBqXgpcClpiWApWClA6Tm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZRICCgAqTGlzc3Vlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcqT3JlZ2lzdHJhcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcyTm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZTl8/9q1q0AGAEIqCiYKJAgBEiBikJteQ0a37UH10AsBGGTcDTteF7QH0nxSmVQemm0uLRAe"
30    },
31    {
32      "createdAt": "2025-10-08T20:41:42.691Z",
33      "contractId": "00525af6a6fd8c1580b6d80aad3dbcc298218ffcd501c9f30e126836a3bb9ada8bca111220c22ce1c7f07a549ad6c6739c7953dd8847f69773b5996169b7afd8c6d66438b9",
34      "templateId": "ed73d5b9ab717333f3dbd122de7be3156f8bf2614a67360c3dd61fc0135133fa:Utility.Registry.V0.Configuration.AppReward:AppRewardConfiguration",
35      "domainId": null,
36      "createdEventBlob": "CgMyLjEStgYKRQBSWvam/YwVgLbYCq09vMKYIY/81QHJ8w4SaDaju5rai8oREiDCLOHH8HpUmtbGc5x5U92IR/aXc7WZYWm3r9jG1mQ4uRITdXRpbGl0eS1yZWdpc3RyeS12MBqLAQpAZWQ3M2Q1YjlhYjcxNzMzM2YzZGJkMTIyZGU3YmUzMTU2ZjhiZjI2MTRhNjczNjBjM2RkNjFmYzAxMzUxMzNmYRIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEglBcHBSZXdhcmQaFkFwcFJld2FyZENvbmZpZ3VyYXRpb24i9AJq8QIKUgpQOk5vcGVyYXRvcjo6MTIyMGIzOWRmNWVkMGUzYzU4NGNkOTdlODZlNzc5ZGVmOTMzZDU0NWJmOWE0ZmFiM2MwZmQzZTRhZDNmN2EzNmI4ZmUKUgpQOk5wcm92aWRlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKxgEKwwFqwAEKTQpLOklEU086OjEyMjBmMGMxNDIxMmVkZmM2Y2E5YjBkZmM2ZjU5NDNiNTFhODBlZmU3MWRlOGFiZjU3NTljOGY1N2I3NTEwZjYzM2ViCm8KbWprClcKVTpTZmVlUmVjZWl2ZXJVczo6MTIyMGIzOWRmNWVkMGUzYzU4NGNkOTdlODZlNzc5ZGVmOTMzZDU0NWJmOWE0ZmFiM2MwZmQzZTRhZDNmN2EzNmI4ZmUKEAoOMgwwLjIwMDAwMDAwMDAqTm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZTJOcHJvdmlkZXI6OjEyMjBkMzAxYWJhYmJlZDdiYzhkNmY2YTgwY2UxNmYzMzkzM2E3Mjc0YTMwMTMyNDFiN2ZiMzczY2E3ZTRmMGQ2NTY3ORA5UrarQAYAQioKJgokCAESIFdnuWlL+9/sSZnL9GgPVRMT0KYfFkQqkD1ffAXT9KgQEB4="
37    }
38  ]
39}

Step 2d - Accept the Mint Request

To finalize the mint and create the asset for the minter, execute the following script:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Admin accepts the mint request
 5## Step 2d: Executes the accept-mint-request command
 6## Authorized by: Admin
 7## Script: step-2d-admin-accepts.sh
 8## =================================================================================================
 9
10DATAFILE="source.sh"
11source "$DATAFILE"
12
13MINTREQUESTS=$(cat "response-step-2b.json")
14MINTREQUEST=$(echo "$MINTREQUESTS" | jq -r --arg MINT_REF "$MINT_REF" '[.[] | select(.contractEntry.JsActiveContract.createdEvent.createArgument.mint.reference == $MINT_REF)][0]')
15MINTREQUEST_CID=$(echo "$MINTREQUEST" | jq -r .contractEntry.JsActiveContract.createdEvent.contractId)
16MINTREQUEST_TEMPLATE=$(echo "$MINTREQUEST" | jq -r .contractEntry.JsActiveContract.createdEvent.templateId)
17
18JSONCONTENT=$(cat "response-step-2c.json")
19CHOICECONTEXTDATA=$(echo $JSONCONTENT | jq .choiceContextData)
20DISCLOSEDCONTRACTS=$(echo $JSONCONTENT | jq .disclosedContracts)
21DISCLOSEDCONTRACTS=$(echo $JSONCONTENT | jq '.choiceContext.disclosedContracts // [] | map(. + {"synchronizerId": ""})')
22
23RESULT=$(
24    curl -s \
25    --url "${HTTP_JSON_API}/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":"${MINTREQUEST_TEMPLATE}",
36                    "contractId":"${MINTREQUEST_CID}",
37                    "choice":"MintRequest_Accept",
38                    "choiceArgument":{
39                        "extraArgs": {
40                            "context": $CHOICECONTEXTDATA,
41                            "meta":{
42                                "values":{
43                                }
44                            }
45                        }
46                    }
47                }
48            }
49        ],
50        "workflowId":"",
51        "userId":"${ADMIN_USER_ID}",
52        "commandId":"$(uuidgen | tr -d '\n')",
53        "deduplicationPeriod":{
54            "DeduplicationDuration":{
55                "value":{
56                    "seconds":30,
57                    "nanos":0
58                }
59            }
60        },
61        "actAs":[
62            "${ADMIN_PARTY_ID}"
63        ],
64        "readAs":[
65
66        ],
67        "submissionId":"$(uuidgen | tr -d '\n')",
68        "disclosedContracts": ${DISCLOSEDCONTRACTS},
69        "domainId":"",
70        "packageIdSelectionPreference":[]
71    }
72}
73EOF
74)
75
76echo "--- Command response ---"
77echo $RESULT | jq
78
79OUTPUTFILE="response-step-2d.json"
80echo "$RESULT" > "$OUTPUTFILE"

After the exercise command is executed, the mint is complete.

Final positions after mint