GRPC Api submit and wait for Archive choice

Hello,

We have an ongoing project targeting Daml 3.x and the canton network and have deployed an artifact into Devnet. Now we wanted to clear the ledger info for this package and we were attempting to run a Archive command via the GRPC api through the CommandService/SubmitAndWait endpoint with the following payload:

Body Payload
{
  "commands": {
    "command_id": "<command_id>",
    "commands": [
      {
        "exercise": {
          "template_id": {
            "package_id": "<package_id>",
            "module_name": "<module_name>",
            "entity_name": "<entity_name>"
          },
          "choice": "Archive",
          "choice_argument": {
            "unit": {}
          },
          "contract_id": "<contract_id>"
        }
      }
    ],
    "deduplication_duration": {},
    "act_as": [
      "<party_id>"
    ]
  }
}

But with this payload we are getting this error message:
COMMAND_PREPROCESSING_FAILED(8,dd6a8889): mismatching type: DA.Internal.Template:Archive and value: ValueUnit

Any assistance would be appreciated.

2 Likes

Here is a gRPC Ledger API request to archive a contract:

com.daml.ledger.api.v2.CommandService.SubmitAndWait

{
  "commands": {
    "act_as": [
      "{{appUserParty}}"
    ],
    "command_id": "command02",
    "commands": [
      {
        "exercise": {
          "template_id": {
            "package_id": "#AdminWorkflows",
            "module_name": "Canton.Internal.Ping",
            "entity_name": "Ping"
          },
          "contract_id": "{{contractId}}",
          "choice": "Archive",
          "choice_argument": {
            "record": {}
          }
        }
      }
    ]
  }
}

To confirm, you can use the following requests to create and query for a simple contract:

create contract

com.daml.ledger.api.v2.CommandService.SubmitAndWait

{
  "commands": {
    "command_id": "command01",
    "act_as": [
      "{{appUserParty}}"
    ],
    "commands": [
      {
        "create": {
          "template_id": {
            "package_id": "#AdminWorkflows",
            "module_name": "Canton.Internal.Ping",
            "entity_name": "Ping"
          },
          "create_arguments": {
            "fields": [
              {
                "label": "id",
                "value": {
                  "text": "testing"
                }
              },
              {
                "label": "initiator",
                "value": {
                  "party": "{{appUserParty}}"
                }
              },
              {
                "label": "responder",
                "value": {
                  "party": "{{appUserParty}}"
                }
              }
            ]
          }
        }
      }
    ]
  }
}
query by update-id

com.daml.ledger.api.v2.UpdateService.GetUpdateById

{
  "update_id": "{{updateId}}",
  "update_format": {
    "include_transactions": {
      "transaction_shape": "TRANSACTION_SHAPE_ACS_DELTA",
      "event_format": {
        "verbose": false,
        "filters_by_party": {
          "{{appUserParty}}": {
            "cumulative": [
              {
                "template_filter": {
                  "include_created_event_blob": false,
                  "template_id": {
                    "package_id": "#AdminWorkflows",
                    "module_name": "Canton.Internal.Ping",
                    "entity_name": "Ping"
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
}
query acs

com.daml.ledger.api.v2.StateService.GetActiveContracts

{
  "verbose": false,
  "active_at_offset": {{ledgerEndOffset}},
  "filter": {
    "filters_by_party": {
      "{{appUserParty}}": {
        "cumulative": [
          {
            "template_filter": {
              "include_created_event_blob": false,
              "template_id": {
                "package_id": "#AdminWorkflows",
                "module_name": "Canton.Internal.Ping",
                "entity_name": "Ping"
              }
            }
          }
        ]
      }
    }
  }
}

These were created with the splice-node bundle 0.4.20.

1 Like

As a point of comparison, here is a JSON Ledger API request to archive a contract:

POST v2/commands/submit-and-wait

{
  "commandId": "command02",
  "commands": [
    {
      "ExerciseCommand": {
        "templateId": "#AdminWorkflows:Canton.Internal.Ping:Ping",
        "contractId": "{{contractId}}",
        "choice": "Archive",
        "choiceArgument": {}
      }
    }
  ],
  "actAs": [
    "{{appUserParty}}"
  ]
}

To confirm, you can use the following requests to create and query for a simple contract:

create contract

POST v2/commands/submit-and-wait

{
  "commandId": "command01",
  "commands": [
    {
      "CreateCommand": {
        "templateId": "#AdminWorkflows:Canton.Internal.Ping:Ping",
        "createArguments": {
          "id": "testing",
          "initiator": "{{appUserParty}}",
          "responder": "{{appUserParty}}"
        }
      }
    }
  ],
  "actAs": [
    "{{appUserParty}}"
  ]
}
query by update-id

POST /v2/updates/update-by-id

{
  "updateId": "{{updateId}}",
  "updateFormat": {
    "includeTransactions": {
      "transactionShape": "TRANSACTION_SHAPE_LEDGER_EFFECTS",
      "eventFormat": {
        "verbose": false,
        "filtersByParty": {
          "{{appUserParty}}": {
            "cumulative": [
              {
                "identifierFilter": {
                  "TemplateFilter": {
                    "value": {
                      "includeCreatedEventBlob": false,
                      "templateId": "#AdminWorkflows:Canton.Internal.Ping:Ping"
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
}
query acs

POST /v2/state/active-contracts

{
  "verbose": false,
  "activeAtOffset": "{{ledgerEndOffset}}",
  "filter": {
    "filtersByParty": {
      "{{appUserParty}}": {
        "cumulative": [
          {
            "identifierFilter": {
              "TemplateFilter": {
                "value": {
                  "includeCreatedEventBlob": false,
                  "templateId": "#AdminWorkflows:Canton.Internal.Ping:Ping"
                }
              }
            }
          }
        ]
      }
    }
  }
}

These were created with the splice-node bundle 0.4.20.

1 Like

Hello @WallaceKelly, thank you for your reply,

The change from “unit“ to “record“ did work as intended, however, I believe the error in question was a bit opaque, as it did not refer to what it was expecting instead of the “ValueUnit“.

In any case thanks for the resolution, I’ll close the topic.

1 Like