Deposit

📘

This is a detailed tutorial on how to make a deposit to one of the Morpho's vaults through the DeFi API. To learn more about the flow in general, refer to the Getting Started section.

As an example of using the DeFi API with the Morpho integration, let us consider making the deposit to the Steakhouse USDC vault on the Base network. The process is the following:

  1. Get the schema with the step list for obtaining approval.
  2. Create the permission request for the permit2 smart contract.
  3. Get the schema with the step list for initiating the deposit.
  4. Create the permission request for the Morpho bundler.
  5. Create the permission request for the P2P.ORG proxy contract.
  6. Prepare the final deposit transaction.
  7. Broadcast the deposit transaction to the Base network.

Before starting, ensure you have met the prerequisites for successful integration.

Request examples are provided using cURL

🚧

This is an example for the Steakhouse USDC vault. Note that for other vaults, the number of steps may vary.

This tutorial covers the most complex flow involving construction of three transactions to make a deposit. For the majority of strategies, one transaction is sufficient.

1. Get schema for approval

Before depositing assets into the vault, first grant permissions to the smart contracts involved in the integration to manage tokens.

To check the action schema and retrieve a list of steps required for approval, send a GET request to /api/defi/v1/transactions/schema.

Example request (for base chain and Steakhouse USDC strategy):

curl --request GET \
     --url GET 'https://edge.p2p.org/api/defi/v1/transactions/schema?action=approvePermit2&chain=base&protocol=morpho&strategy=Steakhouse%20USDC' \
     --header 'accept: application/json' \
     --header 'authorization: Bearer <token>'
     --header 'x-client-hash: <hash>'
  • action — operation type; in this case approvePermit2.
  • chain — blockchain network, e.g., base.
  • protocol— integration name, e.g., morpho.
  • strategy — vault name, e.g., Steakhouse USDC.
  • x-client-hash — unique identifier of the user or merchant participating in the integration; obtained with the authentication token.

Example response:

{
  "error": null,
  "result": {
    "action": "approvePermit2",
    "steps": [
      {
        "index": 0,
        "name": "finalPermit2AllowanceTransaction",
        "description": "Approve token for Permit2 (ERC20 approve to max uint256 for PERMIT2 spender)",
        "inputs": [
          {
            "key": "asset",
            "type": "string",
            "description": "Asset symbol (e.g., USDC, USDT)",
            "required": true
          },
          {
            "key": "amount",
            "type": "string",
            "description": "Optional allowance amount in token smallest unit. If omitted, max uint256 is used.",
            "required": false
          }
        ],
        "outputs": [
          {
            "key": "json",
            "type": "object",
            "description": "Built approve transaction data (to, data, value, chainId)"
          },
          {
            "key": "encoded",
            "type": "string",
            "description": "Built approve transaction as encoded serialized transaction"
          }
        ],
        "groupId": 0,
        "canExecuteInParallel": false,
        "isUnsignedTransaction": true
      }
    ],
    "stepGroups": [
      [
        0
      ]
    ]
  },
  "meta": {
    "time": 34,
    "requestId": "e94c3511-5efe-4c3d-aa0f-38d427c3afa0"
  }
}
  • action — operation type; in this case approvePermit2.
  • steps — schema with the list of steps describing which transactions you have to construct using the Craft Transaction Step endpoint.
    • index — step number in the execution order.
    • name — transaction type corresponding to the stepName request parameter of the Craft Transaction Step endpoint.
    • description — detailed information on the step purpose.
    • inputs — list of request parameters required to construct a transaction, e.g., wallet address, amount of tokens, etc. It may include transactions that require a signature as well.
      • key — parameter name.
      • type — parameter object format.
      • description — detailed information on the parameter.
      • required — boolean flag indicating if this parameter is necessary for the request.
    • outputs — list of fields expected in the transaction response.
      • key — raw transaction payload ready for signing, either encoded or json (optional).
      • type — transaction payload format.
      • description — detailed information on the payload contents.
    • groupID — identifier of the group to which this step belongs.
    • canExecuteInParallel — boolean flag indicating if it is possible to perform this step asynchronously. By executing in parallel, you can initiate the construction of multiple transactions at the same time.
      • true — step can be performed asynchronously.
      • false — step can only be performed synchronously.
    • isUnsignedTransaction — boolean flag indicating if the result of the step is a transaction that must be signed and broadcasted.
  • stepGroups — groups of steps that can be executed in parallel; currently is not operational.
  • meta — API request attributes:
    • time — request execution time in ms.
    • requestId — unique identifier of the request.
👍

Approval action summary

In this schema, the steps response array includes one step called finalPermit2AllowanceTransaction.

It means that to approve token management, you have to prepare only one transaction and then sign and broadcast it.

2. Create permission request for permit2 contract

  1. To allow Morpho's Permit2 contract to perform any operations with the specified amount of tokens, send a POST request to /api/defi/v1/transactions/steps/craft.

    Example request (for base chain and Steakhouse USDC strategy):

    curl --request GET \
      --url GET 'https://edge.p2p.org/api/defi/v1/transactions/steps/craft' \
      --header 'accept: application/json' \
      --header 'authorization: Bearer <token>' \
      --header 'Content-Type: application/json' \
      --data '{
      "chain": "base",
      "action": "approvePermit2",
      "protocol": "morpho",
      "strategy": "Steakhouse USDC",
      "userAddress": "0x0000000000000000000000000000000000000001",
      "options": {
        "executionMode": "sync"
      },
      "stepName": "finalPermit2AllowanceTransaction",
      "payload": {
        "asset": "USDC",
        "amount": "10000"
      }
    }
    '
    • action — operation type.
    • chain — blockchain network.
    • protocol— integration name.
    • strategy — vault name.
    • userAddress — user wallet address.
    • options.executeMode — DeFi API processing mode. The recommended value for each step can be found in the schema's canExecuteInParallel field.
      • sync — synchronous; default for some networks so that the blockchain does not reverse the block in which the transaction is included. In this mode, before continuing with other steps, the user has to wait until the API operation is fully completed and the transaction is returned.
      • async — asynchronous. In this mode, after sending the request, the user can continue with other steps according to the schema and periodically check the request status with the Get Step Crafting Status endpoint.
    • stepName — name of the transaction to construct. In this case, it is finalPermit2AllowanceTransaction.
    • payload — transaction data:
      • amount — amount of tokens the permit2 contract is allowed to interact with. You can specify any amount, but not less than the deposit amount.
      • asset — token denomination, e.g., USDC.

    Example response:

    {
      "error": null,
      "result": {
        "operationId": "mock-operation-id-permit2-abc123",
        "chain": "base",
        "action": "approvePermit2",
        "status": "READY_FOR_SIGN",
        "protocol": "morpho",
        "strategy": "Steakhouse USDC",
        "userAddress": "0x0000000000000000000000000000000000000001",
        "stepList": [
          {
            "index": 0,
            "type": "transaction",
            "name": "finalPermit2AllowanceTransaction",
            "description": "Approve token for Permit2 (ERC20 approve to max uint256 for PERMIT2 spender)",
            "payload": "****",
            "verifierMeta": {
              "signature": "0x0000000000000000000000000000000000000000000000000000000000000000"
            }
          }
        ],
        "payload": "****",
        "verifierMeta": {
          "signature": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        "createdAt": "2026-02-13T12:00:00.000Z",
        "updatedAt": "2026-02-13T12:00:00.000Z"
      },
      "meta": {
        "time": 100,
        "requestId": "mock-request-id-permit2-xyz789"
      }
    }
    • operationId — unique identifier of the transaction.
    • chain — blockchain network.
    • action — operation type.
    • status — current transaction status: AWAITING_CRAFT, IN_PROGRESS, READY_FOR_SIGN or DONE.
    • protocol— integration name.
    • strategy — vault name.
    • userAddress — user wallet address.
    • stepList — list of fields with the step results obtained according to the schema:
      • index — step number in the execution order.
      • type — object format.
      • name — name of the transaction to construct. In this case, it is finalPermit2AllowanceTransaction.
      • description — detailed information on the step purpose.
      • payload — raw transaction object ready for signing represented in two formats: encoded and json (optional).
      • verifierMeta — data object received from P2P.ORG's verifier module.
        • signature — signature provided by the verifier module, which confirms that the transaction was crafted and then cryptographically verified by P2P.ORG.
    • payload — final transaction payload represented either in encoded or json (optional) format.
    • verifierMeta — final transaction data object received from the verifier module.
    • createdAt — timestamp of the transaction creation in the ISO 8601 format.
    • updatedAt — timestamp of the transaction update in the ISO 8601 format.
    • meta — API request attributes:
      • time — request execution time in ms.
      • requestId — unique identifier of the request.
  2. Sign the raw json or encoded object in the result.payload field.

  3. Broadcast it to the network by sending a POST request to /api/defi/v1/transactions/steps/broadcast.

    By broadcasting this transaction, you're granting permission to the permit2 smart contract to interact with the specified amount of tokens at your wallet address.

3. Get schema for deposit

The deposit action may require a various number of steps depending on the target chain and vault. To retrieve a list of steps for the preferred strategy, send a GET request to /api/defi/v1/transactions/schema.

Example request (for base chain and Steakhouse USDC strategy):

curl --request GET \
     --url GET 'https://edge.p2p.org/api/defi/v1/transactions/schema?action=deposit&chain=base&protocol=morpho&strategy=Steakhouse%20USDC' \
     --header 'accept: application/json' \
     --header 'authorization: Bearer <token>'
  • action — operation type; in this case deposit.
  • chain — blockchain network.
  • protocol— integration name.
  • strategy — vault name.
  • x-client-hash — unique identifier of the user or merchant participating in the integration; obtained with the authentication token.

Example response:

{
  "error": null,
  "result": {
    "action": "deposit",
    "steps": [
      {
        "index": 0,
        "name": "permit2SingleDetailsForMorpho",
        "description": "Prepare Permit2 SingleDetails for Morpho bundler",
        "inputs": [
          {
            "key": "amount",
            "type": "string",
            "description": "Deposit amount in token smallest unit",
            "required": true
          },
          {
            "key": "asset",
            "type": "string",
            "description": "Asset symbol (e.g., USDC, USDT)",
            "required": true
          }
        ],
        "outputs": [
          {
            "key": "json",
            "type": "object",
            "description": "Permit2 SingleDetails data (amountInTokens, spenderAddress, sigDeadline, nonce, chainId, tokenContractAddress)"
          },
          {
            "key": "encoded",
            "type": "string",
            "description": "Built Permit2 SingleDetails for Morpho bundler as hashed typed data"
          }
        ],
        "groupId": 0,
        "canExecuteInParallel": false
      },
      {
        "index": 1,
        "name": "permit2SingleDetailsForP2pProxy",
        "description": "Prepare Permit2 SingleDetails for P2P Proxy",
        "inputs": [
          {
            "key": "amount",
            "type": "string",
            "description": "Deposit amount in token smallest unit",
            "required": true
          },
          {
            "key": "asset",
            "type": "string",
            "description": "Asset symbol (e.g., USDC, USDT)",
            "required": true
          },
          {
            "key": "operationId",
            "type": "string",
            "description": "Encrypted transaction ID (operationId) from previous step (step 0)",
            "required": true
          }
        ],
        "outputs": [
          {
            "key": "json",
            "type": "object",
            "description": "Permit2 SingleDetails data (amountInTokens, spenderAddress, sigDeadline, nonce, chainId, tokenContractAddress)"
          },
          {
            "key": "encoded",
            "type": "string",
            "description": "Built Permit2 SingleDetails for P2P Proxy as hashed typed data"
          }
        ],
        "groupId": 0,
        "canExecuteInParallel": false
      },
      {
        "index": 2,
        "name": "finalDepositTransaction",
        "description": "Create final deposit transaction",
        "inputs": [
          {
            "key": "amount",
            "type": "string",
            "description": "Deposit amount in token smallest unit",
            "required": true
          },
          {
            "key": "asset",
            "type": "string",
            "description": "Asset symbol (e.g., USDC, USDT)",
            "required": true
          },
          {
            "key": "permit2SignatureForMorpho",
            "type": "string",
            "description": "Signed Permit2 SingleDetails for Morpho bundler (from step 0)",
            "required": true,
            "requiresSignature": true,
            "signatureSource": {
              "stepIndex": 0,
              "stepName": "permit2SingleDetailsForMorpho",
              "outputKey": "encoded"
            }
          },
          {
            "key": "permit2SignatureForP2pProxy",
            "type": "string",
            "description": "Signed Permit2 SingleDetails for P2P Proxy (from step 1)",
            "required": true,
            "requiresSignature": true,
            "signatureSource": {
              "stepIndex": 1,
              "stepName": "permit2SingleDetailsForP2pProxy",
              "outputKey": "encoded"
            }
          },
          {
            "key": "operationId",
            "type": "string",
            "description": "Encrypted transaction ID (operationId) from previous step (step 0)",
            "required": true
          }
        ],
        "outputs": [
          {
            "key": "json",
            "type": "object",
            "description": "Built deposit transaction data (to, data, value, chainId)"
          },
          {
            "key": "encoded",
            "type": "string",
            "description": "Built deposit transaction as encoded function data"
          }
        ],
        "inputReferences": [
          {
            "stepIndex": 0,
            "outputKey": "encoded"
          },
          {
            "stepIndex": 1,
            "outputKey": "encoded"
          },
          {
            "stepIndex": 0,
            "outputKey": "operationId"
          }
        ],
        "groupId": 1,
        "canExecuteInParallel": false
      }
    ],
    "stepGroups": [
      [
        0,
        1
      ],
      [
        2
      ]
    ]
  },
  "meta": {
    "time": 13,
    "requestId": "6b1c6203-e455-4093-ab3e-271127be16a5"
  }
}
  • action — operation type.
  • steps — schema with the list of steps describing which transactions you have to construct using the Craft Transaction Step endpoint.
    • index — step number in the execution order.
    • name — transaction type corresponding to the stepName request parameter of the Craft Transaction Step endpoint.
    • description — detailed information on the step purpose.
    • inputs — list of request parameters required to construct a transaction, e.g., wallet address, amount of tokens, etc. It may include transactions that require a signature as well.
      • key — parameter name.
      • type — parameter object format.
      • description — detailed information on the parameter.
      • required — boolean flag indicating if this parameter is necessary for the request.
      • requiresSignature — boolean flag indicating if the parameter is a transaction itself that must be signed.
      • signatureSource — detailed information on the step at which the transaction requiring a signature was received:
        • stepIndex — step number.
        • stepName — transaction type.
        • outputKey — resulting object format.
    • outputs — list of fields expected in the transaction response for the specific step.
      • key — raw transaction payload ready for signing.
      • type — object format, which is either encoded or json (optional).
      • description — detailed information on the payload contents.
    • groupID — identifier of the group to which this step belongs.
    • canExecuteInParallel — boolean flag indicating if it is possible to perform this step asynchronously. By executing in parallel, you can initiate the construction of multiple transactions at the same time.
      • true — step can be performed asynchronously.
      • false — step can only be performed synchronously.
    • inputReferences — references to key from previous steps, either from the request or response.
      • stepIndex — step number.
      • outputKey — name of the specific key parameter from the step output.
  • stepGroups — groups of steps that can be executed in parallel; currently is not operational.
  • meta — API request attributes:
    • time — request execution time in ms.
    • requestId — unique identifier of the request.
👍

Deposit action summary

In this schema, the steps response array includes three steps ordered from 0 to 2. It means that the process of depositing assets to a vault requires three actions:

  1. Allow transferring funds from the user wallet to the P2P proxy contract address.
  2. Allow transferring funds from the P2P proxy contract address to the vault address.
  3. Combine the two previous transactions to obtain the raw deposit transaction.

For each step, a signature is required. The third and final transaction must have the payloads of the previous two. To complete the deposit action, broadcast the final transaction to the network.

Accordingly, these transactions can be constructed only consequently, since the value of the canExecuteInParallel parameter is false.

4. Create permission request for the vault

  1. Construct the first intermediate permit2SingleDetailsForMorpho transaction according to the schema.

    To allow the Morpho bundler to withdraw assets from the P2P proxy address to the vault address, send a POST request to /api/defi/v1/transactions/steps/craft.

    Example request (for base chain and Steakhouse USDC strategy):

    curl --request GET \
      --url GET 'https://edge.p2p.org/api/defi/v1/transactions/steps/craft' \
      --header 'accept: application/json' \
      --header 'authorization: Bearer <token>' \
      --header 'Content-Type: application/json' \
      --data '{
        "chain": "base",
        "action": "deposit",
        "protocol": "morpho",
        "strategy": "Steakhouse USDC",
        "userAddress": "0x991c468AbcE2b4DD627a6210C145373EbABdd186",
        "options": {
            "executionMode": "sync"
        },
        "stepName": "permit2SingleDetailsForMorpho",
        "payload": {
            "amount": "10000",
            "asset": "USDC"
            }
    }'
    • chain — blockchain network.
    • action — operation type.
    • protocol— integration name.
    • strategy — vault name.
    • userAddress — user wallet address.
    • options.executeMode — DeFi API processing mode. The recommended value for each step can be found in the schema's canExecuteInParallel field.
    • stepName — step name corresponding to the name response parameter of the Get Transaction Step Schema endpoint. In this case, it is permit2SingleDetailsForMorpho.
    • payload — transaction data:
      • amount — amount of tokens to deposit.
      • asset — token denomination, e.g., USDC.

    Example response:

    {
      "error": null,
      "result": {
        "operationId": "iR4WV/aWs1Ll+SiOObmZdONXggOufzS5kEYdyxmZMWd8gb6Iu9KILvUWCbatR75x",
        "chain": "base",
        "action": "deposit",
        "status": "IN_PROGRESS",
        "protocol": "morpho",
        "strategy": "Steakhouse USDC",
        "userAddress": "0x991c468AbcE2b4DD627a6210C145373EbABdd186",
        "stepList": [
          {
            "index": 0,
            "type": "signature_data",
            "name": "permit2SingleDetailsForMorpho",
            "description": "Prepare Permit2 SingleDetails for Morpho bundler",
            "payload": {
              "json": {
                "domain": {
                  "name": "Permit2",
                  "chainId": 8453,
                  "verifyingContract": "0x000000000022D473030F116dDEE9F6B43aC78BA3"
                },
                "types": {
                  "PermitDetails": [
                    {
                      "name": "token",
                      "type": "address"
                    },
                    {
                      "name": "amount",
                      "type": "uint160"
                    },
                    {
                      "name": "expiration",
                      "type": "uint48"
                    },
                    {
                      "name": "nonce",
                      "type": "uint48"
                    }
                  ],
                  "PermitSingle": [
                    {
                      "name": "details",
                      "type": "PermitDetails"
                    },
                    {
                      "name": "spender",
                      "type": "address"
                    },
                    {
                      "name": "sigDeadline",
                      "type": "uint256"
                    }
                  ]
                },
                "primaryType": "PermitSingle",
                "message": {
                  "details": {
                    "token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                    "amount": "10000",
                    "expiration": "281474976710655",
                    "nonce": 0
                  },
                  "spender": "0x23055618898e202386e6c13955a58D3C68200BFB",
                  "sigDeadline": "1767173669"
                }
              },
              "encoded": "0x8675b0c734ce70a49ffcef60f6cbffd3c747091ccf99c783c0fdbec686b29c11"
            },
            "verifierMeta": {
              "signature": "0x1942c3fdf677c44a333f121e9105d3930a9aac60f393094dba29c9aaa1e230cb"
            },
            "outputKeys": [
              "json",
              "encoded"
            ]
          },
          null,
          null
        ],
        "payload": null,
        "verifierMeta": null,
        "createdAt": "2025-12-24T09:34:29.324Z",
        "updatedAt": "2025-12-24T09:49:53.551Z"
      },
      "meta": {
        "time": 3212,
        "requestId": "25ae64b3-44d0-4bfe-b583-78717ba5581b"
      }
    }
    • operationId — unique identifier of the transaction; required for the next steps.
    • chain — blockchain network.
    • action — operation type.
    • status — current transaction status: AWAITING_CRAFT, IN_PROGRESS, READY_FOR_SIGN or DONE.
    • protocol— integration name.
    • strategy — vault name.
    • userAddress — user wallet address.
    • stepList — list of fields with the step results obtained according to the schema.

      For schemes with multiple steps: if a step has not been performed yet, the field will have null. In this example, the response contains data for the step 0 only.

      • index — step number in the execution order.
      • type — object format.
      • name — step name corresponding to the name response field of the Get Transaction Step Schema endpoint.
      • description — detailed information on the step purpose.
      • payload — raw transaction object ready for signing represented in two formats: encoded and json (optional).
      • verifierMeta — data object received from P2P.ORG's verifier module.
        • signature — signature provided by the verifier module, which confirms that the transaction was crafted and then cryptographically verified by P2P.ORG.
    • payload — final transaction object. null until there are schema steps yet to be performed.
    • verifierMeta — final transaction data object received from the verifier module. null until there are schema steps yet to be performed.
    • createdAt — timestamp of the transaction creation in the ISO 8601 format.
    • updatedAt — timestamp of the transaction update in the ISO 8601 format.
    • meta — API request attributes:
      • time — request execution time in ms.
      • requestId — unique identifier of the request.
  2. Sign the intermediate json or encoded transaction object from the step 0 payload field.

5. Create permission request for P2P.ORG smart contract

  1. Construct the second permit2SingleDetailsForP2pProxy intermediate transaction according to the schema.

    To allow a P2P proxy contract to withdraw assets from your wallet address, send a POST request to /api/defi/v1/transactions/steps/craft. Mind specifying the correct stepName according to the scheme's step order as well as the operationID of the previous transaction.

    Example request (for base chain and Steakhouse USDC strategy):

    curl --request GET \
      --url GET 'https://edge.p2p.org/api/defi/v1/transactions/steps/craft' \
      --header 'accept: application/json' \
      --header 'authorization: Bearer <token>' \
      --header 'Content-Type: application/json' \
      --data '{
        "chain": "base",
        "action": "deposit",
        "protocol": "morpho",
        "strategy": "Steakhouse USDC",
        "userAddress": "0x991c468AbcE2b4DD627a6210C145373EbABdd186",
        "options": {
            "executionMode": "sync"
        },
        "stepName": "permit2SingleDetailsForP2pProxy",
        "payload": {
            "amount": "10000",
            "asset": "USDC",
            "operationId": "iR4WV/aWs1Ll+SiOObmZdONXggOufzS5kEYdyxmZMWd8gb6Iu9KILvUWCbatR75x"
         }
    }'
    • chain — blockchain network.
    • action — operation type.
    • protocol— integration name.
    • strategy — vault name.
    • userAddress — user wallet address.
    • options.executeMode — DeFi API request processing mode. The recommended value for each step can be found in the schema's canExecuteInParallel field.
    • stepName — step name corresponding to the name response parameter of the Get Transaction Step Schema endpoint. In this case, it is permit2SingleDetailsForP2pProxy.
    • payload — transaction data:
      • amount — amount of tokens to deposit.
      • asset — token denomination, e.g., USDC.
      • operationId — unique identifier of the permit2SingleDetailsForMorpho transaction.

    Example response:

    {
      "error": null,
      "result": {
        "operationId": "iR4WV/aWs1Ll+SiOObmZdONXggOufzS5kEYdyxmZMWd8gb6Iu9KILvUWCbatR75x",
        "chain": "base",
        "action": "deposit",
        "status": "IN_PROGRESS",
        "protocol": "morpho",
        "strategy": "Steakhouse USDC",
        "userAddress": "0x991c468AbcE2b4DD627a6210C145373EbABdd186",
        "stepList": [
          {
            "index": 0,
            "type": "signature_data",
            "name": "permit2SingleDetailsForMorpho",
            "description": "Prepare Permit2 SingleDetails for Morpho bundler",
            "payload": {
              "json": {
                "domain": {
                  "name": "Permit2",
                  "chainId": 8453,
                  "verifyingContract": "0x000000000022D473030F116dDEE9F6B43aC78BA3"
                },
                "types": {
                  "PermitDetails": [
                    {
                      "name": "token",
                      "type": "address"
                    },
                    {
                      "name": "amount",
                      "type": "uint160"
                    },
                    {
                      "name": "expiration",
                      "type": "uint48"
                    },
                    {
                      "name": "nonce",
                      "type": "uint48"
                    }
                  ],
                  "PermitSingle": [
                    {
                      "name": "details",
                      "type": "PermitDetails"
                    },
                    {
                      "name": "spender",
                      "type": "address"
                    },
                    {
                      "name": "sigDeadline",
                      "type": "uint256"
                    }
                  ]
                },
                "primaryType": "PermitSingle",
                "message": {
                  "details": {
                    "token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                    "amount": "10000",
                    "expiration": "281474976710655",
                    "nonce": 0
                  },
                  "spender": "0x23055618898e202386e6c13955a58D3C68200BFB",
                  "sigDeadline": "1767173669"
                }
              },
              "encoded": "0x8675b0c734ce70a49ffcef60f6cbffd3c747091ccf99c783c0fdbec686b29c11"
            },
            "verifierMeta": {
              "signature": "0x1942c3fdf677c44a333f121e9105d3930a9aac60f393094dba29c9aaa1e230cb"
            },
            "outputKeys": [
              "json",
              "encoded"
            ]
          },
          {
            "index": 1,
            "type": "signature_data",
            "name": "permit2SingleDetailsForP2pProxy",
            "description": "Prepare Permit2 SingleDetails for P2P Proxy",
            "payload": {
              "json": {
                "domain": {
                  "name": "Permit2",
                  "chainId": 8453,
                  "verifyingContract": "0x000000000022D473030F116dDEE9F6B43aC78BA3"
                },
                "types": {
                  "PermitDetails": [
                    {
                      "name": "token",
                      "type": "address"
                    },
                    {
                      "name": "amount",
                      "type": "uint160"
                    },
                    {
                      "name": "expiration",
                      "type": "uint48"
                    },
                    {
                      "name": "nonce",
                      "type": "uint48"
                    }
                  ],
                  "PermitSingle": [
                    {
                      "name": "details",
                      "type": "PermitDetails"
                    },
                    {
                      "name": "spender",
                      "type": "address"
                    },
                    {
                      "name": "sigDeadline",
                      "type": "uint256"
                    }
                  ]
                },
                "primaryType": "PermitSingle",
                "message": {
                  "details": {
                    "token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                    "amount": "10000",
                    "expiration": "281474976710655",
                    "nonce": 0
                  },
                  "spender": "0x9A01117B3AAB083C93cdd67F9ab4359cB21FE94E",
                  "sigDeadline": "1767173669"
                }
              },
              "encoded": "0xcb57b7905a95cdeea99e1ad7c2a95f079aefe1eb951c4c7b6c14bc72c7aae6c5"
            },
            "verifierMeta": {
              "signature": "0x1d07766debe8ff9f44d04023ded4e2d1ff750109e3975a6f54ac1697db28d8de"
            },
            "outputKeys": [
              "json",
              "encoded"
            ]
          },
          null
        ],
        "payload": null,
        "verifierMeta": null,
        "createdAt": "2025-12-24T09:34:29.324Z",
        "updatedAt": "2025-12-24T09:49:53.551Z"
      },
      "meta": {
        "time": 3212,
        "requestId": "25ae64b3-44d0-4bfe-b583-78717ba5581b"
      }
    }
    • operationId — unique identifier of the permit2SingleDetailsForMorpho transaction.
    • chain — blockchain network.
    • action — operation type.
    • status — current transaction status: AWAITING_CRAFT, IN_PROGRESS, READY_FOR_SIGN or DONE.
    • protocol— integration name.
    • strategy — vault name.
    • userAddress — user wallet address.
    • stepList — list of fields with the step results obtained according to the schema.

      For schemes with multiple steps: if a step has not been performed yet, the field will have null. In this example, the response contains data for steps 0 and 1.

      • index — step number in the execution order.
      • type — parameter object format.
      • name — step name corresponding to the name response field of the Get Transaction Step Schema endpoint.
      • description — detailed information on the step purpose.
      • payload — raw transaction object ready for signing represented in two formats: encoded and json (optional).
      • verifierMeta — data object received from P2P.ORG's verifier module.
        • signature — signature provided by the verifier module, which confirms that the transaction was crafted and then cryptographically verified by P2P.ORG.
    • payload — final transaction object. null until there are schema steps yet to be performed.
    • verifierMeta — final transaction data object received from the verifier module. null until there are schema steps yet to be performed.
    • createdAt — timestamp of the transaction creation in the ISO 8601 format.
    • updatedAt — timestamp of the transaction update in the ISO 8601 format.
    • meta — API request attributes:
      • time — request execution time in ms.
      • requestId — request identifier; used as a correlating ID in logs.
  2. Sign the intermediate json or encoded transaction object from the step 1 payload field.

6. Prepare final deposit transaction

Construct the third finalDepositTransaction transaction according to the schema.

To prepare the final deposit transaction, send a POST request to /api/defi/v1/transactions/steps/craft. Mind specifying the correct stepName according to the scheme's step order and the operationID from the step 0.

Example request (for base chain and Steakhouse USDC strategy):

curl --request GET \
  --url GET 'https://edge.p2p.org/api/defi/v1/transactions/steps/craft' \
  --header 'accept: application/json' \
  --header 'authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "chain": "base",
  "action": "deposit",
  "protocol": "morpho",
  "strategy": "Steakhouse USDC",
  "userAddress": "0x991c468AbcE2b4DD627a6210C145373EbABdd186",
  "options": {
    "executionMode": "sync"
  },
  "stepName": "finalDepositTransaction",
  "payload": {
    "amount": "10000",
    "asset": "USDC",
    "operationId": "iR4WV/aWs1Ll+SiOObmZdONXggOufzS5kEYdyxmZMWd8gb6Iu9KILvUWCbatR75x",
    "permit2SignatureForMorpho": "0x831ad90a76e7f88fda3d35d454ecc6482c456cd180d1243d60b53286e5a41400239b17261d50bd79f301e177a5243ebee57a24728039b03d7cc76cb3b101068f1c",
    "permit2SignatureForP2pProxy": "0xf4de5fcf3866909788c28a69cfad101a602c77f81da47ad4c8e32d28a93703452944eb65d6a13a2522ec4de30e42bdfb44e983dd3d7b25fa27d60dbf1a377f181b"
  }
}'
  • chain — blockchain network.
  • action — operation type.
  • protocol— integration name.
  • strategy — vault name.
  • userAddress — user wallet address.
  • options.executeMode — DeFi API request processing mode. The recommended value for each step can be found in the schema's canExecuteInParallel field.
  • stepName — step name corresponding to the name response parameter of the Get Transaction Step Schema endpoint. In this case, it is finalDepositTransaction.
  • payload — transaction data:
    • amount — amount of tokens to deposit.
    • asset — token denomination, e.g., USDC.
    • operationId — unique identifier of the permit2SingleDetailsForMorpho transaction.
    • permit2SignatureForMorpho — signed transaction obtained at step 0.
    • permit2SignatureForP2pProxy — signed transaction obtained at step 1.

Example response:

{
  "error": null,
  "result": {
    "operationId": "iR4WV/aWs1Ll+SiOObmZdONXggOufzS5kEYdyxmZMWd8gb6Iu9KILvUWCbatR75x",
    "chain": "base",
    "action": "deposit",
    "status": "READY_FOR_SIGN",
    "protocol": "morpho",
    "strategy": "Steakhouse USDC",
    "userAddress": "0x991c468AbcE2b4DD627a6210C145373EbABdd186",
    "stepList": [
      {
        "index": 0,
        "type": "signature_data",
        "name": "permit2SingleDetailsForMorpho",
        "description": "Prepare Permit2 SingleDetails for Morpho bundler",
        "payload": {
          "json": {
            "domain": {
              "name": "Permit2",
              "chainId": 8453,
              "verifyingContract": "0x000000000022D473030F116dDEE9F6B43aC78BA3"
            },
            "types": {
              "PermitDetails": [
                {
                  "name": "token",
                  "type": "address"
                },
                {
                  "name": "amount",
                  "type": "uint160"
                },
                {
                  "name": "expiration",
                  "type": "uint48"
                },
                {
                  "name": "nonce",
                  "type": "uint48"
                }
              ],
              "PermitSingle": [
                {
                  "name": "details",
                  "type": "PermitDetails"
                },
                {
                  "name": "spender",
                  "type": "address"
                },
                {
                  "name": "sigDeadline",
                  "type": "uint256"
                }
              ]
            },
            "primaryType": "PermitSingle",
            "message": {
              "details": {
                "token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "amount": "10000",
                "expiration": "281474976710655",
                "nonce": 0
              },
              "spender": "0x23055618898e202386e6c13955a58D3C68200BFB",
              "sigDeadline": "1767173669"
            }
          },
          "encoded": "0x8675b0c734ce70a49ffcef60f6cbffd3c747091ccf99c783c0fdbec686b29c11"
        },
        "verifierMeta": {
          "signature": "0x1942c3fdf677c44a333f121e9105d3930a9aac60f393094dba29c9aaa1e230cb"
        },
        "outputKeys": [
          "json",
          "encoded"
        ]
      },
      {
        "index": 1,
        "type": "signature_data",
        "name": "permit2SingleDetailsForP2pProxy",
        "description": "Prepare Permit2 SingleDetails for P2P Proxy",
        "payload": {
          "json": {
            "domain": {
              "name": "Permit2",
              "chainId": 8453,
              "verifyingContract": "0x000000000022D473030F116dDEE9F6B43aC78BA3"
            },
            "types": {
              "PermitDetails": [
                {
                  "name": "token",
                  "type": "address"
                },
                {
                  "name": "amount",
                  "type": "uint160"
                },
                {
                  "name": "expiration",
                  "type": "uint48"
                },
                {
                  "name": "nonce",
                  "type": "uint48"
                }
              ],
              "PermitSingle": [
                {
                  "name": "details",
                  "type": "PermitDetails"
                },
                {
                  "name": "spender",
                  "type": "address"
                },
                {
                  "name": "sigDeadline",
                  "type": "uint256"
                }
              ]
            },
            "primaryType": "PermitSingle",
            "message": {
              "details": {
                "token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "amount": "10000",
                "expiration": "281474976710655",
                "nonce": 0
              },
              "spender": "0x9A01117B3AAB083C93cdd67F9ab4359cB21FE94E",
              "sigDeadline": "1767173669"
            }
          },
          "encoded": "0xcb57b7905a95cdeea99e1ad7c2a95f079aefe1eb951c4c7b6c14bc72c7aae6c5"
        },
        "verifierMeta": {
          "signature": "0x1d07766debe8ff9f44d04023ded4e2d1ff750109e3975a6f54ac1697db28d8de"
        },
        "outputKeys": [
          "json",
          "encoded"
        ]
      },
      {
        "index": 2,
        "type": "transaction",
        "name": "finalDepositTransaction",
        "description": "Create final deposit transaction",
        "payload": {
          "json": {
            "domain": {
              "name": "Morpho",
              "chainId": 8453,
              "verifyingContract": "0x23055618898e202386e6c13955a58D3C68200BFB"
            },
            "types": {
              "Deposit": [
                {
                  "name": "bundlerAddress",
                  "type": "address"
                },
                {
                  "name": "multicallData",
                  "type": "bytes"
                },
                {
                  "name": "p2pProxyPermitSingle",
                  "type": "bytes"
                },
                {
                  "name": "permit2SignatureForP2pProxy",
                  "type": "bytes"
                },
                {
                  "name": "feeInBasisPoints",
                  "type": "uint256"
                },
                {
                  "name": "feeSignatureDeadline",
                  "type": "uint256"
                },
                {
                  "name": "feeSignature",
                  "type": "bytes"
                }
              ]
            },
            "primaryType": "Deposit",
            "message": {
              "bundlerAddress": "0x23055618898e202386e6c13955a58D3C68200BFB",
              "multicallData": "0xac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000184af504202000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000ffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023055618898e202386e6c13955a58d3c68200bfb000000000000000000000000000000000000000000000000000000006954ee25000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000041831ad90a76e7f88fda3d35d454ecc6482c456cd180d1243d60b53286e5a41400239b17261d50bd79f301e177a5243ebee57a24728039b03d7cc76cb3b101068f1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004454c53ef0000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000846ef5eeae000000000000000000000000beef010f9cb27031ad51e3333f9af9c6b122818300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000020f8ebb4ebb46f0000000000000000000000009a01117b3aab083c93cdd67f9ab4359cb21fe94e00000000000000000000000000000000000000000000000000000000",
              "p2pProxyPermitSingle": "0x000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000ffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a01117b3aab083c93cdd67f9ab4359cb21fe94e000000000000000000000000000000000000000000000000000000006954ee25",
              "permit2SignatureForP2pProxy": "0xf4de5fcf3866909788c28a69cfad101a602c77f81da47ad4c8e32d28a93703452944eb65d6a13a2522ec4de30e42bdfb44e983dd3d7b25fa27d60dbf1a377f181b",
              "feeInBasisPoints": "10000",
              "feeSignatureDeadline": "1767173669",
              "feeSignature": "0x0f6bbd829715c699631306b3526a7b54de1a20a1ae8f98e80b0800012887c6c1762226b7999f019399f7b68f70cdafb9779bfa23bda3348f66d0da76f6befc7c1b"
            }
          },
          "encoded": "0xa6c26af400000000000000000000000023055618898e202386e6c13955a58d3c68200bfb0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000ffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a01117b3aab083c93cdd67f9ab4359cb21fe94e000000000000000000000000000000000000000000000000000000006954ee2500000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000006954ee2500000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000003a4ac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000184af504202000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000ffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023055618898e202386e6c13955a58d3c68200bfb000000000000000000000000000000000000000000000000000000006954ee25000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000041831ad90a76e7f88fda3d35d454ecc6482c456cd180d1243d60b53286e5a41400239b17261d50bd79f301e177a5243ebee57a24728039b03d7cc76cb3b101068f1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004454c53ef0000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000846ef5eeae000000000000000000000000beef010f9cb27031ad51e3333f9af9c6b122818300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000020f8ebb4ebb46f0000000000000000000000009a01117b3aab083c93cdd67f9ab4359cb21fe94e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041f4de5fcf3866909788c28a69cfad101a602c77f81da47ad4c8e32d28a93703452944eb65d6a13a2522ec4de30e42bdfb44e983dd3d7b25fa27d60dbf1a377f181b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410f6bbd829715c699631306b3526a7b54de1a20a1ae8f98e80b0800012887c6c1762226b7999f019399f7b68f70cdafb9779bfa23bda3348f66d0da76f6befc7c1b00000000000000000000000000000000000000000000000000000000000000"
        },
        "verifierMeta": {
          "signature": "0x7ef4832cc53ca9f909eee4a56ced5314de5ec23ff5074ba4b7a95932ab7252d5"
        },
        "inputReferences": [
          {
            "stepIndex": 0,
            "outputKey": "encoded"
          },
          {
            "stepIndex": 1,
            "outputKey": "encoded"
          },
          {
            "stepIndex": 0,
            "outputKey": "operationId"
          }
        ],
        "outputKeys": [
          "json",
          "encoded"
        ]
      }
    ],
    "payload": {
      "json": {
        "domain": {
          "name": "Morpho",
          "chainId": 8453,
          "verifyingContract": "0x23055618898e202386e6c13955a58D3C68200BFB"
        },
        "types": {
          "Deposit": [
            {
              "name": "bundlerAddress",
              "type": "address"
            },
            {
              "name": "multicallData",
              "type": "bytes"
            },
            {
              "name": "p2pProxyPermitSingle",
              "type": "bytes"
            },
            {
              "name": "permit2SignatureForP2pProxy",
              "type": "bytes"
            },
            {
              "name": "feeInBasisPoints",
              "type": "uint256"
            },
            {
              "name": "feeSignatureDeadline",
              "type": "uint256"
            },
            {
              "name": "feeSignature",
              "type": "bytes"
            }
          ]
        },
        "primaryType": "Deposit",
        "message": {
          "bundlerAddress": "0x23055618898e202386e6c13955a58D3C68200BFB",
          "multicallData": "0xac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000184af504202000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000ffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023055618898e202386e6c13955a58d3c68200bfb000000000000000000000000000000000000000000000000000000006954ee25000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000041831ad90a76e7f88fda3d35d454ecc6482c456cd180d1243d60b53286e5a41400239b17261d50bd79f301e177a5243ebee57a24728039b03d7cc76cb3b101068f1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004454c53ef0000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000846ef5eeae000000000000000000000000beef010f9cb27031ad51e3333f9af9c6b122818300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000020f8ebb4ebb46f0000000000000000000000009a01117b3aab083c93cdd67f9ab4359cb21fe94e00000000000000000000000000000000000000000000000000000000",
          "p2pProxyPermitSingle": "0x000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000ffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a01117b3aab083c93cdd67f9ab4359cb21fe94e000000000000000000000000000000000000000000000000000000006954ee25",
          "permit2SignatureForP2pProxy": "0xf4de5fcf3866909788c28a69cfad101a602c77f81da47ad4c8e32d28a93703452944eb65d6a13a2522ec4de30e42bdfb44e983dd3d7b25fa27d60dbf1a377f181b",
          "feeInBasisPoints": "10000",
          "feeSignatureDeadline": "1767173669",
          "feeSignature": "0x0f6bbd829715c699631306b3526a7b54de1a20a1ae8f98e80b0800012887c6c1762226b7999f019399f7b68f70cdafb9779bfa23bda3348f66d0da76f6befc7c1b"
        }
      },
      "encoded": "0xa6c26af400000000000000000000000023055618898e202386e6c13955a58d3c68200bfb0000000000000000000000000000000000000000000000000000000000000180000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000ffffffffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009a01117b3aab083c93cdd67f9ab4359cb21fe94e000000000000000000000000000000000000000000000000000000006954ee2500000000000000000000000000000000000000000000000000000000000005600000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000006954ee2500000000000000000000000000000000000000000000000000000000000005e000000000000000000000000000000000000000000000000000000000000003a4ac9650d8000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002a00000000000000000000000000000000000000000000000000000000000000184af504202000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000ffffffffffff000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023055618898e202386e6c13955a58d3c68200bfb000000000000000000000000000000000000000000000000000000006954ee25000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000041831ad90a76e7f88fda3d35d454ecc6482c456cd180d1243d60b53286e5a41400239b17261d50bd79f301e177a5243ebee57a24728039b03d7cc76cb3b101068f1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004454c53ef0000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000846ef5eeae000000000000000000000000beef010f9cb27031ad51e3333f9af9c6b122818300000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000020f8ebb4ebb46f0000000000000000000000009a01117b3aab083c93cdd67f9ab4359cb21fe94e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041f4de5fcf3866909788c28a69cfad101a602c77f81da47ad4c8e32d28a93703452944eb65d6a13a2522ec4de30e42bdfb44e983dd3d7b25fa27d60dbf1a377f181b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000410f6bbd829715c699631306b3526a7b54de1a20a1ae8f98e80b0800012887c6c1762226b7999f019399f7b68f70cdafb9779bfa23bda3348f66d0da76f6befc7c1b00000000000000000000000000000000000000000000000000000000000000"
    },
    "verifierMeta": {
      "signature": "0x7ef4832cc53ca9f909eee4a56ced5314de5ec23ff5074ba4b7a95932ab7252d5"
    },
    "createdAt": "2025-12-24T09:34:29.324Z",
    "updatedAt": "2025-12-24T09:49:53.551Z"
  },
  "meta": {
    "time": 3212,
    "requestId": "25ae64b3-44d0-4bfe-b583-78717ba5581b"
  }
}
  • operationId — unique identifier of the permit2SingleDetailsForMorpho transaction.
  • chain — blockchain network.
  • action — operation type.
  • status — current transaction status: AWAITING_CRAFT, IN_PROGRESS, READY_FOR_SIGN or DONE.
  • protocol— integration name.
  • strategy — vault name.
  • userAddress — user wallet address.
  • stepList — list of fields with the step results obtained according to the schema.
    • index — step number in the execution order.
    • type — parameter object format.
    • name — step name corresponding to the name response field of the Get Transaction Step Schema endpoint.
    • description — detailed information on the step purpose.
    • payload — raw transaction object ready for signing represented in two formats: encoded and json (optional).
    • verifierMeta — data object received from P2P.ORG's verifier module.
      • signature — signature provided by the verifier module, which confirms that the transaction was crafted and then cryptographically verified by P2P.ORG.
  • payload — final deposit transaction payload represented either in encoded an optional json format.
  • verifierMeta — final transaction data object received from the verifier module.
  • createdAt — timestamp of the transaction creation in the ISO 8601 format.
  • updatedAt — timestamp of the transaction update in the ISO 8601 format.
  • meta — API request attributes:
    • time — request execution time in ms.
    • requestId — request identifier; used as a correlating ID in logs.

7. Sign and broadcast final deposit transaction

The final deposit transaction now contains all the payload objects from the previous intermediate transactions.

  1. Sign the json or encoded transaction object from the result.payload field.

  2. Broadcast it to the network by sending a POST request to /api/defi/v1/transactions/steps/broadcast.

    By broadcasting this transaction, you're making the deposit to the Steakhouse USDC vault on the Base blockchain.

What's next?