Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .changeset/solana-wallet-name.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@alien-id/sso-solana": minor
"@alien-id/sso-solana-react": minor
---

Add optional `walletName` argument to `generateDeeplink`. When provided, it is sent as `wallet_name` in `POST /solana/link` and embedded in the signed deeplink so the Alien app can display the source wallet (e.g. phantom, solflare). Backward compatible — omitting it behaves as before.
3 changes: 3 additions & 0 deletions packages/solanaCore/jest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ const config: Config.InitialOptions = {
globals: {
'ts-jest': {
useESM: true,
// ES2020 keeps native BigInt ** (ES2015 downlevels it to Math.pow,
// which breaks @noble/curves when transformed here).
tsconfig: { target: 'ES2020' },
},
},
transform: {
Expand Down
6 changes: 5 additions & 1 deletion packages/solanaCore/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,13 @@ export class AlienSolanaSsoClient {
);
}

async generateDeeplink(solanaAddress: string): Promise<SolanaLinkResponse> {
async generateDeeplink(
solanaAddress: string,
walletName?: string
): Promise<SolanaLinkResponse> {
const linkPayload: SolanaLinkRequest = {
solana_address: solanaAddress,
...(walletName ? { wallet_name: walletName } : {}),
};

SolanaLinkRequestSchema.parse(linkPayload);
Expand Down
1 change: 1 addition & 0 deletions packages/solanaCore/src/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { z } from 'zod/v4-mini';
*/
export const SolanaLinkRequestSchema = z.object({
solana_address: z.string(),
wallet_name: z.optional(z.string()),
});
export type SolanaLinkRequest = z.infer<typeof SolanaLinkRequestSchema>;

Expand Down
47 changes: 47 additions & 0 deletions packages/solanaCore/tests/generateDeeplink.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { AlienSolanaSsoClient } from '../src/client';

describe('generateDeeplink — wallet_name', () => {
const config = {
ssoBaseUrl: 'https://sso.develop.alien-api.com',
providerAddress: '00000001040000000000000100000000',
};

const linkResponse = {
deep_link: 'https://s.alien-api.com/abc',
polling_code: 'poll-code',
expired_at: 1780000000,
};

let fetchMock: jest.Mock;

beforeEach(() => {
fetchMock = jest.fn().mockResolvedValue({
ok: true,
json: async () => linkResponse,
});
global.fetch = fetchMock as unknown as typeof fetch;
});

const getBody = () => JSON.parse(fetchMock.mock.calls[0][1].body);

it('includes wallet_name when provided', async () => {
const client = new AlienSolanaSsoClient(config);
await client.generateDeeplink('7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU', 'phantom');

expect(getBody()).toEqual({
solana_address: '7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU',
wallet_name: 'phantom',
});
});

it('omits wallet_name when not provided', async () => {
const client = new AlienSolanaSsoClient(config);
await client.generateDeeplink('7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU');

const body = getBody();
expect(body).toEqual({
solana_address: '7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU',
});
expect(body).not.toHaveProperty('wallet_name');
});
});
7 changes: 4 additions & 3 deletions packages/solanaReact/lib/providers/AlienSolanaSsoProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ type SolanaSsoContextValue = {
connectionAdapter: SolanaConnectionAdapter;
queryClient: QueryClient;
generateDeeplink: (
solanaAddress: string
solanaAddress: string,
walletName?: string
) => Promise<import("@alien-id/sso-solana").SolanaLinkResponse>;
pollAuth: (pollingCode: string) => Promise<import("@alien-id/sso-solana").SolanaPollResponse>;
verifyAttestation: (solanaAddress: string) => Promise<string | null>;
Expand Down Expand Up @@ -114,8 +115,8 @@ export function AlienSolanaSsoProvider({
});

const generateDeeplink = useCallback(
async (solanaAddress: string) => {
return await client.generateDeeplink(solanaAddress);
async (solanaAddress: string, walletName?: string) => {
return await client.generateDeeplink(solanaAddress, walletName);
},
[client]
);
Expand Down