Kadena Pact REST API

The Pact REST API — the transactional API for a runtime offering Pact smart contracts on a Chainweb chain. Endpoints: /local (non-transactional execution and preflight), /send (submit signed commands), /poll and /listen (retrieve results by request key), /private (private transactions), and /spv (simple payment verification proofs).

OpenAPI Specification

kadena-pact-openapi-original.yml Raw ↑
openapi: '3.0.0'

# ############################################################################ #
# Info
# ############################################################################ #

info:
  title: Pact REST API
  description: |
    Transactional API for a runtime offering Pact smart contracts.
  version: '1.3.7'
  x-logo:
    url: 'https://i.imgur.com/bAZFAGF.png'
    # backgroundColor: '#0033A0'
    alttext: Kadena Chainweb Logo
    href: 'https://api.chainweb.com/openapi'

# ############################################################################ #
# Servers
# ############################################################################ #

servers:
- url: "https://api.chainweb.com/chainweb/{apiVersion}/mainnet01/chain/{chainId}/pact/api/v1"
  description: Pact API for a chain on the Kadena mainnet.
  variables:
    apiVersion:
      default: "0.0"
    chainId:
      default: "0"
- url: "https://api.testnet.chainweb.com/chainweb/{apiVersion}/testnet04/chain/{chainId}/pact/api/v1"
  description: Pact API for a chain on the Kadena testnet.
  variables:
    apiVersion:
      default: "0.0"
    chainId:
      default: "0"



# ############################################################################ #
# Paths
# ############################################################################ #

paths:

  # ########################################################################## #
  # Local
  # ########################################################################## #

  /local:
    post:
      description: |
        Blocking/sync call to submit a command for non-transactional execution. In a
        blockchain environment this would be a node-local “dirty read”, which can
        either serve as a node-local repl execution, or fully gassed transaction
        simulation and transaction validation. Any database writes or changes to the
        environment are rolled back.

      tags: [endpoint-local]
      summary: local
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/command'
      parameters:
        - name: preflight
          in: query
          description: |
            Trigger fully-gassed mainnet transaction execution simulation and
            transaction metadata validations.
          required: false
          schema:
            type: boolean

        - name: rewindDepth
          in: query
          description: |
            Rewind transaction execution environment by a number of block
            heights.
          required: false
          schema:
            type: integer
            minimum: 0

        - name: signatureVerification
          in: query
          description: |
            Require user signature verification when validating transaction
            metadata.
          required: false
          schema:
            type: boolean

      responses:
        "200":
          description: The command's result.
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/command-result'
                  - $ref: '#/components/schemas/preflight-result'
        "400":
          description: The command was invalid.
          content:
            text/plain:
              type: string
              example: 'Validation failed: Invalid command: Failed reading: empty'
              schema:
                $ref: '#/components/schemas/validation-failure'

  # ########################################################################## #
  # Send
  # ########################################################################## #

  /send:
    post:
      description: |
        Asynchronous submission of one or more public (unencrypted) commands
        to the blockchain for execution.
      tags: [endpoint-send]
      summary: send
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required: [cmds]
              properties:
                cmds:
                  type: array
                  minItems: 1
                  items:
                    $ref: '#/components/schemas/command'
      responses:
        "200":
          description: The commands were successfully submitted. The response contains their request keys.
          content:
            application/json:
              schema:
                type: object
                required: [requestKeys]
                properties:
                  requestKeys:
                    description: Request keys for use with `poll` or `listen` to retrieve results.
                    type: array
                    minItems: 1
                    items:
                      $ref: '#/components/schemas/request-key'
        "400":
          description: The command failed.
          content:
            text/plain:
              type: string
              example: 'Validation failed for hash "j5f3mZaF9pVA7OmV4nTuw5-paG9LzLQJWAMuGGRRLeQ": Attempt to buy gas failed with: (read coin-table sender): Failure: Tx Failed: read: row not found: 368820f80c324bbc7c2b0610688a7da43e39f91d118732671cd9c7500ff43cca'
              schema:
                $ref: '#/components/schemas/validation-failure'

  # ########################################################################## #
  # Poll
  # ########################################################################## #

  /poll:
    post:
      description: |
        Allows polling for one or more command results by request key.
      summary: poll
      tags: [endpoint-poll]
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required: [requestKeys]
              properties:
                requestKeys:
                  type: array
                  minItems: 1
                  items:
                    $ref: '#/components/schemas/request-key'
      parameters:
        - name: confirmationDepth
          in: query
          description: |
            Configures how many blocks should be mined until the requested transaction is ready.
          required: false
          schema:
            type: integer
            minimum: 0

      responses:
        "200":
          description: The command results for some of the requested request keys.
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  $ref: '#/components/schemas/command-result'

  # ########################################################################## #
  # Listen
  # ########################################################################## #

  /listen:
    post:
      description: |
        Blocking request for single command result.
      summary: listen
      tags: [endpoint-listen]
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required: [listen]
              properties:
                listen:
                  $ref: '#/components/schemas/request-key'
      responses:
        "200":
          description: The request key was found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/command-result'

  # ########################################################################## #
  # Private
  # ########################################################################## #

  /private:
    post:
      description: |
        Asynchronous submission of a single addressed command which
        will be transmitted with end-to-end encryption only between addressed entity nodes.
        Private payload metadata required.
      tags: [endpoint-private]
      summary: private
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/command'
      responses:
        "200":
          description:
            The command was accepted.
          content:
            application/json:
              type: object
              schema:
                properties:
                  requestKeys:
                    description: Request keys for use with `poll` or `listen` to retrieve results.
                    type: array
                    minItems: 1
                    maxItems: 1
                    items:
                      $ref: '#/components/schemas/request-key'

  # ########################################################################## #
  # SPV
  # ########################################################################## #

  /spv:
    servers:
      - url: "https://api.chainweb.com/chainweb/{apiVersion}/mainnet01/chain/{chainId}/pact"
        description: Pact API for a chain on the Kadena mainnet.
        variables:
          apiVersion:
            default: "0.0"
          chainId:
            default: "0"
      - url: "https://api.testnet.chainweb.com/chainweb/{apiVersion}/testnet04/chain/{chainId}/pact"
        description: Pact API for a chain on the Kadena testnet.
        variables:
          apiVersion:
            default: "0.0"
          chainId:
            default: "0"
    post:
      description: |
        Blocking request to fetch spv proof of a cross chain transaction. Request must be sent to the chain where the transaction is initiated.
      summary: spv
      tags: [endpoint-spv]
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/spv-object'
      responses:
        "200":
          description: The requested spv proof.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/spv-proof'
        "400":
          description: The requested spv proof was not findable.
          content:
            text/plain:
              example: "SPV target not reachable: target chain not reachable. Chainweb instance is too young"
              schema:
                description: Error message with the description of failed proof requests.
                type: string

# ############################################################################ #
# Components
# ############################################################################ #

components:

  # ########################################################################## #
  # Schemas
  schemas:

    # ######################################################################## #
    # Command Schema and related

    command:
      title: Pact Command
      tags: [model-command]
      description: Represents a single blockchain Pact transaction.
      type: object
      required: [cmd,hash,sigs]
      example:
        $ref: '#/components/examples/command'
      properties:
        cmd:
          description: |
            Stringified JSON `payload` object. Canonic non-malleable signed transaction data.
          type: string
        hash:
          description: |
            Unpadded Base64URL of Blake2s-256 hash of the `cmd` field value. Serves as a command
            `requestKey` since each transaction must be unique.
          type: string
          contentEncoding: base64url
          example: "H6XjdPHzMai2HLa3_yVkXfkFYMgA0bGfsB0kOsHAMuI"
        sigs:
          description: |
            List of signatures corresponding one-to-one with `signers` array in the payload.
          type: array
          minItems: 0
          items:
            properties:
              sig:
                anyOf:
                  - type: string
                    contentEncoding: base16
                    description: |
                      Base16-encoded Ed25519 signature of `hash` field
                      for corresponding signer in payload.
                    example:
                      "8d452109cc0439234c093b5e204a7428bc0a54f22704402492e027aaa9375a34c910d8a468a12746d0d29e9353f4a3fbebe920d63bcc7963853995db015d060f"
                  - $ref: '#/components/schemas/webauthn-sig-string'

    webauthn-sig-string:
      type: string
      # contentMediaType: application/json
      description: |
        Stringified JSON WebAuthn signature object.

        For a WebAuthn signature string to be valid, its corresponding `Signer`
        must have `scheme: "WebAuthn"`.

        The schema of a Pact WebAuthn signature object resembles that of
        the WebAuthn standard `CredentialResponse`.
        Its fields can be computed from the `response` field of a WebAuthn
        `CredentialResponse`. For example, to construct a WebAuthn signature
        string in the browser:

        ```
        const resp = await navigator.credentials.get();
        const auth = resp.response.authenticatorData();
        const sig = resp.response.signature;
        JSON.stringify({
          authenticatorData: base64url_to_base64(auth),
          clientDataJSON: resp.response.clientDataJSON,
          signature: base64url_to_base64(sig)
        })
        ```


    payload:
      description: |
        Pact Command Payloads are encoded as strings in Pact commands, and contain all
        non-malleable data for a transaction.
      tags: [model-payload]
      type: object
      required: [payload,meta,signers,networkId,nonce]
      example:
        $ref: '#/components/examples/payload'
      properties:
        payload:
          oneOf:
          - title: Exec Message
            description: Standard pact execution.
            properties:
              code:
                type: string
                description: Executable pact code.
              data:
                description: Arbitrary JSON to be accessed via `read-msg`, `read-integer` et al in Pact code.
          - title: Continuation Message
            description: Continuation of a previous transaction defpact.
            properties:
              pactId:
                type: string
                description: ID of pact running previous step.
              step:
                type: number
                description: Step in defpact to execute.
              rollback:
                type: boolean
                description: Whether to execute a specified rollback on this step.
              data:
                description: Arbitrary JSON to be accessed via `read-msg`, `read-integer` et al in Pact code.
              proof:
                type: string
                contentEncoding: base64url
                description: Backend-specific data for continuing a cross-chain proof.
        meta:
          oneOf:
          - title: "Public metadata (Chainweb)"
            description: "Chainweb/public command metadata."
            required: [chainId,sender,gasLimit,gasPrice,ttl,creationTime]
            properties:
              chainId:
                type: string
                description: Platform-specific chain identifier. For chainweb this is the stringified chain number.
              sender:
                type: string
                description: Indicates gas-paying account.
              gasLimit:
                type: number
                minimum: 1
                description: Limits total amount of gas to be consumed.
              gasPrice:
                type: number
                description: Specifies price per gas unit to be charged.
              ttl:
                type: number
                minimum: 1
                maximum: 180000
                description: Time in seconds after creation time that transaction can be executed.
              creationTime:
                type: number
                description: POSIX epoch sending time for transaction.
          - title: "Private metadata (Kuro)"
            description: "Metadata for Kuro endpoints, including `private`."
            properties:
              address:
                description: Private message envelope address. Required only for private messages, otherwise null.
                required: [from,to]
                properties:
                  from:
                    type: string
                    description: "Sender entity name"
                  to:
                    description: "Recipient entity names"
                    type: array
                    minItems: 1
                    items:
                      type: string
                      description: "Recipient entity name"
        signers:
          description: List of signers, corresponding with list of signatures in outer command.
          type: array
          items:
            title: Signer
            required: [pubKey]
            properties:
              pubKey:
                type: string
                description: "Public key image. Pact default is base16 ED25519 encoding."
              address:
                type: string
                description: "Address, if any. Pact default expects this to match pubKey."
              scheme:
                type: string
                description: |
                  Signer scheme. Default is ED25519. When the Signer is
                  `WebAuthn`, the corresponding `sig` must be a WebAuthn
                  signature string.
                enum: [ED25519,WebAuthn]
              clist:
                description: List of capabilities associated with/installed by this signer.
                properties:
                  name:
                    type: string
                    description: Fully-qualified capability name.
                  args:
                    type: array
                    items:
                      $ref: '#/components/schemas/pact-value'
        networkId:
          description: Backend-specific identifier of target network.
          type: string
          enum: [mainnet01,testnet04]
        nonce:
          description: Arbitrary user-supplied value.
          type: string

    spv-object:
      description: |
        Object consisting of data required to fetch proof of a cross chain transaction
      type: object
      required: [requestKey,targetChainId]
      properties:
        requestKey:
          type: string
          description: Request Key of an initiated cross chain transaction at the source chain.
          example:
            "7af34f24d55d2fcf5de6fccfeeb837698ebff4598303237c64348a47806c8646"
        targetChainId:
          type: string
          description: Target chain id of the cross chain transaction.
          example: "1"

    # ######################################################################## #
    # Command Result and related

    preflight-result:
      title: Preflight /local result
      tags: [model-preflight-result]
      example:
        $ref: '#/components/examples/preflight-result'
      description:
        The result of attempting to execute preflight simulation for a
        single well-formed Pact command.
      type: object
      required: [preflightResult,preflightWarnings]
      properties:
        preflightResult:
          $ref: '#/components/schemas/command-result'
        preflightWarnings:
          description:
            A list of warnings associated with deprecated features in upcoming pact releases.
          type: array
          items:
            type: string

    command-result:
      title: Command Result
      tags: [model-command-result]
      example:
        $ref: '#/components/examples/command-result'
      description: The result of attempting to execute a single well-formed Pact command.
      type: object
      required: [reqKey,result,logs,metaData,gas]
      properties:
        reqKey:
          $ref: '#/components/schemas/request-key'
        result:
          oneOf:
          - title: Success
            type: object
            properties:
              status:
                type: string
                enum: [success]
              data:
                $ref: '#/components/schemas/pact-value'
          - title: Failure
            type: object
            properties:
              status:
                type: string
                enum: [failure]
              error:
                $ref: '#/components/schemas/pact-error'
        txId:
          type: number
          description: Database-internal transaction tracking ID.
        logs:
          type: string
          description: Backend-specific value providing image of database logs.
        metaData:
          properties:
            blockTime:
              type: number
              description: POSIX time of block
            prevBlockHash:
              type: string
              description: Parent Block hash of containing block.
            blockHash:
              type: string
              description: Block hash of containing block.
            blockHeight:
              type: number
              description: Block height of containing block.
            publicMeta:
              type: object
              description: Public metadata.
              properties:
                creationTime:
                  type: number
                  description: POSIX time the command was created
                ttl:
                  type: number
                  description: Transaction time to live
                gasLimit:
                  type: number
                  description: The transaction's gas limit
                chainId:
                  type: string
                  description: Chain identifier
                gasPrice:
                  type: number
                  description: The price of each unit of gas in KDA
                sender:
                  type: string
        events:
          type: array
          items:
            $ref: '#/components/schemas/event'
        continuation:
          description: "Describes result of a defpact execution."
          properties:
            pactId:
              type: string
              description: Identifies this defpact execution. On first step generally matches request key.
            step:
              type: number
              description: Identifies which step executed in defpact.
            stepCount:
              type: number
              description: Total number of steps in pact.
            executed:
              type: boolean
              description: optional value for private pacts, indicates if step was skipped.
            stepHasRollback:
              type: boolean
              description: indicates if pact step has rollback.
            continuation:
              description: Closure describing executed pact.
              properties:
                def:
                  type: string
                  description: Fully-qualified defpact name.
                args:
                  type: array
                  items:
                    $ref: '#/components/schemas/pact-value'
            yield:
              description: Value yielded during pact step, optionally indicating cross-chain execution.
              properties:
                data:
                  type: object
                  description: Pact value object containing yielded data.
                  additionalProperties:
                    $ref: '#/components/schemas/pact-value'
                source:
                  type: string
                  description: "Source chain ID."
                provenance:
                  properties:
                    targetChainId:
                      type: string
                      description: "Chain ID of target chain for next step."
                    moduleHash:
                      description: "Hash of module executing defpact."
                      type: string
        gas:
          type: number

    pact-value:
      description: Pact value compound type.
      tags: [model-pact-value]
      anyOf:
      - title: String
        description: Pact strings encode directly to JSON strings.
        type: string
      - title: Decimal
        description: There are two alternative JSON representations for Decimal.
        oneOf:
        - title: Number
          description: |
            JSON numbers can be used whenever the precision is adequate
          type: number
        - title: Object
          description: |
            When JSON number precision is not enough, you can use an object with the number's decimal representation as a string
          type: object
          required: [decimal]
          properties:
            decimal:
              type: string
              description: String representation of number to avoid rounding error
              example:
                "1.23498218000001"
      - title: Integer
        description: There are two alternative JSON representations for Integer.
        type: object
        required: [int]
        properties:
          int:
            oneOf:
            - title: Number
              description: |
                JSON numbers are rounded to integer values.
              type: number
              example: 12345
            - title: String
              description: |
                When JSON number precision is not enough, you can specify the integer as a string
              type: string
              example:
                "123456789"
      - title: Boolean
        description: JSON booleans encode to Pact booleans.
        type: boolean
      - title: Object
        type: object
        description: JSON objects not matching other Pact Value schemas become Pact objects.
        additionalProperties:
          $ref: '#/components/schemas/pact-value'
      - title: Time
        type: object
        required: [time]
        properties:
          time:
            type: string
            description: Literal time value using the UTC time format.
            example: "1970-01-01T00:00:00Z"
      - title: List
        description: JSON lists become Pact lists.
        type: array
        items:
          $ref: '#/components/schemas/pact-value'
      - title: Module Reference
        description: Special pact value to directly reference a module or interface.
        type: object
        required: [refName,refSpec]
        example:
          $ref: '#/components/examples/module_reference'
        properties:
          refName:
            type: object
            required: [name,namespace]
            description: The module name
            properties:
              name:
                type: string
                description: Bare name of a module
              namespace:
                type: string
                nullable: true
                description: Namespace of the indicated module
          refSpec:
            type: array
            description: The module names to substitute for any references present in the module code
            items:
              type: object
              required: [name,namespace]
              properties:
                name:
                  type: string
                  description: Bare name of a module
                namespace:
                  type: string
                  nullable: true
                  description: Namespace of the indicated module
      - title: Guard
        description: Special pact value for guard types.
        type: object
        oneOf:
        - title: Keyset
          description: |
            A keyset forms a rule made from a set of key/address values and a predicate function.
            When enforced, transaction signer list is evaluated against keyset.
          required: [keys,pred]
          properties:
            keys:
              type: array
              description: Set of public key/address values. Native pact public keys are ED25519 in base16 encoding.
              items:
                type: string
            pred:
              type: string
              description: |
                A pact function name. Built-in values are `keys-all` (match all keys in set),
                `keys-any` (match at least one), and `keys-2` (match at least 2).
                Custom functions have a fully-qualified name and
                must accept two integer arguments `count` (number of keys in set) and `matched`
                (number of set keys found in transaction set).
        - title: Keyset Reference
          description: Refers to a keyset in the Pact environment/database installed with `define-keyset`.
          required: [keysetref]
          properties:
            keysetref:
              type: string
              description: Installed keyset name.
        - title: User Guard
          description: |
            Closure of call to "guard function" which is a boolean user function with arguments.
          required: [fun,args]
          properties:
            fun:
              description: Fully-qualified guard function name.
              type: string
            args:
              description: Argument values to the guard function.
              type: array
              items:
                $ref: '#/components/schemas/pact-value'

        - title: Module Guard
          type: object
          description: |
            Autonomous guard that only allows module code access, or requires module admin.
          required: [moduleName,name]
          properties:
            moduleName:
              required: [name,namespace]
              properties:
                name:
                  type: string
                  description: module bare name
                namespace:
                  type: string
                  description: module namespace
            name:
              type: string
              description: Distinguishing/informative name for module guard.
        - title: Pact Guard
          type: object
          description: |
            Autonomous guard that only allows a particular pact execution, referenced by ID, to pass.
            Two executions of the same defpact code result in distinct pact IDs. A pact guard
            created inside of this execution will only pass when running that particular pact.
          required: [pactId,name]
          properties:
            pactId:
              description: Defpact execution ID.
              type: string
            name:
              type: string
              description: Distinguishing/informative name for pact guard.

    event:
      description: "Pact output event."
      type: object
      properties:
        name:
          type: string
          description: Event defcap name.
        module:
          type: object
          description: Qualified module name of event defcap.
          required: [name]
          properties:
            name:
              type: string
              description: module bare name
            namespace:
              type: string
              description: module namespace
        params:
          type: array
          items:
            $ref: '#/components/schemas/pact-value'
        moduleHash:
          type: string
          description: Hash of emitting module.


    pact-error:
      description: |
        Verbose object describing failed execution.
      type: object
      required: [message]
      properties:
        message:
          type: string
          description: "Descriptive error text."
        callStack:
          type: array
          items:
            type: string
        info:
          type: string
        type:
          type: string

    request-key:
      title: Request Key
      type: string
      description: Unique ID of a pact transaction consisting of its hash.
      pattern: "^[a-zA-Z0-9_-]{43}$"
      contentEncoding: base64url
      minLength: 43
      maxLength: 43
      example: y3aWL72-3wAy7vL9wcegGXnstH0lHi-q-cfxkhD5JCw

    validation-failure:
      title: Validation Failure
      type: string
      description: Failure message of unexecuted command due to an invalid gas payer, meta, or other environments.

    spv-proof:
      title: SPV Proof
      type: string
      description: Backend-specific data for continuing a cross-chain proof.
      example: |
        "eyJzdWJqZWN0Ijp7ImlucHV0IjoiQUJSN0ltZGhjeUk2TlRRMExDSnlaWE4xYkhRaU9uc2ljM1JoZEhWeklqb2ljM1ZqWTJWemN5SXNJbVJoZEdFaU9pSlhjbWwwWlNCemRXTmpaV1ZrWldRaWZTd2ljbVZ4UzJWNUlqb2lZa0Y0TjNOd1dqZFdUbUpZWTNocVZFUkNTamt5U21SdlUyVlFjWGx0U25KNWNXOUNhMWcyUkVoYWJ5SXNJbXh2WjNNaU9pSnBRVTF4Y0ZwaVUxSkRaR2hQUzA1YVVYZzFTMHBOTFZOUlNGRlZXRzF4UlZoUlRIRkNUVVpSVFVkSklpd2laWFpsYm5SeklqcGJleUp3WVhKaGJYTWlPbHNpZEdWemRDMXpaVzVrWlhJaUxDSXpaRGxsT1dZeFptSTBZemt6TnpneU5qWmpZV1JrTmpObE4yRTBOMkkzWVRZME5UTmlaVGsyTVdSaU1ETTNNMlkxWXpWbVlUUXdZV05sWlRaaVpHVm1JaXd4WFN3aWJtRnRaU0k2SWxSU1FVNVRSa1ZTSWl3aWJXOWtkV3hsSWpwN0ltNWhiV1Z6Y0dGalpTSTZiblZzYkN3aWJtRnRaU0k2SW1OdmFXNGlmU3dpYlc5a2RXeGxTR0Z6YUNJNkluVjBYMHBmV2s1cmIzbGhVRlZGU21ocGQxWmxWMjVyVTFGdU9VcFVP

# --- truncated at 32 KB (37 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/kadena/refs/heads/main/openapi/kadena-pact-openapi-original.yml