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:
- Get the schema with the step list for obtaining approval.
- Create the permission request for the permit2 smart contract.
- Get the schema with the step list for initiating the deposit.
- Create the permission request for the Morpho bundler.
- Create the permission request for the P2P.ORG proxy contract.
- Prepare the final deposit transaction.
- 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 caseapprovePermit2.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 caseapprovePermit2.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 thestepNamerequest 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, eitherencodedorjson(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 summaryIn this schema, the
stepsresponse array includes one step calledfinalPermit2AllowanceTransaction.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
-
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
basechain andSteakhouse USDCstrategy):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'scanExecuteInParallelfield.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 isfinalPermit2AllowanceTransaction.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_SIGNorDONE.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 isfinalPermit2AllowanceTransaction.description— detailed information on the step purpose.payload— raw transaction object ready for signing represented in two formats:encodedandjson(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 inencodedorjson(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.
-
Sign the raw
jsonorencodedobject in theresult.payloadfield. -
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 casedeposit.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 thestepNamerequest 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 eitherencodedorjson(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 tokeyfrom previous steps, either from the request or response.stepIndex— step number.outputKey— name of the specifickeyparameter 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 summaryIn this schema, the
stepsresponse array includes three steps ordered from 0 to 2. It means that the process of depositing assets to a vault requires three actions:
- Allow transferring funds from the user wallet to the P2P proxy contract address.
- Allow transferring funds from the P2P proxy contract address to the vault address.
- 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
canExecuteInParallelparameter isfalse.
4. Create permission request for the vault
-
Construct the first intermediate
permit2SingleDetailsForMorphotransaction 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
basechain andSteakhouse USDCstrategy):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'scanExecuteInParallelfield.stepName— step name corresponding to thenameresponse parameter of the Get Transaction Step Schema endpoint. In this case, it ispermit2SingleDetailsForMorpho.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_SIGNorDONE.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 thenameresponse 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:encodedandjson(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.nulluntil there are schema steps yet to be performed.verifierMeta— final transaction data object received from the verifier module.nulluntil 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.
-
Sign the intermediate
jsonorencodedtransaction object from the step 0payloadfield.
5. Create permission request for P2P.ORG smart contract
-
Construct the second
permit2SingleDetailsForP2pProxyintermediate 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
stepNameaccording to the scheme's step order as well as theoperationIDof the previous transaction.Example request (for
basechain andSteakhouse USDCstrategy):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'scanExecuteInParallelfield.stepName— step name corresponding to thenameresponse parameter of the Get Transaction Step Schema endpoint. In this case, it ispermit2SingleDetailsForP2pProxy.payload— transaction data:amount— amount of tokens to deposit.asset— token denomination, e.g.,USDC.operationId— unique identifier of thepermit2SingleDetailsForMorphotransaction.
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 thepermit2SingleDetailsForMorphotransaction.chain— blockchain network.action— operation type.status— current transaction status:AWAITING_CRAFT,IN_PROGRESS,READY_FOR_SIGNorDONE.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 thenameresponse 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:encodedandjson(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.nulluntil there are schema steps yet to be performed.verifierMeta— final transaction data object received from the verifier module.nulluntil 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.
-
Sign the intermediate
jsonorencodedtransaction object from the step 1payloadfield.
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'scanExecuteInParallelfield.stepName— step name corresponding to thenameresponse parameter of the Get Transaction Step Schema endpoint. In this case, it isfinalDepositTransaction.payload— transaction data:amount— amount of tokens to deposit.asset— token denomination, e.g.,USDC.operationId— unique identifier of thepermit2SingleDetailsForMorphotransaction.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 thepermit2SingleDetailsForMorphotransaction.chain— blockchain network.action— operation type.status— current transaction status:AWAITING_CRAFT,IN_PROGRESS,READY_FOR_SIGNorDONE.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 thenameresponse 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:encodedandjson(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 inencodedan optionaljsonformat.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.
-
Sign the
jsonorencodedtransaction object from theresult.payloadfield. -
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?
- Withdrawal
- Sign and Broadcast Transaction
- DeFi API reference