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