Registry Utility - Burn Offer API Example

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

It is assumed that the burner 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
 9BURNER_TOKEN="<PASTE_BURNER_JWT_HERE>"
10BURNER_PARTY_ID="sender::12203537ab59c3b8827a87e12ed48ecf9ce28397d81ed9e22c9cfe0b76944775b3dd"
11BURNER_USER_ID="sender"
12
13# Admin/Registrar details
14ADMIN_TOKEN="<PASTE_ADMIN_JWT_HERE>"
15ADMIN_PARTY_ID="admin::1220e2df7cc6be66dd4db3dd4ea8d2fb77cedf047dcca793f52c4f983498196d0521"
16ADMIN_USER_ID="admin"
17
18# Unique reference for the action
19BURN_REF="burn-ref-001"
20
21# update your asset and amount to be transferred
22ASSET_ID="INST"
23ASSET_AMOUNT="3.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_BURNER="https://utility-alice-lab-client3.vcluster.circus-dev.da-int.net/api/json-api"
32
33# Token standard holding interface, may change when new versions of splice exists
34HOLDING_INTERFACE="#splice-api-token-holding-v1:Splice.Api.Token.HoldingV1:Holding"
35
36# Utility templates, may change when new versions of utilities exists
37ALLOCATIONFACTORY_TEMPLATE="#utility-registry-app-v0:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory"
38BURNOFFER_TEMPLATE="#utility-registry-app-v0:Utility.Registry.App.V0.Model.Burn:BurnOffer"

The required information is:

Details of

Description

Burner

JWT, user ID, and party ID of the burner (BURNER_*)

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_*)

Burn

Instrument ID, amount to be burned, and a unique burn reference (BURN_REF)

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

Step 1: Admin Offers a Burn

Step 1a - Obtain the Ledger End Offset

Run the following script to obtain the ledger end offset:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Admin offers a burn
 5## Step 1a: Retrieves the current ledger end offset from the ledger
 6## Authorized by: Admin
 7## Script: step-1a-burn-offer.sh
 8## =================================================================================================
 9
10set -euo pipefail
11
12SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13DATAFILE="${SCRIPT_DIR}/source.sh"
14source "$DATAFILE"
15
16if [[ -z "${HTTP_JSON_API_ADMIN:-}" ]]; then
17    echo "Error: HTTP_JSON_API_ADMIN is not set (check source.sh)" >&2
18    exit 1
19fi
20if [[ -z "${ADMIN_TOKEN:-}" ]]; then
21    echo "Error: ADMIN_TOKEN is not set (check source.sh)" >&2
22    exit 1
23fi
24
25OFFSET=$(curl -sS --fail-with-body \
26    --url "${HTTP_JSON_API_ADMIN}/v2/state/ledger-end" \
27    --header "Accept: application/json" \
28    --header "Authorization: Bearer ${ADMIN_TOKEN}" \
29    --request GET)
30
31echo "$OFFSET" | jq
32
33OUTPUTFILE="${SCRIPT_DIR}/response-step-1a.json"
34echo "$OFFSET" > "$OUTPUTFILE"

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

1{
2    "offset": 18926
3}

Step 1b - Access the Backend API (Burn Offer Factory)

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

Run the following script:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Admin offers a burn
 5## Step 1b: Gets choice context and disclosure for the burn-request command
 6## Authorized by: anyone
 7## Script: step-1b-burn-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
18HOLDINGCIDS=$(cat "${SCRIPT_DIR}/response-step-1a.json")
19
20RESULT=$(
21    curl -sS --fail-with-body \
22    --url "${BACKEND_API_BASE}/api/utilities/v0/registry/burn/v0/offer" \
23    --header "Content-Type: application/json" \
24    --request POST \
25    --data @- <<EOF
26{
27  "holder": "${BURNER_PARTY_ID}",
28  "instrumentId": {
29    "admin": "${ADMIN_PARTY_ID}",
30    "id": "${ASSET_ID}"
31  }
32}
33EOF
34)
35
36echo "--- Endpoint response ---"
37echo "$RESULT" | jq
38
39OUTPUTFILE="${SCRIPT_DIR}/response-step-1b.json"
40echo "$RESULT" > "$OUTPUTFILE"

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

 1{
 2    "factoryId": "00df4bb497aef3a90de581bd85c6c4a6a74916925d376adc273a251afe7a8f20b5ca1212201b8008032d5d8db386a27c4313dd0d89a88f478d4faea61421f91b6b3bdfa4b9",
 3    "choiceContext": {
 4        "choiceContextData": {
 5            "values": {
 6                "utility.digitalasset.com/instrument-configuration": {
 7                    "tag": "AV_ContractId",
 8                    "value": "00d84682e083b26aa9b797118fdc6579ea623bdac6f8a89e8983fcd7ddaa2ef657ca12122005a8e0162a956280221ff013bbedc1645443aeb86cc40f32b3045fdd59a2161e"
 9                },
10                "utility.digitalasset.com/issuer-credentials": {
11                    "tag": "AV_List",
12                    "value": [
13                        {
14                            "tag": "AV_ContractId",
15                            "value": "00c9c8c823a63773d69dca0e2b95cb989bf32e304477799f79bde0723638caa3a7ca12122078a13a2bca464c19317543e6484e6df66479c51170cd9babe81ec9d9bf2fa98f"
16                        }
17                    ]
18                }
19            }
20        },
21        "disclosedContracts": [
22            {
23                "createdAt": "2026-03-14T17:18:06.817Z",
24                "contractId": "00c9c8c823a63773d69dca0e2b95cb989bf32e304477799f79bde0723638caa3a7ca12122078a13a2bca464c19317543e6484e6df66479c51170cd9babe81ec9d9bf2fa98f",
25                "templateId": "5a29ead611a0abd5f5b3fc3caf7d0f67c0ff802032ab6d392824aa9060e56d70:Utility.Credential.V0.Credential:Credential",
26                "domainId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
27                "createdEventBlob": "CgMyLjESpgcKRQDJyMgjpjdz1p3KDiuVy5ib8y4wRHd5n3m94HI2OMqjp8oSEiB4oTorykZMGTF1Q+ZITm32ZHnFEXDNm6voHsnZvy+pjxIVdXRpbGl0eS1jcmVkZW50aWFsLXYwGnMKQDVhMjllYWQ2MTFhMGFiZDVmNWIzZmMzY2FmN2QwZjY3YzBmZjgwMjAzMmFiNmQzOTI4MjRhYTkwNjBlNTZkNzASB1V0aWxpdHkSCkNyZWRlbnRpYWwSAlYwEgpDcmVkZW50aWFsGgpDcmVkZW50aWFsIqUDaqIDCk8KTTpLYWRtaW46OjEyMjBlMmRmN2NjNmJlNjZkZDRkYjNkZDRlYThkMmZiNzdjZWRmMDQ3ZGNjYTc5M2Y1MmM0Zjk4MzQ5ODE5NmQwNTIxClAKTjpMc2VuZGVyOjoxMjIwMzUzN2FiNTljM2I4ODI3YTg3ZTEyZWQ0OGVjZjljZTI4Mzk3ZDgxZWQ5ZTIyYzljZmUwYjc2OTQ0Nzc1YjNkZAoFCgNCAWEKBQoDQgFhCgQKAlIACgQKAlIACnQKclpwCm5qbApQCk5CTHNlbmRlcjo6MTIyMDM1MzdhYjU5YzNiODgyN2E4N2UxMmVkNDhlY2Y5Y2UyODM5N2Q4MWVkOWUyMmM5Y2ZlMGI3Njk0NDc3NWIzZGQKDgoMQgppc0lzc3Vlck9mCggKBkIESU5TVAptCmtqaQpnCmViYwphCls6WXNqb2Rpbi1sYWItb3BlcmF0b3I6OjEyMjA5ZmM4MzIwOWJjMDZkMTFmMDdlNDQxZWE3ODkwNTgyY2E0YmNiNDcxNjJlZjMwZTUzM2NlYzA4MDg2MDI3YmE2EgIKACpLYWRtaW46OjEyMjBlMmRmN2NjNmJlNjZkZDRkYjNkZDRlYThkMmZiNzdjZWRmMDQ3ZGNjYTc5M2Y1MmM0Zjk4MzQ5ODE5NmQwNTIxKkxzZW5kZXI6OjEyMjAzNTM3YWI1OWMzYjg4MjdhODdlMTJlZDQ4ZWNmOWNlMjgzOTdkODFlZDllMjJjOWNmZTBiNzY5NDQ3NzViM2RkMllzam9kaW4tbGFiLW9wZXJhdG9yOjoxMjIwOWZjODMyMDliYzA2ZDExZjA3ZTQ0MWVhNzg5MDU4MmNhNGJjYjQ3MTYyZWYzMGU1MzNjZWMwODA4NjAyN2JhNjk6HGZv60wGAEIqCiYKJAgBEiBgw40ML2RYpcZJMWYoDD1XAZOAbueJ4Hkty06uzQdJCBAe"
28            }
29        ]
30    }
31}

Step 1c - Offer the Burn (JSON API submit)

Finally, submit AllocationFactory_OfferBurn as the admin.

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Admin offers a burn
 5## Step 1c: Execute the burn-request command
 6## Authorized by: Admin
 7## Script: step-1c-burn-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-1b.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_OfferBurn",
38                    "choiceArgument":{
39                        "expectedAdmin":"${ADMIN_PARTY_ID}",
40                        "burn": {
41                            "instrumentId": {
42                              "admin": "${ADMIN_PARTY_ID}",
43                              "id": "${ASSET_ID}"
44                            },
45                            "amount": "${ASSET_AMOUNT}",
46                            "holder": "${BURNER_PARTY_ID}",
47                            "reference": "${BURN_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}
87EOF
88)
89
90echo "--- Command response ---"
91echo "$RESULT" | jq
92
93OUTPUTFILE="${SCRIPT_DIR}/response-step-1c.json"
94echo "$RESULT" > "$OUTPUTFILE"

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

 1{
 2    "transaction": {
 3        "updateId": "1220ff9edff73c83fc23d9ef7dc0f774683fdb4e777d98f8770d3bdadf1d99fd3d76",
 4        "commandId": "E38737C0-281D-4AFD-AE64-0F8FF1AA8A85",
 5        "workflowId": "",
 6        "effectiveAt": "2026-03-16T18:23:02.705713Z",
 7        "events": [
 8            {
 9                "CreatedEvent": {
10                    "offset": 18927,
11                    "nodeId": 3,
12                    "contractId": "0094fa6b2fb34298e3b83d8ef10879b9817fc17e52b3fa495ffe5dcf3157bf8a7dca121220576b1b5b037a22edcc98c53b6f0b44347e87be3069e88c0742778983d0039f7d",
13                    "templateId": "661151768d69141dfd6b757bdc348012b2a64b2c956ad586782f97d07408f264:Utility.Registry.App.V0.Model.Burn:BurnOffer",
14                    "contractKey": null,
15                    "createArgument": {
16                        "operator": "alice-lab-operator::12209fc83209bc06d11f07e441ea7890582ca4bcb47162ef30e533cec08086027ba6",
17                        "provider": "provider::12209c469db2449ca57ba9617bf55f7ee57b6bedfe0f13e28677e42a1afce76f4830",
18                        "burn": {
19                            "instrumentId": {
20                                "admin": "admin::1220e2df7cc6be66dd4db3dd4ea8d2fb77cedf047dcca793f52c4f983498196d0521",
21                                "id": "INST"
22                            },
23                            "amount": "3.0000000000",
24                            "holder": "sender::12203537ab59c3b8827a87e12ed48ecf9ce28397d81ed9e22c9cfe0b76944775b3dd",
25                            "reference": "burn-ref-001",
26                            "requestedAt": "2026-03-16T18:23:02Z",
27                            "executeBefore": "2026-03-16T19:23:02Z",
28                            "meta": {
29                                "values": {}
30                            }
31                        }
32                    },
33                    "createdEventBlob": "",
34                    "interfaceViews": [],
35                    "witnessParties": [
36                        "admin::1220e2df7cc6be66dd4db3dd4ea8d2fb77cedf047dcca793f52c4f983498196d0521"
37                    ],
38                    "signatories": [
39                        "admin::1220e2df7cc6be66dd4db3dd4ea8d2fb77cedf047dcca793f52c4f983498196d0521",
40                        "provider::12209c469db2449ca57ba9617bf55f7ee57b6bedfe0f13e28677e42a1afce76f4830"
41                    ],
42                    "observers": [
43                        "sender::12203537ab59c3b8827a87e12ed48ecf9ce28397d81ed9e22c9cfe0b76944775b3dd",
44                        "alice-lab-operator::12209fc83209bc06d11f07e441ea7890582ca4bcb47162ef30e533cec08086027ba6"
45                    ],
46                    "createdAt": "2026-03-16T18:23:02.705713Z",
47                    "packageName": "utility-registry-app-v0",
48                    "representativePackageId": "661151768d69141dfd6b757bdc348012b2a64b2c956ad586782f97d07408f264",
49                    "acsDelta": true
50                }
51            }
52        ],
53        "offset": 18927,
54        "synchronizerId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
55        "traceContext": {
56            "traceparent": "00-8dc3853cd6c0395aa7ad94d5c5936cc8-2611979ac7a3a512-01",
57            "tracestate": null
58        },
59        "recordTime": "2026-03-16T18:23:03.396305Z",
60        "externalTransactionHash": null
61    }
62}

Step 2: Burner Accepts the Burn Offer

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## Burner accepts the burn offer
 5## Step 2a: Obtains ledger end offset
 6## Authorized by: Burner
 7## Script: step-2a-burn-offer-accept.sh
 8## =================================================================================================
 9
10set -euo pipefail
11
12SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13DATAFILE="${SCRIPT_DIR}/source.sh"
14source "$DATAFILE"
15
16if [[ -z "${HTTP_JSON_API_BURNER:-}" ]]; then
17    echo "Error: HTTP_JSON_API_BURNER is not set (check source.sh)" >&2
18    exit 1
19fi
20if [[ -z "${BURNER_TOKEN:-}" ]]; then
21    echo "Error: BURNER_TOKEN is not set (check source.sh)" >&2
22    exit 1
23fi
24
25OFFSET=$(curl -sS --fail-with-body \
26    --url "${HTTP_JSON_API_BURNER}/v2/state/ledger-end" \
27    --header "Accept: application/json" \
28    --header "Authorization: Bearer ${BURNER_TOKEN}" \
29    --request GET)
30
31echo "$OFFSET" | jq
32
33OUTPUTFILE="${SCRIPT_DIR}/response-step-2a.json"
34echo "$OFFSET" > "$OUTPUTFILE"

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

1{
2    "offset": 18895
3}

Step 2b - Retrieve Burn Offer

To retrieve the Burn Offer created in step 1c, run the following script:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Burner accepts the burn offer
 5## Step 2b: Retrieves the burn offer to accept
 6## Authorized by: Burner
 7## Script: step-2b-burn-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_BURNER}/v2/state/active-contracts" \
20    --header "Authorization: Bearer ${BURNER_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            "${BURNER_PARTY_ID}": {
30                "cumulative": [{
31                    "identifierFilter": {
32                        "TemplateFilter": {
33                            "value": {
34                                "templateId":"${BURNOFFER_TEMPLATE}",
35                                "includeCreatedEventBlob": false
36                            }
37                        }
38                    }
39                }]
40            }
41        }
42    }
43}
44EOF
45)
46
47echo "--- Burn 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": 18886,
 8                    "nodeId": 1,
 9                    "contractId": "0094fa6b2fb34298e3b83d8ef10879b9817fc17e52b3fa495ffe5dcf3157bf8a7dca121220576b1b5b037a22edcc98c53b6f0b44347e87be3069e88c0742778983d0039f7d",
10                    "templateId": "661151768d69141dfd6b757bdc348012b2a64b2c956ad586782f97d07408f264:Utility.Registry.App.V0.Model.Burn:BurnOffer",
11                    "contractKey": null,
12                    "createArgument": {
13                        "operator": "alice-lab-operator::12209fc83209bc06d11f07e441ea7890582ca4bcb47162ef30e533cec08086027ba6",
14                        "provider": "provider::12209c469db2449ca57ba9617bf55f7ee57b6bedfe0f13e28677e42a1afce76f4830",
15                        "burn": {
16                            "instrumentId": {
17                                "admin": "admin::1220e2df7cc6be66dd4db3dd4ea8d2fb77cedf047dcca793f52c4f983498196d0521",
18                                "id": "INST"
19                            },
20                            "amount": "3.0000000000",
21                            "holder": "sender::12203537ab59c3b8827a87e12ed48ecf9ce28397d81ed9e22c9cfe0b76944775b3dd",
22                            "reference": "burn-ref-001",
23                            "requestedAt": "2026-03-16T18:23:02Z",
24                            "executeBefore": "2026-03-16T19:23:02Z",
25                            "meta": {
26                                "values": {}
27                            }
28                        }
29                    },
30                    "createdEventBlob": "",
31                    "interfaceViews": [],
32                    "witnessParties": [
33                        "sender::12203537ab59c3b8827a87e12ed48ecf9ce28397d81ed9e22c9cfe0b76944775b3dd"
34                    ],
35                    "signatories": [
36                        "admin::1220e2df7cc6be66dd4db3dd4ea8d2fb77cedf047dcca793f52c4f983498196d0521",
37                        "provider::12209c469db2449ca57ba9617bf55f7ee57b6bedfe0f13e28677e42a1afce76f4830"
38                    ],
39                    "observers": [
40                        "sender::12203537ab59c3b8827a87e12ed48ecf9ce28397d81ed9e22c9cfe0b76944775b3dd",
41                        "alice-lab-operator::12209fc83209bc06d11f07e441ea7890582ca4bcb47162ef30e533cec08086027ba6"
42                    ],
43                    "createdAt": "2026-03-16T18:23:02.705713Z",
44                    "packageName": "utility-registry-app-v0",
45                    "representativePackageId": "661151768d69141dfd6b757bdc348012b2a64b2c956ad586782f97d07408f264",
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 burn offer.

Run the following script:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Burner accepts the burn offer
 5## Step 2c: Gets choice context and disclosure for the accept-burn-offer command
 6## Authorized by: anyone
 7## Script: step-2c-burn-offer-accept.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
18BURNOFFERS=$(cat "${SCRIPT_DIR}/response-step-2b.json")
19BURNOFFER_CID=$(echo "$BURNOFFERS" | jq -r --arg BURN_REF "$BURN_REF" '[.[] | select(.contractEntry.JsActiveContract.createdEvent.createArgument.burn.reference == $BURN_REF)][0].contractEntry.JsActiveContract.createdEvent.contractId')
20
21RESULT=$(
22    curl -sS --fail-with-body \
23    --url "${BACKEND_API_BASE}/api/utilities/v0/registry/burn/v0/offer/${BURNOFFER_CID}/choice-contexts/accept" \
24    --header "Content-Type: application/json" \
25    --request POST \
26    --data @- <<EOF
27{
28   "meta":{
29
30   },
31   "excludeDebugFields": true
32}
33EOF
34)
35
36echo "--- Endpoint response ---"
37echo "$RESULT" | jq
38
39OUTPUTFILE="${SCRIPT_DIR}/response-step-2c.json"
40echo "$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/app-reward-configuration": {
 5                "tag": "AV_ContractId",
 6                "value": "0012d2fdda91def1863c459f228859befb5860a5ad3b0a9945ad9686cf79ad0ac9ca121220cec5ddc54dc38dee46c784f47e31c6fd0e704a370545280965e333714de42be5"
 7            },
 8            "utility.digitalasset.com/instrument-configuration": {
 9                "tag": "AV_ContractId",
10                "value": "00d84682e083b26aa9b797118fdc6579ea623bdac6f8a89e8983fcd7ddaa2ef657ca12122005a8e0162a956280221ff013bbedc1645443aeb86cc40f32b3045fdd59a2161e"
11            },
12            "utility.digitalasset.com/featured-app-right": {
13                "tag": "AV_ContractId",
14                "value": "006e7d1f01d55f9825950c8fa3548fc5ae59bd26e59f12f5ed974b396671fad19eca12122085aa93f54944d490787dc84b880e9f56ace0bc036ebd16de64e108ff8dc4fca3"
15            },
16            "utility.digitalasset.com/enable-result-contracts": {
17                "tag": "AV_Bool",
18                "value": true
19            },
20            "utility.digitalasset.com/issuer-credentials": {
21                "tag": "AV_List",
22                "value": [
23                    {
24                        "tag": "AV_ContractId",
25                        "value": "00c9c8c823a63773d69dca0e2b95cb989bf32e304477799f79bde0723638caa3a7ca12122078a13a2bca464c19317543e6484e6df66479c51170cd9babe81ec9d9bf2fa98f"
26                    }
27                ]
28            }
29        }
30    },
31    "disclosedContracts": [
32        {
33            "createdAt": "2026-03-14T17:18:06.817Z",
34            "contractId": "00d84682e083b26aa9b797118fdc6579ea623bdac6f8a89e8983fcd7ddaa2ef657ca12122005a8e0162a956280221ff013bbedc1645443aeb86cc40f32b3045fdd59a2161e",
35            "templateId": "672e7c8762314b1ac44dabb6f7b15f53f7078a062257395618e71d07b35336eb:Utility.Registry.V0.Configuration.Instrument:InstrumentConfiguration",
36            "domainId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
37            "createdEventBlob": "CgMyLjESpQkKRQDYRoLgg7JqqbeXEY/cZXnqYjvaxvionomD/Nfdqi72V8oSEiAFqOAWKpVigCIf8BO77cFkVEOuuGzEDzKzBF/dWaIWHhITdXRpbGl0eS1yZWdpc3RyeS12MBqNAQpANjcyZTdjODc2MjMxNGIxYWM0NGRhYmI2ZjdiMTVmNTNmNzA3OGEwNjIyNTczOTU2MThlNzFkMDdiMzUzMzZlYhIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEgpJbnN0cnVtZW50GhdJbnN0cnVtZW50Q29uZmlndXJhdGlvbiKJBWqGBQpdCls6WXNqb2Rpbi1sYWItb3BlcmF0b3I6OjEyMjA5ZmM4MzIwOWJjMDZkMTFmMDdlNDQxZWE3ODkwNTgyY2E0YmNiNDcxNjJlZjMwZTUzM2NlYzA4MDg2MDI3YmE2ClIKUDpOcHJvdmlkZXI6OjEyMjA5YzQ2OWRiMjQ0OWNhNTdiYTk2MTdiZjU1ZjdlZTU3YjZiZWRmZTBmMTNlMjg2NzdlNDJhMWFmY2U3NmY0ODMwCk8KTTpLYWRtaW46OjEyMjBlMmRmN2NjNmJlNjZkZDRkYjNkZDRlYThkMmZiNzdjZWRmMDQ3ZGNjYTc5M2Y1MmM0Zjk4MzQ5ODE5NmQwNTIxCnwKemp4Ck8KTTpLYWRtaW46OjEyMjBlMmRmN2NjNmJlNjZkZDRkYjNkZDRlYThkMmZiNzdjZWRmMDQ3ZGNjYTc5M2Y1MmM0Zjk4MzQ5ODE5NmQwNTIxCggKBkIESU5TVAobChlCF1JlZ2lzdHJhckludGVybmFsU2NoZW1lCgQKAloACn0Ke1p5CndqdQpPCk06S2FkbWluOjoxMjIwZTJkZjdjYzZiZTY2ZGQ0ZGIzZGQ0ZWE4ZDJmYjc3Y2VkZjA0N2RjY2E3OTNmNTJjNGY5ODM0OTgxOTZkMDUyMQoiCiBaHgocahoKDgoMQgppc0lzc3Vlck9mCggKBkIESU5TVAp9CntaeQp3anUKTwpNOkthZG1pbjo6MTIyMGUyZGY3Y2M2YmU2NmRkNGRiM2RkNGVhOGQyZmI3N2NlZGYwNDdkY2NhNzkzZjUyYzRmOTgzNDk4MTk2ZDA1MjEKIgogWh4KHGoaCg4KDEIKaXNIb2xkZXJPZgoICgZCBElOU1QqS2FkbWluOjoxMjIwZTJkZjdjYzZiZTY2ZGQ0ZGIzZGQ0ZWE4ZDJmYjc3Y2VkZjA0N2RjY2E3OTNmNTJjNGY5ODM0OTgxOTZkMDUyMSpOcHJvdmlkZXI6OjEyMjA5YzQ2OWRiMjQ0OWNhNTdiYTk2MTdiZjU1ZjdlZTU3YjZiZWRmZTBmMTNlMjg2NzdlNDJhMWFmY2U3NmY0ODMwMllzam9kaW4tbGFiLW9wZXJhdG9yOjoxMjIwOWZjODMyMDliYzA2ZDExZjA3ZTQ0MWVhNzg5MDU4MmNhNGJjYjQ3MTYyZWYzMGU1MzNjZWMwODA4NjAyN2JhNjmeg91V60wGAEIqCiYKJAgBEiC431Q41X0VTLaFpkK6u7VlNNTqEKtx4K0YVHVGvZbI/xAe"
38        },
39        {
40            "createdAt": "2026-03-14T17:18:06.817Z",
41            "contractId": "00c9c8c823a63773d69dca0e2b95cb989bf32e304477799f79bde0723638caa3a7ca12122078a13a2bca464c19317543e6484e6df66479c51170cd9babe81ec9d9bf2fa98f",
42            "templateId": "5a29ead611a0abd5f5b3fc3caf7d0f67c0ff802032ab6d392824aa9060e56d70:Utility.Credential.V0.Credential:Credential",
43            "domainId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
44            "createdEventBlob": "CgMyLjESpgcKRQDJyMgjpjdz1p3KDiuVy5ib8y4wRHd5n3m94HI2OMqjp8oSEiB4oTorykZMGTF1Q+ZITm32ZHnFEXDNm6voHsnZvy+pjxIVdXRpbGl0eS1jcmVkZW50aWFsLXYwGnMKQDVhMjllYWQ2MTFhMGFiZDVmNWIzZmMzY2FmN2QwZjY3YzBmZjgwMjAzMmFiNmQzOTI4MjRhYTkwNjBlNTZkNzASB1V0aWxpdHkSCkNyZWRlbnRpYWwSAlYwEgpDcmVkZW50aWFsGgpDcmVkZW50aWFsIqUDaqIDCk8KTTpLYWRtaW46OjEyMjBlMmRmN2NjNmJlNjZkZDRkYjNkZDRlYThkMmZiNzdjZWRmMDQ3ZGNjYTc5M2Y1MmM0Zjk4MzQ5ODE5NmQwNTIxClAKTjpMc2VuZGVyOjoxMjIwMzUzN2FiNTljM2I4ODI3YTg3ZTEyZWQ0OGVjZjljZTI4Mzk3ZDgxZWQ5ZTIyYzljZmUwYjc2OTQ0Nzc1YjNkZAoFCgNCAWEKBQoDQgFhCgQKAlIACgQKAlIACnQKclpwCm5qbApQCk5CTHNlbmRlcjo6MTIyMDM1MzdhYjU5YzNiODgyN2E4N2UxMmVkNDhlY2Y5Y2UyODM5N2Q4MWVkOWUyMmM5Y2ZlMGI3Njk0NDc3NWIzZGQKDgoMQgppc0lzc3Vlck9mCggKBkIESU5TVAptCmtqaQpnCmViYwphCls6WXNqb2Rpbi1sYWItb3BlcmF0b3I6OjEyMjA5ZmM4MzIwOWJjMDZkMTFmMDdlNDQxZWE3ODkwNTgyY2E0YmNiNDcxNjJlZjMwZTUzM2NlYzA4MDg2MDI3YmE2EgIKACpLYWRtaW46OjEyMjBlMmRmN2NjNmJlNjZkZDRkYjNkZDRlYThkMmZiNzdjZWRmMDQ3ZGNjYTc5M2Y1MmM0Zjk4MzQ5ODE5NmQwNTIxKkxzZW5kZXI6OjEyMjAzNTM3YWI1OWMzYjg4MjdhODdlMTJlZDQ4ZWNmOWNlMjgzOTdkODFlZDllMjJjOWNmZTBiNzY5NDQ3NzViM2RkMllzam9kaW4tbGFiLW9wZXJhdG9yOjoxMjIwOWZjODMyMDliYzA2ZDExZjA3ZTQ0MWVhNzg5MDU4MmNhNGJjYjQ3MTYyZWYzMGU1MzNjZWMwODA4NjAyN2JhNjk6HGZv60wGAEIqCiYKJAgBEiBgw40ML2RYpcZJMWYoDD1XAZOAbueJ4Hkty06uzQdJCBAe"
45        },
46        {
47            "createdAt": "2026-03-14T08:30:23.746871Z",
48            "contractId": "006e7d1f01d55f9825950c8fa3548fc5ae59bd26e59f12f5ed974b396671fad19eca12122085aa93f54944d490787dc84b880e9f56ace0bc036ebd16de64e108ff8dc4fca3",
49            "templateId": "67fac2f853bce8dbf0b9817bb5ba7c59f10e8120b7c808696f7010e5f0c8a791:Splice.Amulet:FeaturedAppRight",
50            "domainId": null,
51            "createdEventBlob": "CgMyLjEStQQKRQBufR8B1V+YJZUMj6NUj8WuWb0m5Z8S9e2XSzlmcfrRnsoSEiCFqpP1SUTUkHh9yEuIDp9WrOC8A269Ft5k4Qj/jcT8oxINc3BsaWNlLWFtdWxldBpkCkA2N2ZhYzJmODUzYmNlOGRiZjBiOTgxN2JiNWJhN2M1OWYxMGU4MTIwYjdjODA4Njk2ZjcwMTBlNWYwYzhhNzkxEgZTcGxpY2USBkFtdWxldBoQRmVhdHVyZWRBcHBSaWdodCKmAWqjAQpNCks6SURTTzo6MTIyMDZjZjhlMWMwY2U2N2Q4MmQ5NjE0OTBmMWVjMzkyZjY3YzEzYmQ0OGJlNTcxZWVlZmJmYTc4MzRhNTg3YTYxMjcKUgpQOk5wcm92aWRlcjo6MTIyMDljNDY5ZGIyNDQ5Y2E1N2JhOTYxN2JmNTVmN2VlNTdiNmJlZGZlMGYxM2UyODY3N2U0MmExYWZjZTc2ZjQ4MzAqSURTTzo6MTIyMDZjZjhlMWMwY2U2N2Q4MmQ5NjE0OTBmMWVjMzkyZjY3YzEzYmQ0OGJlNTcxZWVlZmJmYTc4MzRhNTg3YTYxMjcyTnByb3ZpZGVyOjoxMjIwOWM0NjlkYjI0NDljYTU3YmE5NjE3YmY1NWY3ZWU1N2I2YmVkZmUwZjEzZTI4Njc3ZTQyYTFhZmNlNzZmNDgzMDk3iwTM90wGAEIqCiYKJAgBEiBC9aMxZOBMrVGNHzv3xRCV3H2/+M+XXxvWO4NsQL5pjBAe"
52        },
53        {
54            "createdAt": "2026-03-14T17:18:06.817Z",
55            "contractId": "0012d2fdda91def1863c459f228859befb5860a5ad3b0a9945ad9686cf79ad0ac9ca121220cec5ddc54dc38dee46c784f47e31c6fd0e704a370545280965e333714de42be5",
56            "templateId": "672e7c8762314b1ac44dabb6f7b15f53f7078a062257395618e71d07b35336eb:Utility.Registry.V0.Configuration.AppReward:AppRewardConfiguration",
57            "domainId": "global-domain::12206cf8e1c0ce67d82d961490f1ec392f67c13bd48be571eeefbfa7834a587a6127",
58            "createdEventBlob": "CgMyLjES0gYKRQAS0v3akd7xhjxFnyKIWb77WGClrTsKmUWtlobPea0KycoSEiDOxd3FTcON7kbHhPR+Mcb9DnBKNwVFKAll4zNxTeQr5RITdXRpbGl0eS1yZWdpc3RyeS12MBqLAQpANjcyZTdjODc2MjMxNGIxYWM0NGRhYmI2ZjdiMTVmNTNmNzA3OGEwNjIyNTczOTU2MThlNzFkMDdiMzUzMzZlYhIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEglBcHBSZXdhcmQaFkFwcFJld2FyZENvbmZpZ3VyYXRpb24ihQNqggMKXQpbOllzam9kaW4tbGFiLW9wZXJhdG9yOjoxMjIwOWZjODMyMDliYzA2ZDExZjA3ZTQ0MWVhNzg5MDU4MmNhNGJjYjQ3MTYyZWYzMGU1MzNjZWMwODA4NjAyN2JhNgpSClA6TnByb3ZpZGVyOjoxMjIwOWM0NjlkYjI0NDljYTU3YmE5NjE3YmY1NWY3ZWU1N2I2YmVkZmUwZjEzZTI4Njc3ZTQyYTFhZmNlNzZmNDgzMArMAQrJAWrGAQpNCks6SURTTzo6MTIyMDZjZjhlMWMwY2U2N2Q4MmQ5NjE0OTBmMWVjMzkyZjY3YzEzYmQ0OGJlNTcxZWVlZmJmYTc4MzRhNTg3YTYxMjcKdQpzanEKXQpbOllzam9kaW4tbGFiLW9wZXJhdG9yOjoxMjIwOWZjODMyMDliYzA2ZDExZjA3ZTQ0MWVhNzg5MDU4MmNhNGJjYjQ3MTYyZWYzMGU1MzNjZWMwODA4NjAyN2JhNgoQCg4yDDAuNTAwMDAwMDAwMCpZc2pvZGluLWxhYi1vcGVyYXRvcjo6MTIyMDlmYzgzMjA5YmMwNmQxMWYwN2U0NDFlYTc4OTA1ODJjYTRiY2I0NzE2MmVmMzBlNTMzY2VjMDgwODYwMjdiYTYyTnByb3ZpZGVyOjoxMjIwOWM0NjlkYjI0NDljYTU3YmE5NjE3YmY1NWY3ZWU1N2I2YmVkZmUwZjEzZTI4Njc3ZTQyYTFhZmNlNzZmNDgzMDmg9hcw60wGAEIqCiYKJAgBEiC93ZXtGGQsp4hVlicBw/3QvNQ610YaBwbANzMiTdR4DhAe"
59        }
60    ]
61}

Step 2d - Retrieve Holding CIDs to Burn

Accepting the burn offer requires specifying which holdings will be burned.

Run:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Burner accepts burn offer
 5## Step 2d: Retrieve the burner's holdings as of the offset from step 1a to use for the burn request
 6## Authorized by: Burner
 7## Script: step-2d-burn-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
15if [[ -f "${SCRIPT_DIR}/response-step-2a.json" ]]; then
16  JSONCONTENT=$(cat "${SCRIPT_DIR}/response-step-2a.json")
17  OFFSET=$(echo "$JSONCONTENT" | jq -r ".offset")
18else
19  echo "Error: response-step-2a.json not found"
20  exit 1
21fi
22
23RESULT=$(
24    curl -sS --fail-with-body \
25    --url "${HTTP_JSON_API_BURNER}/v2/state/active-contracts" \
26    --header "Authorization: Bearer ${BURNER_TOKEN}" \
27    --header "Content-Type: application/json" \
28    --request POST \
29    --data @- <<EOF
30{
31    "verbose": false,
32    "activeAtOffset": "${OFFSET}",
33    "filter": {
34        "filtersByParty": {
35            "${BURNER_PARTY_ID}": {
36                "cumulative": [{
37                    "identifierFilter": {
38                        "InterfaceFilter": {
39                            "value": {
40                                "interfaceId":"$HOLDING_INTERFACE",
41                                "includeInterfaceView": true,
42                                "includeCreatedEventBlob": false
43                            }
44                        }
45                    }
46                }]
47            }
48        }
49    }
50}
51EOF
52)
53
54# Filter holdings for a specific holder, instrument ID, admin and extract contractId
55HOLDINGCIDS=$(echo "$RESULT" | jq \
56  --arg BURNER_PARTY_ID "$BURNER_PARTY_ID" \
57  --arg ASSET_ID "$ASSET_ID" \
58  --arg ADMIN_PARTY_ID "$ADMIN_PARTY_ID" \
59  '[
60    .[] as $c
61    | $c.contractEntry.JsActiveContract.createdEvent.interfaceViews[]
62    | select(
63        .viewValue.owner == $BURNER_PARTY_ID and
64        .viewValue.instrumentId.id == $ASSET_ID and
65        .viewValue.instrumentId.admin == $ADMIN_PARTY_ID and
66        .viewValue.lock == null
67    )
68    | $c.contractEntry.JsActiveContract.createdEvent.contractId
69  ]'
70)
71
72echo "--- Holdings of burner (${BURNER_USER_ID}) as of offset ${OFFSET} ---"
73echo "$HOLDINGCIDS" | jq
74
75OUTPUTFILE="${SCRIPT_DIR}/response-step-2d.json"
76echo "$HOLDINGCIDS" > "$OUTPUTFILE"

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

1[
2    "009bb957d069715599e9ffe28fe4a0fc1e094fc6823e2f7a2483f50efdfc2d0f30ca1212209086fd25f081d7d075afbe63cd79254e15127ad334ecad9f01b6ba047771334d"
3]

Step 2e - Accept the Burn Offer (JSON API submit)

To finalize the burn and remove the asset for the burner, execute:

  1#!/usr/bin/env bash
  2
  3## =================================================================================================
  4## Burner accepts the burn offer
  5## Step 2e: Executes the accept-burn-request command
  6## Authorized by: Burner
  7## Script: step-2e-burn-offer-accept.sh
  8## =================================================================================================
  9
 10set -euo pipefail
 11
 12trap 'echo "ERROR: step-2e-burn-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
 18BURNOFFERS=$(cat "${SCRIPT_DIR}/response-step-2b.json")
 19BURNOFFER=$(echo "$BURNOFFERS" | jq -r --arg BURN_REF "$BURN_REF" '[.[] | select(.contractEntry.JsActiveContract.createdEvent.createArgument.burn.reference == $BURN_REF)][0]')
 20BURNOFFER_CID=$(echo "$BURNOFFER" | jq -r .contractEntry.JsActiveContract.createdEvent.contractId)
 21BURNOFFER_TEMPLATE=$(echo "$BURNOFFER" | jq -r .contractEntry.JsActiveContract.createdEvent.templateId)
 22
 23if [[ -z "${BURNOFFER_CID}" || "${BURNOFFER_CID}" == "null" ]]; then
 24    echo "Error: no BurnOffer found in response-step-2b.json for BURN_REF=${BURN_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
 33HOLDINGCIDS=$(cat "${SCRIPT_DIR}/response-step-2d.json")
 34
 35if ! echo "$HOLDINGCIDS" | jq -e 'type == "array"' >/dev/null 2>&1; then
 36    echo "Error: response-step-2d.json is not a JSON array of holding contract IDs" >&2
 37    exit 1
 38fi
 39
 40OUTPUTFILE="${SCRIPT_DIR}/response-step-2e.json"
 41
 42if ! curl -sS --fail-with-body \
 43    --url "${HTTP_JSON_API_BURNER}/v2/commands/submit-and-wait-for-transaction" \
 44    --header "Authorization: Bearer ${BURNER_TOKEN}" \
 45    --header "Accept: application/json" \
 46    --header "Content-Type: application/json" \
 47    --request POST \
 48    --output "$OUTPUTFILE" \
 49    --data @- <<EOF
 50{
 51   "commands":{
 52        "commands":[
 53            {
 54                "ExerciseCommand":{
 55                    "templateId":"${BURNOFFER_TEMPLATE}",
 56                    "contractId":"${BURNOFFER_CID}",
 57                    "choice":"BurnOffer_Accept",
 58                    "choiceArgument":{
 59                        "holdingCids":${HOLDINGCIDS},
 60                        "extraArgs": {
 61                            "context": $CHOICECONTEXTDATA,
 62                            "meta":{
 63                                "values":{
 64                                }
 65                            }
 66                        }
 67                    }
 68                }
 69            }
 70        ],
 71        "workflowId":"",
 72        "userId":"${BURNER_USER_ID}",
 73        "commandId":"$(uuidgen | tr -d '\n')",
 74        "deduplicationPeriod":{
 75            "DeduplicationDuration":{
 76                "value":{
 77                    "seconds":30,
 78                    "nanos":0
 79                }
 80            }
 81        },
 82        "actAs":[
 83                    "${BURNER_PARTY_ID}"
 84        ],
 85        "readAs":[
 86
 87        ],
 88        "submissionId":"$(uuidgen | tr -d '\n')",
 89        "disclosedContracts": ${DISCLOSEDCONTRACTS},
 90        "domainId":"",
 91        "packageIdSelectionPreference":[]
 92    }
 93}
 94EOF
 95then
 96    echo "Response body saved to: $OUTPUTFILE" >&2
 97    if [[ -s "$OUTPUTFILE" ]]; then
 98        echo "--- Response body ---" >&2
 99        cat "$OUTPUTFILE" >&2
100        echo >&2
101    fi
102    exit 1
103fi
104
105RESULT=$(cat "$OUTPUTFILE")
106
107echo "--- Command response ---"
108echo "$RESULT" | jq

Note

If step 2e 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–2d to refresh the offer CID and choice context before accepting.