diff --git a/.changeset/cyan-cities-enter.md b/.changeset/cyan-cities-enter.md new file mode 100644 index 00000000000..9a0e3b5d068 --- /dev/null +++ b/.changeset/cyan-cities-enter.md @@ -0,0 +1,5 @@ +--- +'@chainlink/mobula-state-adapter': minor +--- + +Revert protocol changes diff --git a/packages/sources/mobula-state/src/endpoint/funding-rate.ts b/packages/sources/mobula-state/src/endpoint/funding-rate.ts index 4c5af3f1c5c..9812a71b297 100644 --- a/packages/sources/mobula-state/src/endpoint/funding-rate.ts +++ b/packages/sources/mobula-state/src/endpoint/funding-rate.ts @@ -23,11 +23,6 @@ export const inputParameters = new InputParameters( type: 'string', description: 'Which exchange to return the funding rate for', }, - protocol: { - required: false, - type: 'string', - description: 'The protocol to query funding rates for', - }, }, [ { diff --git a/packages/sources/mobula-state/src/endpoint/price.ts b/packages/sources/mobula-state/src/endpoint/price.ts index 977d010d2c8..6ebc3d7956d 100644 --- a/packages/sources/mobula-state/src/endpoint/price.ts +++ b/packages/sources/mobula-state/src/endpoint/price.ts @@ -40,8 +40,6 @@ export const endpoint = new CryptoPriceEndpoint({ transport: wsTransport, inputParameters, requestTransforms: [ - // Uppercase base/quote for case-insensitive lookups - // Framework will then apply includes.json transformations (req) => { req.requestContext.data.base = req.requestContext.data.base.toUpperCase() req.requestContext.data.quote = req.requestContext.data.quote.toUpperCase() diff --git a/packages/sources/mobula-state/src/transport/funding-rate.ts b/packages/sources/mobula-state/src/transport/funding-rate.ts index 87976c2895d..90473847dbd 100644 --- a/packages/sources/mobula-state/src/transport/funding-rate.ts +++ b/packages/sources/mobula-state/src/transport/funding-rate.ts @@ -60,7 +60,6 @@ export const wsTransport = new WebSocketTransport({ payload: { symbol: params.base, quote: params.quote, - ...(params.protocol && { protocol: params.protocol }), }, } }, @@ -94,16 +93,8 @@ const getFundingRateResult = ( queryDetails: WSResponse['queryDetails'], fundingRate: FundingRateResponse, ): ProviderResult => { - // Symbol may contain protocol prefix, e.g. "xyz:SILVER" - const symbolParts = String(fundingRate.symbol).split(':') - const protocol = symbolParts.length > 1 ? symbolParts[0] : undefined return { - params: { - base: queryDetails.base, - quote: queryDetails.quote ?? '', - exchange, - ...(protocol && { protocol }), - }, + params: { base: queryDetails.base, quote: queryDetails.quote ?? '', exchange }, response: { result: null, data: { diff --git a/packages/sources/mobula-state/test/integration/__snapshots__/adapter.test.ts.snap b/packages/sources/mobula-state/test/integration/__snapshots__/adapter.test.ts.snap index 1951fd84aa1..fbc045ab6ed 100644 --- a/packages/sources/mobula-state/test/integration/__snapshots__/adapter.test.ts.snap +++ b/packages/sources/mobula-state/test/integration/__snapshots__/adapter.test.ts.snap @@ -43,22 +43,6 @@ exports[`websocket funding rate endpoint no data should return failure 1`] = ` } `; -exports[`websocket funding rate endpoint with protocol param should return success 1`] = ` -{ - "data": { - "epochDuration": 3600, - "fundingRate": 0.00000625, - "fundingTimestamp": 1773788400, - }, - "result": null, - "statusCode": 200, - "timestamps": { - "providerDataReceivedUnixMs": 18188, - "providerDataStreamEstablishedUnixMs": 16160, - }, -} -`; - exports[`websocket graceful error handling and case-insensitive requests should continue working after receiving invalid symbol requests 1`] = ` { "data": { diff --git a/packages/sources/mobula-state/test/integration/adapter.test.ts b/packages/sources/mobula-state/test/integration/adapter.test.ts index 75ac37418b3..f48a9f6cb0c 100644 --- a/packages/sources/mobula-state/test/integration/adapter.test.ts +++ b/packages/sources/mobula-state/test/integration/adapter.test.ts @@ -42,14 +42,6 @@ describe('websocket', () => { endpoint: 'funding-rate', } - const dataFundingRateProtocol = { - base: 'SILVER', - quote: 'USDC', - exchange: 'hyperliquid', - protocol: 'xyz', - endpoint: 'funding-rate', - } - beforeAll(async () => { oldEnv = JSON.parse(JSON.stringify(process.env)) process.env['WS_API_ENDPOINT'] = wsEndpoint @@ -102,6 +94,21 @@ describe('websocket', () => { endpoint: 'price', transport: 'ws', }) + // Prime cache for protocol:asset instrument format tests + await testAdapter.request({ + base: 'xyz:EZETH', + quote: 'USD', + endpoint: 'price', + transport: 'ws', + overrides: { MOBULA_STATE: { 'XYZ:EZETH': '102478632' } }, + }) + await testAdapter.request({ + base: 'abc:GHO', + quote: 'USD', + endpoint: 'price', + transport: 'ws', + overrides: { MOBULA_STATE: { 'ABC:GHO': '2921' } }, + }) // Prime cache for graceful error handling tests await testAdapter.request({ base: 'gho', // Lowercase test - should get uppercased to GHO @@ -115,7 +122,7 @@ describe('websocket', () => { endpoint: 'price', transport: 'ws', }) - await testAdapter.waitForCache(8) // Wait for all primed pairs to be cached (7 new + 1 initial = 8 total, gho/usd doesn't create a new entry since it uppercases to GHO/USD) + await testAdapter.waitForCache(10) // 8 previous + 2 protocol-prefixed pairs }, 30000) afterAll(async () => { @@ -298,11 +305,6 @@ describe('websocket', () => { expect(response.json()).toMatchSnapshot() }) - it('with protocol param should return success', async () => { - const response = await testAdapter.request(dataFundingRateProtocol) - expect(response.json()).toMatchSnapshot() - }) - it('no data should return failure', async () => { const response = await testAdapter.request({ base: 'ETH', @@ -314,6 +316,32 @@ describe('websocket', () => { }) }) + describe('protocol:asset instrument input format', () => { + it('should resolve {protocol}:{asset} via overrides (xyz:EZETH/USD)', async () => { + const response = await testAdapter.request({ + base: 'xyz:EZETH', + quote: 'USD', + endpoint: 'price', + transport: 'ws', + overrides: { MOBULA_STATE: { 'XYZ:EZETH': '102478632' } }, + }) + expect(response.statusCode).toBe(200) + expect(response.json()).toMatchSnapshot() + }) + + it('should resolve {protocol}:{asset} with different protocol (abc:GHO/USD)', async () => { + const response = await testAdapter.request({ + base: 'abc:GHO', + quote: 'USD', + endpoint: 'price', + transport: 'ws', + overrides: { MOBULA_STATE: { 'ABC:GHO': '2921' } }, + }) + expect(response.statusCode).toBe(200) + expect(response.json()).toMatchSnapshot() + }) + }) + describe('graceful error handling and case-insensitive requests', () => { it('should handle lowercase symbols (case-insensitive)', async () => { const response = await testAdapter.request({ diff --git a/packages/sources/mobula-state/test/integration/fixtures.ts b/packages/sources/mobula-state/test/integration/fixtures.ts index 71dc491a362..cca16cd9687 100644 --- a/packages/sources/mobula-state/test/integration/fixtures.ts +++ b/packages/sources/mobula-state/test/integration/fixtures.ts @@ -250,18 +250,6 @@ export const mockWebsocketServer = (URL: string): MockWebsocketServer => { queryDetails: { base: 'AERGO', quote: null }, }), ) - } else if (symbol === 'SILVER' && parsed.payload.protocol === 'xyz') { - socket.send( - JSON.stringify({ - hyperliquidFundingRate: { - symbol: 'xyz:SILVER', - fundingTime: 1773788400011, - fundingRate: 0.00000625, - epochDurationMs: 3600000, - }, - queryDetails: { base: 'SILVER', quote: 'USDC' }, - }), - ) } } })