From a899f00bef6821f3cbbc9e31508ed5ad47cfce7c Mon Sep 17 00:00:00 2001 From: Raymond Jacobson Date: Tue, 16 Dec 2025 17:27:23 -0800 Subject: [PATCH 1/2] Replace ipdata with geoip db lookup --- .../apps/solana-relay/src/config.ts | 7 --- .../apps/solana-relay/src/utils/ipData.ts | 23 ++-------- packages/identity-service/default-config.json | 1 - packages/identity-service/src/config.js | 6 --- .../identity-service/src/routes/location.js | 46 ++++++++++++++++--- .../src/routes/trackListens.js | 11 +---- .../identity-service/src/solana-client.js | 15 ++---- 7 files changed, 48 insertions(+), 61 deletions(-) diff --git a/packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/config.ts b/packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/config.ts index 954b756be9c..4cc40abf41a 100644 --- a/packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/config.ts +++ b/packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/config.ts @@ -47,7 +47,6 @@ type Config = { bonkMintAddress: string solanaFeePayerWallets: Keypair[] delegatePrivateKey: Buffer - ipdataApiKey: string | null listensValidSigner: string solanaSignerPrivateKey: string identityRelayerPublicKey: string @@ -136,10 +135,6 @@ const readConfig = (): Config => { solana_relay_server_host: str({ default: '0.0.0.0' }), solana_relay_server_port: num({ default: 6002 }), audius_delegate_private_key: str({ default: '' }), - audius_ipdata_api_key: str({ - // Throwaway test key - default: '01b633611c0b57babd56a6fdf7400b21340956e1840da6dd788f9c37' - }), audius_solana_eth_registry_program: str({ default: 'testBgRfFcage1hN7zmTsktdQCJZkHEhM1eguYPaeKg' }), @@ -203,8 +198,6 @@ const readConfig = (): Config => { bonkMintAddress: env.audius_solana_bonk_mint, solanaFeePayerWallets, delegatePrivateKey, - ipdataApiKey: - env.audius_ipdata_api_key === '' ? null : env.audius_ipdata_api_key, listensValidSigner: env.audius_solana_listens_valid_signer, ethRegistryProgramId: env.audius_solana_eth_registry_program, solanaSignerPrivateKey: env.audius_solana_signer_private_key, diff --git a/packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/utils/ipData.ts b/packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/utils/ipData.ts index c02dcb3f719..d8239f301e3 100644 --- a/packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/utils/ipData.ts +++ b/packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/utils/ipData.ts @@ -3,7 +3,6 @@ import { Request } from 'express' import { Logger } from 'pino' import { getClientIp } from 'request-ip' -import { config } from '../config' import { logger } from '../logger' export type LocationData = { @@ -12,29 +11,14 @@ export type LocationData = { country: string } | null -// gets ip data from api.ipdata.co, returns an empty object {} if api key not configured or an error occurs +// gets ip data from a validator node export const getIpData = async ( logger: Logger, ip: string ): Promise => { - const ipdataApiKey = config.ipdataApiKey - if (ipdataApiKey === null) { - logger.warn({}, 'ip data requested but api key not configured') - return null - } - const url = `https://api.ipdata.co/${ip}?api-key=${ipdataApiKey}` + const url = `https://creatornode.audius.co/storage.v1.StorageService/GetIPData?ip=${ip}` try { - const response = await axios - .get(url) - .then( - ({ - data: { city, region, country_name } - }: { - data: { city: string; region: string; country_name: string } - }) => { - return { city, region, country: country_name } - } - ) + const { data: response } = await axios.get(url) return response } catch (e: unknown) { logger.error({ error: e }, 'error requesting ip data') @@ -42,7 +26,6 @@ export const getIpData = async ( } } -// gets ip data from api.ipdata.co, returns an empty object {} if api key not configured or an error occurs export const getRequestIpData = async ( logger: Logger, req: Request diff --git a/packages/identity-service/default-config.json b/packages/identity-service/default-config.json index ee6f8d9fcfa..7c2116c9c98 100644 --- a/packages/identity-service/default-config.json +++ b/packages/identity-service/default-config.json @@ -4,7 +4,6 @@ "redisHost": "identity-redis", "redisPort": 6379, "logLevel": "debug", - "ipdataAPIKey": "", "twitterAPIKey": "", "twitterAPISecret": "", "twitterBearerToken": "", diff --git a/packages/identity-service/src/config.js b/packages/identity-service/src/config.js index ecbf59ec86b..faab9700b01 100644 --- a/packages/identity-service/src/config.js +++ b/packages/identity-service/src/config.js @@ -599,12 +599,6 @@ const config = convict({ env: 'hCaptchaSecret', default: '' }, - ipdataAPIKey: { - doc: 'API Key for ipdata', - format: String, - env: 'ipdataAPIKey', - default: '' - }, plaidClientId: { doc: 'Plaid client ID', format: String, diff --git a/packages/identity-service/src/routes/location.js b/packages/identity-service/src/routes/location.js index bda062ae706..c875c1e1af5 100644 --- a/packages/identity-service/src/routes/location.js +++ b/packages/identity-service/src/routes/location.js @@ -9,7 +9,39 @@ const { const config = require('../config') const { logger } = require('../logging') -const IP_API_KEY = config.get('ipdataAPIKey') +const isEU = (countryCode) => { + return [ + 'AT', + 'BE', + 'BG', + 'HR', + 'CY', + 'CZ', + 'DK', + 'EE', + 'FI', + 'FR', + 'DE', + 'GR', + 'HU', + 'IE', + 'IT', + 'LV', + 'LT', + 'LU', + 'MT', + 'NL', + 'PL', + 'PT', + 'RO', + 'SK', + 'SI', + 'ES', + 'SE', + 'GB', + 'UK' + ].includes(countryCode) +} module.exports = function (app) { app.get( @@ -22,16 +54,16 @@ module.exports = function (app) { if (ip.startsWith('::ffff:')) { ip = ip.slice(7) } - const url = `https://api.ipdata.co/${ip}` + const url = `https://creatornode.audius.co/storage.v1.StorageService/GetIPData?ip=${ip}` try { const res = await axios({ method: 'get', - url, - params: { - 'api-key': IP_API_KEY - } + url + }) + return successResponse({ + ...res.data, + in_eu: isEU(res.data.countryCode) }) - return successResponse({ ...res.data, in_eu: res.data.is_eu }) } catch (e) { logger.error(`Got error in location: ${e.response?.data}`) return errorResponse(e.response?.status, e.response?.data) diff --git a/packages/identity-service/src/routes/trackListens.js b/packages/identity-service/src/routes/trackListens.js index d18338cbbbc..730f2d8803b 100644 --- a/packages/identity-service/src/routes/trackListens.js +++ b/packages/identity-service/src/routes/trackListens.js @@ -534,16 +534,9 @@ module.exports = function (app) { ) let location try { - const url = `https://api.ipdata.co/${ip}?api-key=${config.get( - 'ipdataAPIKey' - )}` + const url = `https://creatornode.audius.co/storage.v1.StorageService/GetIPData?ip=${ip}` - const locationResponse = (await axios.get(url)).data - location = { - city: locationResponse.city, - region: locationResponse.region, - country: locationResponse.country_name - } + const location = (await axios.get(url)).data } catch (e) { req.logger.error( `TrackListen location fetch failed: ${e}, trackId=${trackId} userId=${userId}, ${JSON.stringify( diff --git a/packages/identity-service/src/solana-client.js b/packages/identity-service/src/solana-client.js index 3268121bb00..c1f43b3abd7 100644 --- a/packages/identity-service/src/solana-client.js +++ b/packages/identity-service/src/solana-client.js @@ -100,9 +100,9 @@ function getFeePayerKeypair(singleFeePayer = true) { if (!feePayerKeypairs) { feePayerKeypairs = config.get('solanaFeePayerWallets') ? config - .get('solanaFeePayerWallets') - .map((item) => item.privateKey) - .map((key) => solanaWeb3.Keypair.fromSecretKey(Uint8Array.from(key))) + .get('solanaFeePayerWallets') + .map((item) => item.privateKey) + .map((key) => solanaWeb3.Keypair.fromSecretKey(Uint8Array.from(key))) : null } if (!feePayerKeypair) { @@ -171,18 +171,11 @@ async function createTrackListenInstructions({ accInfo.data.toJSON().data.slice(1, 33) ) // cut off version and eth address from valid signer data - let sourceData - if (config.get('ipdataAPIKey')) { - sourceData = JSON.stringify({ source, location }) - } else { - sourceData = source - } - // max sol tx size is 1232 bytes const trackData = new TrackData({ userId, trackId, - source: sourceData, // use api key as feature flag + source, timestamp: (await getListenTimestamp(connection)) || Math.round(new Date().getTime() / 1000) From b58a9cf55ffe7d4641cb32244a7067f5ba47794a Mon Sep 17 00:00:00 2001 From: Raymond Jacobson Date: Wed, 17 Dec 2025 09:13:57 -0800 Subject: [PATCH 2/2] Fix lint --- packages/identity-service/src/solana-client.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/identity-service/src/solana-client.js b/packages/identity-service/src/solana-client.js index c1f43b3abd7..2ec6f37e080 100644 --- a/packages/identity-service/src/solana-client.js +++ b/packages/identity-service/src/solana-client.js @@ -100,9 +100,9 @@ function getFeePayerKeypair(singleFeePayer = true) { if (!feePayerKeypairs) { feePayerKeypairs = config.get('solanaFeePayerWallets') ? config - .get('solanaFeePayerWallets') - .map((item) => item.privateKey) - .map((key) => solanaWeb3.Keypair.fromSecretKey(Uint8Array.from(key))) + .get('solanaFeePayerWallets') + .map((item) => item.privateKey) + .map((key) => solanaWeb3.Keypair.fromSecretKey(Uint8Array.from(key))) : null } if (!feePayerKeypair) {