-
-
Notifications
You must be signed in to change notification settings - Fork 35
Description
Describe the bug
I'm working on adding some converters for some brokers and looking at the Coinbase converter for inspiration, and it seems that the Coinbase converter doesn't work if you change the currency from EUR to USD.
Version
Ghostfolio 2.219.0, in Docker
Expected behavior
Coinbase conversion should succeed and allow import into Ghostfolio.
Provide error input
Using samples/coinbase-export.csv, with EUR replaced with USD.
Ghostfolio error
[Nest] 7 - 11/26/2025, 12:12:59 AM ERROR [YahooFinanceService] Error: BTC-USD is not valid
at YahooFinanceDataEnhancerService.getAssetProfile (/ghostfolio/apps/api/main.js:1:507330)
at YahooFinanceService.getAssetProfile (/ghostfolio/apps/api/main.js:1:501057)
at DataProviderService.getAssetProfiles (/ghostfolio/apps/api/main.js:1:23299)
at ImportService.validateActivities (/ghostfolio/apps/api/main.js:1:933577)
at async ImportService.import (/ghostfolio/apps/api/main.js:1:928927)
at async ImportController.import (/ghostfolio/apps/api/main.js:1:921885)
[Nest] 7 - 11/26/2025, 12:12:59 AM ERROR [DataProviderService] AssetProfileInvalidError: No valid asset profiles have been found
at DataProviderService.getAssetProfiles (/ghostfolio/apps/api/main.js:1:23441)
at async ImportService.validateActivities (/ghostfolio/apps/api/main.js:1:933546)
at async ImportService.import (/ghostfolio/apps/api/main.js:1:928927)
at async ImportController.import (/ghostfolio/apps/api/main.js:1:921885)
[Nest] 7 - 11/26/2025, 12:12:59 AM ERROR [class ImportController{constructor(e,t,a){this.configurationService=e,this.importService=t,this.request=a}async import(e,t="false"){const a="true"===t;if(!(0,T.hasPermission)(this.request.user.permissions,T.permissions.createAccount))throw new O.HttpException((0,P.getReasonPhrase)(P.StatusCodes.FORBIDDEN),P.StatusCodes.FORBIDDEN);let r=this.configurationService.get("MAX_ACTIVITIES_TO_IMPORT");this.configurationService.get("ENABLE_FEATURE_SUBSCRIPTION")&&"Premium"===this.request.user.subscription.type&&(r=Number.MAX_SAFE_INTEGER);try{return{activities:await this.importService.import({isDryRun:a,maxActivitiesToImport:r,accountsWithBalancesDto:e.accounts??[],activitiesDto:e.activities,assetProfilesWithMarketDataDto:e.assetProfiles??[],tagsDto:e.tags??[],user:this.request.user})}}catch(i){throw O.Logger.error(i,o),new O.HttpException({error:(0,P.getReasonPhrase)(P.StatusCodes.BAD_REQUEST),message:[i.message]},P.StatusCodes.BAD_REQUEST)}}async gatherDividends(e,t){return{activities:await this.importService.getDividends({dataSource:e,symbol:t,userId:this.request.user.id})}}}] Error: activities.2.symbol ("BTC-USD") is not valid for the specified data source ("YAHOO")
at ImportService.validateActivities (/ghostfolio/apps/api/main.js:1:934191)
at async ImportService.import (/ghostfolio/apps/api/main.js:1:928927)
at async ImportController.import (/ghostfolio/apps/api/main.js:1:921885)
Additional context
This error is confusing to me because if you look on Yahoo Finance, BTC-USD (with a dash) is the slug for BTC. This is also the case for BTC-EUR. But if you remove the dash (BTCUSD) it will correctly import.
In contrast, importing BTC-EUR (with a dash) seems to work.
I'm not sure if this is a Ghostfolio issue or an issue with these converters, or maybe I'm missing something.
Also somewhat adjacent to this, if you import USD/USD or USD=X, it will import as the ticker for USD (which is not the currency USD as it probably should be). I'm new to Ghostfolio, so I'm not sure what is going on here.