From 005127209cda88c48a319cef63e209bbb1efd7f9 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Tue, 14 Apr 2026 11:24:19 +0200 Subject: [PATCH 1/8] chore: add imageUrl --- packages/social-controllers/CHANGELOG.md | 1 + packages/social-controllers/src/SocialService.test.ts | 1 + packages/social-controllers/src/SocialService.ts | 1 + packages/social-controllers/src/social-types.ts | 2 ++ 4 files changed, 5 insertions(+) diff --git a/packages/social-controllers/CHANGELOG.md b/packages/social-controllers/CHANGELOG.md index 8c8da7efed5..52f20419fd1 100644 --- a/packages/social-controllers/CHANGELOG.md +++ b/packages/social-controllers/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- Add optional `tokenImageUrl` field to `Position` type and `PositionStruct` validation schema - Add `intent` and optional `category` fields to `Trade` type ([#8410](https://github.com/MetaMask/core/pull/8410)) - Export `TradeStruct` superstruct schema; derive `Trade` type via `Infer` ([#8410](https://github.com/MetaMask/core/pull/8410)) - Narrow `direction` to `'buy' | 'sell'` and `intent` to `'enter' | 'exit'` on `Trade` type ([#8410](https://github.com/MetaMask/core/pull/8410)) diff --git a/packages/social-controllers/src/SocialService.test.ts b/packages/social-controllers/src/SocialService.test.ts index eb8ad32f1ce..4f0762205ba 100644 --- a/packages/social-controllers/src/SocialService.test.ts +++ b/packages/social-controllers/src/SocialService.test.ts @@ -44,6 +44,7 @@ const mockPosition = { costBasis: 3000, trades: [mockTrade], lastTradeAt: 1700000000, + tokenImageUrl: 'https://assets.daylight.xyz/images/token-eth.png', }; function createMessenger(): SocialServiceMessenger { diff --git a/packages/social-controllers/src/SocialService.ts b/packages/social-controllers/src/SocialService.ts index 7c753b22203..30e504690ba 100644 --- a/packages/social-controllers/src/SocialService.ts +++ b/packages/social-controllers/src/SocialService.ts @@ -69,6 +69,7 @@ const PositionStruct = structType({ costBasis: number(), trades: array(TradeStruct), lastTradeAt: number(), + tokenImageUrl: optional(nullable(string())), currentValueUSD: optional(nullable(number())), pnlValueUsd: optional(nullable(number())), pnlPercent: optional(nullable(number())), diff --git a/packages/social-controllers/src/social-types.ts b/packages/social-controllers/src/social-types.ts index e80b9abd57e..2d2bec5bcff 100644 --- a/packages/social-controllers/src/social-types.ts +++ b/packages/social-controllers/src/social-types.ts @@ -142,6 +142,8 @@ export type Position = { costBasis: number; trades: Trade[]; lastTradeAt: number; + /** Daylight-hosted token image URL. */ + tokenImageUrl?: string | null; /** Current USD value of the remaining position (open positions only). */ currentValueUSD?: number | null; /** Unrealized + realized PnL in USD. */ From f36bccd2b24728c3b6b775173d177694ddee2a28 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Tue, 14 Apr 2026 11:32:52 +0200 Subject: [PATCH 2/8] chore: add avgHoldMinutes --- packages/social-controllers/CHANGELOG.md | 1 + packages/social-controllers/src/SocialService.test.ts | 1 + packages/social-controllers/src/SocialService.ts | 1 + packages/social-controllers/src/social-types.ts | 2 ++ 4 files changed, 5 insertions(+) diff --git a/packages/social-controllers/CHANGELOG.md b/packages/social-controllers/CHANGELOG.md index 52f20419fd1..b2975c448ca 100644 --- a/packages/social-controllers/CHANGELOG.md +++ b/packages/social-controllers/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Add optional `tokenImageUrl` field to `Position` type and `PositionStruct` validation schema +- Add optional `avgHoldMinutes` field to `TraderStats` type and `TraderStatsStruct` validation schema - Add `intent` and optional `category` fields to `Trade` type ([#8410](https://github.com/MetaMask/core/pull/8410)) - Export `TradeStruct` superstruct schema; derive `Trade` type via `Infer` ([#8410](https://github.com/MetaMask/core/pull/8410)) - Narrow `direction` to `'buy' | 'sell'` and `intent` to `'enter' | 'exit'` on `Trade` type ([#8410](https://github.com/MetaMask/core/pull/8410)) diff --git a/packages/social-controllers/src/SocialService.test.ts b/packages/social-controllers/src/SocialService.test.ts index 4f0762205ba..d42d9608c77 100644 --- a/packages/social-controllers/src/SocialService.test.ts +++ b/packages/social-controllers/src/SocialService.test.ts @@ -240,6 +240,7 @@ describe('SocialService', () => { winRate7d: 0.7, roiPercent7d: 1.2, tradeCount7d: 15, + avgHoldMinutes: 120, }, perChainBreakdown: { perChainPnl: { base: 30000 }, diff --git a/packages/social-controllers/src/SocialService.ts b/packages/social-controllers/src/SocialService.ts index 30e504690ba..59e1323dd78 100644 --- a/packages/social-controllers/src/SocialService.ts +++ b/packages/social-controllers/src/SocialService.ts @@ -120,6 +120,7 @@ const TraderStatsStruct = structType({ winRate7d: optional(nullable(number())), roiPercent7d: optional(nullable(number())), tradeCount7d: optional(nullable(number())), + avgHoldMinutes: optional(nullable(number())), }); const PerChainBreakdownStruct = structType({ diff --git a/packages/social-controllers/src/social-types.ts b/packages/social-controllers/src/social-types.ts index 2d2bec5bcff..1cbac3aa25d 100644 --- a/packages/social-controllers/src/social-types.ts +++ b/packages/social-controllers/src/social-types.ts @@ -105,6 +105,8 @@ export type TraderStats = { winRate7d?: number | null; roiPercent7d?: number | null; tradeCount7d?: number | null; + /** Median holding time in minutes. */ + avgHoldMinutes?: number | null; }; export type PerChainBreakdown = { From ba5a6ec7aaea65313de560e709f695ff60a13109 Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Tue, 14 Apr 2026 11:36:12 +0200 Subject: [PATCH 3/8] fix: use v1 instead of v2 for closed positions --- packages/social-controllers/CHANGELOG.md | 4 ++++ packages/social-controllers/src/SocialService.test.ts | 2 +- packages/social-controllers/src/SocialService.ts | 4 +++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/social-controllers/CHANGELOG.md b/packages/social-controllers/CHANGELOG.md index b2975c448ca..0467a582780 100644 --- a/packages/social-controllers/CHANGELOG.md +++ b/packages/social-controllers/CHANGELOG.md @@ -15,6 +15,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Export `TradeStruct` superstruct schema; derive `Trade` type via `Infer` ([#8410](https://github.com/MetaMask/core/pull/8410)) - Narrow `direction` to `'buy' | 'sell'` and `intent` to `'enter' | 'exit'` on `Trade` type ([#8410](https://github.com/MetaMask/core/pull/8410)) +### Fixed + +- Fix `fetchClosedPositions` using v2 URL instead of v1, which caused 404 errors since the closed positions endpoint only exists on v1 + ### Changed - Bump `@metamask/messenger` from `^1.1.0` to `^1.1.1` ([#8373](https://github.com/MetaMask/core/pull/8373)) diff --git a/packages/social-controllers/src/SocialService.test.ts b/packages/social-controllers/src/SocialService.test.ts index d42d9608c77..b4745abda2b 100644 --- a/packages/social-controllers/src/SocialService.test.ts +++ b/packages/social-controllers/src/SocialService.test.ts @@ -479,7 +479,7 @@ describe('SocialService', () => { expect(result).toStrictEqual(mockPositionsResponse); expect(mockFetch).toHaveBeenCalledWith( - `${V2_URL}/traders/0x1234/positions/closed`, + `${V1_URL}/traders/0x1234/positions/closed`, ); }); diff --git a/packages/social-controllers/src/SocialService.ts b/packages/social-controllers/src/SocialService.ts index 59e1323dd78..8e8efa4b972 100644 --- a/packages/social-controllers/src/SocialService.ts +++ b/packages/social-controllers/src/SocialService.ts @@ -548,8 +548,10 @@ export class SocialService extends BaseDataService< page ?? null, ], queryFn: async () => { + const baseUrl = + status === 'open' ? this.#v2Url : this.#v1Url; const url = new URL( - `${this.#v2Url}/traders/${encodeURIComponent(addressOrId)}/positions/${status}`, + `${baseUrl}/traders/${encodeURIComponent(addressOrId)}/positions/${status}`, ); if (chain) { url.searchParams.append('chain', chain); From e4313f943483c4d653ad75bc74aae530c0a7f39a Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Tue, 14 Apr 2026 13:36:57 +0200 Subject: [PATCH 4/8] chore: update changelog --- packages/social-controllers/CHANGELOG.md | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/social-controllers/CHANGELOG.md b/packages/social-controllers/CHANGELOG.md index 0467a582780..51ac58ad2b9 100644 --- a/packages/social-controllers/CHANGELOG.md +++ b/packages/social-controllers/CHANGELOG.md @@ -9,16 +9,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- Add optional `tokenImageUrl` field to `Position` type and `PositionStruct` validation schema -- Add optional `avgHoldMinutes` field to `TraderStats` type and `TraderStatsStruct` validation schema +- Add optional `tokenImageUrl` field to `Position` type and `PositionStruct` validation schema ([#8448](https://github.com/MetaMask/core/pull/8448)) +- Add optional `avgHoldMinutes` field to `TraderStats` type and `TraderStatsStruct` validation schema ([#8448](https://github.com/MetaMask/core/pull/8448)) +- Fix `fetchClosedPositions` using v2 URL instead of v1, which caused 404 errors since the closed positions endpoint only exists on v1 ([#8448](https://github.com/MetaMask/core/pull/8448)) - Add `intent` and optional `category` fields to `Trade` type ([#8410](https://github.com/MetaMask/core/pull/8410)) - Export `TradeStruct` superstruct schema; derive `Trade` type via `Infer` ([#8410](https://github.com/MetaMask/core/pull/8410)) - Narrow `direction` to `'buy' | 'sell'` and `intent` to `'enter' | 'exit'` on `Trade` type ([#8410](https://github.com/MetaMask/core/pull/8410)) -### Fixed - -- Fix `fetchClosedPositions` using v2 URL instead of v1, which caused 404 errors since the closed positions endpoint only exists on v1 - ### Changed - Bump `@metamask/messenger` from `^1.1.0` to `^1.1.1` ([#8373](https://github.com/MetaMask/core/pull/8373)) From 9318cfd61ad912074f639a8a719c656d7040c98a Mon Sep 17 00:00:00 2001 From: Joao Santos Date: Tue, 14 Apr 2026 13:44:56 +0200 Subject: [PATCH 5/8] fix: changelog entry --- packages/social-controllers/CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/social-controllers/CHANGELOG.md b/packages/social-controllers/CHANGELOG.md index 51ac58ad2b9..c8c4fba50db 100644 --- a/packages/social-controllers/CHANGELOG.md +++ b/packages/social-controllers/CHANGELOG.md @@ -11,11 +11,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add optional `tokenImageUrl` field to `Position` type and `PositionStruct` validation schema ([#8448](https://github.com/MetaMask/core/pull/8448)) - Add optional `avgHoldMinutes` field to `TraderStats` type and `TraderStatsStruct` validation schema ([#8448](https://github.com/MetaMask/core/pull/8448)) -- Fix `fetchClosedPositions` using v2 URL instead of v1, which caused 404 errors since the closed positions endpoint only exists on v1 ([#8448](https://github.com/MetaMask/core/pull/8448)) - Add `intent` and optional `category` fields to `Trade` type ([#8410](https://github.com/MetaMask/core/pull/8410)) - Export `TradeStruct` superstruct schema; derive `Trade` type via `Infer` ([#8410](https://github.com/MetaMask/core/pull/8410)) - Narrow `direction` to `'buy' | 'sell'` and `intent` to `'enter' | 'exit'` on `Trade` type ([#8410](https://github.com/MetaMask/core/pull/8410)) +### Fixed + +- Fix `fetchClosedPositions` using v2 URL instead of v1, which caused 404 errors since the closed positions endpoint only exists on v1 ([#8448](https://github.com/MetaMask/core/pull/8448)) + ### Changed - Bump `@metamask/messenger` from `^1.1.0` to `^1.1.1` ([#8373](https://github.com/MetaMask/core/pull/8373)) From b73dadc45476c34690f20176ff2feb95d793d129 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Wed, 15 Apr 2026 09:36:20 +0100 Subject: [PATCH 6/8] chore: clean up --- packages/social-controllers/CHANGELOG.md | 8 ++++---- packages/social-controllers/src/SocialService.ts | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/social-controllers/CHANGELOG.md b/packages/social-controllers/CHANGELOG.md index c8c4fba50db..edb4ecdfcc1 100644 --- a/packages/social-controllers/CHANGELOG.md +++ b/packages/social-controllers/CHANGELOG.md @@ -15,14 +15,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Export `TradeStruct` superstruct schema; derive `Trade` type via `Infer` ([#8410](https://github.com/MetaMask/core/pull/8410)) - Narrow `direction` to `'buy' | 'sell'` and `intent` to `'enter' | 'exit'` on `Trade` type ([#8410](https://github.com/MetaMask/core/pull/8410)) -### Fixed - -- Fix `fetchClosedPositions` using v2 URL instead of v1, which caused 404 errors since the closed positions endpoint only exists on v1 ([#8448](https://github.com/MetaMask/core/pull/8448)) - ### Changed - Bump `@metamask/messenger` from `^1.1.0` to `^1.1.1` ([#8373](https://github.com/MetaMask/core/pull/8373)) +### Fixed + +- Fix `fetchClosedPositions` using v2 URL instead of v1, which caused 404 errors since the closed positions endpoint only exists on v1 ([#8448](https://github.com/MetaMask/core/pull/8448)) + ## [0.1.0] ### Added diff --git a/packages/social-controllers/src/SocialService.ts b/packages/social-controllers/src/SocialService.ts index 8e8efa4b972..40a29d421fa 100644 --- a/packages/social-controllers/src/SocialService.ts +++ b/packages/social-controllers/src/SocialService.ts @@ -548,8 +548,7 @@ export class SocialService extends BaseDataService< page ?? null, ], queryFn: async () => { - const baseUrl = - status === 'open' ? this.#v2Url : this.#v1Url; + const baseUrl = status === 'open' ? this.#v2Url : this.#v1Url; const url = new URL( `${baseUrl}/traders/${encodeURIComponent(addressOrId)}/positions/${status}`, ); From a06df2e7c74a85d57d3c28e6a97ef2d06b7ddc49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3nio=20Regadas?= Date: Wed, 15 Apr 2026 09:48:11 +0100 Subject: [PATCH 7/8] Update packages/social-controllers/src/social-types.ts Co-authored-by: Devin Stewart <49423028+Bigshmow@users.noreply.github.com> --- packages/social-controllers/src/social-types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/social-controllers/src/social-types.ts b/packages/social-controllers/src/social-types.ts index 1cbac3aa25d..8bd50c72076 100644 --- a/packages/social-controllers/src/social-types.ts +++ b/packages/social-controllers/src/social-types.ts @@ -106,7 +106,7 @@ export type TraderStats = { roiPercent7d?: number | null; tradeCount7d?: number | null; /** Median holding time in minutes. */ - avgHoldMinutes?: number | null; +medianHoldMinutes?: number | null; }; export type PerChainBreakdown = { From d2d40e27b8d881b0d349a7bf0f155a87f2799ed0 Mon Sep 17 00:00:00 2001 From: Antonio Regadas Date: Wed, 15 Apr 2026 09:53:42 +0100 Subject: [PATCH 8/8] chore: lint fix and prettier --- packages/social-controllers/src/social-types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/social-controllers/src/social-types.ts b/packages/social-controllers/src/social-types.ts index 8bd50c72076..0766ea0fad5 100644 --- a/packages/social-controllers/src/social-types.ts +++ b/packages/social-controllers/src/social-types.ts @@ -106,7 +106,7 @@ export type TraderStats = { roiPercent7d?: number | null; tradeCount7d?: number | null; /** Median holding time in minutes. */ -medianHoldMinutes?: number | null; + medianHoldMinutes?: number | null; }; export type PerChainBreakdown = {