Docs

User V2 vault position activity

Events that changed a user's share balance in a Morpho Vault V2, newest first, one row per event log.

Signs: deposit and shares_transfer_in add shares, withdraw and shares_transfer_out remove them. Folding the whole feed with those signs returns the shares of the position endpoint at the same last_indexed_block; a partial window does not reconcile, and neither does the feed of a fee recipient, whose balance also grows through fee mints this endpoint does not emit.

assets is never derived: it is present on deposit and withdraw, and absent on share transfers, whose ERC-20 log carries no asset amount.

Bundled transactions are reconciled: a share transfer to or from a bundler adapter that carries a bundled deposit or withdrawal is reported as that deposit or withdrawal.

A self-transfer is omitted, since it changes no balance. Rows are therefore capped, not filled, by limit: keep paginating until cursor is null.

Cursors are bound to the selector and to the type filter of the request that produced them; replaying one with different filters returns 400.

Vault selector example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11 (format: <chain_id>:<vault_address>; replace with the target vault).

Path Parameters

user-address*string

Position owner address. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.

Formataddress
vault-selector*string

Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.

Format<chain_id>:<vault_address>

Query Parameters

limit?integer

Maximum number of event logs to read.

Default100
Range1 <= value <= 1000
cursor?string

Opaque cursor returned by a previous page.

type?array<>

Restrict the feed to the given event types.

Response Body

application/json

const baseUrl = process.env.CORE_REST_BASE_URL ?? "https://api.morpho.org";const apiKey = process.env.MORPHO_API_KEY ?? "<MORPHO_API_KEY>";const vaultSelector = "1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11";const userAddress = "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd";const url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/users/${userAddress}/position/activity`);const response = await fetch(url, {  headers: {    accept: "application/json",    "x-api-key": apiKey,  },});if (!response.ok) throw new Error(await response.text());const body = await response.json();
{
  "params": {
    "chain_id": 1,
    "vault_address": "0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11",
    "user_address": "0x0000000000000000000000000000000000000001"
  },
  "data": [
    {
      "type": "shares_transfer_out",
      "data": {
        "shares": "250000000000000000000",
        "to_address": "0x3F32bC09d41eE699844F8296e806417D6bf61Bba"
      },
      "block_number": "19840000",
      "tx_hash": "0x4e3a9b0ff1c2d52d7e8c5e1d3b9a8f7e6c5b4a39281706f5e4d3c2b1a09f8e7d",
      "log_index": 12,
      "timestamp": 1715270400
    },
    {
      "type": "withdraw",
      "data": {
        "shares": "300000000000000000000",
        "assets": "302631578"
      },
      "block_number": "19800500",
      "tx_hash": "0x1f2e3d4c5b6a798807162534435261708f9e0d1c2b3a49586776859403f2e1d0",
      "log_index": 4,
      "timestamp": 1714796400
    },
    {
      "type": "shares_transfer_in",
      "data": {
        "shares": "500000000000000000000",
        "from_address": "0x8Ba1f109551bD432803012645Ac136ddd64DBA72"
      },
      "block_number": "19750200",
      "tx_hash": "0xa1b2c3d4e5f60718293a4b5c6d7e8f900112233445566778899aabbccddeeff0",
      "log_index": 88,
      "timestamp": 1714192800
    },
    {
      "type": "deposit",
      "data": {
        "shares": "1000000000000000000000",
        "assets": "1000000000"
      },
      "block_number": "19700100",
      "tx_hash": "0x99887766554433221100ffeeddccbbaa99887766554433221100ffeeddccbbaa",
      "log_index": 30,
      "timestamp": 1713591600
    }
  ],
  "cursor": null,
  "last_indexed_block": "19847234"
}