Registry Utility - Burn Request API Example

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

It is assumed that the burner 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
 9BURNER_TOKEN="eyJhbGciOiJIUzI1NiJ9.eyJzY29wZSI6ImRhbWxfbGVkZ2VyX2FwaSIsImlhdCI6MTc1OTk5MjEzMiwiYXVkIjoiaHR0cHM6Ly91dGlsaXR5LmNhbnRvbi5uZXR3b3JrIiwic3ViIjoiaXNzdWVyIn0.6wP8xNyQopoyKk_rGv9agcIK8TLyJVYLq3oRo983z8Q"
10BURNER_PARTY_ID="issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
11BURNER_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
19BURN_REF="burn-ref-002"
20
21# update your asset and amount to be transferred
22ASSET_ID="INST"
23ASSET_AMOUNT="3.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, may change when new versions of utilities exists
38# ALLOCATIONFACTORY_TEMPLATE="170929b11d5f0ed1385f890f42887c31ff7e289c0f4bc482aff193a7173d576c:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory"
39ALLOCATIONFACTORY_TEMPLATE="#utility-registry-app-v0:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory"
40BURNREQUEST_TEMPLATE="#utility-registry-app-v0:Utility.Registry.App.V0.Model.Burn:BurnRequest"

The required information is:

Required Information

Details of

Description

Burner

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

Burn

Instrument ID, amount to be burned, and reference

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

Initial positions

Step 1: Burner Requests 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## Burner requests a burn of its holdings
 5## Step 1a: Retrieves the current ledger end offset from the ledger
 6## Authorized by: Burner
 7## Script: step-1a-burner-requests.sh
 8## =================================================================================================
 9
10DATAFILE="source.sh"
11source "$DATAFILE"
12
13OFFSET=$(curl -s GET \
14    --url "${HTTP_JSON_API}/v2/state/ledger-end" \
15    --header "Accept: application/json" \
16    --header "Authorization: Bearer ${BURNER_TOKEN}")
17
18echo "$OFFSET" | jq
19
20OUTPUTFILE="response-step-1a.json"
21echo "$OFFSET" > "$OUTPUTFILE"

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

1{
2  "offset": 4136
3}

Step 1b - Retrieve Holding Cids

Run the following script to retrieve the Holding Cids:

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

The result is the Holding Cids, stored in response-step-1b.json. For example:

1[
2  "00127ad26e78e9818046cbea7cddde3a87a26d88d0b6e5c67bc8b8a30eb09d0f57ca1112206b3b79d89f0d9671ae36c51bcfce5ab8d7396c6c4cfda20e1ab0115924d022cb"
3]

Step 1c - Access the Backend API

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

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

The result contains the required choice context for executing the command, stored in response-step-1c.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 1d - Request the Burn

Finally, run the following script to request the burn:

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Burner requests a burn of its holdings
 5## Step 1d: Execute the burn-request command
 6## Authorized by: Burner
 7## Script: step-1d-burner-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
17HOLDINGCIDS=$(cat "response-step-1b.json")
18
19JSONCONTENT=$(cat "response-step-1c.json")
20FACTORYID=$(echo $JSONCONTENT | jq .factoryId)
21CHOICECONTEXTDATA=$(echo $JSONCONTENT | jq .choiceContext.choiceContextData)
22DISCLOSEDCONTRACTS=$(echo $JSONCONTENT | jq .choiceContext.disclosedContracts)
23DISCLOSEDCONTRACTS=$(echo $JSONCONTENT | jq '.choiceContext.disclosedContracts // [] | map(. + {"synchronizerId": ""})')
24
25RESULT=$(
26    curl -s \
27    --url "${HTTP_JSON_API}/v2/commands/submit-and-wait-for-transaction" \
28    --header "Authorization: Bearer ${BURNER_TOKEN}" \
29    --header "Content-Type: application/json" \
30    --request POST \
31    --data @- <<EOF
32{
33   "commands":{
34        "commands":[
35            {
36                "ExerciseCommand":{
37                    "templateId":"${ALLOCATIONFACTORY_TEMPLATE}",
38                    "contractId":${FACTORYID},
39                    "choice":"AllocationFactory_RequestBurn",
40                    "choiceArgument":{
41                        "expectedAdmin":"${ADMIN_PARTY_ID}",
42                        "burn": {
43                            "instrumentId": {
44                              "admin": "${ADMIN_PARTY_ID}",
45                              "id": "${ASSET_ID}"
46                            },
47                            "amount": "${ASSET_AMOUNT}",
48                            "holder": "${BURNER_PARTY_ID}",
49                            "reference": "${BURN_REF}",
50                            "requestedAt": "${NOW_ISO_TIMESTAMP}",
51                            "executeBefore": "${ONEHOUR_ISO_TIMESTAMP}",
52                            "meta": {
53                              "values": {}
54                            }
55                        },
56                        "holdingCids":${HOLDINGCIDS},
57                        "extraArgs":{
58                            "context":${CHOICECONTEXTDATA},
59                            "meta":{
60                                "values":{
61                                }
62                            }
63                        }
64                    }
65                }
66            }
67        ],
68        "workflowId":"",
69        "userId":"${BURNER_USER_ID}",
70        "commandId":"$(uuidgen | tr -d '\n')",
71        "deduplicationPeriod":{
72            "DeduplicationDuration":{
73                "value":{
74                    "seconds":30,
75                    "nanos":0
76                }
77            }
78        },
79        "actAs":[
80            "${BURNER_PARTY_ID}"
81        ],
82        "readAs":[
83        ],
84        "submissionId":"$(uuidgen | tr -d '\n')",
85        "disclosedContracts": ${DISCLOSEDCONTRACTS},
86        "domainId":"",
87        "packageIdSelectionPreference":[]
88    }
89}
90EOF
91)
92
93echo "--- Command response ---"
94echo $RESULT | jq
95
96OUTPUTFILE="response-step-1d.json"
97echo "$RESULT" > "$OUTPUTFILE"

After the exercise command is executed, the amount is locked by the admin.

Locked positions after burn request

Step 2: Admin Accepts Burn Reequest

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 burn 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_PARTY_ID}")
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": 4143
3}

Step 2b - Retrieve Burn Request

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

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Admin accepts the burn request
 5## Step 2b: Retrieves the burn 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":"${BURNREQUEST_TEMPLATE}",
34                                "includeCreatedEventBlob": false
35                            }
36                        }
37                    }
38                }]
39            }
40        }
41    }
42}
43EOF
44)
45
46echo "--- Burn Request ---"
47echo "$RESULT" | jq
48
49OUTPUTFILE="response-step-2b.json"
50echo "$RESULT" > "$OUTPUTFILE"

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

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

Step 2c - Access the Backend API

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

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Admin accepts the burn request
 5## Step 2c: Gets choice context and disclosure for the accept-burn-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
17BURNREQUESTS=$(cat "response-step-2b.json")
18BURNREQUEST_CID=$(echo "$BURNREQUESTS" | jq -r --arg BURN_REF "$BURN_REF" '[.[] | select(.contractEntry.JsActiveContract.createdEvent.createArgument.burn.reference == $BURN_REF)][0].contractEntry.JsActiveContract.createdEvent.contractId')
19
20RESULT=$(
21    curl -s \
22    --url "${BACKEND_API}/v0/registry/burn/v0/request/${BURNREQUEST_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 Burn Request

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

 1#!/usr/bin/env bash
 2
 3## =================================================================================================
 4## Admin accepts the burn request
 5## Step 2d: Executes the accept-burn-request command
 6## Authorized by: Admin
 7## Script: step-2d-admin-accepts.sh
 8## =================================================================================================
 9
10DATAFILE="source.sh"
11source "$DATAFILE"
12
13BURNREQUESTS=$(cat "response-step-2b.json")
14BURNREQUEST=$(echo "$BURNREQUESTS" | jq -r --arg BURN_REF "$BURN_REF" '[.[] | select(.contractEntry.JsActiveContract.createdEvent.createArgument.burn.reference == $BURN_REF)][0]')
15BURNREQUEST_CID=$(echo "$BURNREQUEST" | jq -r .contractEntry.JsActiveContract.createdEvent.contractId)
16BURNREQUEST_TEMPLATE=$(echo "$BURNREQUEST" | 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":"${BURNREQUEST_TEMPLATE}",
36                    "contractId":"${BURNREQUEST_CID}",
37                    "choice":"BurnRequest_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"

For example, this is the response of this command:

 1{
 2  "transaction": {
 3    "updateId": "122096c6ca09db8e59bb9fa74f0d2303561fe722b89c8a5ed9cbcf5ed2399b655e76",
 4    "commandId": "A52F8C64-9788-49CC-8D94-16B8322AFC4D",
 5    "workflowId": "",
 6    "effectiveAt": "2025-10-10T10:12:37.509006Z",
 7    "events": [
 8      {
 9        "ArchivedEvent": {
10          "offset": 4144,
11          "nodeId": 0,
12          "contractId": "00248633b192704c1ad9f145e46f44158a92c4e8620e24f5074da54316a7da5e0bca11122086f5162d9d8de0d9ae114389680ad61d2fe5dad19f57a6dd227806610388e82a",
13          "templateId": "170929b11d5f0ed1385f890f42887c31ff7e289c0f4bc482aff193a7173d576c:Utility.Registry.App.V0.Model.Burn:BurnRequest",
14          "witnessParties": [
15            "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
16          ],
17          "packageName": "utility-registry-app-v0",
18          "implementedInterfaces": []
19        }
20      },
21      {
22        "ArchivedEvent": {
23          "offset": 4144,
24          "nodeId": 2,
25          "contractId": "0007706fefe2a2b1951cf4e441b0799f810d3756f3f5ac521981e72d36dc5d740aca111220b40ba49c122d1cdabe9c361a6008e18ab523aa91a5918afd87ae86bd2e469e7b",
26          "templateId": "dd3a9f2d51cc4c52d9ec2e1d7ff235298dcfb3afd1d50ab44328b1aaa9a18587:Utility.Registry.Holding.V0.Holding:Holding",
27          "witnessParties": [
28            "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
29          ],
30          "packageName": "utility-registry-holding-v0",
31          "implementedInterfaces": []
32        }
33      },
34      {
35        "CreatedEvent": {
36          "offset": 4144,
37          "nodeId": 5,
38          "contractId": "0000de51b471a9207c0fb855a69c19e72dde41b803dc3239611526a07a289736b7ca1112201568a3fa987d40896234b1cf519a128e458fc943ae5829fea41f9982bd754ba2",
39          "templateId": "170929b11d5f0ed1385f890f42887c31ff7e289c0f4bc482aff193a7173d576c:Utility.Registry.App.V0.Model.Burn:ExecutedBurn",
40          "contractKey": null,
41          "createArgument": {
42            "operator": "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
43            "provider": "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
44            "burn": {
45              "instrumentId": {
46                "admin": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
47                "id": "INST"
48              },
49              "amount": "3.0000000000",
50              "holder": "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
51              "reference": "burn-ref-002",
52              "requestedAt": "2025-10-10T10:11:19Z",
53              "executeBefore": "2025-10-10T11:11:19Z",
54              "meta": {
55                "values": {}
56              }
57            }
58          },
59          "createdEventBlob": "",
60          "interfaceViews": [],
61          "witnessParties": [
62            "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
63          ],
64          "signatories": [
65            "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
66          ],
67          "observers": [
68            "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
69            "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
70            "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
71          ],
72          "createdAt": "2025-10-10T10:12:37.509006Z",
73          "packageName": "utility-registry-app-v0"
74        }
75      }
76    ],
77    "offset": 4144,
78    "synchronizerId": "global-domain::1220f0c14212edfc6ca9b0dfc6f5943b51a80efe71de8abf5759c8f57b7510f633eb",
79    "traceContext": {
80      "traceparent": "00-e586ae8f5bbf537c2e06bce74365ba90-e40c56da6a68f532-01",
81      "tracestate": null
82    },
83    "recordTime": "2025-10-10T10:12:37.563687Z"
84  }
85}

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

Final positions after burn