- Overview
- Setup
- Tutorials
- How Tos
- Reference
- DAR Versions
- API Reference
- Commercials API
- Credential API
- Registry API
- Utility.Registry
- Utility.Registry.V0.Configuration.AppReward
- Utility.Registry.V0.Configuration.Instrument
- Utility.Registry.V0.Holding.Allocation
- Utility.Registry.V0.Holding.Burn
- Utility.Registry.V0.Holding.Lock
- Utility.Registry.V0.Holding.Mint
- Utility.Registry.V0.Holding.Transfer
- Utility.Registry.V0.Holding.Unlock
- Utility.Registry.V0.Rule.Transfer
- Utility.Registry.V0.Types
- Utility.Registry.V0.Util
- Utility.Registry.App
- Utility.Registry.App.V0.Configuration.Operator
- Utility.Registry.App.V0.Configuration.Provider
- Utility.Registry.App.V0.Model.Burn
- Utility.Registry.App.V0.Model.Mint
- Utility.Registry.App.V0.Model.Transfer
- Utility.Registry.App.V0.Service.AllocationFactory
- Utility.Registry.App.V0.Service.Holder
- Utility.Registry.App.V0.Service.Provider
- Utility.Registry.App.V0.Service.Registrar
- Utility.Holding
- Utility.Registry
- Settlement Utility API
- Collateral Utility API
- Operator Backend API
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:
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.
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.