- Overview
- Setup
- Tutorials
- How Tos
- Reference
- DAR Versions
- API Reference
- Commercials API
- Credential API
- Registry API
- Utility.Registry
- Utility.Registry.V0.Configuration.AppReward
- Utility.Registry.V0.Configuration.Instrument
- Utility.Registry.V0.Holding.Allocation
- Utility.Registry.V0.Holding.Burn
- Utility.Registry.V0.Holding.Lock
- Utility.Registry.V0.Holding.Mint
- Utility.Registry.V0.Holding.Transfer
- Utility.Registry.V0.Holding.Unlock
- Utility.Registry.V0.Rule.Transfer
- Utility.Registry.V0.Types
- Utility.Registry.V0.Util
- Utility.Registry.App
- Utility.Registry.App.V0.Configuration.Operator
- Utility.Registry.App.V0.Configuration.Provider
- Utility.Registry.App.V0.Model.Burn
- Utility.Registry.App.V0.Model.Mint
- Utility.Registry.App.V0.Model.Transfer
- Utility.Registry.App.V0.Service.AllocationFactory
- Utility.Registry.App.V0.Service.Holder
- Utility.Registry.App.V0.Service.Provider
- Utility.Registry.App.V0.Service.Registrar
- Utility.Holding
- Utility.Registry
- Settlement Utility API
- Collateral Utility API
- Operator Backend API
Registry Utility - Transfer API Example¶
This example shows how to perform a transfer offer on CNU 0.9.x using the HTTP JSON API.
It is assumed that both the sender and receiver have all the required credentials as holders 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# sender's details
9SENDER_TOKEN="eyJhbGciOiJIUzI1NiJ9.eyJzY29wZSI6ImRhbWxfbGVkZ2VyX2FwaSIsImlhdCI6MTc1OTk5MjEzMiwiYXVkIjoiaHR0cHM6Ly91dGlsaXR5LmNhbnRvbi5uZXR3b3JrIiwic3ViIjoiaXNzdWVyIn0.6wP8xNyQopoyKk_rGv9agcIK8TLyJVYLq3oRo983z8Q"
10SENDER_PARTY_ID="issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
11SENDER_USER_ID="issuer"
12
13# receiver's details
14RECEIVER_TOKEN="eyJhbGciOiJIUzI1NiJ9.eyJzY29wZSI6ImRhbWxfbGVkZ2VyX2FwaSIsImlhdCI6MTc1OTk5MjE0NiwiYXVkIjoiaHR0cHM6Ly91dGlsaXR5LmNhbnRvbi5uZXR3b3JrIiwic3ViIjoiaG9sZGVyIn0.4zuioSDoiysXfNLmobyW0xqXmJEY1tnvX7QOnHv1ASU"
15RECEIVER_PARTY_ID="holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
16RECEIVER_USER_ID="holder"
17
18# update your asset and amount to be transferred
19ADMIN_PARTY_ID="registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
20ASSET_ID="INST"
21ASSET_AMOUNT="10.0"
22
23# example 1
24# BACKEND_API="https://api.utilities.digitalasset-dev.com/api/token-standard"
25# HTTP_JSON_API="https://utility.demo.registry.digitalasset.com/api/json-api"
26# example 2
27# BACKEND_API="https://api.utilities.digitalasset-dev.com/api/token-standard"
28# HTTP_JSON_API="https://utility.demo.registry.digitalasset.com/api/json-api"
29BACKEND_API="http://localhost:8080/api/token-standard"
30HTTP_JSON_API="http://localhost:8001/api/json-api"
31
32# token standard holding interface, may change when new versions of splice exists
33TRANSFERFACTORY_INTERFACE="55ba4deb0ad4662c4168b39859738a0e91388d252286480c7331b3f71a517281:Splice.Api.Token.TransferInstructionV1:TransferFactory"
34HOLDING_INTERFACE="718a0f77e505a8de22f188bd4c87fe74101274e9d4cb1bfac7d09aec7158d35b:Splice.Api.Token.HoldingV1:Holding"
35TRANSFER_INSTRUCTION_INTERFACE="55ba4deb0ad4662c4168b39859738a0e91388d252286480c7331b3f71a517281:Splice.Api.Token.TransferInstructionV1:TransferInstruction"
The required information is:
Details of |
Description |
|---|---|
Sender |
JWT, user ID, and party ID of the sender |
Receiver |
JWT, user ID, and party ID of the receiver |
Operator |
Backend API and JSON Ledger API |
Transfer |
Instrument ID and amount to be transferred |
If possible, open three CNU UI windows, one each for the admin, sender, and receiver. This allows you to observe changes in holdings for the parties throughout the transfer process. The image below shows the initial holdings for both the sender (issuer) and the receiver (holder) for the instrument INST.
Step 1: Sender Offers a Transfer¶
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## Sender offers a transfer
5## Step 1a: Obtains ledger end offset
6## Authorized by: Sender
7## Script: step-1a-sender-offers.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 ${SENDER_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-offset.json. For example:
1{
2 "offset": 4246
3}
Step 1b - Retrieve Holding Cids¶
Run the following script to retrieve the Holding Cids:
1#!/usr/bin/env bash
2
3## =================================================================================================
4## Sender offers a transfer
5## Step 1b: Retrieve sender's holdings as of the offset from step 1a to use for the transfer
6## Authorized by: Sender
7## Script: step-1b-sender-offers.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 ${SENDER_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 "${SENDER_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
54# Filter holdings for a specific holder, instrument ID, admin and extract contractId
55HOLDINGCIDS=$(echo "$RESULT" | jq \
56 --arg SENDER_PARTY_ID "$SENDER_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 == $SENDER_PARTY_ID and
64 .viewValue.instrumentId.id == $ASSET_ID and
65 .viewValue.instrumentId.admin == $ADMIN_PARTY_ID
66 )
67 | $c.contractEntry.JsActiveContract.createdEvent.contractId
68 ]'
69)
70
71echo "--- Holdings of sender (${SENDER_USER_ID}) as of offset ${OFFSET} ---"
72echo "$HOLDINGCIDS" | jq
73
74OUTPUTFILE="response-step-1b.json"
75echo "$HOLDINGCIDS" > "$OUTPUTFILE"
The result is the Holding Cids, stored in response-step-1b.json. For example:
1[
2 "0016ddecdd744c90c7d25fd9609369223c44337fb73dba5c63613c14f9f4e1e44eca111220c8227ae252e5767438faccd649c077c907e394ed476a7129b2af48ff9a242049",
3 "00d37133155054a7a4788c59d2f318bea3a78ab046cf1cb5e437774668b48a6f4bca11122072d862fa4cac490a05de4fedc8a3f421ed399ce0fe4a6e85155cdf5988c35dbf"
4]
Step 1c - Access the Backend API¶
The request URL is ${BACKEND_API}/v0/registrars/${ADMIN_PARTY_ID}/registry/transfer-instruction/v1/transfer-factory. To hit this endpoint, run the following script:
1#!/usr/bin/env bash
2
3## =================================================================================================
4## Sender offers a transfer
5## Step 1c: Gets choice context and disclosure for the transfer-offer command
6## Authorized by: anyone
7## Script: step-1c-sender-offers.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/registrars/${ADMIN_PARTY_ID}/registry/transfer-instruction/v1/transfer-factory" \
22 --header "Content-Type: application/json" \
23 --request POST \
24 --data @- <<EOF
25{
26 "choiceArguments":{
27 "expectedAdmin":"${ADMIN_PARTY_ID}",
28 "transfer":{
29 "sender":"${SENDER_PARTY_ID}",
30 "receiver":"${RECEIVER_PARTY_ID}",
31 "amount":"${ASSET_AMOUNT}",
32 "instrumentId":{
33 "admin":"${ADMIN_PARTY_ID}",
34 "id":"${ASSET_ID}"
35 },
36 "requestedAt":"${NOW_ISO_TIMESTAMP}",
37 "executeBefore":"${ONEHOUR_ISO_TIMESTAMP}",
38 "inputHoldingCids":${HOLDINGCIDS},
39 "meta":{
40 "values":{
41 "splice.lfdecentralizedtrust.org/reason":""
42 }
43 }
44 },
45 "extraArgs":{
46 "context":{
47 "values":{
48
49 }
50 },
51 "meta":{
52 "values":{
53
54 }
55 }
56 }
57 },
58 "excludeDebugFields":true
59}
60EOF
61)
62
63echo "--- Endpoint response ---"
64echo $RESULT | jq
65
66OUTPUTFILE="response-step-1c.json"
67echo "$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 "transferKind": "offer",
4 "choiceContext": {
5 "choiceContextData": {
6 "values": {
7 "utility.digitalasset.com/instrument-configuration": {
8 "tag": "AV_ContractId",
9 "value": "00eca75bf1e14e192de69b58054cf62f2a60a9c0aae8f4d3491a4b2fad9f9731eaca111220b5fd51ccd498385b0ceaef63243fdfef6c2e62dd8d3a2f59fdb61a9099956481"
10 },
11 "utility.digitalasset.com/sender-credentials": {
12 "tag": "AV_List",
13 "value": [
14 {
15 "tag": "AV_ContractId",
16 "value": "00840216df4df7f46e853231f4cfcd23dfb98bc4a3d670b1e0ed3b9b9afa218aecca1112207057c74dc0da345b4ec3006eae3a55ac1cd7fc34aa23c13cf453f5b9a9884235"
17 }
18 ]
19 },
20 "instrument-configuration": {
21 "tag": "AV_ContractId",
22 "value": "00eca75bf1e14e192de69b58054cf62f2a60a9c0aae8f4d3491a4b2fad9f9731eaca111220b5fd51ccd498385b0ceaef63243fdfef6c2e62dd8d3a2f59fdb61a9099956481"
23 },
24 "sender-credentials": {
25 "tag": "AV_List",
26 "value": [
27 {
28 "tag": "AV_ContractId",
29 "value": "00840216df4df7f46e853231f4cfcd23dfb98bc4a3d670b1e0ed3b9b9afa218aecca1112207057c74dc0da345b4ec3006eae3a55ac1cd7fc34aa23c13cf453f5b9a9884235"
30 }
31 ]
32 }
33 }
34 },
35 "disclosedContracts": [
36 {
37 "templateId": "170929b11d5f0ed1385f890f42887c31ff7e289c0f4bc482aff193a7173d576c:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory",
38 "contractId": "000b99a12b36d9d3b865060c19eab4558b63b105ea8f6917442aef10394712ee7dca1112205046662015ee57e20143d8ae8f9985e069d1db31e3d8540c0543f3e4ccb8e863",
39 "createdEventBlob": "CgMyLjESmQYKRQALmaErNtnTuGUGDBnqtFWLY7EF6o9pF0Qq7xA5RxLufcoREiBQRmYgFe5X4gFD2K6PmYXgadHbMePYVAwFQ/PkzLjoYxIXdXRpbGl0eS1yZWdpc3RyeS1hcHAtdjAajQEKQDE3MDkyOWIxMWQ1ZjBlZDEzODVmODkwZjQyODg3YzMxZmY3ZTI4OWMwZjRiYzQ4MmFmZjE5M2E3MTczZDU3NmMSB1V0aWxpdHkSCFJlZ2lzdHJ5EgNBcHASAlYwEgdTZXJ2aWNlEhFBbGxvY2F0aW9uRmFjdG9yeRoRQWxsb2NhdGlvbkZhY3RvcnkigAJq/QEKUgpQOk5wcm92aWRlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKUwpROk9yZWdpc3RyYXI6OjEyMjBkMzAxYWJhYmJlZDdiYzhkNmY2YTgwY2UxNmYzMzkzM2E3Mjc0YTMwMTMyNDFiN2ZiMzczY2E3ZTRmMGQ2NTY3ClIKUDpOb3BlcmF0b3I6OjEyMjBiMzlkZjVlZDBlM2M1ODRjZDk3ZTg2ZTc3OWRlZjkzM2Q1NDViZjlhNGZhYjNjMGZkM2U0YWQzZjdhMzZiOGZlKk5wcm92aWRlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcqT3JlZ2lzdHJhcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcyTm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZTnKhnS2q0AGAEIqCiYKJAgBEiCdfF/uuVvbYVGCBftUb6P/SwJDPzwGmCDQ4jzAdtOMPBAe",
40 "synchronizerId": "",
41 "debugPackageName": null,
42 "debugPayload": null,
43 "debugCreatedAt": null
44 },
45 {
46 "templateId": "ed73d5b9ab717333f3dbd122de7be3156f8bf2614a67360c3dd61fc0135133fa:Utility.Registry.V0.Configuration.Instrument:InstrumentConfiguration",
47 "contractId": "00eca75bf1e14e192de69b58054cf62f2a60a9c0aae8f4d3491a4b2fad9f9731eaca111220b5fd51ccd498385b0ceaef63243fdfef6c2e62dd8d3a2f59fdb61a9099956481",
48 "createdEventBlob": "CgMyLjESpgkKRQDsp1vx4U4ZLeabWAVM9i8qYKnAquj000kaSy+tn5cx6soREiC1/VHM1Jg4Wwzq72MkP9/vbC5i3Y06L1n9thqQmZVkgRITdXRpbGl0eS1yZWdpc3RyeS12MBqNAQpAZWQ3M2Q1YjlhYjcxNzMzM2YzZGJkMTIyZGU3YmUzMTU2ZjhiZjI2MTRhNjczNjBjM2RkNjFmYzAxMzUxMzNmYRIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEgpJbnN0cnVtZW50GhdJbnN0cnVtZW50Q29uZmlndXJhdGlvbiKRBWqOBQpSClA6Tm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZQpSClA6TnByb3ZpZGVyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwpTClE6T3JlZ2lzdHJhcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKgAEKfmp8ClMKUTpPcmVnaXN0cmFyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwoICgZCBElOU1QKGwoZQhdSZWdpc3RyYXJJbnRlcm5hbFNjaGVtZQoECgJaAAqBAQp/Wn0Ke2p5ClMKUTpPcmVnaXN0cmFyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwoiCiBaHgocahoKDgoMQgppc0lzc3Vlck9mCggKBkIESU5TVAqBAQp/Wn0Ke2p5ClMKUTpPcmVnaXN0cmFyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwoiCiBaHgocahoKDgoMQgppc0hvbGRlck9mCggKBkIESU5TVCpOcHJvdmlkZXI6OjEyMjBkMzAxYWJhYmJlZDdiYzhkNmY2YTgwY2UxNmYzMzkzM2E3Mjc0YTMwMTMyNDFiN2ZiMzczY2E3ZTRmMGQ2NTY3Kk9yZWdpc3RyYXI6OjEyMjBkMzAxYWJhYmJlZDdiYzhkNmY2YTgwY2UxNmYzMzkzM2E3Mjc0YTMwMTMyNDFiN2ZiMzczY2E3ZTRmMGQ2NTY3Mk5vcGVyYXRvcjo6MTIyMGIzOWRmNWVkMGUzYzU4NGNkOTdlODZlNzc5ZGVmOTMzZDU0NWJmOWE0ZmFiM2MwZmQzZTRhZDNmN2EzNmI4ZmU5rPtttqtABgBCKgomCiQIARIgQ1DsOZLYGVRiscestTBDQ3CqU27WvKQODudfxMesKCEQHg==",
49 "synchronizerId": "",
50 "debugPackageName": null,
51 "debugPayload": null,
52 "debugCreatedAt": null
53 }
54 ]
55 }
56}
Step 1d - Offer the Transfer¶
Finally, run the following script to offer the transfer:
1#!/usr/bin/env bash
2
3## =================================================================================================
4## Sender offers a transfer
5## Step 1d: Executes the transfer-offer command
6## Authorized by: Sender
7## Script: step-1d-sender-offers.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)
23
24RESULT=$(
25 curl -s \
26 --url "${HTTP_JSON_API}/v2/commands/submit-and-wait-for-transaction" \
27 --header "Authorization: Bearer ${SENDER_TOKEN}" \
28 --header "Content-Type: application/json" \
29 --request POST \
30 --data @- <<EOF
31{
32 "commands":{
33 "commands":[
34 {
35 "ExerciseCommand":{
36 "templateId":"${TRANSFERFACTORY_INTERFACE}",
37 "contractId":${FACTORYID},
38 "choice":"TransferFactory_Transfer",
39 "choiceArgument":{
40 "expectedAdmin":"${ADMIN_PARTY_ID}",
41 "transfer":{
42 "sender":"${SENDER_PARTY_ID}",
43 "receiver":"${RECEIVER_PARTY_ID}",
44 "amount":"${ASSET_AMOUNT}",
45 "instrumentId":{
46 "admin":"${ADMIN_PARTY_ID}",
47 "id":"${ASSET_ID}"
48 },
49 "requestedAt":"${NOW_ISO_TIMESTAMP}",
50 "executeBefore":"${ONEHOUR_ISO_TIMESTAMP}",
51 "inputHoldingCids":${HOLDINGCIDS},
52 "meta":{
53 "values":{
54 "splice.lfdecentralizedtrust.org/reason":""
55 }
56 }
57 },
58 "extraArgs":{
59 "context":${CHOICECONTEXTDATA},
60 "meta":{
61 "values":{
62 }
63 }
64 }
65 }
66 }
67 }
68 ],
69 "workflowId":"",
70 "userId":"${SENDER_USER_ID}",
71 "commandId":"$(uuidgen | tr -d '\n')",
72 "deduplicationPeriod":{
73 "DeduplicationDuration":{
74 "value":{
75 "seconds":30,
76 "nanos":0
77 }
78 }
79 },
80 "actAs":[
81 "${SENDER_PARTY_ID}"
82 ],
83 "readAs":[
84
85 ],
86 "submissionId":"$(uuidgen | tr -d '\n')",
87 "disclosedContracts": ${DISCLOSEDCONTRACTS},
88 "domainId":"",
89 "packageIdSelectionPreference":[]
90 }
91}
92EOF
93)
94
95echo "--- Command response ---"
96echo $RESULT | jq
97
98OUTPUTFILE="response-step-1d.json"
99echo "$RESULT" > "$OUTPUTFILE"
For example, this is the response of this command:
1{
2 "transaction": {
3 "updateId": "1220c6b7f0a55d77b5a1634c322fa2e63bed70814d25c89ee1d07d719473a3208676",
4 "commandId": "E13861F6-F6E0-4802-B9DB-F4B70E1048BF",
5 "workflowId": "",
6 "effectiveAt": "2025-10-10T10:31:55.117218Z",
7 "events": [
8 {
9 "ArchivedEvent": {
10 "offset": 4249,
11 "nodeId": 4,
12 "contractId": "0016ddecdd744c90c7d25fd9609369223c44337fb73dba5c63613c14f9f4e1e44eca111220c8227ae252e5767438faccd649c077c907e394ed476a7129b2af48ff9a242049",
13 "templateId": "dd3a9f2d51cc4c52d9ec2e1d7ff235298dcfb3afd1d50ab44328b1aaa9a18587:Utility.Registry.Holding.V0.Holding:Holding",
14 "witnessParties": [
15 "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
16 ],
17 "packageName": "utility-registry-holding-v0",
18 "implementedInterfaces": []
19 }
20 },
21 {
22 "ArchivedEvent": {
23 "offset": 4249,
24 "nodeId": 6,
25 "contractId": "00d37133155054a7a4788c59d2f318bea3a78ab046cf1cb5e437774668b48a6f4bca11122072d862fa4cac490a05de4fedc8a3f421ed399ce0fe4a6e85155cdf5988c35dbf",
26 "templateId": "dd3a9f2d51cc4c52d9ec2e1d7ff235298dcfb3afd1d50ab44328b1aaa9a18587:Utility.Registry.Holding.V0.Holding:Holding",
27 "witnessParties": [
28 "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
29 ],
30 "packageName": "utility-registry-holding-v0",
31 "implementedInterfaces": []
32 }
33 },
34 {
35 "CreatedEvent": {
36 "offset": 4249,
37 "nodeId": 7,
38 "contractId": "0041f93610a76b343fe5e969b953805a23674304341ff36a8e61fa1df0be6fc7f3ca111220877889786a97380f80e2a00e0da81525833982d789c9d72dc43ddc24d215eecb",
39 "templateId": "dd3a9f2d51cc4c52d9ec2e1d7ff235298dcfb3afd1d50ab44328b1aaa9a18587:Utility.Registry.Holding.V0.Holding:Holding",
40 "contractKey": null,
41 "createArgument": {
42 "operator": "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
43 "provider": "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
44 "registrar": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
45 "owner": "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
46 "instrument": {
47 "source": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
48 "id": "INST",
49 "scheme": "RegistrarInternalScheme"
50 },
51 "label": "",
52 "amount": "10.0000000000",
53 "lock": {
54 "lockers": {
55 "map": [
56 [
57 "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
58 {}
59 ]
60 ]
61 },
62 "context": "",
63 "observers": {
64 "map": [
65 [
66 "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
67 {}
68 ]
69 ]
70 }
71 }
72 },
73 "createdEventBlob": "",
74 "interfaceViews": [],
75 "witnessParties": [
76 "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
77 ],
78 "signatories": [
79 "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
80 "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
81 ],
82 "observers": [
83 "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
84 "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
85 "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
86 ],
87 "createdAt": "2025-10-10T10:31:55.117218Z",
88 "packageName": "utility-registry-holding-v0"
89 }
90 },
91 {
92 "CreatedEvent": {
93 "offset": 4249,
94 "nodeId": 8,
95 "contractId": "00c5ebf11bba0ef8c43531a83906453997253ed8493334cabc0852e057e01d849dca111220b95fcfdcd054ab8f88a0196f3129651facd8c6f1103db092824a1f857ffd53f5",
96 "templateId": "dd3a9f2d51cc4c52d9ec2e1d7ff235298dcfb3afd1d50ab44328b1aaa9a18587:Utility.Registry.Holding.V0.Holding:Holding",
97 "contractKey": null,
98 "createArgument": {
99 "operator": "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
100 "provider": "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
101 "registrar": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
102 "owner": "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
103 "instrument": {
104 "source": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
105 "id": "INST",
106 "scheme": "RegistrarInternalScheme"
107 },
108 "label": "",
109 "amount": "30.0000000000",
110 "lock": null
111 },
112 "createdEventBlob": "",
113 "interfaceViews": [],
114 "witnessParties": [
115 "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
116 ],
117 "signatories": [
118 "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
119 "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
120 ],
121 "observers": [
122 "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
123 "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
124 ],
125 "createdAt": "2025-10-10T10:31:55.117218Z",
126 "packageName": "utility-registry-holding-v0"
127 }
128 },
129 {
130 "CreatedEvent": {
131 "offset": 4249,
132 "nodeId": 9,
133 "contractId": "00faddf948ee97e0d70be1baad6517e8af6a1bbd57e0646c300e2d23857bacb38fca11122059a0b3f54bafc2deab11e7964961c1ecda4b6a1fdeec4435d01726663666484f",
134 "templateId": "170929b11d5f0ed1385f890f42887c31ff7e289c0f4bc482aff193a7173d576c:Utility.Registry.App.V0.Model.Transfer:TransferOffer",
135 "contractKey": null,
136 "createArgument": {
137 "operator": "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
138 "provider": "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
139 "transfer": {
140 "sender": "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
141 "receiver": "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
142 "amount": "10.0000000000",
143 "instrumentId": {
144 "admin": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
145 "id": "INST"
146 },
147 "requestedAt": "2025-10-10T10:31:54Z",
148 "executeBefore": "2025-10-10T11:31:54Z",
149 "inputHoldingCids": [
150 "0041f93610a76b343fe5e969b953805a23674304341ff36a8e61fa1df0be6fc7f3ca111220877889786a97380f80e2a00e0da81525833982d789c9d72dc43ddc24d215eecb"
151 ],
152 "meta": {
153 "values": {
154 "splice.lfdecentralizedtrust.org/reason": ""
155 }
156 }
157 }
158 },
159 "createdEventBlob": "",
160 "interfaceViews": [],
161 "witnessParties": [
162 "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
163 ],
164 "signatories": [
165 "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
166 "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
167 "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
168 ],
169 "observers": [
170 "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
171 "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe"
172 ],
173 "createdAt": "2025-10-10T10:31:55.117218Z",
174 "packageName": "utility-registry-app-v0"
175 }
176 }
177 ],
178 "offset": 4249,
179 "synchronizerId": "global-domain::1220f0c14212edfc6ca9b0dfc6f5943b51a80efe71de8abf5759c8f57b7510f633eb",
180 "traceContext": {
181 "traceparent": "00-4ddd5bfb8c08ed720dea79fb2e988cdb-6a13bc923bea9975-01",
182 "tracestate": null
183 },
184 "recordTime": "2025-10-10T10:31:55.154179Z"
185 }
186}
After the exercise command is executed, the amount is locked by the admin.
Step 2: Receiver Accepts the Transfer 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## Receiver accepts offer
5## Step 2a: Obtains ledger end offset
6## Authorized by: Receiver
7## Script: step-2a-receiver-accepts.sh
8## =================================================================================================
9
10DATAFILE="source.sh"
11source "$DATAFILE"
12
13# obtain ledger end
14OFFSET=$(curl -s GET \
15 --url "${HTTP_JSON_API}/v2/state/ledger-end" \
16 --header "Accept: application/json" \
17 --header "Authorization: Bearer ${RECEIVER_TOKEN}")
18
19echo "$OFFSET" | jq
20
21OUTPUTFILE="response-step-2a.json"
22echo "$OFFSET" > "$OUTPUTFILE"
The result is the ledger end offset at this moment, stored in response-step-2a.json. For example:
1{
2 "offset": 4251
3}
Step 2b - Retrieve Transfer Offer¶
To retrieve the Transfer Offer created in Step 1d, run the following script:
1#!/usr/bin/env bash
2
3## =================================================================================================
4## Receiver accepts offer
5## Step 2b: Retrieves the transfer offer to accept
6## Authorized by: Receiver
7## Script: step-2b-receiver-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 ${RECEIVER_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 "${RECEIVER_PARTY_ID}": {
29 "cumulative": [{
30 "identifierFilter": {
31 "InterfaceFilter": {
32 "value": {
33 "interfaceId":"$TRANSFER_INSTRUCTION_INTERFACE",
34 "includeInterfaceView": true,
35 "includeCreatedEventBlob": false
36 }
37 }
38 }
39 }]
40 }
41 }
42 }
43}
44EOF
45)
46
47echo "--- Transfer Offer for Sender ---"
48echo "$RESULT" | jq
49
50OUTPUTFILE="response-step-2b.json"
51echo "$RESULT" > "$OUTPUTFILE"
The result is the Transfer Offer, stored in response-step-2b.json. For example,
1[
2 {
3 "workflowId": "",
4 "contractEntry": {
5 "JsActiveContract": {
6 "createdEvent": {
7 "offset": 4249,
8 "nodeId": 9,
9 "contractId": "00faddf948ee97e0d70be1baad6517e8af6a1bbd57e0646c300e2d23857bacb38fca11122059a0b3f54bafc2deab11e7964961c1ecda4b6a1fdeec4435d01726663666484f",
10 "templateId": "170929b11d5f0ed1385f890f42887c31ff7e289c0f4bc482aff193a7173d576c:Utility.Registry.App.V0.Model.Transfer:TransferOffer",
11 "contractKey": null,
12 "createArgument": null,
13 "createdEventBlob": "",
14 "interfaceViews": [
15 {
16 "interfaceId": "55ba4deb0ad4662c4168b39859738a0e91388d252286480c7331b3f71a517281:Splice.Api.Token.TransferInstructionV1:TransferInstruction",
17 "viewStatus": {
18 "code": 0,
19 "message": "",
20 "details": []
21 },
22 "viewValue": {
23 "originalInstructionCid": null,
24 "transfer": {
25 "sender": "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
26 "receiver": "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
27 "amount": "10.0000000000",
28 "instrumentId": {
29 "admin": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
30 "id": "INST"
31 },
32 "requestedAt": "2025-10-10T10:31:54Z",
33 "executeBefore": "2025-10-10T11:31:54Z",
34 "inputHoldingCids": [
35 "0041f93610a76b343fe5e969b953805a23674304341ff36a8e61fa1df0be6fc7f3ca111220877889786a97380f80e2a00e0da81525833982d789c9d72dc43ddc24d215eecb"
36 ],
37 "meta": {
38 "values": {
39 "splice.lfdecentralizedtrust.org/reason": ""
40 }
41 }
42 },
43 "status": {
44 "tag": "TransferPendingReceiverAcceptance",
45 "value": {}
46 },
47 "meta": {
48 "values": {}
49 }
50 }
51 }
52 ],
53 "witnessParties": [
54 "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
55 ],
56 "signatories": [
57 "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
58 "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
59 "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
60 ],
61 "observers": [
62 "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
63 "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe"
64 ],
65 "createdAt": "2025-10-10T10:31:55.117218Z",
66 "packageName": "utility-registry-app-v0"
67 },
68 "synchronizerId": "global-domain::1220f0c14212edfc6ca9b0dfc6f5943b51a80efe71de8abf5759c8f57b7510f633eb",
69 "reassignmentCounter": 0
70 }
71 }
72 }
73]
Step 2c - Access the Backend API¶
The request URL is ${BACKEND_API}/v0/registrars/${ADMIN_PARTY_ID}/registry/transfer-instruction/v1/${TRANSFEROFFER_CID}/choice-contexts/accept. To hit this endpoint, run the following script:
1#!/usr/bin/env bash
2
3## =================================================================================================
4## Receiver accepts offer
5## Step 2c: Gets choice context and disclosure for the accept-transfer-offer command
6## Authorized by: anyone
7## Script: step-2c-receiver-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 -v +1H "$DATE_FORMAT")
16
17TRANSFEROFFER=$(cat "response-step-2b.json")
18TRANSFEROFFER_CID=$(echo $TRANSFEROFFER |jq '.[] | .contractEntry.JsActiveContract.createdEvent.contractId' | tr -d '"')
19
20RESULT=$(
21 curl -s \
22 --url "${BACKEND_API}/v0/registrars/${ADMIN_PARTY_ID}/registry/transfer-instruction/v1/${TRANSFEROFFER_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 "app-reward-configuration": {
5 "tag": "AV_ContractId",
6 "value": "00525af6a6fd8c1580b6d80aad3dbcc298218ffcd501c9f30e126836a3bb9ada8bca111220c22ce1c7f07a549ad6c6739c7953dd8847f69773b5996169b7afd8c6d66438b9"
7 },
8 "utility.digitalasset.com/receiver-credentials": {
9 "tag": "AV_List",
10 "value": [
11 {
12 "tag": "AV_ContractId",
13 "value": "0074aa76902b5f1641eff3bb2e86cccce989b35a6ecaddafe0d39989026b4a3d0aca111220a0d5a8472cea3189ce92e26398225b466edc904a2bf4e85f8636ca7e93bd1df8"
14 }
15 ]
16 },
17 "utility.digitalasset.com/app-reward-configuration": {
18 "tag": "AV_ContractId",
19 "value": "00525af6a6fd8c1580b6d80aad3dbcc298218ffcd501c9f30e126836a3bb9ada8bca111220c22ce1c7f07a549ad6c6739c7953dd8847f69773b5996169b7afd8c6d66438b9"
20 },
21 "receiver-credentials": {
22 "tag": "AV_List",
23 "value": [
24 {
25 "tag": "AV_ContractId",
26 "value": "0074aa76902b5f1641eff3bb2e86cccce989b35a6ecaddafe0d39989026b4a3d0aca111220a0d5a8472cea3189ce92e26398225b466edc904a2bf4e85f8636ca7e93bd1df8"
27 }
28 ]
29 },
30 "instrument-configuration": {
31 "tag": "AV_ContractId",
32 "value": "00eca75bf1e14e192de69b58054cf62f2a60a9c0aae8f4d3491a4b2fad9f9731eaca111220b5fd51ccd498385b0ceaef63243fdfef6c2e62dd8d3a2f59fdb61a9099956481"
33 },
34 "sender-credentials": {
35 "tag": "AV_List",
36 "value": [
37 {
38 "tag": "AV_ContractId",
39 "value": "00840216df4df7f46e853231f4cfcd23dfb98bc4a3d670b1e0ed3b9b9afa218aecca1112207057c74dc0da345b4ec3006eae3a55ac1cd7fc34aa23c13cf453f5b9a9884235"
40 }
41 ]
42 },
43 "utility.digitalasset.com/transfer-rule": {
44 "tag": "AV_ContractId",
45 "value": "0015765518fb417897baac4c0a1fa1eb05971900e98bd731ad46095b0685f101c0ca1112209c56cdafaf9bb1fad5e72d054af025c441a1d0185cd6a309c216a25b6b708dca"
46 },
47 "utility.digitalasset.com/sender-credentials": {
48 "tag": "AV_List",
49 "value": [
50 {
51 "tag": "AV_ContractId",
52 "value": "00840216df4df7f46e853231f4cfcd23dfb98bc4a3d670b1e0ed3b9b9afa218aecca1112207057c74dc0da345b4ec3006eae3a55ac1cd7fc34aa23c13cf453f5b9a9884235"
53 }
54 ]
55 },
56 "utility.digitalasset.com/instrument-configuration": {
57 "tag": "AV_ContractId",
58 "value": "00eca75bf1e14e192de69b58054cf62f2a60a9c0aae8f4d3491a4b2fad9f9731eaca111220b5fd51ccd498385b0ceaef63243fdfef6c2e62dd8d3a2f59fdb61a9099956481"
59 },
60 "transfer-rule": {
61 "tag": "AV_ContractId",
62 "value": "0015765518fb417897baac4c0a1fa1eb05971900e98bd731ad46095b0685f101c0ca1112209c56cdafaf9bb1fad5e72d054af025c441a1d0185cd6a309c216a25b6b708dca"
63 }
64 }
65 },
66 "disclosedContracts": [
67 {
68 "templateId": "ed73d5b9ab717333f3dbd122de7be3156f8bf2614a67360c3dd61fc0135133fa:Utility.Registry.V0.Configuration.Instrument:InstrumentConfiguration",
69 "contractId": "00eca75bf1e14e192de69b58054cf62f2a60a9c0aae8f4d3491a4b2fad9f9731eaca111220b5fd51ccd498385b0ceaef63243fdfef6c2e62dd8d3a2f59fdb61a9099956481",
70 "createdEventBlob": "CgMyLjESpgkKRQDsp1vx4U4ZLeabWAVM9i8qYKnAquj000kaSy+tn5cx6soREiC1/VHM1Jg4Wwzq72MkP9/vbC5i3Y06L1n9thqQmZVkgRITdXRpbGl0eS1yZWdpc3RyeS12MBqNAQpAZWQ3M2Q1YjlhYjcxNzMzM2YzZGJkMTIyZGU3YmUzMTU2ZjhiZjI2MTRhNjczNjBjM2RkNjFmYzAxMzUxMzNmYRIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEgpJbnN0cnVtZW50GhdJbnN0cnVtZW50Q29uZmlndXJhdGlvbiKRBWqOBQpSClA6Tm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZQpSClA6TnByb3ZpZGVyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwpTClE6T3JlZ2lzdHJhcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKgAEKfmp8ClMKUTpPcmVnaXN0cmFyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwoICgZCBElOU1QKGwoZQhdSZWdpc3RyYXJJbnRlcm5hbFNjaGVtZQoECgJaAAqBAQp/Wn0Ke2p5ClMKUTpPcmVnaXN0cmFyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwoiCiBaHgocahoKDgoMQgppc0lzc3Vlck9mCggKBkIESU5TVAqBAQp/Wn0Ke2p5ClMKUTpPcmVnaXN0cmFyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwoiCiBaHgocahoKDgoMQgppc0hvbGRlck9mCggKBkIESU5TVCpOcHJvdmlkZXI6OjEyMjBkMzAxYWJhYmJlZDdiYzhkNmY2YTgwY2UxNmYzMzkzM2E3Mjc0YTMwMTMyNDFiN2ZiMzczY2E3ZTRmMGQ2NTY3Kk9yZWdpc3RyYXI6OjEyMjBkMzAxYWJhYmJlZDdiYzhkNmY2YTgwY2UxNmYzMzkzM2E3Mjc0YTMwMTMyNDFiN2ZiMzczY2E3ZTRmMGQ2NTY3Mk5vcGVyYXRvcjo6MTIyMGIzOWRmNWVkMGUzYzU4NGNkOTdlODZlNzc5ZGVmOTMzZDU0NWJmOWE0ZmFiM2MwZmQzZTRhZDNmN2EzNmI4ZmU5rPtttqtABgBCKgomCiQIARIgQ1DsOZLYGVRiscestTBDQ3CqU27WvKQODudfxMesKCEQHg==",
71 "synchronizerId": "",
72 "debugPackageName": "utility-registry-v0",
73 "debugPayload": {
74 "operator": "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
75 "provider": "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
76 "registrar": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
77 "defaultIdentifier": {
78 "source": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
79 "id": "INST",
80 "scheme": "RegistrarInternalScheme"
81 },
82 "additionalIdentifiers": [],
83 "issuerRequirements": [
84 {
85 "issuer": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
86 "requiredClaims": [
87 {
88 "_1": "isIssuerOf",
89 "_2": "INST"
90 }
91 ]
92 }
93 ],
94 "holderRequirements": [
95 {
96 "issuer": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
97 "requiredClaims": [
98 {
99 "_1": "isHolderOf",
100 "_2": "INST"
101 }
102 ]
103 }
104 ],
105 "providerAppRewardBeneficiaries": null
106 },
107 "debugCreatedAt": "2025-10-08T20:41:44.51Z"
108 },
109 {
110 "templateId": "ed73d5b9ab717333f3dbd122de7be3156f8bf2614a67360c3dd61fc0135133fa:Utility.Registry.V0.Rule.Transfer:TransferRule",
111 "contractId": "0015765518fb417897baac4c0a1fa1eb05971900e98bd731ad46095b0685f101c0ca1112209c56cdafaf9bb1fad5e72d054af025c441a1d0185cd6a309c216a25b6b708dca",
112 "createdEventBlob": "CgMyLjES/gUKRQAVdlUY+0F4l7qsTAofoesFlxkA6YvXMa1GCVsGhfEBwMoREiCcVs2vr5ux+tXnLQVK8CXEQaHQGFzWownCFqJba3CNyhITdXRpbGl0eS1yZWdpc3RyeS12MBp3CkBlZDczZDViOWFiNzE3MzMzZjNkYmQxMjJkZTdiZTMxNTZmOGJmMjYxNGE2NzM2MGMzZGQ2MWZjMDEzNTEzM2ZhEgdVdGlsaXR5EghSZWdpc3RyeRICVjASBFJ1bGUSCFRyYW5zZmVyGgxUcmFuc2ZlclJ1bGUigAJq/QEKUgpQOk5vcGVyYXRvcjo6MTIyMGIzOWRmNWVkMGUzYzU4NGNkOTdlODZlNzc5ZGVmOTMzZDU0NWJmOWE0ZmFiM2MwZmQzZTRhZDNmN2EzNmI4ZmUKUgpQOk5wcm92aWRlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKUwpROk9yZWdpc3RyYXI6OjEyMjBkMzAxYWJhYmJlZDdiYzhkNmY2YTgwY2UxNmYzMzkzM2E3Mjc0YTMwMTMyNDFiN2ZiMzczY2E3ZTRmMGQ2NTY3Kk5wcm92aWRlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcqT3JlZ2lzdHJhcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcyTm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZTmkGJERtEAGAEIqCiYKJAgBEiAwHP4MvAbKwprrvngECIRBF9TJCxtOaWUOffwO0FoJxhAe",
113 "synchronizerId": "",
114 "debugPackageName": "utility-registry-v0",
115 "debugPayload": {
116 "operator": "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
117 "provider": "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
118 "registrar": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
119 },
120 "debugCreatedAt": "2025-10-09T06:39:53.276Z"
121 },
122 {
123 "templateId": "dd3a9f2d51cc4c52d9ec2e1d7ff235298dcfb3afd1d50ab44328b1aaa9a18587:Utility.Registry.Holding.V0.Holding:Holding",
124 "contractId": "0041f93610a76b343fe5e969b953805a23674304341ff36a8e61fa1df0be6fc7f3ca111220877889786a97380f80e2a00e0da81525833982d789c9d72dc43ddc24d215eecb",
125 "createdEventBlob": "CgMyLjES7QoKRQBB+TYQp2s0P+XpablTgFojZ0MENB/zao5h+h3wvm/H88oREiCHeIl4apc4D4DioA4NqBUlgzmC14nJ1y3EPdwk0hXuyxIbdXRpbGl0eS1yZWdpc3RyeS1ob2xkaW5nLXYwGnQKQGRkM2E5ZjJkNTFjYzRjNTJkOWVjMmUxZDdmZjIzNTI5OGRjZmIzYWZkMWQ1MGFiNDQzMjhiMWFhYTlhMTg1ODcSB1V0aWxpdHkSCFJlZ2lzdHJ5EgdIb2xkaW5nEgJWMBIHSG9sZGluZxoHSG9sZGluZyLOBWrLBQpSClA6Tm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZQpSClA6TnByb3ZpZGVyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwpTClE6T3JlZ2lzdHJhcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKUApOOkxpc3N1ZXI6OjEyMjBkMzAxYWJhYmJlZDdiYzhkNmY2YTgwY2UxNmYzMzkzM2E3Mjc0YTMwMTMyNDFiN2ZiMzczY2E3ZTRmMGQ2NTY3CoABCn5qfApTClE6T3JlZ2lzdHJhcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKCAoGQgRJTlNUChsKGUIXUmVnaXN0cmFySW50ZXJuYWxTY2hlbWUKBAoCQgAKEQoPMg0xMC4wMDAwMDAwMDAwCt0BCtoBUtcBCtQBatEBCmMKYWpfCl0KW2JZClcKUTpPcmVnaXN0cmFyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NxICCgAKBAoCQgAKZApiUmAKXmpcCloKWGJWClQKTjpMaG9sZGVyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NxICCgAqTGlzc3Vlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcqT3JlZ2lzdHJhcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcyTGhvbGRlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcyTm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZTJOcHJvdmlkZXI6OjEyMjBkMzAxYWJhYmJlZDdiYzhkNmY2YTgwY2UxNmYzMzkzM2E3Mjc0YTMwMTMyNDFiN2ZiMzczY2E3ZTRmMGQ2NTY3OaLmNm3LQAYAQioKJgokCAESIKCtk3K2ucXddGo/5as+zuHiMCpqN8f/zBeUHYdkncTzEB4=",
126 "synchronizerId": "",
127 "debugPackageName": "utility-registry-holding-v0",
128 "debugPayload": {
129 "operator": "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
130 "provider": "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
131 "registrar": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
132 "owner": "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
133 "instrument": {
134 "source": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
135 "id": "INST",
136 "scheme": "RegistrarInternalScheme"
137 },
138 "label": "",
139 "amount": "10.0000000000",
140 "lock": {
141 "lockers": {
142 "map": [
143 [
144 "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
145 {}
146 ]
147 ]
148 },
149 "context": "",
150 "observers": {
151 "map": [
152 [
153 "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
154 {}
155 ]
156 ]
157 }
158 }
159 },
160 "debugCreatedAt": "2025-10-10T10:31:55.117Z"
161 },
162 {
163 "templateId": "77df4e7b980c12de438d7b052141a762215fae790d81f71179c8fb534beb68f7:Utility.Credential.V0.Credential:Credential",
164 "contractId": "00840216df4df7f46e853231f4cfcd23dfb98bc4a3d670b1e0ed3b9b9afa218aecca1112207057c74dc0da345b4ec3006eae3a55ac1cd7fc34aa23c13cf453f5b9a9884235",
165 "createdEventBlob": "CgMyLjESrAcKRQCEAhbfTff0boUyMfTPzSPfuYvEo9ZwseDtO5ua+iGK7MoREiBwV8dNwNo0W07DAG6uOlWsHNf8NKojwTz0U/W5qYhCNRIVdXRpbGl0eS1jcmVkZW50aWFsLXYwGnMKQDc3ZGY0ZTdiOTgwYzEyZGU0MzhkN2IwNTIxNDFhNzYyMjE1ZmFlNzkwZDgxZjcxMTc5YzhmYjUzNGJlYjY4ZjcSB1V0aWxpdHkSCkNyZWRlbnRpYWwSAlYwEgpDcmVkZW50aWFsGgpDcmVkZW50aWFsIrIDaq8DClMKUTpPcmVnaXN0cmFyOjoxMjIwZDMwMWFiYWJiZWQ3YmM4ZDZmNmE4MGNlMTZmMzM5MzNhNzI3NGEzMDEzMjQxYjdmYjM3M2NhN2U0ZjBkNjU2NwpQCk46TGlzc3Vlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKDwoNQgtJTlNUX0hvbGRlcgoPCg1CC0lOU1RfSG9sZGVyCgQKAlIACgQKAlIACnQKclpwCm5qbApQCk5CTGlzc3Vlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKDgoMQgppc0hvbGRlck9mCggKBkIESU5TVApiCmBqXgpcClpiWApWClA6Tm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZRICCgAqTGlzc3Vlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcqT3JlZ2lzdHJhcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcyTm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZTkcDve1q0AGAEIqCiYKJAgBEiAwqMkxtFdza9zEqr/gjGp0tLPnvuPsSDVBE/nBZoKEwBAe",
166 "synchronizerId": "",
167 "debugPackageName": "utility-credential-v0",
168 "debugPayload": {
169 "issuer": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
170 "holder": "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
171 "id": "INST_Holder",
172 "description": "INST_Holder",
173 "validFrom": null,
174 "validUntil": null,
175 "claims": [
176 {
177 "subject": "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
178 "property": "isHolderOf",
179 "value": "INST"
180 }
181 ],
182 "observers": {
183 "map": [
184 [
185 "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
186 {}
187 ]
188 ]
189 }
190 },
191 "debugCreatedAt": "2025-10-08T20:41:36.716Z"
192 },
193 {
194 "templateId": "ed73d5b9ab717333f3dbd122de7be3156f8bf2614a67360c3dd61fc0135133fa:Utility.Registry.V0.Configuration.AppReward:AppRewardConfiguration",
195 "contractId": "00525af6a6fd8c1580b6d80aad3dbcc298218ffcd501c9f30e126836a3bb9ada8bca111220c22ce1c7f07a549ad6c6739c7953dd8847f69773b5996169b7afd8c6d66438b9",
196 "createdEventBlob": "CgMyLjEStgYKRQBSWvam/YwVgLbYCq09vMKYIY/81QHJ8w4SaDaju5rai8oREiDCLOHH8HpUmtbGc5x5U92IR/aXc7WZYWm3r9jG1mQ4uRITdXRpbGl0eS1yZWdpc3RyeS12MBqLAQpAZWQ3M2Q1YjlhYjcxNzMzM2YzZGJkMTIyZGU3YmUzMTU2ZjhiZjI2MTRhNjczNjBjM2RkNjFmYzAxMzUxMzNmYRIHVXRpbGl0eRIIUmVnaXN0cnkSAlYwEg1Db25maWd1cmF0aW9uEglBcHBSZXdhcmQaFkFwcFJld2FyZENvbmZpZ3VyYXRpb24i9AJq8QIKUgpQOk5vcGVyYXRvcjo6MTIyMGIzOWRmNWVkMGUzYzU4NGNkOTdlODZlNzc5ZGVmOTMzZDU0NWJmOWE0ZmFiM2MwZmQzZTRhZDNmN2EzNmI4ZmUKUgpQOk5wcm92aWRlcjo6MTIyMGQzMDFhYmFiYmVkN2JjOGQ2ZjZhODBjZTE2ZjMzOTMzYTcyNzRhMzAxMzI0MWI3ZmIzNzNjYTdlNGYwZDY1NjcKxgEKwwFqwAEKTQpLOklEU086OjEyMjBmMGMxNDIxMmVkZmM2Y2E5YjBkZmM2ZjU5NDNiNTFhODBlZmU3MWRlOGFiZjU3NTljOGY1N2I3NTEwZjYzM2ViCm8KbWprClcKVTpTZmVlUmVjZWl2ZXJVczo6MTIyMGIzOWRmNWVkMGUzYzU4NGNkOTdlODZlNzc5ZGVmOTMzZDU0NWJmOWE0ZmFiM2MwZmQzZTRhZDNmN2EzNmI4ZmUKEAoOMgwwLjIwMDAwMDAwMDAqTm9wZXJhdG9yOjoxMjIwYjM5ZGY1ZWQwZTNjNTg0Y2Q5N2U4NmU3NzlkZWY5MzNkNTQ1YmY5YTRmYWIzYzBmZDNlNGFkM2Y3YTM2YjhmZTJOcHJvdmlkZXI6OjEyMjBkMzAxYWJhYmJlZDdiYzhkNmY2YTgwY2UxNmYzMzkzM2E3Mjc0YTMwMTMyNDFiN2ZiMzczY2E3ZTRmMGQ2NTY3ORA5UrarQAYAQioKJgokCAESIFdnuWlL+9/sSZnL9GgPVRMT0KYfFkQqkD1ffAXT9KgQEB4=",
197 "synchronizerId": "",
198 "debugPackageName": "utility-registry-v0",
199 "debugPayload": {
200 "operator": "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
201 "provider": "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
202 "details": {
203 "dso": "DSO::1220f0c14212edfc6ca9b0dfc6f5943b51a80efe71de8abf5759c8f57b7510f633eb",
204 "operatorAppRewardBeneficiary": {
205 "beneficiary": "feeReceiverUs::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
206 "weight": "0.2000000000"
207 }
208 }
209 },
210 "debugCreatedAt": "2025-10-08T20:41:42.691Z"
211 }
212 ]
213}
Step 2d - Accept the Transfer Offer¶
To finalize the transfer and move the asset from the sender to the receiver, execute the following script:
1#!/usr/bin/env bash
2
3## =================================================================================================
4## Receiver accepts offer
5## Step 2d: Executes the accept transfer command
6## Authorized by: Receiver
7## Script: step-2d-receiver-accepts.sh
8## =================================================================================================
9
10DATAFILE="source.sh"
11source "$DATAFILE"
12
13INSTRUCTION=$(cat "response-step-2b.json")
14INSTRUCTION_TEMPLATE=$(echo $INSTRUCTION | jq '.[] | .contractEntry.JsActiveContract.createdEvent.interfaceViews[0].interfaceId' | tr -d '"')
15INSTRUCTION_CID=$(echo $INSTRUCTION | jq '.[] | .contractEntry.JsActiveContract.createdEvent.contractId')
16
17JSONCONTENT=$(cat "response-step-2c.json")
18CHOICECONTEXTDATA=$(echo $JSONCONTENT | jq .choiceContextData)
19DISCLOSEDCONTRACTS=$(echo $JSONCONTENT | jq .disclosedContracts)
20
21RESULT=$(
22 curl -s \
23 --url "${HTTP_JSON_API}/v2/commands/submit-and-wait-for-transaction" \
24 --header "Authorization: Bearer ${RECEIVER_TOKEN}" \
25 --header "Content-Type: application/json" \
26 --request POST \
27 --data @- <<EOF
28{
29 "commands":{
30 "commands":[
31 {
32 "ExerciseCommand":{
33 "templateId":"${INSTRUCTION_TEMPLATE}",
34 "contractId":${INSTRUCTION_CID},
35 "choice":"TransferInstruction_Accept",
36 "choiceArgument":{
37 "extraArgs": {
38 "context": $CHOICECONTEXTDATA,
39 "meta":{
40 "values":{
41
42 }
43 }
44 }
45 }
46 }
47 }
48 ],
49 "workflowId":"",
50 "userId":"${RECEIVER_USER_ID}",
51 "commandId":"$(uuidgen | tr -d '\n')",
52 "deduplicationPeriod":{
53 "DeduplicationDuration":{
54 "value":{
55 "seconds":30,
56 "nanos":0
57 }
58 }
59 },
60 "actAs":[
61 "${RECEIVER_PARTY_ID}"
62 ],
63 "readAs":[
64
65 ],
66 "submissionId":"$(uuidgen | tr -d '\n')",
67 "disclosedContracts": ${DISCLOSEDCONTRACTS},
68 "domainId":"",
69 "packageIdSelectionPreference":[]
70 }
71}
72EOF
73)
74
75echo "--- Command response ---"
76echo $RESULT | jq
77
78OUTPUTFILE="response-step-2d.json"
79echo "$RESULT" > "$OUTPUTFILE"
For example, this is the response of this command:
1{
2 "transaction": {
3 "updateId": "1220aa3f401f39f902aff4a092e4d310bbc4acc0f2de8ae641d7659ed6334a83d1b8",
4 "commandId": "94058279-B1B1-4B2D-BF5D-EA0B33DDDAD8",
5 "workflowId": "",
6 "effectiveAt": "2025-10-10T10:33:03.967184Z",
7 "events": [
8 {
9 "ArchivedEvent": {
10 "offset": 4253,
11 "nodeId": 0,
12 "contractId": "00faddf948ee97e0d70be1baad6517e8af6a1bbd57e0646c300e2d23857bacb38fca11122059a0b3f54bafc2deab11e7964961c1ecda4b6a1fdeec4435d01726663666484f",
13 "templateId": "170929b11d5f0ed1385f890f42887c31ff7e289c0f4bc482aff193a7173d576c:Utility.Registry.App.V0.Model.Transfer:TransferOffer",
14 "witnessParties": [
15 "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
16 ],
17 "packageName": "utility-registry-app-v0",
18 "implementedInterfaces": []
19 }
20 },
21 {
22 "ArchivedEvent": {
23 "offset": 4253,
24 "nodeId": 7,
25 "contractId": "0041f93610a76b343fe5e969b953805a23674304341ff36a8e61fa1df0be6fc7f3ca111220877889786a97380f80e2a00e0da81525833982d789c9d72dc43ddc24d215eecb",
26 "templateId": "dd3a9f2d51cc4c52d9ec2e1d7ff235298dcfb3afd1d50ab44328b1aaa9a18587:Utility.Registry.Holding.V0.Holding:Holding",
27 "witnessParties": [
28 "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
29 ],
30 "packageName": "utility-registry-holding-v0",
31 "implementedInterfaces": []
32 }
33 },
34 {
35 "CreatedEvent": {
36 "offset": 4253,
37 "nodeId": 8,
38 "contractId": "0071cf43411dd636eb4d6b63716f7138df3e2d77c42225e2ad7383e2a49358d07bca111220536af478df272adf2cfc4e3488e6d709397cc368112ec82a518f416fb9b0dc00",
39 "templateId": "dd3a9f2d51cc4c52d9ec2e1d7ff235298dcfb3afd1d50ab44328b1aaa9a18587:Utility.Registry.Holding.V0.Holding:Holding",
40 "contractKey": null,
41 "createArgument": {
42 "operator": "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
43 "provider": "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
44 "registrar": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
45 "owner": "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
46 "instrument": {
47 "source": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
48 "id": "INST",
49 "scheme": "RegistrarInternalScheme"
50 },
51 "label": "",
52 "amount": "10.0000000000",
53 "lock": null
54 },
55 "createdEventBlob": "",
56 "interfaceViews": [],
57 "witnessParties": [
58 "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
59 ],
60 "signatories": [
61 "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
62 "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
63 ],
64 "observers": [
65 "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
66 "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
67 ],
68 "createdAt": "2025-10-10T10:33:03.967184Z",
69 "packageName": "utility-registry-holding-v0"
70 }
71 },
72 {
73 "CreatedEvent": {
74 "offset": 4253,
75 "nodeId": 9,
76 "contractId": "00134a9fbf51efd74d80fdaedde5d4ceeae0d0ebfd54dc1e359044c5e251e313c5ca1112205a60f7549af5531c01d163e74c428f54ffa0698f90947ecb6f50e4e831e33f30",
77 "templateId": "ed73d5b9ab717333f3dbd122de7be3156f8bf2614a67360c3dd61fc0135133fa:Utility.Registry.V0.Holding.Transfer:ExecutedTransfer",
78 "contractKey": null,
79 "createArgument": {
80 "transfer": {
81 "operator": "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
82 "provider": "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
83 "registrar": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
84 "sender": "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
85 "receiver": "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
86 "instrumentIdentifier": {
87 "source": "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
88 "id": "INST",
89 "scheme": "RegistrarInternalScheme"
90 },
91 "amount": "10.0000000000",
92 "reference": "",
93 "batch": {
94 "id": "",
95 "size": "1",
96 "settlementFrom": null,
97 "settlementUntil": null
98 }
99 },
100 "senderLabel": "",
101 "receiverLabel": "",
102 "observers": null
103 },
104 "createdEventBlob": "",
105 "interfaceViews": [],
106 "witnessParties": [
107 "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
108 ],
109 "signatories": [
110 "registrar::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
111 ],
112 "observers": [
113 "holder::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
114 "issuer::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567",
115 "operator::1220b39df5ed0e3c584cd97e86e779def933d545bf9a4fab3c0fd3e4ad3f7a36b8fe",
116 "provider::1220d301ababbed7bc8d6f6a80ce16f33933a7274a3013241b7fb373ca7e4f0d6567"
117 ],
118 "createdAt": "2025-10-10T10:33:03.967184Z",
119 "packageName": "utility-registry-v0"
120 }
121 }
122 ],
123 "offset": 4253,
124 "synchronizerId": "global-domain::1220f0c14212edfc6ca9b0dfc6f5943b51a80efe71de8abf5759c8f57b7510f633eb",
125 "traceContext": {
126 "traceparent": "00-be96f03df4261d384f3cfba5c03bf78e-a2134d9051f3a399-01",
127 "tracestate": null
128 },
129 "recordTime": "2025-10-10T10:33:04.009428Z"
130 }
131}
After the exercise command is executed, the transfer is complete.