Swagger

Avalanche C-Chain

The same API through a different mechanism, plus one setup step the other networks do not have.

What differs on this network

Avalanche C-Chain reaches the same API through a different mechanism. Nothing about prepare, submit or status changes — but what the account signs does, and there is one setup step the other networks do not have.

There is no delegation to adopt

Avalanche has no chain-level EIP-7702, so an account there is never activated and GET /account/delegation-status reports it as unsupported. Do not treat that as an error or wait for an activation that cannot happen — it is the steady state for this network.

An executor relays what the account signed

Instead of a UserOperation, prepare answers rail "forward_request" with EIP-712 typed data. The account signs that with eth_signTypedData_v4, UGTP countersigns the fee terms and relays it, and the contract refuses anything the account did not sign. The published executor address is the one your operation passes through.

Each token needs one allowance, once

The executor moves tokens against an allowance, so the first gasless operation for a token is refused with EXECUTOR_ALLOWANCE_MISSING until one exists. POST /transaction/allowance-setup says whether this token takes a permit or an ordinary approve. It is per token and per account, not per operation.

The native coin takes a third path

No allowance can move AVAX, so a native operation answers rail "self_funded": the account signs the whole transaction, including the nonce it is handed, pays its own gas, and UGTP broadcasts and tracks it. There is no ugtpFee on that path, and a native leg must be the only leg.

Private tokens live here

The encrypted-token contracts are deployed on this network, so every private-token operation is an executor-rail operation. Read the available symbols from GET /private/tokens rather than assuming which network serves them.

The fee is priced the same, collected differently

The executor prices an operation identically to the Paymaster and collects it in an ERC-20 fee token, so it always needs one named — a preview without feeToken is refused with FEE_TOKEN_REQUIRED. Its terms travel with the request and are capped on-chain, so the signed maximum is a ceiling the settled charge stays under.

Each of these ran. The request, the response, and the object that went on chain are the operation's own, read back out of the platform's records — and the transaction link opens the result in a block explorer, so every number here can be checked against something outside this page.

The same transfer, where there is no EIP-7702

Executor rail (EIP-712 execution request) · Avalanche C-Chain

0.2 USDt moved on Avalanche C-Chain. Same API call as the Arbitrum transfer; the response asks for typed data instead of a UserOperation hash.

Operation id
ugtp_operation_ILmX7eF4Ngf5
Charged
0.050351 USDT: 0.00014 gas + 0.050011 static + 0.0002 transfer percentage. The signed ceiling was 0.050908 USDT, so the charge landed under the maximum the account had agreed to.

The ExecutionRequest the executor received

The account's own EIP-712 signature travels with it, and so does the backend signature that proves UGTP quoted these terms — the contract verifies both and refuses anything the account did not sign. The action stays ABI-encoded: kind 0 is a send.

{
  "account": "0x0a1758ad202a2059e8c2970b562597ca45d863c4",
  "nonce": "0x3",
  "actions": [
    {
      "kind": 0,
      "params": "0x0000000000000000000000009702230a8ea53601f5cd2dc00fdbc13d4d…96 bytes"
    }
  ],
  "terms": {
    "feeToken": "0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7",
    "transferredValueInFeeToken": "200000",
    "platformTransferFeeBps": 10,
    "projectTransferFeeBps": 0,
    "platformStaticFeeUsd8dp": "5000000",
    "projectStaticFeeUsd8dp": "0",
    "projectPayoutAddress": "0x0000000000000000000000000000000000000000",
    "calldataGas": "7296",
    "maxFeeTokenAmount": "50908",
    "validUntil": 1788518426
  },
  "backendSignature": "0x0c9eb1440086c6f661c9c370fa25d623277990b3…65 bytes",
  "executor": "0xA7C8776C6ac6f21eC923321793F62A4887f9E767",
  "requestHash": "0x8f2f1873e757aea22e8d896fff6e6d03ef1835f922f49cb7fca6ff032fce813f",
  "transaction": "0x6369d823789469741cecf701e9000710b24a3180984dc07e47fdfc277fe1a7ed"
}

POST /transaction/transfer
{
  "ownerAddress": "0x0a1758ad202a2059e8c2970b562597ca45d863c4",
  "networkId": "43114",
  "transfers": [
    {
      "tokenAddress": "0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7",
      "amount": "200000",
      "recipientAddress": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f"
    }
  ],
  "feeTokenAddress": "0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7"
}

{
  "operationId": "ugtp_operation_ILmX7eF4Ngf5",
  "rail": "forward_request",
  "requestHash": "0x8f2f1873e757aea22e8d896fff6e6d03ef1835f922f49cb7fca6ff032fce813f",
  "signingPayload": {
    "domain": {
      "name": "UGTPAvalancheExecutor",
      "version": "1",
      "chainId": 43114,
      "verifyingContract": "0xA7C8776C6ac6f21eC923321793F62A4887f9E767"
    },
    "types": {
      "ExecutionRequest": [
        {
          "name": "account",
          "type": "address"
        },
        {
          "name": "nonce",
          "type": "uint256"
        },
        {
          "name": "sends",
          "type": "Send[]"
        },
        {
          "name": "swaps",
          "type": "Swap[]"
        },
        {
          "name": "bridges",
          "type": "Bridge[]"
        },
        {
          "name": "privates",
          "type": "Private[]"
        },
        {
          "name": "terms",
          "type": "FeeTerms"
        }
      ],
      "Send": [
        {
          "name": "token",
          "type": "address"
        },
        {
          "name": "recipient",
          "type": "address"
        },
        {
          "name": "amount",
          "type": "uint256"
        }
      ],
      "...": "Swap, Bridge, Private and FeeTerms members follow; the payload carries the whole tree"
    },
    "primaryType": "ExecutionRequest",
    "message": {
      "account": "0x0a1758ad202a2059e8c2970b562597ca45d863c4",
      "nonce": "3",
      "sends": [
        {
          "token": "0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7",
          "recipient": "0x9b5fcd6f647a14ebf0f88b1c3e5a3d34b951fc6f",
          "amount": "200000"
        }
      ],
      "swaps": [],
      "bridges": [],
      "privates": [],
      "terms": {
        "feeToken": "0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7",
        "transferredValueInFeeToken": "200000",
        "platformTransferFeeBps": 10,
        "projectTransferFeeBps": 0,
        "platformStaticFeeUsd8dp": "5000000",
        "projectStaticFeeUsd8dp": "0",
        "projectPayoutAddress": "0x0000000000000000000000000000000000000000",
        "calldataGas": "7296",
        "maxFeeTokenAmount": "50908",
        "validUntil": 1788518426
      }
    }
  },
  "ugtpFee": {
    "tokenAmount": "50908",
    "expectedTokenAmount": "50392",
    "feeToken": "0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7"
  }
}

GET /transaction/:id
{
  "operationId": "ugtp_operation_ILmX7eF4Ngf5",
  "status": "finalized",
  "transactionHash": "0x6369d823789469741cecf701e9000710b24a3180984dc07e47fdfc277fe1a7ed",
  "userOperationHash": "0x8f2f1873e757aea22e8d896fff6e6d03ef1835f922f49cb7fca6ff032fce813f",
  "networkId": "43114",
  "replacementCount": 0,
  "reason": null
}

Open the transaction on the block explorer ↗

The native coin, which no allowance can move

Self-funded rail (a whole transaction) · Avalanche C-Chain

0.001 AVAX moved. Nothing can relay a native balance on an account's behalf, so the account signed the whole transaction and paid its own gas — and UGTP charged nothing.

Operation id
ugtp_operation_d99WHSYNXv4j
Charged
No UGTP fee at all. The operation has a fee row with every amount null, because there is nothing to collect on this rail.

The signed transaction, as broadcast

A plain EIP-1559 transaction — type 0x02, 117 bytes of RLP. There is no UserOperation and no executor in the picture: the operation IS this transaction, which is why its hash and the operation's own hash are the same value.

{
  "type": "0x2",
  "chainId": "0xa86a",
  "nonce": "0x4",
  "maxPriorityFeePerGas": "0x1",
  "maxFeePerGas": "0x5f9510d",
  "gas": "0x7b0c",
  "to": "0x0ea9337dc1055df7bbd16f3d4824b01c560af4c5",
  "value": "0x38d7ea4c68000",
  "data": "0x",
  "raw": "0x02f86f82a86a04018405f9510d827b0c940ea9337dc…117 bytes",
  "transactionHash": "0xd805c96742bc1aed12029fe2e1a78c487b635c0d64f94d8520a6715578f67e17"
}

POST /transaction/transfer
{
  "ownerAddress": "0x760ECC99d6eA52D4D209591E2eC10878cFF4e7E3",
  "networkId": "43114",
  "transfers": [
    {
      "tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
      "amount": "1000000000000000",
      "recipientAddress": "0x0ea9337dc1055df7bbd16f3d4824b01c560af4c5"
    }
  ]
}

{
  "rail": "self_funded",
  "senderAddress": "0x760ECC99d6eA52D4D209591E2eC10878cFF4e7E3",
  "networkId": "43114",
  "nonce": 4,
  "transaction": {
    "to": "0x0ea9337dc1055df7bbd16f3d4824b01c560af4c5",
    "data": "0x",
    "value": "1000000000000000"
  },
  "gasSuggestion": {
    "gasLimit": "31500",
    "maxFeePerGas": "100000013",
    "maxPriorityFeePerGas": "1"
  }
}

POST /transaction/submit
{
  "signedTransaction": "0x02f86f82a86a04018405f9510d827b0c940ea9337dc…117 bytes"
}

{
  "operationId": "ugtp_operation_d99WHSYNXv4j",
  "status": "submitted",
  "userOperationHash": "0xd805c96742bc1aed12029fe2e1a78c487b635c0d64f94d8520a6715578f67e17",
  "networkId": "43114"
}

Open the transaction on the block explorer ↗

Withdraw

Executor rail (EIP-712 execution request) · Avalanche C-Chain

0.2 USDT unwrapped back out of its encrypted form. The client built the proof and the encrypted-token calldata; UGTP relayed it and priced it in the public token.

Operation id
ugtp_operation_BJL0njW5DcGh
Charged
0.054441 USDT of network-and-service fee (0.00443 gas + 0.050011 static), plus the product fee of 0.0005 USDT — 0.25% of the public amount, taken out of the proceeds the withdrawal itself released.

The ExecutionRequest the executor received

A private action of kind 3 carrying 1280 bytes of proof and calldata, then a send of kind 0 for the product fee. This one ran through the currently published executor.

{
  "account": "0x098afb6194f54a1ea0097fca5c9593b5ab81348e",
  "nonce": "0x1",
  "actions": [
    {
      "kind": 3,
      "params": "0x0000000000000000000000000000000000000000…1280 bytes"
    },
    {
      "kind": 0,
      "params": "0x0000000000000000000000009702230a8ea53601…96 bytes"
    }
  ],
  "terms": {
    "feeToken": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7",
    "transferredValueInFeeToken": "500",
    "platformTransferFeeBps": 0,
    "projectTransferFeeBps": 0,
    "platformStaticFeeUsd8dp": "5000000",
    "projectStaticFeeUsd8dp": "0",
    "projectPayoutAddress": "0x0000000000000000000000000000000000000000",
    "calldataGas": "24044",
    "maxFeeTokenAmount": "55304",
    "validUntil": 1788511916
  },
  "backendSignature": "0x7c2259727c9add7646104002c25689e7d5daad39…65 bytes",
  "executor": "0xA7C8776C6ac6f21eC923321793F62A4887f9E767",
  "requestHash": "0x141d4abead5569196b9c3165e040dab50a6a91940a1da44b779a76c5cc01307d",
  "transaction": "0x5d0827600d4bf987ec907143c2479f1d84e49e92d26bd967411a21cb03246506"
}

POST /private/prepare
{
  "ownerAddress": "0x098afb6194f54a1ea0097fca5c9593b5ab81348e",
  "networkId": "43114",
  "tokenSymbol": "esUSDT",
  "operationKind": "private_withdraw",
  "amountRaw": "200000",
  "calls": [
    {
      "to": "0x…the encrypted-token contract",
      "data": "0x…the client's withdrawal proof",
      "value": "0"
    }
  ]
}

{
  "operationId": "ugtp_operation_BJL0njW5DcGh",
  "rail": "forward_request",
  "requestHash": "0x141d4abead5569196b9c3165e040dab50a6a91940a1da44b779a76c5cc01307d",
  "signingPayload": {
    "domain": {
      "name": "UGTPAvalancheExecutor",
      "version": "1",
      "chainId": 43114,
      "verifyingContract": "0xA7C8776C6ac6f21eC923321793F62A4887f9E767"
    },
    "types": {
      "ExecutionRequest": [
        {
          "name": "account",
          "type": "address"
        },
        {
          "name": "nonce",
          "type": "uint256"
        },
        {
          "name": "sends",
          "type": "Send[]"
        },
        {
          "name": "swaps",
          "type": "Swap[]"
        },
        {
          "name": "bridges",
          "type": "Bridge[]"
        },
        {
          "name": "privates",
          "type": "Private[]"
        },
        {
          "name": "terms",
          "type": "FeeTerms"
        }
      ],
      "Send": [
        {
          "name": "token",
          "type": "address"
        },
        {
          "name": "recipient",
          "type": "address"
        },
        {
          "name": "amount",
          "type": "uint256"
        }
      ],
      "...": "Swap, Bridge, Private and FeeTerms members follow; the payload carries the whole tree"
    },
    "primaryType": "ExecutionRequest",
    "message": {
      "account": "0x098afb6194f54a1ea0097fca5c9593b5ab81348e",
      "nonce": "1",
      "sends": [
        {
          "token": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7",
          "recipient": "0x…the fee recipient",
          "amount": "500"
        }
      ],
      "swaps": [],
      "bridges": [],
      "privates": [
        "…one private action, 1280 bytes of proof and calldata"
      ],
      "terms": {
        "feeToken": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7",
        "transferredValueInFeeToken": "500",
        "platformTransferFeeBps": 0,
        "projectTransferFeeBps": 0,
        "platformStaticFeeUsd8dp": "5000000",
        "projectStaticFeeUsd8dp": "0",
        "projectPayoutAddress": "0x0000000000000000000000000000000000000000",
        "calldataGas": "24044",
        "maxFeeTokenAmount": "55304",
        "validUntil": 1788511916
      }
    }
  },
  "ugtpFee": {
    "tokenAmount": "55304",
    "expectedTokenAmount": "54671",
    "feeToken": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7"
  },
  "productFee": {
    "kind": "bps",
    "asset": "underlying",
    "feeRaw": "500",
    "tokenAddress": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7"
  }
}

GET /transaction/:id
{
  "operationId": "ugtp_operation_BJL0njW5DcGh",
  "status": "finalized",
  "transactionHash": "0x5d0827600d4bf987ec907143c2479f1d84e49e92d26bd967411a21cb03246506",
  "userOperationHash": "0x141d4abead5569196b9c3165e040dab50a6a91940a1da44b779a76c5cc01307d",
  "networkId": "43114",
  "replacementCount": 0,
  "reason": null
}

Open the transaction on the block explorer ↗