Skip to content

Update Locked yvUSD manual config: fix label and inception block#351

Merged
matheus1lva merged 3 commits intomainfrom
update-yvlocked-type
Feb 26, 2026
Merged

Update Locked yvUSD manual config: fix label and inception block#351
matheus1lva merged 3 commits intomainfrom
update-yvlocked-type

Conversation

@matheus1lva
Copy link
Collaborator

@matheus1lva matheus1lva commented Feb 25, 2026

Summary

Updates the manual config for Locked yvUSD (0xAaaFEa48472f77563961Cdb53291DEDfB46F9040 on mainnet):

  • Adds a strategy thing record alongside the existing vault record, since v3 strategies require both entries (per f6aba00)
  • Updates inceptBlock from 24271831 to 24329199 and inceptTime from 1768861991 to 1769553431

How to review

Single file change in config/manuals.yaml. The diff updates inception values on the existing vault entry and adds a second entry with label: strategy for the same address.

Test plan

Setup

  1. Copy .env.example to .env and configure RPC endpoint for chain 1 and Redis connection
  2. Create config/abis.local.yaml to scope indexing to just this vault:
    cron:
      name: AbiFanout
      queue: fanout
      job: abis
      schedule: '*/15 * * * *'
      start: false
    
    abis:
      - abiPath: 'yearn/3/vault'
        sources: [
          { chainId: 1, address: '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040', inceptBlock: 24329199 }
        ]
    
      - abiPath: 'yearn/3/strategy'
        sources: [
          { chainId: 1, address: '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040', inceptBlock: 24329199 }
        ]
  3. Create config/manuals.local.yaml with both vault and strategy entries:
    manuals:
      - chainId: 1
        address: '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040'
        label: 'vault'
        defaults: {
          erc4626: true, v3: true, yearn: true,
          apiVersion: '3.0.4', origin: "yearn",
          name: 'Locked yvUSD',
          asset: '0x696d02Db93291651ED510704c9b286841d506987',
          decimals: 6, inceptBlock: 24329199, inceptTime: 1769553431
        }
    
      - chainId: 1
        address: '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040'
        label: 'strategy'
        defaults: {
          erc4626: true, v3: true, yearn: true,
          apiVersion: '3.0.4', origin: "yearn",
          name: 'Locked yvUSD',
          asset: '0x696d02Db93291651ED510704c9b286841d506987',
          decimals: 6, inceptBlock: 24329199, inceptTime: 1769553431
        }
  4. make dev to start the dev environment

Ingestion (order matters)

  1. In the terminal UI, select ingestextract manauls to load manual thing records
  2. Verify both thing records were created:
    SELECT chain_id, address, label FROM thing
    WHERE address = '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040';
    Expected: two rows — one vault, one strategy
  3. Run ingestfanout abis — wait for event log strides to complete (watch for evmlog and snapshot jobs finishing in the ingest pane)
  4. Verify event coverage reached past block 24530947:
    SELECT strides FROM evmlog_strides
    WHERE chain_id = 1 AND address = '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040';
  5. Verify harvest events were captured (need >= 2 for APY computation):
    SELECT event_name, block_number, block_time FROM evmlog
    WHERE chain_id = 1 AND address = '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040'
    AND event_name IN ('StrategyReported', 'Reported')
    ORDER BY block_number;
    Expected: 5 Reported events
  6. Run ingestfanout abis a second time to trigger timeseries computation (now that events are indexed)

Verification

  1. Verify APY timeseries was computed with real values:
    SELECT block_time::date as date, component, value FROM output
    WHERE address = '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040'
    AND label = 'apy-bwd-delta-pps' AND component = 'net'
    ORDER BY date;
    Expected: ~25 rows with non-null value from Feb 1 onwards (first days are null — expected, < 2 harvests at that point)
  2. Verify snapshot has performance data:
    SELECT hook->'performance' as performance FROM snapshot
    WHERE address = '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040';
    Expected: historical.net ~0.69, oracle.apr ~0.54, oracle.apy ~0.72
  3. Open GraphQL explorer at http://localhost:3001/api/gql and verify the vault returns with APY:
    query {
      vault(chainId: 1, address: "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040") {
        name
        strategies
        apy { net weeklyNet monthlyNet inceptionNet grossApr }
      }
    }

Important: timeseries ordering caveat

If fanout abis runs before events are fully indexed, the timeseries hook stores empty APY output (< 2 harvests available). Subsequent runs skip those dates since output already exists. To recover, delete stale output and re-run:

DELETE FROM output
WHERE chain_id = 1 AND address = '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040'
AND label = 'apy-bwd-delta-pps';

Then run fanout abis again.

Risk / impact

Low risk — config-only change adding a manual entry. No code changes. Rollback is a simple revert.

@vercel
Copy link

vercel bot commented Feb 25, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
kong Ready Ready Preview, Comment Feb 26, 2026 7:40pm

Request Review

Copy link
Collaborator

@murderteeth murderteeth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as of f6aba00 v3 strategies get two thing records, one for vault and one for strategy. so this change correctly points out we need a manual strategy record, but we need to keep the vault record too. ie, there will be two manual entries for 0xAaaFEa48472f77563961Cdb53291DEDfB46F9040

also I'm not clear how to test this. please give full setup and steps. we should be confident that releasing in production will solve the problem

V3 strategies need two thing records (vault + strategy). Keep the
original vault entry and add a separate strategy entry for the same
address.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Collaborator

@murderteeth murderteeth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still not seeing historical apys. here's my test plan,

- create a fork of production on neon.tech
- configure fork database in .env and packages/web/.env.local
- configure config/chains.local.yaml for only mainnet
- configure config/abis.local.yaml for only yearn/3/vault and yearn/3/strategy
- `make dev`
- from kong terminal: Ingest, Extract manuals
- from kong terminal: Ingest, Fanout abis
- wait for index to complete, watch status on http://localhost:3001
- to be sure, run this again from kong terminal: Ingest, Fanout abis
- wait for index to complete, watch status on http://localhost:3001
- verify historical apy is available for `0xAaaFEa48472f77563961Cdb53291DEDfB46F9040` on http://localhost:3001/api/gql
Image

Also note the estimated apy components are null, maybe that's #350?

Copy link
Collaborator

@murderteeth murderteeth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i might have missed something in my config. one sec

Copy link
Collaborator

@murderteeth murderteeth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok same result, historical is still null.

here's what my config looks like. if you do this, abi fanout finishes much faster.

config/chains.local.yaml

chains: [
  'mainnet'
]

config/abis.local.yaml

cron:
  name: AbiFanout
  queue: fanout
  job: abis
  schedule: '*/15 * * * *'
  start: false

abis:
  - abiPath: 'yearn/3/vault'
    sources: [
      { chainId: 1, address: '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040', inceptBlock: 24329199 }
    ]

  - abiPath: 'yearn/3/strategy'
    sources: [
      { chainId: 1, address: '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040', inceptBlock: 24329199 }
    ]

@matheus1lva
Copy link
Collaborator Author

Ok so i haven't done anything rather than just leaving it run for a while and come back, following same config you shared before, and i got it.

{
    "apy": {
        "net": 0.6907843700575935,
        "label": "apy-bwd-delta-pps",
        "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
        "chainId": 1,
        "grossApr": 0.5278536817535979,
        "blockTime": "1772063795",
        "weeklyNet": 0.6907843700575935,
        "monthlyNet": null,
        "blockNumber": "24537348",
        "inceptionNet": 0.30489323757374653,
        "pricePerShare": "1018451",
        "weeklyPricePerShare": "1008251",
        "monthlyPricePerShare": null
    },
    "tvl": {
        "close": 11301.362124687601,
        "label": "tvl-c",
        "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
        "chainId": 1,
        "blockTime": "1771804800",
        "component": "tvl"
    },
    "fees": {
        "managementFee": 0,
        "performanceFee": 0
    },
    "meta": {
        "kind": "None",
        "name": "Locked yvUSD",
        "type": "None",
        "token": {
            "name": "USD yVault",
            "symbol": "yvUSD",
            "address": "0x696d02db93291651ed510704c9b286841d506987",
            "chainId": 1,
            "category": "yVault",
            "decimals": 6,
            "description": "",
            "displayName": "USD yVault",
            "displaySymbol": "yvUSD"
        },
        "isPool": false,
        "address": "0xaaafea48472f77563961cdb53291dedfb46f9040",
        "chainId": 1,
        "category": "Stablecoin",
        "isHidden": true,
        "registry": "0x0000000000000000000000000000000000000000",
        "uiNotice": "",
        "inclusion": {
            "isSet": false,
            "isCove": false,
            "isGimme": false,
            "isYearn": false,
            "isKatana": false,
            "isMorpho": false,
            "isYearnJuiced": false,
            "isPoolTogether": false,
            "isPublicERC4626": false
        },
        "isBoosted": false,
        "isRetired": false,
        "migration": {
            "target": "0xaaafea48472f77563961cdb53291dedfb46f9040",
            "available": false
        },
        "protocols": [],
        "sourceURI": "",
        "stability": {
            "stability": "Unknown"
        },
        "description": "",
        "displayName": "",
        "isAutomated": false,
        "isAggregator": false,
        "displaySymbol": "",
        "isHighlighted": false,
        "shouldUseV2APR": false
    },
    "asset": {
        "name": "USD yVault",
        "symbol": "yvUSD",
        "address": "0x696d02Db93291651ED510704c9b286841d506987",
        "chainId": 1,
        "decimals": "6"
    },
    "debts": [],
    "roles": [],
    "staking": {
        "rewards": [],
        "available": false
    },
    "sparklines": {
        "apy": [
            {
                "close": 0.6907843700575935,
                "label": "apy-bwd-delta-pps",
                "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
                "chainId": 1,
                "blockTime": "1771804800",
                "component": "net"
            },
            {
                "close": 0.776377578001682,
                "label": "apy-bwd-delta-pps",
                "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
                "chainId": 1,
                "blockTime": "1771200000",
                "component": "net"
            },
            {
                "close": 0.1309007333276273,
                "label": "apy-bwd-delta-pps",
                "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
                "chainId": 1,
                "blockTime": "1770595200",
                "component": "net"
            }
        ],
        "tvl": [
            {
                "close": 11301.362124687601,
                "label": "tvl-c",
                "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
                "chainId": 1,
                "blockTime": "1771804800",
                "component": "tvl"
            },
            {
                "close": 0,
                "label": "tvl-c",
                "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
                "chainId": 1,
                "blockTime": "1771200000",
                "component": "tvl"
            },
            {
                "close": 0,
                "label": "tvl-c",
                "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
                "chainId": 1,
                "blockTime": "1770595200",
                "component": "tvl"
            }
        ]
    },
    "strategies": [],
    "composition": [],
    "performance": {
        "oracle": {
            "apr": 0.5425333796642877,
            "apy": 0.7155310735950398
        },
        "historical": {
            "net": 0.6907843700575935,
            "weeklyNet": 0.6907843700575935,
            "monthlyNet": null,
            "inceptionNet": 0.30489323757374653
        }
    },
    "lastReportDetail": {
        "apr": {
            "net": 0.29477175972077374,
            "gross": 0.29477175972077374
        },
        "loss": "0",
        "profit": "73054693",
        "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
        "chainId": 1,
        "lossUsd": 0,
        "blockTime": "1771963151",
        "profitUsd": 0,
        "blockNumber": "24529006",
        "protocolFees": "0",
        "performanceFees": "0",
        "protocolFeesUsd": 0,
        "transactionHash": "0x2435893c15cda69cd6a6babed4210cb0d6e8a248759e36f78b88169a4c39759e",
        "performanceFeesUsd": 0
    }
}

@murderteeth
Copy link
Collaborator

"performance": {
"oracle": {
"apr": 0.5425333796642877,
"apy": 0.7155310735950398
},
"historical": {
"net": 0.6907843700575935,
"weeklyNet": 0.6907843700575935,
"monthlyNet": null,
"inceptionNet": 0.30489323757374653
}
},

image

i created a new database branch forked from production and retested everything and let it fanout automatically for over an hour, same result. Historical is null and estimated apy components are all null. Are you testing with a database fork? What could i be doing wrong?

@matheus1lva
Copy link
Collaborator Author

No im using local, i used the terminal reset db opt, rerun same stuff again, and saw it. Im gonna maually do a truncate and let it run again.

abis.local.yaml

cron:
  name: AbiFanout
  queue: fanout
  job: abis
  schedule: '*/15 * * * *'
  start: false

abis:
  - abiPath: 'yearn/3/vault'
    sources: [
      { chainId: 1, address: '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040', inceptBlock: 24329199 }
    ]

  - abiPath: 'yearn/3/strategy'
    sources: [
      { chainId: 1, address: '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040', inceptBlock: 24329199 }
    ]

manuals.local.yaml

manuals:
  - chainId: 1
    address: '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040'
    label: 'vault'
    defaults: {
      erc4626: true,
      v3: true,
      yearn: true,
      apiVersion: '3.0.4',
      origin: "yearn",
      name: 'Locked yvUSD',
      asset: '0x696d02Db93291651ED510704c9b286841d506987',
      decimals: 6,
      inceptBlock: 24329199,
      inceptTime: 1769553431
    }

  - chainId: 1
    address: '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040'
    label: 'strategy'
    defaults: {
      erc4626: true,
      v3: true,
      yearn: true,
      apiVersion: '3.0.4',
      origin: "yearn",
      name: 'Locked yvUSD',
      asset: '0x696d02Db93291651ED510704c9b286841d506987',
      decimals: 6,
      inceptBlock: 24329199,
      inceptTime: 1769553431
    }

  • extract manuals
  • fanaout abi

and thats it.

@matheus1lva
Copy link
Collaborator Author

matheus1lva commented Feb 26, 2026

Production Deployment Steps

After merging, the following SQL must be run against the production database to clear stale stride/output data so the indexer re-processes these vaults from scratch:

-- Clear event log strides for both yvUSD vaults
DELETE FROM evmlog_strides
WHERE chain_id = 1 AND address IN (
  '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040',  -- Locked yvUSD
  '0x696d02Db93291651ED510704c9b286841d506987'   -- yvUSD
);

Then trigger extract manuals followed by fanout abis

@murderteeth
Copy link
Collaborator

Production Deployment Steps

After merging, the following SQL must be run against the production database to clear stale stride/output data so the indexer re-processes these vaults from scratch:

-- Clear event log strides for both yvUSD vaults
DELETE FROM evmlog_strides
WHERE chain_id = 1 AND address IN (
  '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040',  -- Locked yvUSD
  '0x696d02Db93291651ED510704c9b286841d506987'   -- yvUSD
);

-- Clear stale APY output so timeseries recomputes with fresh event data
DELETE FROM output
WHERE chain_id = 1 AND address IN (
  '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040',
  '0x696d02Db93291651ED510704c9b286841d506987'
) AND label = 'apy-bwd-delta-pps';

Then trigger extract manuals followed by fanout abis (twice — first pass re-indexes events, second pass computes timeseries with the fresh event data).

Context

Tested locally by wiping strides for the Locked yvUSD vault and re-running the full ingestion pipeline. After the second fanout, historical APY populated correctly (~69% net, ~54% oracle APR). The root cause of empty APY is a race condition: timeseries jobs run concurrently with event log extraction, so on first fanout the APY hook finds < 2 harvests and stores empty output. The second fanout picks up the now-indexed events.

ok sounds like we should also disable the abi fanout cron temporarily

Production Deployment Steps

After merging, the following SQL must be run against the production database to clear stale stride/output data so the indexer re-processes these vaults from scratch:

-- Clear event log strides for both yvUSD vaults
DELETE FROM evmlog_strides
WHERE chain_id = 1 AND address IN (
  '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040',  -- Locked yvUSD
  '0x696d02Db93291651ED510704c9b286841d506987'   -- yvUSD
);

-- Clear stale APY output so timeseries recomputes with fresh event data
DELETE FROM output
WHERE chain_id = 1 AND address IN (
  '0xAaaFEa48472f77563961Cdb53291DEDfB46F9040',
  '0x696d02Db93291651ED510704c9b286841d506987'
) AND label = 'apy-bwd-delta-pps';

Then trigger extract manuals followed by fanout abis (twice — first pass re-indexes events, second pass computes timeseries with the fresh event data).

Context

Tested locally by wiping strides for the Locked yvUSD vault and re-running the full ingestion pipeline. After the second fanout, historical APY populated correctly (~69% net, ~54% oracle APR). The root cause of empty APY is a race condition: timeseries jobs run concurrently with event log extraction, so on first fanout the APY hook finds < 2 harvests and stores empty output. The second fanout picks up the now-indexed events.

image

Historical looks good 👍, what about Estimated? Are the components expected to be null

@matheus1lva
Copy link
Collaborator Author

{
    "apy": {
        "net": 0.6232583484335619,
        "label": "apy-bwd-delta-pps",
        "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
        "chainId": 1,
        "grossApr": 0.48669899551261864,
        "blockTime": "1772133779",
        "weeklyNet": 0.6232583484335619,
        "monthlyNet": null,
        "blockNumber": "24543156",
        "inceptionNet": 0.3078721346060176,
        "pricePerShare": "1019217",
        "weeklyPricePerShare": "1009798",
        "monthlyPricePerShare": "0"
    },
    "tvl": {
        "close": 11301.8469033078,
        "label": "tvl-c",
        "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
        "chainId": 1,
        "blockTime": "1771804800",
        "component": "tvl"
    },
    "fees": {
        "managementFee": 0,
        "performanceFee": 0
    },
    "meta": {
        "kind": "None",
        "name": "Locked yvUSD",
        "type": "None",
        "token": {
            "name": "USD yVault",
            "symbol": "yvUSD",
            "address": "0x696d02db93291651ed510704c9b286841d506987",
            "chainId": 1,
            "category": "yVault",
            "decimals": 6,
            "description": "",
            "displayName": "USD yVault",
            "displaySymbol": "yvUSD"
        },
        "isPool": false,
        "address": "0xaaafea48472f77563961cdb53291dedfb46f9040",
        "chainId": 1,
        "category": "Stablecoin",
        "isHidden": true,
        "registry": "0x0000000000000000000000000000000000000000",
        "uiNotice": "",
        "inclusion": {
            "isSet": false,
            "isCove": false,
            "isGimme": false,
            "isYearn": false,
            "isKatana": false,
            "isMorpho": false,
            "isYearnJuiced": false,
            "isPoolTogether": false,
            "isPublicERC4626": false
        },
        "isBoosted": false,
        "isRetired": false,
        "migration": {
            "target": "0xaaafea48472f77563961cdb53291dedfb46f9040",
            "available": false
        },
        "protocols": [],
        "sourceURI": "",
        "stability": {
            "stability": "Unknown"
        },
        "description": "",
        "displayName": "",
        "isAutomated": false,
        "isAggregator": false,
        "displaySymbol": "",
        "isHighlighted": false,
        "shouldUseV2APR": false
    },
    "asset": {
        "name": "USD yVault",
        "symbol": "yvUSD",
        "address": "0x696d02Db93291651ED510704c9b286841d506987",
        "chainId": 1,
        "decimals": "6"
    },
    "debts": [],
    "roles": [],
    "vaults": [],
    "staking": {
        "rewards": [],
        "available": false
    },
    "sparklines": {
        "apy": [
            {
                "close": 0.6232583484335619,
                "label": "apy-bwd-delta-pps",
                "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
                "chainId": 1,
                "blockTime": "1771804800",
                "component": "net"
            },
            {
                "close": 0,
                "label": "apy-bwd-delta-pps",
                "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
                "chainId": 1,
                "blockTime": "1771200000",
                "component": "net"
            },
            {
                "close": 0,
                "label": "apy-bwd-delta-pps",
                "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
                "chainId": 1,
                "blockTime": "1770595200",
                "component": "net"
            }
        ],
        "tvl": [
            {
                "close": 11301.8469033078,
                "label": "tvl-c",
                "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
                "chainId": 1,
                "blockTime": "1771804800",
                "component": "tvl"
            },
            {
                "close": 0,
                "label": "tvl-c",
                "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
                "chainId": 1,
                "blockTime": "1771200000",
                "component": "tvl"
            },
            {
                "close": 0,
                "label": "tvl-c",
                "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
                "chainId": 1,
                "blockTime": "1770595200",
                "component": "tvl"
            }
        ]
    },
    "strategies": [],
    "composition": [],
    "performance": {
        "oracle": {
            "apr": 0.5208884423818968,
            "apy": 0.6791653304579668
        },
        "estimated": {
            "apr": 0.7342429270506029,
            "apy": 1.0121039153588949,
            "type": "yvusd-estimated-apr",
            "components": {
                "netAPR": 0.7342429270506029,
                "netAPY": 1.0121039153588949,
                "grossAPR": 0.07153645515974473,
                "baseNetAPR": 0.06438280964377026,
                "baseNetAPY": 0.06645823179985522,
                "lockerBonusAPR": 0.6698601174068326,
                "lockerBonusAPY": 0.9456456835590397
            }
        },
        "historical": {
            "net": 0.6232583484335619,
            "weeklyNet": 0.6232583484335619,
            "monthlyNet": null,
            "inceptionNet": 0.3078721346060176
        }
    },
    "pricePerShare": 1017625,
    "lastReportDetail": {
        "apr": {
            "net": 0.29477175972077374,
            "gross": 0.29477175972077374
        },
        "loss": "0",
        "profit": "73054693",
        "address": "0xAaaFEa48472f77563961Cdb53291DEDfB46F9040",
        "chainId": 1,
        "lossUsd": 0,
        "blockTime": "1771963151",
        "profitUsd": 0,
        "blockNumber": "24529006",
        "protocolFees": "0",
        "performanceFees": "0",
        "protocolFeesUsd": 0,
        "transactionHash": "0x2435893c15cda69cd6a6babed4210cb0d6e8a248759e36f78b88169a4c39759e",
        "performanceFeesUsd": 0
    }
}

And from api:

{
  "data": {
    "vault": {
      "performance": {
        "estimated": {
          "apr": 0.7342429270506029,
          "apy": 1.0121039153588949,
          "type": "yvusd-estimated-apr",
          "components": {
            "boost": null,
            "poolAPY": null,
            "boostedAPR": null,
            "baseAPR": null,
            "rewardsAPR": null,
            "rewardsAPY": null,
            "cvxAPR": null,
            "keepCRV": null,
            "keepVelo": null,
            "netAPR": 0.7342429270506029,
            "netAPY": 1.0121039153588949,
            "grossAPR": 0.07153645515974473,
            "baseNetAPR": 0.06438280964377026,
            "baseNetAPY": 0.06645823179985522,
            "lockerBonusAPR": 0.6698601174068326,
            "lockerBonusAPY": 0.9456456835590397
          }
        }
      }
    }
  }
}

Gql doesnt have a loose set, but this gives more DX for consumers.

@matheus1lva matheus1lva merged commit a795a83 into main Feb 26, 2026
2 checks passed
@murderteeth murderteeth deleted the update-yvlocked-type branch March 14, 2026 18:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants