@abstraxn/signer-react 3.2.0 → 3.3.0
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.
- package/CHANGELOG.md +12 -0
- package/README.md +7 -0
- package/dist/src/components/AbstraxnProvider/AbstraxnProvider.js +4 -1
- package/dist/src/components/AbstraxnProvider/AbstraxnProviderInner.js +1 -0
- package/dist/src/hooks.d.ts +43 -0
- package/dist/src/hooks.js +140 -0
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.js +1 -1
- package/dist/src/types.d.ts +37 -0
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [3.3.0] - 2026-04-28
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Solana gasless relayer hooks** – Added `useSolanaGasless()` and `useSignAndSendSolanaGaslessTxn()` to support build/sign/send gasless flow from React apps.
|
|
13
|
+
- **Solana gasless provider config** – Added `solanaGasless` in `AbstraxnProviderConfig` for relayer settings (`enabled`, `relayerBaseUrl`, `apiKey`, `networkChainId`, and optional polling defaults).
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **Gasless signing path uses existing signer-react backend signing** – Gasless transaction signing now reuses `signSolanaTransactionViaAPI` (+ MFA step-up retry) so signatures continue to come from the existing Turnkey-backed signer flow instead of client-side signing.
|
|
18
|
+
- **Public exports extended** – Exported new Solana gasless hooks and related types from `@abstraxn/signer-react`.
|
|
19
|
+
|
|
8
20
|
## [3.2.0] - 2026-04-22
|
|
9
21
|
|
|
10
22
|
### Added
|
package/README.md
CHANGED
|
@@ -27,6 +27,12 @@ import App from './App';
|
|
|
27
27
|
|
|
28
28
|
const providerConfig: AbstraxnProviderConfig = {
|
|
29
29
|
apiKey: 'your-api-key-here',
|
|
30
|
+
solanaGasless: {
|
|
31
|
+
enabled: true,
|
|
32
|
+
relayerBaseUrl: 'https://solana-hub.abstraxn.com',
|
|
33
|
+
apiKey: 'your-solana-relayer-api-key',
|
|
34
|
+
networkChainId: 101, // Solana mainnet
|
|
35
|
+
},
|
|
30
36
|
};
|
|
31
37
|
|
|
32
38
|
createRoot(document.getElementById('root')!).render(
|
|
@@ -105,6 +111,7 @@ function HookConnectButton() {
|
|
|
105
111
|
- `useExportWallet()` - Export wallet (EVM or Solana, based on current chain)
|
|
106
112
|
- `usePublicClient()` / `usePrepareRawTxn()` / `useSignTxn()` / `useSignAndSendTxn()` / `useWaitForTxnReceipt()` - EVM transaction flow (prepare → sign → send → confirm)
|
|
107
113
|
- `useSolanaConnection()` / `useSolanaPublicKey()` / `usePrepareSolanaTxn()` / `useSignSolanaTxn()` / `useSignAndSendSolanaTxn()` / `useWaitForSolanaConfirmation()` - Solana transaction flow (prepare → sign → send → confirm)
|
|
114
|
+
- `useSolanaGasless()` / `useSignAndSendSolanaGaslessTxn()` - Solana gasless flow using relayer build/send with Turnkey signing through signer-react
|
|
108
115
|
- `useSmartAccountOwner()` - Get an AA-compatible owner account for permissionless-style account abstraction flows
|
|
109
116
|
|
|
110
117
|
### Example: Account Abstraction owner (permissionless-compatible)
|
|
@@ -14,6 +14,9 @@ import { ConnectionProvider, WalletProvider } from "@solana/wallet-adapter-react
|
|
|
14
14
|
import { PhantomWalletAdapter, SolflareWalletAdapter } from "@solana/wallet-adapter-wallets";
|
|
15
15
|
export function AbstraxnProvider({ config, children }) {
|
|
16
16
|
const externalWalletsEnabled = config.externalWallets?.enabled ?? false;
|
|
17
|
+
const solanaEndpoint = config.chains?.solanaEndpoint ??
|
|
18
|
+
config.solanaEndpoint ??
|
|
19
|
+
"https://api.mainnet-beta.solana.com";
|
|
17
20
|
const externalSsr = config.externalWallets?.ssr ?? false;
|
|
18
21
|
// Get or create QueryClient - tries to use existing one from context first
|
|
19
22
|
// This ensures we use the app's QueryClient instance if it exists, preventing multiple instances
|
|
@@ -197,7 +200,7 @@ export function AbstraxnProvider({ config, children }) {
|
|
|
197
200
|
}
|
|
198
201
|
// Do NOT pass key to WagmiProvider. Remounting loses connection state and causes
|
|
199
202
|
// "Connector not connected" in Next.js (e.g. when config loads after hydration).
|
|
200
|
-
return (_jsx(QueryClientWrapper, { queryClient: queryClient, children: _jsx(ConnectionProvider, { endpoint:
|
|
203
|
+
return (_jsx(QueryClientWrapper, { queryClient: queryClient, children: _jsx(ConnectionProvider, { endpoint: solanaEndpoint, children: _jsx(WalletProvider, { wallets: solanaWallets, autoConnect: true, children: _jsx(WagmiProvider, { config: wagmiConfig, initialState: config.initialState, children: _jsx(AbstraxnProviderWithWagmi, { config: config, children: children }) }) }) }) }));
|
|
201
204
|
}
|
|
202
205
|
// If external wallets are disabled, use the provider without wagmi
|
|
203
206
|
return (_jsx(AbstraxnProviderWithoutWagmi, { config: config, children: children }));
|
|
@@ -3686,6 +3686,7 @@ export function AbstraxnProviderInner({ config, children, base, wagmi, solana, }
|
|
|
3686
3686
|
setEmailForOtp: setEmailForOtp,
|
|
3687
3687
|
// Global config flags
|
|
3688
3688
|
enableSolana: config.chains?.enableSolana,
|
|
3689
|
+
solanaGaslessConfig: config.solanaGasless,
|
|
3689
3690
|
};
|
|
3690
3691
|
// Ref to store latest value to avoid dependency issues (defined after value)
|
|
3691
3692
|
const valueRef = useRef(value);
|
package/dist/src/hooks.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { WhoamiResponse, TransactionRequest, EnableMfaResponse, VerifySetupMfaResponse, DisableMfaResponse, SupportedAuthMethod, LinkedAuthMethod } from '@abstraxn/signer-core';
|
|
2
2
|
import type { Chain, PublicClient, Address, Abi, GetContractReturnType, TransactionReceipt } from 'viem';
|
|
3
3
|
import { Connection as SolanaConnection, Transaction as SolanaTransaction, TransactionInstruction, type Commitment, type SendOptions } from '@solana/web3.js';
|
|
4
|
+
import { SolanaRelayer } from '@abstraxn/solana-relayer';
|
|
5
|
+
import type { BuildTxParams as SolanaGaslessBuildTxParams, BuildRelayTxResult as SolanaGaslessBuildTxResult, RelaySubmitResponse as SolanaGaslessRelaySubmitResponse, RelayStatusResponse as SolanaGaslessRelayStatusResponse } from '@abstraxn/solana-relayer';
|
|
4
6
|
import type { TypedData, TypedDataDomain } from 'viem';
|
|
5
7
|
import { type ConnectorType, type ConnectorMeta } from './connectors';
|
|
6
8
|
/**
|
|
@@ -8614,6 +8616,47 @@ export declare function useSignAndSendSolanaTxn(connection: SolanaConnection): {
|
|
|
8614
8616
|
isConnected: boolean;
|
|
8615
8617
|
solanaAddress: string | null;
|
|
8616
8618
|
};
|
|
8619
|
+
export type SolanaGaslessBuildParams = Omit<SolanaGaslessBuildTxParams, 'connection' | 'sender'> & {
|
|
8620
|
+
connection?: SolanaConnection;
|
|
8621
|
+
sender?: string;
|
|
8622
|
+
};
|
|
8623
|
+
export interface SolanaGaslessConfigResolved {
|
|
8624
|
+
enabled: boolean;
|
|
8625
|
+
relayerBaseUrl: string;
|
|
8626
|
+
apiKey: string;
|
|
8627
|
+
networkChainId: number;
|
|
8628
|
+
defaultPollMs?: number;
|
|
8629
|
+
defaultTimeoutMs?: number;
|
|
8630
|
+
relayerUrl: string;
|
|
8631
|
+
}
|
|
8632
|
+
export declare function useSolanaGasless(): {
|
|
8633
|
+
isEnabled: boolean;
|
|
8634
|
+
config: SolanaGaslessConfigResolved | null;
|
|
8635
|
+
relayerClient: SolanaRelayer | null;
|
|
8636
|
+
buildGaslessTx: (params: SolanaGaslessBuildParams) => Promise<SolanaGaslessBuildTxResult>;
|
|
8637
|
+
signGaslessTx: (params: {
|
|
8638
|
+
transaction: SolanaTransaction;
|
|
8639
|
+
sender?: string;
|
|
8640
|
+
}) => Promise<{
|
|
8641
|
+
signedTransactionBase64: string;
|
|
8642
|
+
signedTransactionHex: string;
|
|
8643
|
+
}>;
|
|
8644
|
+
sendGaslessTx: (params: {
|
|
8645
|
+
signedTransactionBase64: string;
|
|
8646
|
+
lastValidBlockHeight: number;
|
|
8647
|
+
}) => Promise<SolanaGaslessRelaySubmitResponse>;
|
|
8648
|
+
getGaslessTxStatus: (txnId: string) => Promise<SolanaGaslessRelayStatusResponse>;
|
|
8649
|
+
};
|
|
8650
|
+
export declare function useSignAndSendSolanaGaslessTxn(): {
|
|
8651
|
+
signAndSendGaslessTx: (params: SolanaGaslessBuildParams) => Promise<{
|
|
8652
|
+
txnId: string;
|
|
8653
|
+
status: "pending" | "confirmed" | "processing" | "failed";
|
|
8654
|
+
preview: Record<string, unknown>;
|
|
8655
|
+
signedTransactionHex: string;
|
|
8656
|
+
signedTransactionBase64: string;
|
|
8657
|
+
lastValidBlockHeight: number;
|
|
8658
|
+
}>;
|
|
8659
|
+
};
|
|
8617
8660
|
/**
|
|
8618
8661
|
* Hook to wait for Solana transaction confirmation.
|
|
8619
8662
|
*/
|
package/dist/src/hooks.js
CHANGED
|
@@ -7,6 +7,7 @@ import { InvalidDeviceIdError, SignMfaRequiredError } from '@abstraxn/signer-cor
|
|
|
7
7
|
import { createPublicClient, createWalletClient, http, getContract, serializeTransaction, encodeFunctionData, hashTypedData, hashMessage, parseSignature } from 'viem';
|
|
8
8
|
import { toAccount } from 'viem/accounts';
|
|
9
9
|
import { Connection as SolanaConnection, Transaction as SolanaTransaction, SystemProgram, PublicKey, LAMPORTS_PER_SOL, TransactionInstruction, } from '@solana/web3.js';
|
|
10
|
+
import { SolanaRelayer } from '@abstraxn/solana-relayer';
|
|
10
11
|
import { useWalletClient as useWagmiWalletClient, useAccount, useConfig, useChainId as useWagmiChainId, useSwitchChain as useWagmiSwitchChain, useSignMessage as useWagmiSignMessage, useReconnect as useWagmiReconnect } from 'wagmi';
|
|
11
12
|
import { getWalletClient, switchChain } from '@wagmi/core';
|
|
12
13
|
import { getConnectorMeta } from './connectors';
|
|
@@ -1517,6 +1518,145 @@ export function useSignAndSendSolanaTxn(connection) {
|
|
|
1517
1518
|
}, [connection, isConnected, whoami, signSolanaTransactionViaAPI, verifySignMfa]);
|
|
1518
1519
|
return { signAndSendSolanaTxn, isConnected, solanaAddress: whoami?.solanaAddress ?? null };
|
|
1519
1520
|
}
|
|
1521
|
+
function buildSolanaRelayerUrl(relayerBaseUrl, networkChainId, apiKey) {
|
|
1522
|
+
const parsed = new URL(relayerBaseUrl);
|
|
1523
|
+
const hasTxPath = /\/tx\/\d+\/?$/.test(parsed.pathname);
|
|
1524
|
+
const hasChainOnlyPath = /\/\d+\/?$/.test(parsed.pathname);
|
|
1525
|
+
if (!hasTxPath && !hasChainOnlyPath) {
|
|
1526
|
+
const basePath = parsed.pathname.replace(/\/$/, "");
|
|
1527
|
+
const withApiV1 = /\/api\/v1$/.test(basePath)
|
|
1528
|
+
? basePath
|
|
1529
|
+
: `${basePath}/api/v1`;
|
|
1530
|
+
parsed.pathname = `${withApiV1}/tx/${networkChainId}/`;
|
|
1531
|
+
}
|
|
1532
|
+
parsed.searchParams.set("apikey", apiKey);
|
|
1533
|
+
return parsed.toString();
|
|
1534
|
+
}
|
|
1535
|
+
function hexToBase64SignedTransaction(signedHex) {
|
|
1536
|
+
const hex = signedHex.startsWith('0x') ? signedHex.slice(2) : signedHex;
|
|
1537
|
+
const bytes = new Uint8Array(hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) ?? []);
|
|
1538
|
+
if (typeof btoa === 'function') {
|
|
1539
|
+
let binary = '';
|
|
1540
|
+
for (let i = 0; i < bytes.length; i++)
|
|
1541
|
+
binary += String.fromCharCode(bytes[i]);
|
|
1542
|
+
return btoa(binary);
|
|
1543
|
+
}
|
|
1544
|
+
return Buffer.from(bytes).toString('base64');
|
|
1545
|
+
}
|
|
1546
|
+
export function useSolanaGasless() {
|
|
1547
|
+
const { isConnected, whoami, solanaConnection, signSolanaTransactionViaAPI, verifySignMfa, solanaGaslessConfig, } = useAbstraxnWallet();
|
|
1548
|
+
const providerConnection = solanaConnection?.connection ?? null;
|
|
1549
|
+
const resolvedConfig = useMemo(() => {
|
|
1550
|
+
if (!solanaGaslessConfig?.enabled)
|
|
1551
|
+
return null;
|
|
1552
|
+
const relayerBaseUrl = solanaGaslessConfig.relayerBaseUrl?.trim();
|
|
1553
|
+
const apiKey = solanaGaslessConfig.apiKey?.trim();
|
|
1554
|
+
const networkChainId = solanaGaslessConfig.networkChainId;
|
|
1555
|
+
if (!relayerBaseUrl || !apiKey || !networkChainId)
|
|
1556
|
+
return null;
|
|
1557
|
+
const base = relayerBaseUrl.replace(/\/$/, '');
|
|
1558
|
+
const relayerUrl = buildSolanaRelayerUrl(base, networkChainId, apiKey);
|
|
1559
|
+
return {
|
|
1560
|
+
enabled: true,
|
|
1561
|
+
relayerBaseUrl: base,
|
|
1562
|
+
apiKey,
|
|
1563
|
+
networkChainId,
|
|
1564
|
+
defaultPollMs: solanaGaslessConfig.defaultPollMs,
|
|
1565
|
+
defaultTimeoutMs: solanaGaslessConfig.defaultTimeoutMs,
|
|
1566
|
+
relayerUrl,
|
|
1567
|
+
};
|
|
1568
|
+
}, [solanaGaslessConfig]);
|
|
1569
|
+
const relayerClient = useMemo(() => {
|
|
1570
|
+
if (!resolvedConfig)
|
|
1571
|
+
return null;
|
|
1572
|
+
return new SolanaRelayer({
|
|
1573
|
+
relayerUrl: resolvedConfig.relayerUrl,
|
|
1574
|
+
defaultPollMs: resolvedConfig.defaultPollMs,
|
|
1575
|
+
defaultTimeoutMs: resolvedConfig.defaultTimeoutMs,
|
|
1576
|
+
});
|
|
1577
|
+
}, [resolvedConfig]);
|
|
1578
|
+
const ensureReady = useCallback(() => {
|
|
1579
|
+
if (!isConnected)
|
|
1580
|
+
throw new Error('Wallet is not connected');
|
|
1581
|
+
if (!resolvedConfig) {
|
|
1582
|
+
throw new Error('Solana gasless is not configured. Set config.solanaGasless with enabled, relayerBaseUrl, apiKey and networkChainId.');
|
|
1583
|
+
}
|
|
1584
|
+
if (!relayerClient)
|
|
1585
|
+
throw new Error('Failed to initialize Solana relayer client');
|
|
1586
|
+
if (!signSolanaTransactionViaAPI) {
|
|
1587
|
+
throw new Error('Solana transaction signing is not supported by this wallet');
|
|
1588
|
+
}
|
|
1589
|
+
const sender = whoami?.solanaAddress ?? null;
|
|
1590
|
+
if (!sender)
|
|
1591
|
+
throw new Error('Solana address is required for gasless flow');
|
|
1592
|
+
return { sender };
|
|
1593
|
+
}, [isConnected, relayerClient, resolvedConfig, signSolanaTransactionViaAPI, whoami]);
|
|
1594
|
+
const buildGaslessTx = useCallback(async (params) => {
|
|
1595
|
+
const { sender } = ensureReady();
|
|
1596
|
+
const connection = params.connection ?? providerConnection;
|
|
1597
|
+
if (!connection)
|
|
1598
|
+
throw new Error('Solana connection is required');
|
|
1599
|
+
const { connection: _connection, sender: _sender, ...rest } = params;
|
|
1600
|
+
return await relayerClient.buildTx({
|
|
1601
|
+
connection,
|
|
1602
|
+
sender: _sender ?? sender,
|
|
1603
|
+
...rest,
|
|
1604
|
+
});
|
|
1605
|
+
}, [ensureReady, providerConnection, relayerClient]);
|
|
1606
|
+
const signGaslessTx = useCallback(async (params) => {
|
|
1607
|
+
const { sender } = ensureReady();
|
|
1608
|
+
const unsignedBytes = params.transaction.serialize({ requireAllSignatures: false });
|
|
1609
|
+
const unsignedHex = Array.from(unsignedBytes)
|
|
1610
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
1611
|
+
.join('');
|
|
1612
|
+
const signWith = params.sender ?? sender;
|
|
1613
|
+
const { signedTransaction } = await runWithSignStepUpRetry(() => signSolanaTransactionViaAPI(unsignedHex, signWith), verifySignMfa);
|
|
1614
|
+
return {
|
|
1615
|
+
signedTransactionHex: signedTransaction,
|
|
1616
|
+
signedTransactionBase64: hexToBase64SignedTransaction(signedTransaction),
|
|
1617
|
+
};
|
|
1618
|
+
}, [ensureReady, signSolanaTransactionViaAPI, verifySignMfa]);
|
|
1619
|
+
const sendGaslessTx = useCallback(async (params) => {
|
|
1620
|
+
ensureReady();
|
|
1621
|
+
return await relayerClient.sendTx({
|
|
1622
|
+
signedTransaction: params.signedTransactionBase64,
|
|
1623
|
+
lastValidBlockHeight: params.lastValidBlockHeight,
|
|
1624
|
+
});
|
|
1625
|
+
}, [ensureReady, relayerClient]);
|
|
1626
|
+
const getGaslessTxStatus = useCallback(async (txnId) => {
|
|
1627
|
+
ensureReady();
|
|
1628
|
+
return await relayerClient.getTxStatus({ txnId });
|
|
1629
|
+
}, [ensureReady, relayerClient]);
|
|
1630
|
+
return {
|
|
1631
|
+
isEnabled: !!resolvedConfig,
|
|
1632
|
+
config: resolvedConfig,
|
|
1633
|
+
relayerClient,
|
|
1634
|
+
buildGaslessTx,
|
|
1635
|
+
signGaslessTx,
|
|
1636
|
+
sendGaslessTx,
|
|
1637
|
+
getGaslessTxStatus,
|
|
1638
|
+
};
|
|
1639
|
+
}
|
|
1640
|
+
export function useSignAndSendSolanaGaslessTxn() {
|
|
1641
|
+
const { buildGaslessTx, signGaslessTx, sendGaslessTx } = useSolanaGasless();
|
|
1642
|
+
const signAndSendGaslessTx = useCallback(async (params) => {
|
|
1643
|
+
const built = await buildGaslessTx(params);
|
|
1644
|
+
const signed = await signGaslessTx({ transaction: built.tx, sender: params.sender });
|
|
1645
|
+
const relay = await sendGaslessTx({
|
|
1646
|
+
signedTransactionBase64: signed.signedTransactionBase64,
|
|
1647
|
+
lastValidBlockHeight: built.lastValidBlockHeight,
|
|
1648
|
+
});
|
|
1649
|
+
return {
|
|
1650
|
+
txnId: relay.txnId,
|
|
1651
|
+
status: relay.status,
|
|
1652
|
+
preview: built.preview,
|
|
1653
|
+
signedTransactionHex: signed.signedTransactionHex,
|
|
1654
|
+
signedTransactionBase64: signed.signedTransactionBase64,
|
|
1655
|
+
lastValidBlockHeight: built.lastValidBlockHeight,
|
|
1656
|
+
};
|
|
1657
|
+
}, [buildGaslessTx, sendGaslessTx, signGaslessTx]);
|
|
1658
|
+
return { signAndSendGaslessTx };
|
|
1659
|
+
}
|
|
1520
1660
|
/**
|
|
1521
1661
|
* Hook to wait for Solana transaction confirmation.
|
|
1522
1662
|
*/
|
package/dist/src/index.d.ts
CHANGED
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
* when used in a React project
|
|
5
5
|
*/
|
|
6
6
|
export { AbstraxnProvider, useAbstraxnWallet } from './AbstraxnProvider';
|
|
7
|
-
export { useIsConnected, useAddress, useAuthContext, useChainId, useError, useEnableMfa, useDisableMfa, useAuthMethodLinking, useEmailForOtp, useWallet, useSmartAccountOwner, useExportWallet, useWhoami, useExternalWallet, useExternalWalletBalance, useExternalWalletChain, useExternalWalletInfo, usePublicClient, useWalletClient, useContract, usePrepareRawTxn, useSignTxn, useSignTypedTx, useSignAndSendTxn, useWaitForTxnReceipt, useReadContract, useExternalWalletClient, useWriteContract, useConnectionType, useSwitchChain, useSignMessage, useEstimateGas, useGetGasPrice, useSolanaConnection, useSolanaPublicKey, useSolanaBalance, usePrepareSolanaTxn, useSolanaExternalWallet, usePrepareSolanaProgramTxn, useSolanaProgramTransaction, useSignSolanaTxn, useSignAndSendSolanaTxn, useWaitForSolanaConfirmation, } from './hooks';
|
|
7
|
+
export { useIsConnected, useAddress, useAuthContext, useChainId, useError, useEnableMfa, useDisableMfa, useAuthMethodLinking, useEmailForOtp, useWallet, useSmartAccountOwner, useExportWallet, useWhoami, useExternalWallet, useExternalWalletBalance, useExternalWalletChain, useExternalWalletInfo, usePublicClient, useWalletClient, useContract, usePrepareRawTxn, useSignTxn, useSignTypedTx, useSignAndSendTxn, useWaitForTxnReceipt, useReadContract, useExternalWalletClient, useWriteContract, useConnectionType, useSwitchChain, useSignMessage, useEstimateGas, useGetGasPrice, useSolanaConnection, useSolanaPublicKey, useSolanaBalance, usePrepareSolanaTxn, useSolanaExternalWallet, usePrepareSolanaProgramTxn, useSolanaProgramTransaction, useSignSolanaTxn, useSignAndSendSolanaTxn, useSolanaGasless, useSignAndSendSolanaGaslessTxn, useWaitForSolanaConfirmation, } from './hooks';
|
|
8
8
|
export { ConnectButton } from './ConnectButton';
|
|
9
9
|
export type { ConnectButtonProps, ConnectButtonVariant, ConnectButtonSize } from './ConnectButton';
|
|
10
10
|
export { WalletModal } from './WalletModal';
|
|
11
11
|
export type { WalletModalProps } from './WalletModal';
|
|
12
12
|
export { OnboardingUIComponent as OnboardingUI } from './OnboardingUI';
|
|
13
|
-
export type { AbstraxnProviderConfig, AbstraxnUIConfig, AbstraxnContextValue, ChainConfig, } from './types';
|
|
14
|
-
export type { PayloadEncoding, HashFunction, SignTypedTxParams, SmartAccountOwnerOptions, SmartAccountOwnerResult, SolanaAccountMetaInput, SolanaInstructionDataInput, } from './hooks';
|
|
13
|
+
export type { AbstraxnProviderConfig, AbstraxnUIConfig, AbstraxnContextValue, ChainConfig, SolanaGaslessConfig, } from './types';
|
|
14
|
+
export type { PayloadEncoding, HashFunction, SignTypedTxParams, SmartAccountOwnerOptions, SmartAccountOwnerResult, SolanaGaslessBuildParams, SolanaGaslessConfigResolved, SolanaAccountMetaInput, SolanaInstructionDataInput, } from './hooks';
|
|
15
15
|
export type { OnboardingUIComponentProps, OnboardingUIComponentRef } from './OnboardingUI';
|
|
16
16
|
export { ALL_CHAINS, EVM_CHAINS, SOLANA_CHAINS, getChainById, getChainsByType, getDefaultChains, toCoreChain, type ChainData, } from './chains';
|
|
17
17
|
export { CONNECTORS, getConnectorMeta, isOAuthConnector, isWalletConnector, isAuthConnector, type ConnectorType, type ConnectorMeta, } from './connectors';
|
package/dist/src/index.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* when used in a React project
|
|
5
5
|
*/
|
|
6
6
|
export { AbstraxnProvider, useAbstraxnWallet } from './AbstraxnProvider';
|
|
7
|
-
export { useIsConnected, useAddress, useAuthContext, useChainId, useError, useEnableMfa, useDisableMfa, useAuthMethodLinking, useEmailForOtp, useWallet, useSmartAccountOwner, useExportWallet, useWhoami, useExternalWallet, useExternalWalletBalance, useExternalWalletChain, useExternalWalletInfo, usePublicClient, useWalletClient, useContract, usePrepareRawTxn, useSignTxn, useSignTypedTx, useSignAndSendTxn, useWaitForTxnReceipt, useReadContract, useExternalWalletClient, useWriteContract, useConnectionType, useSwitchChain, useSignMessage, useEstimateGas, useGetGasPrice, useSolanaConnection, useSolanaPublicKey, useSolanaBalance, usePrepareSolanaTxn, useSolanaExternalWallet, usePrepareSolanaProgramTxn, useSolanaProgramTransaction, useSignSolanaTxn, useSignAndSendSolanaTxn, useWaitForSolanaConfirmation, } from './hooks';
|
|
7
|
+
export { useIsConnected, useAddress, useAuthContext, useChainId, useError, useEnableMfa, useDisableMfa, useAuthMethodLinking, useEmailForOtp, useWallet, useSmartAccountOwner, useExportWallet, useWhoami, useExternalWallet, useExternalWalletBalance, useExternalWalletChain, useExternalWalletInfo, usePublicClient, useWalletClient, useContract, usePrepareRawTxn, useSignTxn, useSignTypedTx, useSignAndSendTxn, useWaitForTxnReceipt, useReadContract, useExternalWalletClient, useWriteContract, useConnectionType, useSwitchChain, useSignMessage, useEstimateGas, useGetGasPrice, useSolanaConnection, useSolanaPublicKey, useSolanaBalance, usePrepareSolanaTxn, useSolanaExternalWallet, usePrepareSolanaProgramTxn, useSolanaProgramTransaction, useSignSolanaTxn, useSignAndSendSolanaTxn, useSolanaGasless, useSignAndSendSolanaGaslessTxn, useWaitForSolanaConfirmation, } from './hooks';
|
|
8
8
|
export { ConnectButton } from './ConnectButton';
|
|
9
9
|
export { WalletModal } from './WalletModal';
|
|
10
10
|
export { OnboardingUIComponent as OnboardingUI } from './OnboardingUI';
|
package/dist/src/types.d.ts
CHANGED
|
@@ -146,6 +146,33 @@ export interface ChainConfig {
|
|
|
146
146
|
*/
|
|
147
147
|
solanaEndpoint?: string;
|
|
148
148
|
}
|
|
149
|
+
export interface SolanaGaslessConfig {
|
|
150
|
+
/**
|
|
151
|
+
* Enable Solana gasless relayer flow.
|
|
152
|
+
* @default false
|
|
153
|
+
*/
|
|
154
|
+
enabled?: boolean;
|
|
155
|
+
/**
|
|
156
|
+
* Base relayer URL without path/query (e.g. https://relayer.abstraxn.com)
|
|
157
|
+
*/
|
|
158
|
+
relayerBaseUrl?: string;
|
|
159
|
+
/**
|
|
160
|
+
* API key used by relayer endpoints.
|
|
161
|
+
*/
|
|
162
|
+
apiKey?: string;
|
|
163
|
+
/**
|
|
164
|
+
* Solana chain/network id used in relayer path (/tx/:chainId).
|
|
165
|
+
*/
|
|
166
|
+
networkChainId?: number;
|
|
167
|
+
/**
|
|
168
|
+
* Optional default polling interval in ms for status checks.
|
|
169
|
+
*/
|
|
170
|
+
defaultPollMs?: number;
|
|
171
|
+
/**
|
|
172
|
+
* Optional default timeout in ms for polling helpers.
|
|
173
|
+
*/
|
|
174
|
+
defaultTimeoutMs?: number;
|
|
175
|
+
}
|
|
149
176
|
/**
|
|
150
177
|
* Complete configuration for AbstraxnProvider
|
|
151
178
|
*/
|
|
@@ -172,6 +199,15 @@ export interface AbstraxnProviderConfig extends AbstraxnWalletConfig {
|
|
|
172
199
|
* Chain configuration
|
|
173
200
|
*/
|
|
174
201
|
chains?: ChainConfig;
|
|
202
|
+
/**
|
|
203
|
+
* Top-level Solana RPC endpoint fallback.
|
|
204
|
+
* Useful when `chains` is passed as an array (viem chain format).
|
|
205
|
+
*/
|
|
206
|
+
solanaEndpoint?: string;
|
|
207
|
+
/**
|
|
208
|
+
* Solana gasless relayer configuration.
|
|
209
|
+
*/
|
|
210
|
+
solanaGasless?: SolanaGaslessConfig;
|
|
175
211
|
/**
|
|
176
212
|
* Optional custom wagmi config
|
|
177
213
|
* If provided, this will be used instead of creating a new one
|
|
@@ -278,4 +314,5 @@ export interface AbstraxnContextValue {
|
|
|
278
314
|
emailForOtp?: string;
|
|
279
315
|
setEmailForOtp?: (email: string) => void;
|
|
280
316
|
enableSolana?: boolean;
|
|
317
|
+
solanaGaslessConfig?: SolanaGaslessConfig;
|
|
281
318
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abstraxn/signer-react",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"description": "React SDK for Abstraxn Wallet - React components, hooks, and providers for seamless Web3 wallet integration",
|
|
5
5
|
"main": "./dist/src/index.js",
|
|
6
6
|
"module": "./dist/src/index.js",
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@abstraxn/signer-core": "2.1.2",
|
|
44
|
+
"@abstraxn/solana-relayer": "^0.0.2",
|
|
44
45
|
"@solana/wallet-adapter-base": "^0.9.27",
|
|
45
46
|
"@solana/wallet-adapter-react": "^0.15.39",
|
|
46
47
|
"@solana/wallet-adapter-react-ui": "^0.9.39",
|