@whisk/steakhouse 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/metadata/generated/vaults.d.ts +7 -0
- package/dist/metadata/generated/vaults.js +468 -0
- package/dist/metadata/generated/vaults.js.map +1 -0
- package/dist/metadata/index.d.ts +3 -3
- package/dist/metadata/index.js +4 -8
- package/dist/metadata/index.js.map +1 -1
- package/dist/metadata/types.d.ts +9 -10
- package/dist/metadata/types.js +4 -0
- package/dist/metadata/types.js.map +1 -1
- package/dist/queries/getDetailedVault.d.ts +2 -2
- package/dist/queries/getDetailedVault.js +3 -3
- package/dist/queries/getDetailedVault.js.map +1 -1
- package/dist/queries/getVaults.d.ts +1 -1
- package/dist/queries/getVaults.js +2 -4
- package/dist/queries/getVaults.js.map +1 -1
- package/dist/queries/steakhouseMetadata.d.ts +2 -1
- package/dist/queries/steakhouseMetadata.js +1 -1
- package/dist/queries/steakhouseMetadata.js.map +1 -1
- package/dist/react/hooks/index.d.ts +1 -1
- package/dist/react/hooks/useDetailedVault.d.ts +1 -1
- package/dist/react/index.d.ts +1 -1
- package/package.json +14 -6
- package/src/metadata/README.md +93 -0
- package/src/metadata/generated/vaults.ts +470 -0
- package/src/metadata/index.ts +5 -3
- package/src/metadata/types.ts +8 -11
- package/src/metadata/vaults/arbitrum/high-yield-turbo-usdc.md +6 -0
- package/src/metadata/vaults/arbitrum/high-yield-usdc-v1.md +6 -0
- package/src/metadata/vaults/arbitrum/high-yield-usdc-v2.md +6 -0
- package/src/metadata/vaults/arbitrum/high-yield-usdt-v2.md +6 -0
- package/src/metadata/vaults/base/deblock-eurc.md +6 -0
- package/src/metadata/vaults/base/eth-v1.md +6 -0
- package/src/metadata/vaults/base/eura.md +6 -0
- package/src/metadata/vaults/base/eurc-v1.md +6 -0
- package/src/metadata/vaults/base/high-yield-instant-usdc.md +6 -0
- package/src/metadata/vaults/base/high-yield-turbo-eth.md +6 -0
- package/src/metadata/vaults/base/high-yield-usdc-v1-1.md +6 -0
- package/src/metadata/vaults/base/high-yield-usdc.md +6 -0
- package/src/metadata/vaults/base/prime-instant-usdc.md +6 -0
- package/src/metadata/vaults/base/safe-x-eth-2.md +6 -0
- package/src/metadata/vaults/base/safe-x-eth.md +6 -0
- package/src/metadata/vaults/base/safe-x-usdc.md +6 -0
- package/src/metadata/vaults/base/smokehouse-usdc.md +6 -0
- package/src/metadata/vaults/base/susds.md +6 -0
- package/src/metadata/vaults/base/usda.md +6 -0
- package/src/metadata/vaults/base/usdc-rwa.md +6 -0
- package/src/metadata/vaults/base/usdc-v1.md +6 -0
- package/src/metadata/vaults/katana/high-yield-ausd.md +6 -0
- package/src/metadata/vaults/katana/high-yield-usdc.md +6 -0
- package/src/metadata/vaults/katana/prime-ausd.md +6 -0
- package/src/metadata/vaults/katana/prime-usdc.md +6 -0
- package/src/metadata/vaults/mainnet/3f-x-steakhouse.md +6 -0
- package/src/metadata/vaults/mainnet/coinshift-usdc.md +6 -0
- package/src/metadata/vaults/mainnet/coinshift-usdl.md +6 -0
- package/src/metadata/vaults/mainnet/eth-v1.md +6 -0
- package/src/metadata/vaults/mainnet/ethena-usdt.md +6 -0
- package/src/metadata/vaults/mainnet/ethena-usdtb.md +6 -0
- package/src/metadata/vaults/mainnet/eurcv-v1.md +6 -0
- package/src/metadata/vaults/mainnet/high-yield-instant-ausd-v2.md +6 -0
- package/src/metadata/vaults/mainnet/high-yield-instant-usdc-v2.md +6 -0
- package/src/metadata/vaults/mainnet/high-yield-instant-usdt-v2.md +6 -0
- package/src/metadata/vaults/mainnet/high-yield-term-usdc.md +6 -0
- package/src/metadata/vaults/mainnet/high-yield-turbo-cbbtc-v2.md +6 -0
- package/src/metadata/vaults/mainnet/high-yield-turbo-eth-v2.md +6 -0
- package/src/metadata/vaults/mainnet/high-yield-turbo-usdt-v2.md +6 -0
- package/src/metadata/vaults/mainnet/infinifi-usdc.md +6 -0
- package/src/metadata/vaults/mainnet/level-usdc.md +6 -0
- package/src/metadata/vaults/mainnet/m-v1.md +6 -0
- package/src/metadata/vaults/mainnet/paxg-v1.md +6 -0
- package/src/metadata/vaults/mainnet/peaty-usdc.md +6 -0
- package/src/metadata/vaults/mainnet/prime-instant-eth-v2.md +6 -0
- package/src/metadata/vaults/mainnet/prime-instant-eurcv-v2.md +6 -0
- package/src/metadata/vaults/mainnet/prime-instant-pyusd-v2.md +6 -0
- package/src/metadata/vaults/mainnet/prime-instant-usdc-v2.md +6 -0
- package/src/metadata/vaults/mainnet/prime-instant-usdt-v2.md +6 -0
- package/src/metadata/vaults/mainnet/pyusd-high-yield-instant.md +6 -0
- package/src/metadata/vaults/mainnet/pyusd-v1.md +6 -0
- package/src/metadata/vaults/mainnet/rusd-v1.md +6 -0
- package/src/metadata/vaults/mainnet/safe-x-eth.md +6 -0
- package/src/metadata/vaults/mainnet/safe-x-smokehouse-usdc.md +6 -0
- package/src/metadata/vaults/mainnet/safe-x-smokehouse-usdt.md +6 -0
- package/src/metadata/vaults/mainnet/safe-x-smokehouse-wbtc.md +6 -0
- package/src/metadata/vaults/mainnet/safe-x-smokehouse-wsteth.md +6 -0
- package/src/metadata/vaults/mainnet/safe-x-usdc.md +6 -0
- package/src/metadata/vaults/mainnet/safe-x-usdt.md +6 -0
- package/src/metadata/vaults/mainnet/smokehouse-cbbtc.md +6 -0
- package/src/metadata/vaults/mainnet/smokehouse-dai.md +6 -0
- package/src/metadata/vaults/mainnet/smokehouse-eth.md +6 -0
- package/src/metadata/vaults/mainnet/smokehouse-usdc.md +6 -0
- package/src/metadata/vaults/mainnet/smokehouse-usdt.md +6 -0
- package/src/metadata/vaults/mainnet/smokehouse-wsteth.md +6 -0
- package/src/metadata/vaults/mainnet/usdc-rwa.md +6 -0
- package/src/metadata/vaults/mainnet/usdc-v1.md +6 -0
- package/src/metadata/vaults/mainnet/usdq.md +6 -0
- package/src/metadata/vaults/mainnet/usdr.md +6 -0
- package/src/metadata/vaults/mainnet/usdt-lite.md +6 -0
- package/src/metadata/vaults/mainnet/usdt-v1.md +6 -0
- package/src/metadata/vaults/mainnet/vault-bridge-usdc.md +6 -0
- package/src/metadata/vaults/mainnet/wbtc-v1.md +6 -0
- package/src/metadata/vaults/monad/ausd-v2.md +6 -0
- package/src/metadata/vaults/monad/usdc-v2.md +6 -0
- package/src/metadata/vaults/unichain/eth.md +6 -0
- package/src/metadata/vaults/unichain/wsteth.md +6 -0
- package/src/queries/getDetailedVault.test.ts +9 -19
- package/src/queries/getDetailedVault.ts +3 -4
- package/src/queries/getVaults.test.ts +15 -34
- package/src/queries/getVaults.ts +4 -4
- package/src/queries/steakhouseMetadata.ts +2 -2
- package/dist/metadata/chains.d.ts +0 -7
- package/dist/metadata/chains.js +0 -15
- package/dist/metadata/chains.js.map +0 -1
- package/dist/metadata/vaults.d.ts +0 -7
- package/dist/metadata/vaults.js +0 -26
- package/dist/metadata/vaults.js.map +0 -1
- package/src/metadata/chains.ts +0 -13
- package/src/metadata/vaults.ts +0 -27
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { graphql } from "@whisk/graphql";
|
|
2
|
-
import {
|
|
2
|
+
import { STEAKHOUSE_VAULTS } from "../metadata/generated/vaults.js";
|
|
3
3
|
import { vaultDetailFragment } from "./fragments/vaultDetail.js";
|
|
4
4
|
import { buildSteakhouseMetadata } from "./steakhouseMetadata.js";
|
|
5
5
|
const vaultsQuery = graphql(
|
|
@@ -16,9 +16,7 @@ const vaultsQuery = graphql(
|
|
|
16
16
|
);
|
|
17
17
|
async function getVaults(client, variables = {}) {
|
|
18
18
|
const { chainId } = variables;
|
|
19
|
-
const filteredVaults =
|
|
20
|
-
(v) => !v.isHidden && (!chainId || v.chainId === chainId)
|
|
21
|
-
);
|
|
19
|
+
const filteredVaults = chainId ? STEAKHOUSE_VAULTS.filter((v) => v.chainId === chainId) : STEAKHOUSE_VAULTS;
|
|
22
20
|
if (filteredVaults.length === 0) {
|
|
23
21
|
return [];
|
|
24
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queries/getVaults.ts"],"sourcesContent":["import { graphql } from \"@whisk/graphql\"\nimport type { SteakhouseClient } from \"../client.js\"\nimport
|
|
1
|
+
{"version":3,"sources":["../../src/queries/getVaults.ts"],"sourcesContent":["import { graphql } from \"@whisk/graphql\"\nimport type { SteakhouseClient } from \"../client.js\"\nimport { STEAKHOUSE_VAULTS } from \"../metadata/generated/vaults.js\"\nimport type { Address, VaultConfig } from \"../metadata/types.js\"\nimport { type VaultDetail, vaultDetailFragment } from \"./fragments/vaultDetail.js\"\nimport { buildSteakhouseMetadata, type SteakhouseMetadata } from \"./steakhouseMetadata.js\"\n\n/** GraphQL query for fetching Steakhouse vaults */\nexport const vaultsQuery = graphql(\n `\n query GetVaults($where: Erc4626VaultFilter, $limit: Int) {\n erc4626Vaults(where: $where, limit: $limit) {\n items {\n ...VaultDetailFragment\n }\n }\n }\n `,\n [vaultDetailFragment],\n)\n\nexport type GetVaultsVariables = {\n /** Filter by chain ID */\n chainId?: number\n}\n\n/** Vault with Steakhouse metadata */\nexport type VaultWithMetadata = VaultDetail & {\n steakhouseMetadata?: SteakhouseMetadata\n}\n\nexport type GetVaultsResult = VaultWithMetadata[]\n\n/**\n * Get all Steakhouse-curated vaults.\n * Results are filtered to the SDK whitelist and augmented with Steakhouse metadata.\n */\nexport async function getVaults(\n client: SteakhouseClient,\n variables: GetVaultsVariables = {},\n): Promise<GetVaultsResult> {\n const { chainId } = variables\n\n const filteredVaults = chainId\n ? STEAKHOUSE_VAULTS.filter((v) => v.chainId === chainId)\n : STEAKHOUSE_VAULTS\n\n if (filteredVaults.length === 0) {\n return []\n }\n\n // Build keys array for erc4626Vaults filter\n const keys = filteredVaults.map((v) => ({\n chainId: v.chainId,\n vaultAddress: v.address,\n protocol: v.protocol,\n }))\n\n const result = await client.query(vaultsQuery, {\n where: { keys },\n limit: keys.length,\n })\n\n const metadataMap = new Map<Address, VaultConfig>(\n filteredVaults.map((v) => [v.address.toLowerCase() as Address, v]),\n )\n\n return result.erc4626Vaults.items\n .filter((vault): vault is NonNullable<typeof vault> => vault !== null)\n .map((vault) => {\n const config = metadataMap.get(vault.vaultAddress.toLowerCase() as Address)\n if (config) {\n return { ...vault, steakhouseMetadata: buildSteakhouseMetadata(config) }\n }\n return vault\n })\n}\n"],"mappings":"AAAA,SAAS,eAAe;AAExB,SAAS,yBAAyB;AAElC,SAA2B,2BAA2B;AACtD,SAAS,+BAAwD;AAG1D,MAAM,cAAc;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,CAAC,mBAAmB;AACtB;AAkBA,eAAsB,UACpB,QACA,YAAgC,CAAC,GACP;AAC1B,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,iBAAiB,UACnB,kBAAkB,OAAO,CAAC,MAAM,EAAE,YAAY,OAAO,IACrD;AAEJ,MAAI,eAAe,WAAW,GAAG;AAC/B,WAAO,CAAC;AAAA,EACV;AAGA,QAAM,OAAO,eAAe,IAAI,CAAC,OAAO;AAAA,IACtC,SAAS,EAAE;AAAA,IACX,cAAc,EAAE;AAAA,IAChB,UAAU,EAAE;AAAA,EACd,EAAE;AAEF,QAAM,SAAS,MAAM,OAAO,MAAM,aAAa;AAAA,IAC7C,OAAO,EAAE,KAAK;AAAA,IACd,OAAO,KAAK;AAAA,EACd,CAAC;AAED,QAAM,cAAc,IAAI;AAAA,IACtB,eAAe,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,YAAY,GAAc,CAAC,CAAC;AAAA,EACnE;AAEA,SAAO,OAAO,cAAc,MACzB,OAAO,CAAC,UAA8C,UAAU,IAAI,EACpE,IAAI,CAAC,UAAU;AACd,UAAM,SAAS,YAAY,IAAI,MAAM,aAAa,YAAY,CAAY;AAC1E,QAAI,QAAQ;AACV,aAAO,EAAE,GAAG,OAAO,oBAAoB,wBAAwB,MAAM,EAAE;AAAA,IACzE;AACA,WAAO;AAAA,EACT,CAAC;AACL;","names":[]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { VaultConfig } from '../metadata/types.js';
|
|
2
|
+
import '@whisk/graphql';
|
|
2
3
|
|
|
3
4
|
/** Steakhouse-specific metadata augmented onto vault data */
|
|
4
5
|
type SteakhouseMetadata = {
|
|
5
6
|
name?: string;
|
|
6
7
|
description?: string;
|
|
7
|
-
|
|
8
|
+
type?: VaultConfig["type"];
|
|
8
9
|
protocol: VaultConfig["protocol"];
|
|
9
10
|
};
|
|
10
11
|
/** Build metadata object from vault config */
|
|
@@ -3,7 +3,7 @@ function buildSteakhouseMetadata(config) {
|
|
|
3
3
|
protocol: config.protocol,
|
|
4
4
|
...config.name !== void 0 && { name: config.name },
|
|
5
5
|
...config.description !== void 0 && { description: config.description },
|
|
6
|
-
...config.
|
|
6
|
+
...config.type !== void 0 && { type: config.type }
|
|
7
7
|
};
|
|
8
8
|
}
|
|
9
9
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queries/steakhouseMetadata.ts"],"sourcesContent":["import type { VaultConfig } from \"../metadata/types.js\"\n\n/** Steakhouse-specific metadata augmented onto vault data */\nexport type SteakhouseMetadata = {\n name?: string\n description?: string\n
|
|
1
|
+
{"version":3,"sources":["../../src/queries/steakhouseMetadata.ts"],"sourcesContent":["import type { VaultConfig } from \"../metadata/types.js\"\n\n/** Steakhouse-specific metadata augmented onto vault data */\nexport type SteakhouseMetadata = {\n name?: string\n description?: string\n type?: VaultConfig[\"type\"]\n protocol: VaultConfig[\"protocol\"]\n}\n\n/** Build metadata object from vault config */\nexport function buildSteakhouseMetadata(config: VaultConfig): SteakhouseMetadata {\n return {\n protocol: config.protocol,\n ...(config.name !== undefined && { name: config.name }),\n ...(config.description !== undefined && { description: config.description }),\n ...(config.type !== undefined && { type: config.type }),\n }\n}\n"],"mappings":"AAWO,SAAS,wBAAwB,QAAyC;AAC/E,SAAO;AAAA,IACL,UAAU,OAAO;AAAA,IACjB,GAAI,OAAO,SAAS,UAAa,EAAE,MAAM,OAAO,KAAK;AAAA,IACrD,GAAI,OAAO,gBAAgB,UAAa,EAAE,aAAa,OAAO,YAAY;AAAA,IAC1E,GAAI,OAAO,SAAS,UAAa,EAAE,MAAM,OAAO,KAAK;AAAA,EACvD;AACF;","names":[]}
|
|
@@ -6,8 +6,8 @@ import '../../queries/getDetailedVault.js';
|
|
|
6
6
|
import 'gql.tada';
|
|
7
7
|
import '@whisk/client';
|
|
8
8
|
import '../../metadata/types.js';
|
|
9
|
-
import '../../queries/fragments/vaultDetail.js';
|
|
10
9
|
import '@whisk/graphql';
|
|
10
|
+
import '../../queries/fragments/vaultDetail.js';
|
|
11
11
|
import '../../queries/steakhouseMetadata.js';
|
|
12
12
|
import '../../queries/types.js';
|
|
13
13
|
import '../../queries/getVaults.js';
|
|
@@ -3,8 +3,8 @@ import { GetDetailedVaultVariables, GetDetailedVaultResult } from '../../queries
|
|
|
3
3
|
import 'gql.tada';
|
|
4
4
|
import '@whisk/client';
|
|
5
5
|
import '../../metadata/types.js';
|
|
6
|
-
import '../../queries/fragments/vaultDetail.js';
|
|
7
6
|
import '@whisk/graphql';
|
|
7
|
+
import '../../queries/fragments/vaultDetail.js';
|
|
8
8
|
import '../../queries/steakhouseMetadata.js';
|
|
9
9
|
|
|
10
10
|
declare function useDetailedVault(variables: GetDetailedVaultVariables): UseQueryResult<GetDetailedVaultResult, Error>;
|
package/dist/react/index.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ import '../queries/getDetailedVault.js';
|
|
|
7
7
|
import 'gql.tada';
|
|
8
8
|
import '@whisk/client';
|
|
9
9
|
import '../metadata/types.js';
|
|
10
|
-
import '../queries/fragments/vaultDetail.js';
|
|
11
10
|
import '@whisk/graphql';
|
|
11
|
+
import '../queries/fragments/vaultDetail.js';
|
|
12
12
|
import '../queries/steakhouseMetadata.js';
|
|
13
13
|
import '../queries/types.js';
|
|
14
14
|
import '../queries/getVaults.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@whisk/steakhouse",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/office-supply-ventures/whisk-sdk.git",
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
"@whisk/graphql": "0.0.10"
|
|
41
41
|
},
|
|
42
42
|
"peerDependencies": {
|
|
43
|
+
"@tanstack/react-query": ">=5",
|
|
43
44
|
"graphql": ">=16",
|
|
44
45
|
"react": ">=18",
|
|
45
|
-
"react-dom": ">=18"
|
|
46
|
-
"@tanstack/react-query": ">=5"
|
|
46
|
+
"react-dom": ">=18"
|
|
47
47
|
},
|
|
48
48
|
"peerDependenciesMeta": {
|
|
49
49
|
"react": {
|
|
@@ -57,14 +57,22 @@
|
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
|
+
"@tanstack/react-query": "5.90.10",
|
|
60
61
|
"@types/react": "^19.2.0",
|
|
61
62
|
"@types/react-dom": "^19.2.0",
|
|
63
|
+
"chokidar-cli": "^3.0.0",
|
|
64
|
+
"concurrently": "^9.2.1",
|
|
65
|
+
"gray-matter": "^4.0.3",
|
|
62
66
|
"react": "19.2.0",
|
|
63
67
|
"react-dom": "19.2.0",
|
|
64
|
-
"
|
|
68
|
+
"tsx": "^4.20.6",
|
|
69
|
+
"viem": "^2.0.0",
|
|
70
|
+
"zod": "^3.24.0"
|
|
65
71
|
},
|
|
66
72
|
"scripts": {
|
|
67
|
-
"
|
|
68
|
-
"
|
|
73
|
+
"generate:vaults": "tsx scripts/generate-vaults.ts",
|
|
74
|
+
"generate:vaults:watch": "chokidar \"src/metadata/vaults/**/*.md\" --initial -c \"pnpm generate:vaults\"",
|
|
75
|
+
"build": "pnpm generate:vaults && tsup",
|
|
76
|
+
"dev": "concurrently -n vaults,tsup -c blue,green \"pnpm generate:vaults:watch\" \"tsup --watch\""
|
|
69
77
|
}
|
|
70
78
|
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Vault Metadata
|
|
2
|
+
|
|
3
|
+
Steakhouse vault metadata is defined in markdown files with YAML frontmatter, which are compiled into TypeScript at build time.
|
|
4
|
+
|
|
5
|
+
## Adding a New Vault
|
|
6
|
+
|
|
7
|
+
1. Create a `.md` file in `vaults/{chain}/`:
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
vaults/mainnet/my-vault.md
|
|
11
|
+
vaults/base/my-vault.md
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
2. Add YAML frontmatter:
|
|
15
|
+
|
|
16
|
+
```yaml
|
|
17
|
+
---
|
|
18
|
+
chainId: 1
|
|
19
|
+
vaultAddress: 0x...
|
|
20
|
+
protocol: morpho_v2
|
|
21
|
+
type: Prime
|
|
22
|
+
---
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Optionally override the on-chain name or add a description:
|
|
26
|
+
|
|
27
|
+
```yaml
|
|
28
|
+
---
|
|
29
|
+
chainId: 1
|
|
30
|
+
vaultAddress: 0x...
|
|
31
|
+
protocol: morpho_v2
|
|
32
|
+
type: Prime
|
|
33
|
+
name: Custom Display Name
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
Custom description in markdown. Supports **formatting**, links, etc.
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
3. Regenerate and commit:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
pnpm generate:vaults
|
|
43
|
+
git add src/metadata/generated/vaults.ts
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
4. Verify the vault appears in `generated/vaults.ts` and commit the changes
|
|
47
|
+
|
|
48
|
+
## Frontmatter Fields
|
|
49
|
+
|
|
50
|
+
| Field | Required | Description |
|
|
51
|
+
| -------------- | -------- | ------------------------------------------------- |
|
|
52
|
+
| `chainId` | Yes | Chain ID (1 for mainnet, 8453 for Base, etc.) |
|
|
53
|
+
| `vaultAddress` | Yes | Ethereum address, no quotes needed (checksummed automatically) |
|
|
54
|
+
| `protocol` | Yes | `morpho_v1`, `morpho_v2`, `generic`, or `box` |
|
|
55
|
+
| `type` | No | `Prime`, `High Yield`, `Turbo`, or `Term` |
|
|
56
|
+
| `name` | No | Override display name (defaults to on-chain name) |
|
|
57
|
+
|
|
58
|
+
The markdown body after the frontmatter becomes the `description` field (optional, defaults to morpho metadata).
|
|
59
|
+
|
|
60
|
+
## Validation
|
|
61
|
+
|
|
62
|
+
The build script validates:
|
|
63
|
+
|
|
64
|
+
- Required fields are present
|
|
65
|
+
- Valid Ethereum address format (checksummed automatically via viem)
|
|
66
|
+
- Valid protocol enum value (from `@whisk/graphql`)
|
|
67
|
+
- Valid type enum value (if provided)
|
|
68
|
+
- No duplicate chainId + vaultAddress combinations
|
|
69
|
+
|
|
70
|
+
If validation fails, the build will error with details about which file and field failed.
|
|
71
|
+
|
|
72
|
+
## File Naming
|
|
73
|
+
|
|
74
|
+
Use descriptive slugs that identify the vault:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
vaults/
|
|
78
|
+
mainnet/
|
|
79
|
+
steakhouse-usdc.md
|
|
80
|
+
steakhouse-eth.md
|
|
81
|
+
base/
|
|
82
|
+
steakhouse-usdc.md
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The filename doesn't affect the generated code - it's just for organization.
|
|
86
|
+
|
|
87
|
+
## Generated Output
|
|
88
|
+
|
|
89
|
+
The generator creates `src/metadata/generated/vaults.ts` with:
|
|
90
|
+
|
|
91
|
+
- `STEAKHOUSE_VAULTS` - array of all vault configurations
|
|
92
|
+
|
|
93
|
+
This file is committed to git for security auditability. CI verifies the committed file matches regenerated output.
|