Skip to content

Commit 0b5366c

Browse files
authored
Merge pull request #115 from ethereum-optimism/kevin/69-rename-vault-lend
rename vault -> market
2 parents 4930704 + 4f5e0dd commit 0b5366c

File tree

19 files changed

+298
-227
lines changed

19 files changed

+298
-227
lines changed

packages/demo/backend/src/app.integration.spec.ts

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ vi.mock('./config/verbs.js', () => ({
7777
},
7878
},
7979
lend: {
80-
getVaults: vi.fn(() =>
80+
getMarkets: vi.fn(() =>
8181
Promise.resolve([
8282
{
8383
address: '0x38f4f3B6533de0023b9DCd04b02F93d36ad1F9f9',
@@ -93,10 +93,10 @@ vi.mock('./config/verbs.js', () => ({
9393
},
9494
]),
9595
),
96-
getVault: vi.fn((vaultAddress: string) => {
97-
if (vaultAddress === '0x38f4f3B6533de0023b9DCd04b02F93d36ad1F9f9') {
96+
getMarket: vi.fn((marketId: { address: string; chainId: number }) => {
97+
if (marketId.address === '0x38f4f3B6533de0023b9DCd04b02F93d36ad1F9f9') {
9898
return Promise.resolve({
99-
address: vaultAddress,
99+
address: marketId.address,
100100
name: 'Gauntlet USDC',
101101
asset: '0xBAa5CC21fd487B8Fcc2F632f3F4E8D37262a0842',
102102
apy: 0.03,
@@ -119,6 +119,17 @@ vi.mock('./config/verbs.js', () => ({
119119
}
120120
throw new Error('Vault not found')
121121
}),
122+
getMarketBalance: vi.fn(
123+
(_marketAddress: string, _walletAddress: string) => {
124+
return Promise.resolve({
125+
balance: 1000000n,
126+
balanceFormatted: '1.0',
127+
shares: 1000000000000000000n,
128+
sharesFormatted: '1.0',
129+
chainId: 130,
130+
})
131+
},
132+
),
122133
},
123134
})),
124135
}))
@@ -309,6 +320,19 @@ describe('HTTP API Integration', () => {
309320
balance: [
310321
{ symbol: 'USDC', balance: '1000000' },
311322
{ symbol: 'MORPHO', balance: '500000' },
323+
{
324+
symbol: 'Gauntlet USDC',
325+
totalBalance: '1000000',
326+
totalFormattedBalance: '1',
327+
chainBalances: [
328+
{
329+
chainId: 130,
330+
balance: '1000000',
331+
tokenAddress: '0xBAa5CC21fd487B8Fcc2F632f3F4E8D37262a0842',
332+
formattedBalance: '1',
333+
},
334+
],
335+
},
312336
],
313337
})
314338
})
@@ -368,18 +392,18 @@ describe('HTTP API Integration', () => {
368392
})
369393

370394
describe('Lend endpoints', () => {
371-
it('should get all vaults', async () => {
372-
const response = await request(`${baseUrl}/lend/vaults`)
395+
it('should get all markets', async () => {
396+
const response = await request(`${baseUrl}/lend/markets`)
373397

374398
expect(response.statusCode).toBe(200)
375399
const data = (await response.body.json()) as any
376400

377-
expect(data).toHaveProperty('vaults')
378-
expect(Array.isArray(data.vaults)).toBe(true)
379-
expect(data.vaults.length).toBeGreaterThan(0)
401+
expect(data).toHaveProperty('markets')
402+
expect(Array.isArray(data.markets)).toBe(true)
403+
expect(data.markets.length).toBeGreaterThan(0)
380404

381-
// Check vault structure
382-
const vault = data.vaults[0]
405+
// Check market structure
406+
const vault = data.markets[0]
383407
expect(vault).toHaveProperty('address')
384408
expect(vault).toHaveProperty('name')
385409
expect(vault).toHaveProperty('apy')
@@ -389,15 +413,17 @@ describe('HTTP API Integration', () => {
389413
expect(typeof vault.apy).toBe('number')
390414
})
391415

392-
it('should get specific vault info', async () => {
416+
it('should get specific market info', async () => {
393417
const vaultAddress = '0x38f4f3B6533de0023b9DCd04b02F93d36ad1F9f9'
394-
const response = await request(`${baseUrl}/lend/vault/${vaultAddress}`)
418+
const response = await request(
419+
`${baseUrl}/lend/market/130/${vaultAddress}`,
420+
)
395421

396422
expect(response.statusCode).toBe(200)
397423
const data = (await response.body.json()) as any
398424

399-
expect(data).toHaveProperty('vault')
400-
const vault = data.vault
425+
expect(data).toHaveProperty('market')
426+
const vault = data.market
401427
expect(vault).toHaveProperty('address')
402428
expect(vault).toHaveProperty('name')
403429
expect(vault).toHaveProperty('apy')
@@ -423,23 +449,23 @@ describe('HTTP API Integration', () => {
423449
expect(typeof vault.fee).toBe('number')
424450
})
425451

426-
it('should return 400 for missing vault address', async () => {
427-
const response = await request(`${baseUrl}/lend/vault/`)
452+
it('should return 400 for missing market address', async () => {
453+
const response = await request(`${baseUrl}/lend/market/`)
428454

429455
expect(response.statusCode).toBe(404) // Will be 404 since route doesn't match
430456
})
431457

432-
it('should handle vault not found', async () => {
458+
it('should handle market not found', async () => {
433459
const invalidVaultAddress = '0x1234567890123456789012345678901234567890'
434460
const response = await request(
435-
`${baseUrl}/lend/vault/${invalidVaultAddress}`,
461+
`${baseUrl}/lend/market/130/${invalidVaultAddress}`,
436462
)
437463

438464
expect(response.statusCode).toBe(500)
439465
const data = (await response.body.json()) as any
440466

441467
expect(data).toHaveProperty('error')
442-
expect(data.error).toBe('Failed to get vault info')
468+
expect(data.error).toBe('Failed to get market info')
443469
expect(data).toHaveProperty('message')
444470
expect(data.message).toContain('Vault not found')
445471
})

packages/demo/backend/src/controllers/lend.ts

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,7 @@ const DepositRequestSchema = z.object({
1818
}),
1919
})
2020

21-
const VaultAddressParamSchema = z.object({
22-
params: z.object({
23-
vaultAddress: z
24-
.string()
25-
.regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid vault address format'),
26-
}),
27-
})
28-
29-
const VaultBalanceParamsSchema = z.object({
21+
const MarketBalanceParamsSchema = z.object({
3022
params: z.object({
3123
vaultAddress: z
3224
.string()
@@ -37,19 +29,19 @@ const VaultBalanceParamsSchema = z.object({
3729

3830
export class LendController {
3931
/**
40-
* GET - Retrieve all available lending vaults
32+
* GET - Retrieve all available lending markets
4133
*/
42-
async getVaults(c: Context) {
34+
async getMarkets(c: Context) {
4335
try {
44-
const vaults = await lendService.getVaults()
45-
const formattedVaults = await Promise.all(
46-
vaults.map((vault) => lendService.formatVaultResponse(vault)),
36+
const markets = await lendService.getMarkets()
37+
const formattedMarkets = await Promise.all(
38+
markets.map((market) => lendService.formatMarketResponse(market)),
4739
)
48-
return c.json({ vaults: formattedVaults })
40+
return c.json({ markets: formattedMarkets })
4941
} catch (error) {
5042
return c.json(
5143
{
52-
error: 'Failed to get vaults',
44+
error: 'Failed to get markets',
5345
message: error instanceof Error ? error.message : 'Unknown error',
5446
},
5547
500,
@@ -58,23 +50,33 @@ export class LendController {
5850
}
5951

6052
/**
61-
* GET - Retrieve specific vault information by address
53+
* GET - Retrieve specific market information by ID and chain
6254
*/
63-
async getVault(c: Context) {
55+
async getMarket(c: Context) {
6456
try {
65-
const validation = await validateRequest(c, VaultAddressParamSchema)
66-
if (!validation.success) return validation.response
57+
const chainId = Number(c.req.param('chainId'))
58+
const marketId = c.req.param('marketId')
6759

68-
const {
69-
params: { vaultAddress },
70-
} = validation.data
71-
const vaultInfo = await lendService.getVault(vaultAddress as Address)
72-
const formattedVault = await lendService.formatVaultResponse(vaultInfo)
73-
return c.json({ vault: formattedVault })
60+
if (!chainId || !marketId) {
61+
return c.json(
62+
{
63+
error: 'Invalid parameters',
64+
message: 'chainId and marketId are required',
65+
},
66+
400,
67+
)
68+
}
69+
70+
const marketInfo = await lendService.getMarket(
71+
marketId as Address,
72+
chainId as SupportedChainId,
73+
)
74+
const formattedMarket = await lendService.formatMarketResponse(marketInfo)
75+
return c.json({ market: formattedMarket })
7476
} catch (error) {
7577
return c.json(
7678
{
77-
error: 'Failed to get vault info',
79+
error: 'Failed to get market info',
7880
message: error instanceof Error ? error.message : 'Unknown error',
7981
},
8082
500,
@@ -83,27 +85,27 @@ export class LendController {
8385
}
8486

8587
/**
86-
* GET - Get vault balance for a specific wallet
88+
* GET - Get market balance for a specific wallet
8789
*/
88-
async getVaultBalance(c: Context) {
90+
async getMarketBalance(c: Context) {
8991
try {
90-
const validation = await validateRequest(c, VaultBalanceParamsSchema)
92+
const validation = await validateRequest(c, MarketBalanceParamsSchema)
9193
if (!validation.success) return validation.response
9294

9395
const {
9496
params: { vaultAddress, walletId },
9597
} = validation.data
96-
const balance = await lendService.getVaultBalance(
98+
const balance = await lendService.getMarketBalance(
9799
vaultAddress as Address,
98100
walletId,
99101
)
100102
const formattedBalance =
101-
await lendService.formatVaultBalanceResponse(balance)
103+
await lendService.formatMarketBalanceResponse(balance)
102104
return c.json(formattedBalance)
103105
} catch (error) {
104106
return c.json(
105107
{
106-
error: 'Failed to get vault balance',
108+
error: 'Failed to get market balance',
107109
message: error instanceof Error ? error.message : 'Unknown error',
108110
},
109111
500,

packages/demo/backend/src/router.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ router.post('/wallet/:userId/fund', walletController.fundWallet)
4949
router.post('/wallet/send', walletController.sendTokens)
5050

5151
// Lend endpoints
52-
router.get('/lend/vaults', lendController.getVaults)
53-
router.get('/lend/vault/:vaultAddress', lendController.getVault)
52+
router.get('/lend/markets', lendController.getMarkets)
53+
router.get('/lend/market/:chainId/:marketId', lendController.getMarket)
5454
router.get(
55-
'/lend/vault/:vaultAddress/balance/:walletId',
56-
lendController.getVaultBalance,
55+
'/lend/market/:vaultAddress/balance/:walletId',
56+
lendController.getMarketBalance,
5757
)
5858
router.post('/lend/deposit', lendController.deposit)

packages/demo/backend/src/services/lend.spec.ts

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ vi.mock('../config/verbs.js', () => ({
88
}))
99

1010
const mockLendProvider = {
11-
getVaults: vi.fn(),
12-
getVault: vi.fn(),
11+
getMarkets: vi.fn(),
12+
getMarket: vi.fn(),
1313
}
1414

1515
const mockVerbs = {
@@ -23,9 +23,9 @@ describe('Lend Service', () => {
2323
vi.mocked(getVerbs).mockReturnValue(mockVerbs as any)
2424
})
2525

26-
describe('getVaults', () => {
27-
it('should return vaults from the lend provider', async () => {
28-
const mockVaults = [
26+
describe('getMarkets', () => {
27+
it('should return markets from the lend provider', async () => {
28+
const mockMarkets = [
2929
{
3030
address:
3131
'0x38f4f3B6533de0023b9DCd04b02F93d36ad1F9f9' as `0x${string}`,
@@ -42,37 +42,38 @@ describe('Lend Service', () => {
4242
},
4343
]
4444

45-
mockLendProvider.getVaults.mockResolvedValue(mockVaults)
45+
mockLendProvider.getMarkets.mockResolvedValue(mockMarkets)
4646

47-
const result = await lendService.getVaults()
47+
const result = await lendService.getMarkets()
4848

49-
expect(result).toEqual(mockVaults)
50-
expect(mockLendProvider.getVaults).toHaveBeenCalledOnce()
49+
expect(result).toEqual(mockMarkets)
50+
expect(mockLendProvider.getMarkets).toHaveBeenCalledOnce()
5151
})
5252

5353
it('should throw error when lend provider fails', async () => {
5454
const error = new Error('Lend provider error')
55-
mockLendProvider.getVaults.mockRejectedValue(error)
55+
mockLendProvider.getMarkets.mockRejectedValue(error)
5656

57-
await expect(lendService.getVaults()).rejects.toThrow(
57+
await expect(lendService.getMarkets()).rejects.toThrow(
5858
'Lend provider error',
5959
)
6060
})
6161

6262
it('should handle unknown errors', async () => {
63-
mockLendProvider.getVaults.mockRejectedValue('Unknown error')
63+
mockLendProvider.getMarkets.mockRejectedValue('Unknown error')
6464

65-
await expect(lendService.getVaults()).rejects.toThrow('Unknown error')
65+
await expect(lendService.getMarkets()).rejects.toThrow('Unknown error')
6666
})
6767
})
6868

69-
describe('getVault', () => {
70-
const vaultAddress =
69+
describe('getMarket', () => {
70+
const marketId =
7171
'0x38f4f3B6533de0023b9DCd04b02F93d36ad1F9f9' as `0x${string}`
72+
const chainId = 130
7273

73-
it('should return vault info from the lend provider', async () => {
74-
const mockVaultInfo = {
75-
address: vaultAddress,
74+
it('should return market info from the lend provider', async () => {
75+
const mockMarketInfo = {
76+
address: marketId,
7677
name: 'Gauntlet USDC',
7778
asset: '0xBAa5CC21fd487B8Fcc2F632f3F4E8D37262a0842' as `0x${string}`,
7879
apy: 0.03,
@@ -84,27 +85,30 @@ describe('Lend Service', () => {
8485
lastUpdate: 1234567890,
8586
}
8687

87-
mockLendProvider.getVault.mockResolvedValue(mockVaultInfo)
88+
mockLendProvider.getMarket.mockResolvedValue(mockMarketInfo)
8889

89-
const result = await lendService.getVault(vaultAddress)
90+
const result = await lendService.getMarket(marketId, chainId)
9091

91-
expect(result).toEqual(mockVaultInfo)
92-
expect(mockLendProvider.getVault).toHaveBeenCalledWith(vaultAddress)
92+
expect(result).toEqual(mockMarketInfo)
93+
expect(mockLendProvider.getMarket).toHaveBeenCalledWith({
94+
address: marketId,
95+
chainId,
96+
})
9397
})
9498

9599
it('should throw error when lend provider fails', async () => {
96-
const error = new Error('Vault not found')
97-
mockLendProvider.getVault.mockRejectedValue(error)
100+
const error = new Error('Market not found')
101+
mockLendProvider.getMarket.mockRejectedValue(error)
98102

99-
await expect(lendService.getVault(vaultAddress)).rejects.toThrow(
100-
'Vault not found',
103+
await expect(lendService.getMarket(marketId, chainId)).rejects.toThrow(
104+
'Market not found',
101105
)
102106
})
103107

104108
it('should handle unknown errors', async () => {
105-
mockLendProvider.getVault.mockRejectedValue('Unknown error')
109+
mockLendProvider.getMarket.mockRejectedValue('Unknown error')
106110

107-
await expect(lendService.getVault(vaultAddress)).rejects.toThrow(
111+
await expect(lendService.getMarket(marketId, chainId)).rejects.toThrow(
108112
'Unknown error',
109113
)
110114
})

0 commit comments

Comments
 (0)