@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.
Files changed (116) hide show
  1. package/dist/metadata/generated/vaults.d.ts +7 -0
  2. package/dist/metadata/generated/vaults.js +468 -0
  3. package/dist/metadata/generated/vaults.js.map +1 -0
  4. package/dist/metadata/index.d.ts +3 -3
  5. package/dist/metadata/index.js +4 -8
  6. package/dist/metadata/index.js.map +1 -1
  7. package/dist/metadata/types.d.ts +9 -10
  8. package/dist/metadata/types.js +4 -0
  9. package/dist/metadata/types.js.map +1 -1
  10. package/dist/queries/getDetailedVault.d.ts +2 -2
  11. package/dist/queries/getDetailedVault.js +3 -3
  12. package/dist/queries/getDetailedVault.js.map +1 -1
  13. package/dist/queries/getVaults.d.ts +1 -1
  14. package/dist/queries/getVaults.js +2 -4
  15. package/dist/queries/getVaults.js.map +1 -1
  16. package/dist/queries/steakhouseMetadata.d.ts +2 -1
  17. package/dist/queries/steakhouseMetadata.js +1 -1
  18. package/dist/queries/steakhouseMetadata.js.map +1 -1
  19. package/dist/react/hooks/index.d.ts +1 -1
  20. package/dist/react/hooks/useDetailedVault.d.ts +1 -1
  21. package/dist/react/index.d.ts +1 -1
  22. package/package.json +14 -6
  23. package/src/metadata/README.md +93 -0
  24. package/src/metadata/generated/vaults.ts +470 -0
  25. package/src/metadata/index.ts +5 -3
  26. package/src/metadata/types.ts +8 -11
  27. package/src/metadata/vaults/arbitrum/high-yield-turbo-usdc.md +6 -0
  28. package/src/metadata/vaults/arbitrum/high-yield-usdc-v1.md +6 -0
  29. package/src/metadata/vaults/arbitrum/high-yield-usdc-v2.md +6 -0
  30. package/src/metadata/vaults/arbitrum/high-yield-usdt-v2.md +6 -0
  31. package/src/metadata/vaults/base/deblock-eurc.md +6 -0
  32. package/src/metadata/vaults/base/eth-v1.md +6 -0
  33. package/src/metadata/vaults/base/eura.md +6 -0
  34. package/src/metadata/vaults/base/eurc-v1.md +6 -0
  35. package/src/metadata/vaults/base/high-yield-instant-usdc.md +6 -0
  36. package/src/metadata/vaults/base/high-yield-turbo-eth.md +6 -0
  37. package/src/metadata/vaults/base/high-yield-usdc-v1-1.md +6 -0
  38. package/src/metadata/vaults/base/high-yield-usdc.md +6 -0
  39. package/src/metadata/vaults/base/prime-instant-usdc.md +6 -0
  40. package/src/metadata/vaults/base/safe-x-eth-2.md +6 -0
  41. package/src/metadata/vaults/base/safe-x-eth.md +6 -0
  42. package/src/metadata/vaults/base/safe-x-usdc.md +6 -0
  43. package/src/metadata/vaults/base/smokehouse-usdc.md +6 -0
  44. package/src/metadata/vaults/base/susds.md +6 -0
  45. package/src/metadata/vaults/base/usda.md +6 -0
  46. package/src/metadata/vaults/base/usdc-rwa.md +6 -0
  47. package/src/metadata/vaults/base/usdc-v1.md +6 -0
  48. package/src/metadata/vaults/katana/high-yield-ausd.md +6 -0
  49. package/src/metadata/vaults/katana/high-yield-usdc.md +6 -0
  50. package/src/metadata/vaults/katana/prime-ausd.md +6 -0
  51. package/src/metadata/vaults/katana/prime-usdc.md +6 -0
  52. package/src/metadata/vaults/mainnet/3f-x-steakhouse.md +6 -0
  53. package/src/metadata/vaults/mainnet/coinshift-usdc.md +6 -0
  54. package/src/metadata/vaults/mainnet/coinshift-usdl.md +6 -0
  55. package/src/metadata/vaults/mainnet/eth-v1.md +6 -0
  56. package/src/metadata/vaults/mainnet/ethena-usdt.md +6 -0
  57. package/src/metadata/vaults/mainnet/ethena-usdtb.md +6 -0
  58. package/src/metadata/vaults/mainnet/eurcv-v1.md +6 -0
  59. package/src/metadata/vaults/mainnet/high-yield-instant-ausd-v2.md +6 -0
  60. package/src/metadata/vaults/mainnet/high-yield-instant-usdc-v2.md +6 -0
  61. package/src/metadata/vaults/mainnet/high-yield-instant-usdt-v2.md +6 -0
  62. package/src/metadata/vaults/mainnet/high-yield-term-usdc.md +6 -0
  63. package/src/metadata/vaults/mainnet/high-yield-turbo-cbbtc-v2.md +6 -0
  64. package/src/metadata/vaults/mainnet/high-yield-turbo-eth-v2.md +6 -0
  65. package/src/metadata/vaults/mainnet/high-yield-turbo-usdt-v2.md +6 -0
  66. package/src/metadata/vaults/mainnet/infinifi-usdc.md +6 -0
  67. package/src/metadata/vaults/mainnet/level-usdc.md +6 -0
  68. package/src/metadata/vaults/mainnet/m-v1.md +6 -0
  69. package/src/metadata/vaults/mainnet/paxg-v1.md +6 -0
  70. package/src/metadata/vaults/mainnet/peaty-usdc.md +6 -0
  71. package/src/metadata/vaults/mainnet/prime-instant-eth-v2.md +6 -0
  72. package/src/metadata/vaults/mainnet/prime-instant-eurcv-v2.md +6 -0
  73. package/src/metadata/vaults/mainnet/prime-instant-pyusd-v2.md +6 -0
  74. package/src/metadata/vaults/mainnet/prime-instant-usdc-v2.md +6 -0
  75. package/src/metadata/vaults/mainnet/prime-instant-usdt-v2.md +6 -0
  76. package/src/metadata/vaults/mainnet/pyusd-high-yield-instant.md +6 -0
  77. package/src/metadata/vaults/mainnet/pyusd-v1.md +6 -0
  78. package/src/metadata/vaults/mainnet/rusd-v1.md +6 -0
  79. package/src/metadata/vaults/mainnet/safe-x-eth.md +6 -0
  80. package/src/metadata/vaults/mainnet/safe-x-smokehouse-usdc.md +6 -0
  81. package/src/metadata/vaults/mainnet/safe-x-smokehouse-usdt.md +6 -0
  82. package/src/metadata/vaults/mainnet/safe-x-smokehouse-wbtc.md +6 -0
  83. package/src/metadata/vaults/mainnet/safe-x-smokehouse-wsteth.md +6 -0
  84. package/src/metadata/vaults/mainnet/safe-x-usdc.md +6 -0
  85. package/src/metadata/vaults/mainnet/safe-x-usdt.md +6 -0
  86. package/src/metadata/vaults/mainnet/smokehouse-cbbtc.md +6 -0
  87. package/src/metadata/vaults/mainnet/smokehouse-dai.md +6 -0
  88. package/src/metadata/vaults/mainnet/smokehouse-eth.md +6 -0
  89. package/src/metadata/vaults/mainnet/smokehouse-usdc.md +6 -0
  90. package/src/metadata/vaults/mainnet/smokehouse-usdt.md +6 -0
  91. package/src/metadata/vaults/mainnet/smokehouse-wsteth.md +6 -0
  92. package/src/metadata/vaults/mainnet/usdc-rwa.md +6 -0
  93. package/src/metadata/vaults/mainnet/usdc-v1.md +6 -0
  94. package/src/metadata/vaults/mainnet/usdq.md +6 -0
  95. package/src/metadata/vaults/mainnet/usdr.md +6 -0
  96. package/src/metadata/vaults/mainnet/usdt-lite.md +6 -0
  97. package/src/metadata/vaults/mainnet/usdt-v1.md +6 -0
  98. package/src/metadata/vaults/mainnet/vault-bridge-usdc.md +6 -0
  99. package/src/metadata/vaults/mainnet/wbtc-v1.md +6 -0
  100. package/src/metadata/vaults/monad/ausd-v2.md +6 -0
  101. package/src/metadata/vaults/monad/usdc-v2.md +6 -0
  102. package/src/metadata/vaults/unichain/eth.md +6 -0
  103. package/src/metadata/vaults/unichain/wsteth.md +6 -0
  104. package/src/queries/getDetailedVault.test.ts +9 -19
  105. package/src/queries/getDetailedVault.ts +3 -4
  106. package/src/queries/getVaults.test.ts +15 -34
  107. package/src/queries/getVaults.ts +4 -4
  108. package/src/queries/steakhouseMetadata.ts +2 -2
  109. package/dist/metadata/chains.d.ts +0 -7
  110. package/dist/metadata/chains.js +0 -15
  111. package/dist/metadata/chains.js.map +0 -1
  112. package/dist/metadata/vaults.d.ts +0 -7
  113. package/dist/metadata/vaults.js +0 -26
  114. package/dist/metadata/vaults.js.map +0 -1
  115. package/src/metadata/chains.ts +0 -13
  116. package/src/metadata/vaults.ts +0 -27
@@ -1,5 +1,5 @@
1
1
  import { graphql } from "@whisk/graphql";
2
- import { ALL_VAULTS } from "../metadata/vaults.js";
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 = ALL_VAULTS.filter(
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 type { Address, VaultConfig } from \"../metadata/types.js\"\nimport { ALL_VAULTS } from \"../metadata/vaults.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 = ALL_VAULTS.filter(\n (v) => !v.isHidden && (!chainId || v.chainId === chainId),\n )\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;AAGxB,SAAS,kBAAkB;AAC3B,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,WAAW;AAAA,IAChC,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,WAAW,EAAE,YAAY;AAAA,EACnD;AAEA,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
+ {"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
- tag?: VaultConfig["tag"];
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.tag !== void 0 && { tag: config.tag }
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 tag?: VaultConfig[\"tag\"]\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.tag !== undefined && { tag: config.tag }),\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,QAAQ,UAAa,EAAE,KAAK,OAAO,IAAI;AAAA,EACpD;AACF;","names":[]}
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>;
@@ -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.5",
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
- "@tanstack/react-query": "5.90.10"
68
+ "tsx": "^4.20.6",
69
+ "viem": "^2.0.0",
70
+ "zod": "^3.24.0"
65
71
  },
66
72
  "scripts": {
67
- "build": "tsup",
68
- "dev": "tsup --watch"
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.