@reown/appkit-solana-react-native 0.0.0-feat-multichain-20250516115442 → 0.0.0-feat-multichain-20250519172433

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,9 +15,11 @@ class SolanaAdapter extends _appkitCommonReactNative.SolanaBaseAdapter {
15
15
  });
16
16
  }
17
17
  async getBalance(params) {
18
+ console.log('solana getBalance');
18
19
  const {
19
20
  network,
20
- address
21
+ address,
22
+ tokens
21
23
  } = params;
22
24
  if (!this.connector) throw new Error('No active connector');
23
25
  if (!network) throw new Error('No network provided');
@@ -33,11 +35,24 @@ class SolanaAdapter extends _appkitCommonReactNative.SolanaBaseAdapter {
33
35
  if (!rpcUrl) throw new Error('No RPC URL available');
34
36
  const base58Address = balanceAddress.split(':')[2];
35
37
  if (!base58Address) throw new Error('Invalid balance address');
36
- const amount = await (0, _helpers.getSolanaBalance)(rpcUrl, base58Address);
37
- const balance = {
38
- amount: amount.toString(),
39
- symbol: network.nativeCurrency?.symbol ?? 'SOL'
40
- };
38
+ const token = network?.caipNetworkId && tokens?.[network.caipNetworkId]?.address;
39
+ let balance;
40
+ if (token) {
41
+ const {
42
+ amount,
43
+ symbol
44
+ } = await (0, _helpers.getSolanaTokenBalance)(rpcUrl, base58Address, token);
45
+ balance = {
46
+ amount,
47
+ symbol
48
+ };
49
+ } else {
50
+ const amount = await (0, _helpers.getSolanaNativeBalance)(rpcUrl, base58Address);
51
+ balance = {
52
+ amount: amount.toString(),
53
+ symbol: 'SOL'
54
+ };
55
+ }
41
56
  this.emit('balanceChanged', {
42
57
  namespace: this.getSupportedNamespace(),
43
58
  address: balanceAddress,
@@ -1 +1 @@
1
- {"version":3,"names":["_appkitCommonReactNative","require","_helpers","SolanaAdapter","SolanaBaseAdapter","supportedNamespace","constructor","configParams","projectId","getBalance","params","network","address","connector","Error","balanceAddress","getAccounts","find","account","includes","id","toString","amount","symbol","rpcUrl","rpcUrls","default","http","base58Address","split","getSolanaBalance","balance","nativeCurrency","emit","namespace","getSupportedNamespace","error","switchNetwork","provider","getProvider","switchError","namespaces","getNamespaces","accounts","disconnect","exports"],"sourceRoot":"../../src","sources":["adapter.ts"],"mappings":"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"}
1
+ {"version":3,"names":["_appkitCommonReactNative","require","_helpers","SolanaAdapter","SolanaBaseAdapter","supportedNamespace","constructor","configParams","projectId","getBalance","params","console","log","network","address","tokens","connector","Error","balanceAddress","getAccounts","find","account","includes","id","toString","amount","symbol","rpcUrl","rpcUrls","default","http","base58Address","split","token","caipNetworkId","balance","getSolanaTokenBalance","getSolanaNativeBalance","emit","namespace","getSupportedNamespace","error","switchNetwork","provider","getProvider","switchError","namespaces","getNamespaces","accounts","disconnect","exports"],"sourceRoot":"../../src","sources":["adapter.ts"],"mappings":"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"}
@@ -3,7 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getSolanaBalance = getSolanaBalance;
6
+ exports.getSolanaNativeBalance = getSolanaNativeBalance;
7
+ exports.getSolanaTokenBalance = getSolanaTokenBalance;
8
+ exports.getSolanaTokenMetadata = getSolanaTokenMetadata;
7
9
  exports.isSolanaAddress = isSolanaAddress;
8
10
  /**
9
11
  * Validates if the given string is a Solana address.
@@ -20,7 +22,7 @@ function isSolanaAddress(address) {
20
22
  * @param rpcUrl Solana RPC endpoint
21
23
  * @param address Solana public address (base58)
22
24
  */
23
- async function getSolanaBalance(rpcUrl, address) {
25
+ async function getSolanaNativeBalance(rpcUrl, address) {
24
26
  if (!isSolanaAddress(address)) {
25
27
  throw new Error('Invalid Solana address format');
26
28
  }
@@ -40,4 +42,53 @@ async function getSolanaBalance(rpcUrl, address) {
40
42
  if (json.error) throw new Error(json.error.message);
41
43
  return json.result.value / 1000000000; // Convert lamports to SOL
42
44
  }
45
+
46
+ let tokenCache = {};
47
+ /**
48
+ * Fetch metadata for a Solana SPL token using the Jupiter token list.
49
+ * @param mint - The token's mint address
50
+ * @returns TokenInfo if found, or undefined
51
+ */
52
+ async function getSolanaTokenMetadata(mint) {
53
+ // Return from cache if available
54
+ if (tokenCache[mint]) return tokenCache[mint];
55
+ try {
56
+ const res = await fetch('https://token.jup.ag/all');
57
+ const list = await res.json();
58
+ for (const token of list) {
59
+ tokenCache[token.address] = token;
60
+ }
61
+ return tokenCache[mint];
62
+ } catch (error) {
63
+ return undefined;
64
+ }
65
+ }
66
+ async function getSolanaTokenBalance(rpcUrl, address, tokenAddress) {
67
+ if (!isSolanaAddress(address)) {
68
+ throw new Error('Invalid Solana address format');
69
+ }
70
+ const token = await getSolanaTokenMetadata(tokenAddress);
71
+ const response = await fetch(rpcUrl, {
72
+ method: 'POST',
73
+ headers: {
74
+ 'Content-Type': 'application/json'
75
+ },
76
+ body: JSON.stringify({
77
+ jsonrpc: '2.0',
78
+ id: 1,
79
+ method: 'getTokenAccountsByOwner',
80
+ params: [address, {
81
+ mint: tokenAddress
82
+ }, {
83
+ encoding: 'jsonParsed'
84
+ }]
85
+ })
86
+ });
87
+ const result = await response.json();
88
+ const balance = result.result.value[0]?.account?.data?.parsed?.info?.tokenAmount?.uiAmount;
89
+ return {
90
+ amount: balance?.toString() ?? '0',
91
+ symbol: token?.symbol ?? 'SOL'
92
+ };
93
+ }
43
94
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["isSolanaAddress","address","solanaAddressRegex","test","getSolanaBalance","rpcUrl","Error","response","fetch","method","headers","body","JSON","stringify","jsonrpc","id","params","json","error","message","result","value"],"sourceRoot":"../../src","sources":["helpers.ts"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACO,SAASA,eAAeA,CAACC,OAAe,EAAW;EACxD,MAAMC,kBAAkB,GAAG,+BAA+B;EAE1D,OAAOA,kBAAkB,CAACC,IAAI,CAACF,OAAO,CAAC;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACO,eAAeG,gBAAgBA,CAACC,MAAc,EAAEJ,OAAe,EAAmB;EACvF,IAAI,CAACD,eAAe,CAACC,OAAO,CAAC,EAAE;IAC7B,MAAM,IAAIK,KAAK,CAAC,+BAA+B,CAAC;EAClD;EAEA,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAACH,MAAM,EAAE;IACnCI,MAAM,EAAE,MAAM;IACdC,OAAO,EAAE;MAAE,cAAc,EAAE;IAAmB,CAAC;IAC/CC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;MACnBC,OAAO,EAAE,KAAK;MACdC,EAAE,EAAE,CAAC;MACLN,MAAM,EAAE,YAAY;MACpBO,MAAM,EAAE,CAACf,OAAO;IAClB,CAAC;EACH,CAAC,CAAC;EAEF,MAAMgB,IAAI,GAAI,MAAMV,QAAQ,CAACU,IAAI,CAAC,CAGjC;EACD,IAAIA,IAAI,CAACC,KAAK,EAAE,MAAM,IAAIZ,KAAK,CAACW,IAAI,CAACC,KAAK,CAACC,OAAO,CAAC;EAEnD,OAAOF,IAAI,CAACG,MAAM,CAACC,KAAK,GAAG,UAAU,CAAC,CAAC;AACzC"}
1
+ {"version":3,"names":["isSolanaAddress","address","solanaAddressRegex","test","getSolanaNativeBalance","rpcUrl","Error","response","fetch","method","headers","body","JSON","stringify","jsonrpc","id","params","json","error","message","result","value","tokenCache","getSolanaTokenMetadata","mint","res","list","token","undefined","getSolanaTokenBalance","tokenAddress","encoding","balance","account","data","parsed","info","tokenAmount","uiAmount","amount","toString","symbol"],"sourceRoot":"../../src","sources":["helpers.ts"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { SolanaBaseAdapter } from '@reown/appkit-common-react-native';
2
- import { getSolanaBalance } from './helpers';
2
+ import { getSolanaNativeBalance, getSolanaTokenBalance } from './helpers';
3
3
  export class SolanaAdapter extends SolanaBaseAdapter {
4
4
  static supportedNamespace = 'solana';
5
5
  constructor(configParams) {
@@ -9,9 +9,11 @@ export class SolanaAdapter extends SolanaBaseAdapter {
9
9
  });
10
10
  }
11
11
  async getBalance(params) {
12
+ console.log('solana getBalance');
12
13
  const {
13
14
  network,
14
- address
15
+ address,
16
+ tokens
15
17
  } = params;
16
18
  if (!this.connector) throw new Error('No active connector');
17
19
  if (!network) throw new Error('No network provided');
@@ -27,11 +29,24 @@ export class SolanaAdapter extends SolanaBaseAdapter {
27
29
  if (!rpcUrl) throw new Error('No RPC URL available');
28
30
  const base58Address = balanceAddress.split(':')[2];
29
31
  if (!base58Address) throw new Error('Invalid balance address');
30
- const amount = await getSolanaBalance(rpcUrl, base58Address);
31
- const balance = {
32
- amount: amount.toString(),
33
- symbol: network.nativeCurrency?.symbol ?? 'SOL'
34
- };
32
+ const token = network?.caipNetworkId && tokens?.[network.caipNetworkId]?.address;
33
+ let balance;
34
+ if (token) {
35
+ const {
36
+ amount,
37
+ symbol
38
+ } = await getSolanaTokenBalance(rpcUrl, base58Address, token);
39
+ balance = {
40
+ amount,
41
+ symbol
42
+ };
43
+ } else {
44
+ const amount = await getSolanaNativeBalance(rpcUrl, base58Address);
45
+ balance = {
46
+ amount: amount.toString(),
47
+ symbol: 'SOL'
48
+ };
49
+ }
35
50
  this.emit('balanceChanged', {
36
51
  namespace: this.getSupportedNamespace(),
37
52
  address: balanceAddress,
@@ -1 +1 @@
1
- {"version":3,"names":["SolanaBaseAdapter","getSolanaBalance","SolanaAdapter","supportedNamespace","constructor","configParams","projectId","getBalance","params","network","address","connector","Error","balanceAddress","getAccounts","find","account","includes","id","toString","amount","symbol","rpcUrl","rpcUrls","default","http","base58Address","split","balance","nativeCurrency","emit","namespace","getSupportedNamespace","error","switchNetwork","provider","getProvider","switchError","namespaces","getNamespaces","accounts","disconnect"],"sourceRoot":"../../src","sources":["adapter.ts"],"mappings":"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"}
1
+ {"version":3,"names":["SolanaBaseAdapter","getSolanaNativeBalance","getSolanaTokenBalance","SolanaAdapter","supportedNamespace","constructor","configParams","projectId","getBalance","params","console","log","network","address","tokens","connector","Error","balanceAddress","getAccounts","find","account","includes","id","toString","amount","symbol","rpcUrl","rpcUrls","default","http","base58Address","split","token","caipNetworkId","balance","emit","namespace","getSupportedNamespace","error","switchNetwork","provider","getProvider","switchError","namespaces","getNamespaces","accounts","disconnect"],"sourceRoot":"../../src","sources":["adapter.ts"],"mappings":"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"}
@@ -13,7 +13,7 @@ export function isSolanaAddress(address) {
13
13
  * @param rpcUrl Solana RPC endpoint
14
14
  * @param address Solana public address (base58)
15
15
  */
16
- export async function getSolanaBalance(rpcUrl, address) {
16
+ export async function getSolanaNativeBalance(rpcUrl, address) {
17
17
  if (!isSolanaAddress(address)) {
18
18
  throw new Error('Invalid Solana address format');
19
19
  }
@@ -33,4 +33,53 @@ export async function getSolanaBalance(rpcUrl, address) {
33
33
  if (json.error) throw new Error(json.error.message);
34
34
  return json.result.value / 1000000000; // Convert lamports to SOL
35
35
  }
36
+
37
+ let tokenCache = {};
38
+ /**
39
+ * Fetch metadata for a Solana SPL token using the Jupiter token list.
40
+ * @param mint - The token's mint address
41
+ * @returns TokenInfo if found, or undefined
42
+ */
43
+ export async function getSolanaTokenMetadata(mint) {
44
+ // Return from cache if available
45
+ if (tokenCache[mint]) return tokenCache[mint];
46
+ try {
47
+ const res = await fetch('https://token.jup.ag/all');
48
+ const list = await res.json();
49
+ for (const token of list) {
50
+ tokenCache[token.address] = token;
51
+ }
52
+ return tokenCache[mint];
53
+ } catch (error) {
54
+ return undefined;
55
+ }
56
+ }
57
+ export async function getSolanaTokenBalance(rpcUrl, address, tokenAddress) {
58
+ if (!isSolanaAddress(address)) {
59
+ throw new Error('Invalid Solana address format');
60
+ }
61
+ const token = await getSolanaTokenMetadata(tokenAddress);
62
+ const response = await fetch(rpcUrl, {
63
+ method: 'POST',
64
+ headers: {
65
+ 'Content-Type': 'application/json'
66
+ },
67
+ body: JSON.stringify({
68
+ jsonrpc: '2.0',
69
+ id: 1,
70
+ method: 'getTokenAccountsByOwner',
71
+ params: [address, {
72
+ mint: tokenAddress
73
+ }, {
74
+ encoding: 'jsonParsed'
75
+ }]
76
+ })
77
+ });
78
+ const result = await response.json();
79
+ const balance = result.result.value[0]?.account?.data?.parsed?.info?.tokenAmount?.uiAmount;
80
+ return {
81
+ amount: balance?.toString() ?? '0',
82
+ symbol: token?.symbol ?? 'SOL'
83
+ };
84
+ }
36
85
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["isSolanaAddress","address","solanaAddressRegex","test","getSolanaBalance","rpcUrl","Error","response","fetch","method","headers","body","JSON","stringify","jsonrpc","id","params","json","error","message","result","value"],"sourceRoot":"../../src","sources":["helpers.ts"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,eAAeA,CAACC,OAAe,EAAW;EACxD,MAAMC,kBAAkB,GAAG,+BAA+B;EAE1D,OAAOA,kBAAkB,CAACC,IAAI,CAACF,OAAO,CAAC;AACzC;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeG,gBAAgBA,CAACC,MAAc,EAAEJ,OAAe,EAAmB;EACvF,IAAI,CAACD,eAAe,CAACC,OAAO,CAAC,EAAE;IAC7B,MAAM,IAAIK,KAAK,CAAC,+BAA+B,CAAC;EAClD;EAEA,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAACH,MAAM,EAAE;IACnCI,MAAM,EAAE,MAAM;IACdC,OAAO,EAAE;MAAE,cAAc,EAAE;IAAmB,CAAC;IAC/CC,IAAI,EAAEC,IAAI,CAACC,SAAS,CAAC;MACnBC,OAAO,EAAE,KAAK;MACdC,EAAE,EAAE,CAAC;MACLN,MAAM,EAAE,YAAY;MACpBO,MAAM,EAAE,CAACf,OAAO;IAClB,CAAC;EACH,CAAC,CAAC;EAEF,MAAMgB,IAAI,GAAI,MAAMV,QAAQ,CAACU,IAAI,CAAC,CAGjC;EACD,IAAIA,IAAI,CAACC,KAAK,EAAE,MAAM,IAAIZ,KAAK,CAACW,IAAI,CAACC,KAAK,CAACC,OAAO,CAAC;EAEnD,OAAOF,IAAI,CAACG,MAAM,CAACC,KAAK,GAAG,UAAU,CAAC,CAAC;AACzC"}
1
+ {"version":3,"names":["isSolanaAddress","address","solanaAddressRegex","test","getSolanaNativeBalance","rpcUrl","Error","response","fetch","method","headers","body","JSON","stringify","jsonrpc","id","params","json","error","message","result","value","tokenCache","getSolanaTokenMetadata","mint","res","list","token","undefined","getSolanaTokenBalance","tokenAddress","encoding","balance","account","data","parsed","info","tokenAmount","uiAmount","amount","toString","symbol"],"sourceRoot":"../../src","sources":["helpers.ts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,mCAAmC,CAAC;AAG3C,qBAAa,aAAc,SAAQ,iBAAiB;IAClD,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA4B;gBAEjD,YAAY,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE;IAOzC,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwCjE,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1D,WAAW,IAAI,WAAW,EAAE,GAAG,SAAS;IAOxC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,qBAAqB,IAAI,cAAc;CAGxC"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,mCAAmC,CAAC;AAG3C,qBAAa,aAAc,SAAQ,iBAAiB;IAClD,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAA4B;gBAEjD,YAAY,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE;IAOzC,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmDjE,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1D,WAAW,IAAI,WAAW,EAAE,GAAG,SAAS;IAOxC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,qBAAqB,IAAI,cAAc;CAGxC"}
@@ -1,3 +1,10 @@
1
+ export interface TokenInfo {
2
+ address: string;
3
+ symbol: string;
4
+ name: string;
5
+ decimals: number;
6
+ logoURI?: string;
7
+ }
1
8
  /**
2
9
  * Validates if the given string is a Solana address.
3
10
  * @param address The string to validate.
@@ -9,5 +16,15 @@ export declare function isSolanaAddress(address: string): boolean;
9
16
  * @param rpcUrl Solana RPC endpoint
10
17
  * @param address Solana public address (base58)
11
18
  */
12
- export declare function getSolanaBalance(rpcUrl: string, address: string): Promise<number>;
19
+ export declare function getSolanaNativeBalance(rpcUrl: string, address: string): Promise<number>;
20
+ /**
21
+ * Fetch metadata for a Solana SPL token using the Jupiter token list.
22
+ * @param mint - The token's mint address
23
+ * @returns TokenInfo if found, or undefined
24
+ */
25
+ export declare function getSolanaTokenMetadata(mint: string): Promise<TokenInfo | undefined>;
26
+ export declare function getSolanaTokenBalance(rpcUrl: string, address: string, tokenAddress: string): Promise<{
27
+ amount: string;
28
+ symbol: string;
29
+ }>;
13
30
  //# sourceMappingURL=helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAIxD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBvF"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAIxD;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuB7F;AAGD;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAgBzF;AAED,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAsB7C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reown/appkit-solana-react-native",
3
- "version": "0.0.0-feat-multichain-20250516115442",
3
+ "version": "0.0.0-feat-multichain-20250519172433",
4
4
  "main": "lib/commonjs/index.js",
5
5
  "types": "lib/typescript/index.d.ts",
6
6
  "module": "lib/module/index.js",
@@ -38,7 +38,7 @@
38
38
  "access": "public"
39
39
  },
40
40
  "dependencies": {
41
- "@reown/appkit-common-react-native": "0.0.0-feat-multichain-20250516115442"
41
+ "@reown/appkit-common-react-native": "0.0.0-feat-multichain-20250519172433"
42
42
  },
43
43
  "react-native": "src/index.tsx"
44
44
  }
package/src/adapter.ts CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  type GetBalanceParams,
7
7
  type GetBalanceResponse
8
8
  } from '@reown/appkit-common-react-native';
9
- import { getSolanaBalance } from './helpers';
9
+ import { getSolanaNativeBalance, getSolanaTokenBalance } from './helpers';
10
10
 
11
11
  export class SolanaAdapter extends SolanaBaseAdapter {
12
12
  private static supportedNamespace: ChainNamespace = 'solana';
@@ -19,7 +19,8 @@ export class SolanaAdapter extends SolanaBaseAdapter {
19
19
  }
20
20
 
21
21
  async getBalance(params: GetBalanceParams): Promise<GetBalanceResponse> {
22
- const { network, address } = params;
22
+ console.log('solana getBalance');
23
+ const { network, address, tokens } = params;
23
24
 
24
25
  if (!this.connector) throw new Error('No active connector');
25
26
  if (!network) throw new Error('No network provided');
@@ -39,12 +40,22 @@ export class SolanaAdapter extends SolanaBaseAdapter {
39
40
 
40
41
  if (!base58Address) throw new Error('Invalid balance address');
41
42
 
42
- const amount = await getSolanaBalance(rpcUrl, base58Address);
43
-
44
- const balance = {
45
- amount: amount.toString(),
46
- symbol: network.nativeCurrency?.symbol ?? 'SOL'
47
- };
43
+ const token = network?.caipNetworkId && tokens?.[network.caipNetworkId]?.address;
44
+ let balance;
45
+
46
+ if (token) {
47
+ const { amount, symbol } = await getSolanaTokenBalance(rpcUrl, base58Address, token);
48
+ balance = {
49
+ amount,
50
+ symbol
51
+ };
52
+ } else {
53
+ const amount = await getSolanaNativeBalance(rpcUrl, base58Address);
54
+ balance = {
55
+ amount: amount.toString(),
56
+ symbol: 'SOL'
57
+ };
58
+ }
48
59
 
49
60
  this.emit('balanceChanged', {
50
61
  namespace: this.getSupportedNamespace(),
package/src/helpers.ts CHANGED
@@ -1,3 +1,11 @@
1
+ export interface TokenInfo {
2
+ address: string;
3
+ symbol: string;
4
+ name: string;
5
+ decimals: number;
6
+ logoURI?: string;
7
+ }
8
+
1
9
  /**
2
10
  * Validates if the given string is a Solana address.
3
11
  * @param address The string to validate.
@@ -14,7 +22,7 @@ export function isSolanaAddress(address: string): boolean {
14
22
  * @param rpcUrl Solana RPC endpoint
15
23
  * @param address Solana public address (base58)
16
24
  */
17
- export async function getSolanaBalance(rpcUrl: string, address: string): Promise<number> {
25
+ export async function getSolanaNativeBalance(rpcUrl: string, address: string): Promise<number> {
18
26
  if (!isSolanaAddress(address)) {
19
27
  throw new Error('Invalid Solana address format');
20
28
  }
@@ -38,3 +46,55 @@ export async function getSolanaBalance(rpcUrl: string, address: string): Promise
38
46
 
39
47
  return json.result.value / 1000000000; // Convert lamports to SOL
40
48
  }
49
+
50
+ let tokenCache: Record<string, TokenInfo> = {};
51
+ /**
52
+ * Fetch metadata for a Solana SPL token using the Jupiter token list.
53
+ * @param mint - The token's mint address
54
+ * @returns TokenInfo if found, or undefined
55
+ */
56
+ export async function getSolanaTokenMetadata(mint: string): Promise<TokenInfo | undefined> {
57
+ // Return from cache if available
58
+ if (tokenCache[mint]) return tokenCache[mint];
59
+
60
+ try {
61
+ const res = await fetch('https://token.jup.ag/all');
62
+ const list: TokenInfo[] = await res.json();
63
+
64
+ for (const token of list) {
65
+ tokenCache[token.address] = token;
66
+ }
67
+
68
+ return tokenCache[mint];
69
+ } catch (error) {
70
+ return undefined;
71
+ }
72
+ }
73
+
74
+ export async function getSolanaTokenBalance(
75
+ rpcUrl: string,
76
+ address: string,
77
+ tokenAddress: string
78
+ ): Promise<{ amount: string; symbol: string }> {
79
+ if (!isSolanaAddress(address)) {
80
+ throw new Error('Invalid Solana address format');
81
+ }
82
+
83
+ const token = await getSolanaTokenMetadata(tokenAddress);
84
+
85
+ const response = await fetch(rpcUrl, {
86
+ method: 'POST',
87
+ headers: { 'Content-Type': 'application/json' },
88
+ body: JSON.stringify({
89
+ jsonrpc: '2.0',
90
+ id: 1,
91
+ method: 'getTokenAccountsByOwner',
92
+ params: [address, { mint: tokenAddress }, { encoding: 'jsonParsed' }]
93
+ })
94
+ });
95
+
96
+ const result = await response.json();
97
+ const balance = result.result.value[0]?.account?.data?.parsed?.info?.tokenAmount?.uiAmount;
98
+
99
+ return { amount: balance?.toString() ?? '0', symbol: token?.symbol ?? 'SOL' };
100
+ }