Skip to content

Commit 560b196

Browse files
committed
feat: v2 dapp messages
1 parent 7a3da76 commit 560b196

31 files changed

+656
-315
lines changed

packages/blockchain-sdk-solana/src/auth/v2/sign-message/solana-sign-message-v2-authentication-facade-factory.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
Ed25519TokenBodyParser,
66
TokenParser,
77
TokenSigner,
8+
AuthV2Api,
89
} from '@dialectlabs/sdk';
910

1011
import { SolanaSignMessageV2TokenGenerator } from './solana-sign-message-v2-token-generator';
@@ -28,7 +29,10 @@ export class SolanaSignMessageV2AuthenticationFacadeFactory extends Authenticati
2829
get(): AuthenticationFacade {
2930
return new AuthenticationFacade(
3031
this.tokenSigner,
31-
new SolanaSignMessageV2TokenGenerator(this.tokenSigner, this.baseUrl),
32+
new SolanaSignMessageV2TokenGenerator(
33+
this.tokenSigner,
34+
new AuthV2Api(this.baseUrl),
35+
),
3236
SolanaSignMessageV2AuthenticationFacadeFactory.createAuthenticator(),
3337
);
3438
}

packages/blockchain-sdk-solana/src/auth/v2/sign-message/solana-sign-message-v2-token-generator.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,35 @@
11
import {
2+
type AuthV2Api,
23
bytesFromBase64,
34
jsonParseFromBase64,
45
type Token,
56
TokenGenerator,
67
type TokenSigner,
78
} from '@dialectlabs/sdk';
8-
import axios from 'axios';
99
import bs58 from 'bs58';
1010

1111
export class SolanaSignMessageV2TokenGenerator extends TokenGenerator {
12-
constructor(signer: TokenSigner, private readonly v2BaseUrl: string) {
12+
constructor(signer: TokenSigner, private readonly api: AuthV2Api) {
1313
super(signer);
1414
}
1515

1616
override async generate(): Promise<Token> {
17-
const prepareResponse = await axios.post<{ message: string }>(
18-
`${this.v2BaseUrl}/v2/auth/solana/prepare`,
19-
{ walletAddress: this.signer.subject },
17+
const prepareResponse = await this.api.prepareSolanaAuth(
18+
this.signer.subject,
2019
);
2120

22-
const messageToSign = prepareResponse.data.message;
21+
const messageToSign = prepareResponse.message;
2322

2423
const { signature } = await this.signer.sign(
2524
new TextEncoder().encode(messageToSign),
2625
);
2726

28-
const tokenResponse = await axios.post<{ token: string }>(
29-
`${this.v2BaseUrl}/v2/auth/solana/verify`,
30-
{
31-
message: messageToSign,
32-
signature: bs58.encode(signature),
33-
},
27+
const tokenResponse = await this.api.verifySolanaAuth(
28+
messageToSign,
29+
bs58.encode(signature),
3430
);
3531

36-
const tokenStr = tokenResponse.data.token;
32+
const tokenStr = tokenResponse.token;
3733

3834
const [base64Header, base64Body, base64Signature] = tokenStr.split('.');
3935
if (!base64Header || !base64Body || !base64Signature) {

packages/blockchain-sdk-solana/src/auth/v2/sign-tx/solana-sign-tx-v2-authentication-facade-factory.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {
2+
AuthV2Api,
23
AuthenticationFacade,
34
AuthenticationFacadeFactory,
45
Authenticator,
@@ -28,7 +29,10 @@ export class SolanaSignTxV2AuthenticationFacadeFactory extends AuthenticationFac
2829
get(): AuthenticationFacade {
2930
return new AuthenticationFacade(
3031
this.tokenSigner,
31-
new SolanaSignTxV2TokenGenerator(this.tokenSigner, this.baseUrl),
32+
new SolanaSignTxV2TokenGenerator(
33+
this.tokenSigner,
34+
new AuthV2Api(this.baseUrl),
35+
),
3236
SolanaSignTxV2AuthenticationFacadeFactory.createAuthenticator(),
3337
);
3438
}

packages/blockchain-sdk-solana/src/auth/v2/sign-tx/solana-sign-tx-v2-token-generator.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,33 @@
11
import {
22
bytesFromBase64,
33
jsonParseFromBase64,
4+
type AuthV2Api,
45
type Token,
56
TokenGenerator,
67
type TokenSigner,
78
} from '@dialectlabs/sdk';
8-
import axios from 'axios';
99

1010
export class SolanaSignTxV2TokenGenerator extends TokenGenerator {
11-
constructor(signer: TokenSigner, private readonly v2BaseUrl: string) {
11+
constructor(signer: TokenSigner, private readonly api: AuthV2Api) {
1212
super(signer);
1313
}
1414

1515
override async generate(): Promise<Token> {
16-
const prepareResponse = await axios.post<{ transaction: string }>(
17-
`${this.v2BaseUrl}/v2/auth/solana-tx/prepare`,
18-
{ walletAddress: this.signer.subject },
16+
const prepareResponse = await this.api.prepareSolanaTxAuth(
17+
this.signer.subject,
1918
);
2019

21-
const transactionBase64 = prepareResponse.data.transaction;
20+
const transactionBase64 = prepareResponse.transaction;
2221

2322
const { signature } = await this.signer.sign(
2423
Buffer.from(transactionBase64, 'base64'),
2524
);
2625

27-
const tokenResponse = await axios.post<{ token: string }>(
28-
`${this.v2BaseUrl}/v2/auth/solana-tx/verify`,
29-
{
30-
transaction: Buffer.from(signature).toString('base64'),
31-
},
26+
const tokenResponse = await this.api.verifySolanaTxAuth(
27+
Buffer.from(signature).toString('base64'),
3228
);
3329

34-
const tokenStr = tokenResponse.data.token;
30+
const tokenStr = tokenResponse.token;
3531

3632
const [base64Header, base64Body, base64Signature] = tokenStr.split('.');
3733
if (!base64Header || !base64Body || !base64Signature) {

packages/blockchain-sdk-solana/src/sdk/sdk.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,10 @@ import { DialectWalletAdapterSolanaTxSigner } from '../auth/v2/sign-tx/solana-tx
1919

2020
export interface SolanaConfigProps {
2121
wallet: DialectSolanaWalletAdapter;
22-
authVersion?: 1 | 2;
2322
}
2423

2524
export interface SolanaConfig extends SolanaConfigProps {
2625
wallet: DialectSolanaWalletAdapterWrapper;
27-
authVersion: 1 | 2;
2826
}
2927

3028
export type SolanaNetwork = 'mainnet-beta' | 'devnet' | 'localnet';
@@ -53,7 +51,6 @@ Solana settings:
5351
Wallet supports authentication: ${
5452
config.wallet.canSignMessage() || config.wallet.canSignTransaction()
5553
}
56-
Auth version: ${config.authVersion}
5754
`,
5855
);
5956
}
@@ -91,7 +88,7 @@ Solana settings:
9188
solanaConfig: SolanaConfig,
9289
config: Config,
9390
) {
94-
if (solanaConfig.authVersion === 1) {
91+
if (config.dialectCloud.apiVersion === 1) {
9592
if (solanaConfig.wallet.canSignMessage()) {
9693
return new SolanaEd25519AuthenticationFacadeFactory(
9794
new DialectWalletAdapterSolanaEd25519TokenSigner(solanaConfig.wallet),
@@ -103,7 +100,7 @@ Solana settings:
103100
);
104101
}
105102
}
106-
if (solanaConfig.authVersion === 2) {
103+
if (config.dialectCloud.apiVersion === 2) {
107104
if (solanaConfig.wallet.canSignMessage()) {
108105
return new SolanaSignMessageV2AuthenticationFacadeFactory(
109106
new DialectWalletAdapterSolanaEd25519TokenSigner(solanaConfig.wallet),
@@ -126,7 +123,6 @@ Solana settings:
126123
);
127124
return {
128125
wallet,
129-
authVersion: this.solanaConfigProps.authVersion ?? 2,
130126
};
131127
}
132128
}

packages/sdk/src/dapp/dapp.interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ export interface SmartMessageParams {}
119119

120120
export interface SendDappMessageCommandBase {
121121
message: string;
122-
title?: string;
122+
title: string;
123123
imageUrl?: string;
124124
notificationTypeId?: string;
125125
addressTypes?: AddressType[];

packages/sdk/src/dialect-cloud-api/data-service-api-factory.ts

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,14 @@
1-
import {
2-
DataServiceDialectsApi,
3-
DataServiceDialectsApiClient,
4-
} from './data-service-dialects-api';
5-
import {
6-
DataServiceWalletNotificationSubscriptionsApi,
7-
DataServiceWalletNotificationSubscriptionsApiClient,
8-
} from './data-service-wallet-notification-subscriptions-api';
9-
import type { DataServiceWalletsApiV0 } from './data-service-wallets-api.v0';
10-
import { DataServiceWalletsApiClientV0 } from './data-service-wallets-api.v0';
11-
import type { DataServiceWalletDappAddressesApi } from './data-service-wallet-dapp-addresses-api';
1+
import { DataServiceDialectsApiClient } from './data-service-dialects-api';
2+
import { DataServiceWalletNotificationSubscriptionsApiClient } from './data-service-wallet-notification-subscriptions-api';
123
import { DataServiceWalletDappAddressesApiClient } from './data-service-wallet-dapp-addresses-api';
13-
import type { DataServiceWalletAddressesApi } from './data-service-wallet-addresses-api';
144
import { DataServiceWalletAddressesApiClient } from './data-service-wallet-addresses-api';
15-
import type { Token } from '../auth/auth.interface';
16-
import type { DataServiceDappsApi } from './data-service-dapps-api';
175
import { DataServiceDappsApiClient } from './data-service-dapps-api';
18-
import {
19-
DataServicePushNotificationSubscriptionsApi,
20-
DataServicePushNotificationSubscriptionsApiClient,
21-
} from './data-service-push-notification-subscriptions-api';
22-
import { nanoid } from 'nanoid';
6+
import { DataServicePushNotificationSubscriptionsApiClient } from './data-service-push-notification-subscriptions-api';
237
import type { TokenProvider } from '../auth/token-provider';
24-
import {
25-
DataServiceDappNotificationTypesApi,
26-
DataServiceDappNotificationTypesApiClient,
27-
} from './data-service-dapp-notification-types-api';
28-
import {
29-
DataServiceWalletMessagesApi,
30-
DataServiceWalletMessagesApiClient,
31-
} from './data-service-wallet-messages-api';
32-
import type { AxiosError } from 'axios';
33-
import type { DataServiceDappNotificationSubscriptionsApi } from './data-service-dapp-notification-subscriptions-api';
8+
import { DataServiceDappNotificationTypesApiClient } from './data-service-dapp-notification-types-api';
9+
import { DataServiceWalletMessagesApiClient } from './data-service-wallet-messages-api';
3410
import { DataServiceDappNotificationSubscriptionsApiClient } from './data-service-dapp-notification-subscriptions-api';
35-
import type { DataServiceHealthApi } from './data-service-health-api';
3611
import { DataServiceHealthApiClient } from './data-service-health-api';
37-
import { SDK_VERSION } from '../version';
3812
import { DataServiceApi } from './data-service-api';
3913

4014
export class DataServiceApiFactory {
@@ -56,10 +30,7 @@ export class DataServiceApiFactory {
5630
baseUrl,
5731
tokenProvider,
5832
);
59-
const walletsApiV0 = new DataServiceWalletsApiClientV0(
60-
baseUrl,
61-
tokenProvider,
62-
);
33+
6334
const walletAddressesApi = new DataServiceWalletAddressesApiClient(
6435
baseUrl,
6536
tokenProvider,
@@ -89,7 +60,6 @@ export class DataServiceApiFactory {
8960
dappsApiClient,
9061
dappNotificationTypes,
9162
dappNotificationSubscriptions,
92-
walletsApiV0,
9363
walletAddressesApi,
9464
walletDappAddressesApi,
9565
walletDappMessagesApi,

packages/sdk/src/dialect-cloud-api/data-service-api.ts

Lines changed: 8 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,27 @@
11
import type { DataServiceDialectsApi } from './data-service-dialects-api';
22
import type { DataServiceWalletNotificationSubscriptionsApi } from './data-service-wallet-notification-subscriptions-api';
3-
import type { DataServiceWalletsApiV0 } from './data-service-wallets-api.v0';
43
import type { DataServiceWalletDappAddressesApi } from './data-service-wallet-dapp-addresses-api';
54
import type { DataServiceWalletAddressesApi } from './data-service-wallet-addresses-api';
6-
import type { Token } from '../auth/auth.interface';
75
import type { DataServiceDappsApi } from './data-service-dapps-api';
86
import type { DataServicePushNotificationSubscriptionsApi } from './data-service-push-notification-subscriptions-api';
9-
import { nanoid } from 'nanoid';
107
import type { DataServiceDappNotificationTypesApi } from './data-service-dapp-notification-types-api';
118
import type { DataServiceWalletMessagesApi } from './data-service-wallet-messages-api';
129
import type { AxiosError } from 'axios';
1310
import type { DataServiceDappNotificationSubscriptionsApi } from './data-service-dapp-notification-subscriptions-api';
1411
import type { DataServiceHealthApi } from './data-service-health-api';
15-
import { SDK_VERSION } from '../version';
12+
import {
13+
ApiError,
14+
NetworkError,
15+
type RawApiError,
16+
XRequestIdHeader,
17+
} from './utils';
1618

1719
export class DataServiceApi {
1820
constructor(
1921
readonly threads: DataServiceDialectsApi,
2022
readonly dapps: DataServiceDappsApi,
2123
readonly dappNotificationTypes: DataServiceDappNotificationTypesApi,
2224
readonly dappNotificationSubscriptions: DataServiceDappNotificationSubscriptionsApi,
23-
readonly walletsV0: DataServiceWalletsApiV0,
2425
readonly walletAddresses: DataServiceWalletAddressesApi,
2526
readonly walletDappAddresses: DataServiceWalletDappAddressesApi,
2627
readonly walletMessages: DataServiceWalletMessagesApi,
@@ -30,38 +31,6 @@ export class DataServiceApi {
3031
) {}
3132
}
3233

33-
interface RawDataServiceApiError {
34-
message: string;
35-
}
36-
37-
export type DataServiceApiClientError = NetworkError | DataServiceApiError;
38-
39-
export class NetworkError {}
40-
41-
export class DataServiceApiError {
42-
constructor(
43-
readonly error: string,
44-
readonly statusCode: number,
45-
readonly message?: string | null,
46-
readonly requestId?: string | null,
47-
) {}
48-
}
49-
50-
const XRequestIdHeader = 'x-request-id';
51-
const XClientNameHeader = 'x-client-name';
52-
const XClientVersionHeader = 'x-client-version';
53-
54-
export function createHeaders(token?: Token) {
55-
return {
56-
...(token && {
57-
Authorization: `Bearer ${token.rawValue}`,
58-
}),
59-
[XRequestIdHeader]: nanoid(),
60-
[XClientNameHeader]: 'dialect-sdk',
61-
[XClientVersionHeader]: SDK_VERSION,
62-
};
63-
}
64-
6534
export async function withReThrowingDataServiceError<T>(fn: Promise<T>) {
6635
try {
6736
return await fn;
@@ -71,12 +40,12 @@ export async function withReThrowingDataServiceError<T>(fn: Promise<T>) {
7140
if (!err.response) {
7241
throw new NetworkError();
7342
}
74-
const data = err.response.data as RawDataServiceApiError;
43+
const data = err.response.data as RawApiError;
7544
const requestId =
7645
(err.config.headers &&
7746
(err.config.headers[XRequestIdHeader] as string)) ??
7847
null;
79-
throw new DataServiceApiError(
48+
throw new ApiError(
8049
err.response.statusText,
8150
Number(err.response.status),
8251
data.message,

packages/sdk/src/dialect-cloud-api/data-service-dapp-notification-subscriptions-api.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import type { TokenProvider } from '../auth/token-provider';
2-
import {
3-
createHeaders,
4-
withReThrowingDataServiceError,
5-
} from './data-service-api';
2+
import { withReThrowingDataServiceError } from './data-service-api';
63
import axios from 'axios';
74
import type {
85
NotificationSubscriptionDto,
96
NotificationTypeDto,
107
} from './data-service-wallet-notification-subscriptions-api';
8+
import { createHeaders } from './utils';
119

1210
export interface DataServiceDappNotificationSubscriptionsApi {
1311
findAll(): Promise<DappNotificationSubscriptionDto[]>;
@@ -28,7 +26,7 @@ export class DataServiceDappNotificationSubscriptionsApiClient
2826
.get<DappNotificationSubscriptionDto[]>(
2927
`${this.baseUrl}/api/v1/dapps/${token.body.sub}/notificationSubscriptions`,
3028
{
31-
headers: createHeaders(token),
29+
headers: createHeaders({ token: token.rawValue }),
3230
},
3331
)
3432
.then((it) => it.data),

0 commit comments

Comments
 (0)