Socket
Socket
Sign inDemoInstall

@dynamic-labs/wallet-connector-core

Package Overview
Dependencies
Maintainers
1
Versions
585
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@dynamic-labs/wallet-connector-core - npm Package Compare versions

Comparing version 3.0.0-alpha.52 to 3.0.0-alpha.53

src/utils/isConnectorMethodSupported/index.d.ts

9

_virtual/_tslib.js

@@ -45,9 +45,2 @@ 'use client'

function __classPrivateFieldSet(receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
}
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {

@@ -58,2 +51,2 @@ var e = new Error(message);

export { __awaiter, __classPrivateFieldGet, __classPrivateFieldSet, __rest };
export { __awaiter, __classPrivateFieldGet, __rest };
{
"name": "@dynamic-labs/wallet-connector-core",
"version": "3.0.0-alpha.52",
"version": "3.0.0-alpha.53",
"repository": {

@@ -32,9 +32,9 @@ "type": "git",

"peerDependencies": {
"@dynamic-labs/logger": "3.0.0-alpha.52",
"@dynamic-labs/rpc-providers": "3.0.0-alpha.52",
"@dynamic-labs/types": "3.0.0-alpha.52",
"@dynamic-labs/utils": "3.0.0-alpha.52",
"@dynamic-labs/wallet-book": "3.0.0-alpha.52",
"@dynamic-labs/logger": "3.0.0-alpha.53",
"@dynamic-labs/rpc-providers": "3.0.0-alpha.53",
"@dynamic-labs/types": "3.0.0-alpha.53",
"@dynamic-labs/utils": "3.0.0-alpha.53",
"@dynamic-labs/wallet-book": "3.0.0-alpha.53",
"eventemitter3": "5.0.1"
}
}

@@ -1,4 +0,4 @@

export { Chains, Wallet, WalletConnectorBase, socialProviders, type Attestation, type AuthenticatorRecoveryHandler, type AuthenticatorType, type BitcoinSignPsbtRequest, type BitcoinSignPsbtRequestSignature, type BitcoinSignPsbtResponse, type Chain, type ChainInfo, type ExportHandler, type ExtendedPrivateKey, type GetAddressOpts, type IAccountAbstractionWalletConnector, type IBitcoinWalletConnector, type ICoinbaseMPCWalletConnector, type IEmailOTPWalletConnector, type IEmailWalletConnector, type IHardwareWalletConnector, type IPasskeyWalletConnector, type IPhantomRedirectConnector, type IPhantomRedirectConnectorWithEvents, type ISMSWalletConnector, type ISendBalanceWalletConnector, type ISessionKeyCompatibleWalletConnector, type ITurnkeyWalletConnectorStamper, type IWalletConnectConnector, type NameServiceData, type PayloadParams, type RawPrivateKey, type RecoveryEmailParams, type RecoveryWebAuthnAttestation, type SignAllTransactionsListener, type SignAndSendTransactionListener, type SignMessageListener, type SignTransactionListener, type SmartWalletConnector, type SocialProvider, type WalletConnector, type WalletConnectorConstructor, type WalletConnectorCore, type WalletConnectorEventTypes, type WalletConnectorsMethod, type WebAuthnAttestation, } from './lib';
export { Chains, Wallet, WalletConnectorBase, socialProviders, type Attestation, type AuthenticatorRecoveryHandler, type AuthenticatorType, type BitcoinSignPsbtRequest, type BitcoinSignPsbtRequestSignature, type BitcoinSignPsbtResponse, type Chain, type ChainInfo, type ExportHandler, type ExtendedPrivateKey, type GetAddressOpts, type IAccountAbstractionWalletConnector, type IBitcoinWalletConnector, type ICoinbaseMPCWalletConnector, type IEmailOTPWalletConnector, type IEmailWalletConnector, type IHardwareWalletConnector, type InternalWalletConnector, type IPasskeyWalletConnector, type IPhantomRedirectConnector, type IPhantomRedirectConnectorWithEvents, type ISMSWalletConnector, type ISendBalanceWalletConnector, type ISessionKeyCompatibleWalletConnector, type ITurnkeyWalletConnectorStamper, type IWalletConnectConnector, type NameServiceData, type PayloadParams, type RawPrivateKey, type RecoveryEmailParams, type RecoveryWebAuthnAttestation, type SignAllTransactionsListener, type SignAndSendTransactionListener, type SignMessageListener, type SignTransactionListener, type SocialProvider, type WalletConnector, type WalletConnectorConstructor, type WalletConnectorCore, type WalletConnectorEventTypes, type WalletConnectorsMethod, type WalletConstructor, type WalletProps, type WebAuthnAttestation, } from './lib';
export type { WalletConnectorExtension } from './lib/WalletConnectorExtension';
export type { AccountChangeEventHandler, ChainChangeEventHandler, DisconnectEventHandler, } from './types';
export { ProviderLookup, addHexPrefix, bufferToHex, eventListenerHandlers, getChainInfo, getChainInfoWithOverrides, setChainInfoOverrides, getDeepLink, getMobileExperience, getRpcUrlForChain, getWalletConnectorByKey, isAccountAbstractionConnector, isBitcoinConnector, isBloctoConnector, isCoinbaseMpcWalletConnector, isEmailOTPWalletConnector, isEmailWalletConnector, isEmbeddedConnector, isHardwareWalletConnector, isHex, isMagicConnector, isPasskeyWalletConnector, isPhantomRedirectConnector, isSameAddress, isSendBalanceWalletConnector, isSessionKeyCompatibleWalletConnector, isSmartWalletConnector, isSocialWalletConnector, isWalletConnectConnector, logger, performPlatformSpecificConnectionMethod, shouldLowercaseAddress, utf8ToHex, type DeepLinkVariant, type ProviderCondition, type ChainDisplayOverrides, } from './utils';
export { ProviderLookup, addHexPrefix, bufferToHex, eventListenerHandlers, getChainInfo, getChainInfoWithOverrides, setChainInfoOverrides, getDeepLink, getMobileExperience, getRpcUrlForChain, getWalletConnectorByKey, isAccountAbstractionConnector, isBitcoinConnector, isBloctoConnector, isCoinbaseMpcWalletConnector, isEmailOTPWalletConnector, isEmailWalletConnector, isEmbeddedConnector, isHardwareWalletConnector, isHex, isMagicConnector, isPasskeyWalletConnector, isPhantomRedirectConnector, isSameAddress, isSendBalanceWalletConnector, isSessionKeyCompatibleWallet, isSessionKeyCompatibleWalletConnector, isSocialWalletConnector, isWalletConnectConnector, logger, performPlatformSpecificConnectionMethod, shouldLowercaseAddress, utf8ToHex, type DeepLinkVariant, type ProviderCondition, type ChainDisplayOverrides, } from './utils';

@@ -20,3 +20,2 @@ 'use client'

export { isPasskeyWalletConnector } from './utils/isPasskeyWalletConnector/isPasskeyWalletConnector.js';
export { isSmartWalletConnector } from './utils/isSmartWalletConnector/isSmartWalletConnector.js';
export { isAccountAbstractionConnector } from './utils/isAccountAbstractionConnector/isAccountAbstractionConnector.js';

@@ -32,3 +31,4 @@ export { isBitcoinConnector } from './utils/isBitcoinConnector/isBitcoinConnector.js';

export { isSendBalanceWalletConnector } from './utils/isSendBalanceWalletConnector/isSendBalanceWalletConnector.js';
export { isSessionKeyCompatibleWalletConnector } from './utils/isSessionKeyCompatibleWalletConnector/isSessionKeyCompatibleWalletConnector.js';
export { isSessionKeyCompatibleWallet } from './utils/isSessionKeyCompatible/isSessionKeyCompatibleWallet/isSessionKeyCompatibleWallet.js';
export { isSessionKeyCompatibleWalletConnector } from './utils/isSessionKeyCompatible/isSessionKeyCompatibleWalletConnector/isSessionKeyCompatibleWalletConnector.js';
export { getMobileExperience } from './utils/getMobileExperience/getMobileExperience.js';

@@ -11,4 +11,9 @@ import { IUITransaction } from '@dynamic-labs/types';

getAccountAbstractionProvider(props?: GetAccountAbstractionProviderProps): unknown;
setEoaConnector(connector: WalletConnectorBase): Promise<void>;
/**
* @deprecated You should get the EOA connector by passing the SCW wallet to getEOAConnector,
* from the useSmartWallet hook
*/
getEOAConnector(): WalletConnector | undefined;
}
export {};

@@ -27,3 +27,4 @@ import { WalletConnectorBase } from '.';

clearConnectedAccounts(): Promise<void>;
signMessageWithAddress(messageToSign: string, address: string): Promise<string | undefined>;
}
export {};

@@ -1,4 +0,5 @@

export interface IHardwareWalletConnector {
import { WalletConnectorBase } from '../';
export interface IHardwareWalletConnector extends WalletConnectorBase {
canConnectWithHardwareWallet(): boolean;
isHardwareWalletEnabled: boolean;
}

@@ -7,3 +7,2 @@ export * from './IEmailOTPWalletConnector';

export * from './ITurnkeyWalletConnectorStamper';
export * from './SmartWalletConnector';
export * from './IAccountAbstractionWalletConnector';

@@ -10,0 +9,0 @@ export * from './IBitcoinWalletConnector';

@@ -9,2 +9,3 @@ import EventEmitter from 'eventemitter3';

import { WalletConnectorCore } from './types';
import { WalletConstructor, WalletProps } from './wallets';
export declare const Chains: readonly ["ETH", "FLOW", "SOL", "EVM", "ALGO", "STARK", "ATOM", "COSMOS", "BTC"];

@@ -37,5 +38,6 @@ export type Chain = typeof Chains[number];

}
export type WalletConnector = WalletConnectorCore.WalletConnector;
export type InternalWalletConnector = WalletConnectorCore.WalletConnector;
export type WalletConnector = Pick<InternalWalletConnector, 'canConnectViaCustodialService' | 'canConnectViaQrCode' | 'canConnectViaSocial' | 'chainRpcProviders' | 'connect' | 'connectedChain' | 'createWallet' | 'constructorProps' | 'endSession' | 'getAddress' | 'getAdditionalAddresses' | 'getConnectedAccounts' | 'getNetwork' | 'initEventListener' | 'isAvailable' | 'isEmbeddedWallet' | 'isInitialized' | 'isInstalledOnBrowser' | 'isTestnet' | 'isWalletConnect' | 'key' | 'name' | 'parseAddress' | 'proveOwnership' | 'providerResources' | 'supportedChains' | 'supportsNetworkSwitching' | 'switchNetwork' | 'switchNetworkOnlyFromWallet' | 'teardownEventListeners'> & EventEmitter<WalletConnectorEventTypes>;
export interface WalletConnectorConstructor {
new (props?: any): WalletConnector;
new (props?: any): InternalWalletConnector;
}

@@ -52,4 +54,6 @@ export type WalletConnectorsMethod = (props?: any) => WalletConnectorConstructor[];

};
export declare abstract class WalletConnectorBase extends EventEmitter<WalletConnectorEventTypes> {
export declare abstract class WalletConnectorBase<C extends WalletConstructor<any> = WalletConstructor<any>> extends EventEmitter<WalletConnectorEventTypes> {
#private;
abstract ChainWallet: C;
createWallet(props: WalletProps<InternalWalletConnector>): import("./wallets").Wallet<any>;
chainRpcProviders: IChainRpcProviders | undefined;

@@ -165,5 +169,7 @@ constructorProps: any;

*
* @param forceFetch - if true it will fetch the address again even if
* wallet has getConnectedAccounts limitation in wallet-book
* @default Promise<[]>
*/
getConnectedAccounts(): Promise<string[]>;
getConnectedAccounts(forceFetch?: boolean): Promise<string[]>;
/**

@@ -263,3 +269,3 @@ * Gets the deep link of the wallet

*/
getMobileOrInstalledWallet(): WalletConnector;
getMobileOrInstalledWallet(): InternalWalletConnector;
/**

@@ -270,3 +276,3 @@ * In most cases this is an alias for `signMessage`

*/
proveOwnership(messageToSign: string): Promise<string | undefined>;
proveOwnership(address: string, messageToSign: string): Promise<string | undefined>;
/**

@@ -273,0 +279,0 @@ * Additional resources to add to the message to be signed

@@ -9,2 +9,3 @@ 'use client'

import { getMobileExperience } from '../utils/getMobileExperience/getMobileExperience.js';
import { isConnectorMethodSupported } from '../utils/isConnectorMethodSupported/isConnectorMethodSupported.js';
import { WalletBookSingleton } from './WalletBookSingleton.js';

@@ -43,2 +44,6 @@

class WalletConnectorBase extends EventEmitter {
createWallet(props) {
const wallet = new this.ChainWallet(props);
return wallet;
}
/**

@@ -232,5 +237,7 @@ * We store the constructor props so that we can use them later on

*
* @param forceFetch - if true it will fetch the address again even if
* wallet has getConnectedAccounts limitation in wallet-book
* @default Promise<[]>
*/
getConnectedAccounts() {
getConnectedAccounts(forceFetch) {
return Promise.resolve([]);

@@ -308,4 +315,7 @@ }

*/
proveOwnership(messageToSign) {
return this.signMessage(messageToSign);
proveOwnership(address, messageToSign) {
return __awaiter(this, void 0, void 0, function* () {
yield this.validateActiveWallet(address);
return this.signMessage(messageToSign);
});
}

@@ -362,16 +372,35 @@ /**

var _a, _b;
const [activeAddress] = yield this.getConnectedAccounts();
const isWalletActive = isSameAddress(activeAddress, expectedAddress, this.connectedChain);
logger.debug(`validateActiveWallet - wallet ${isWalletActive ? 'is' : 'is not'} active`, {
activeAddress,
expectedAddress,
logger.debug('validateActiveWallet - validating wallet', expectedAddress);
const canFetchConnectedAccounts = isConnectorMethodSupported(this, 'getConnectedAccounts', 'browserExtension');
logger.debug('validateActiveWallet - getting connected accounts', {
canFetchConnectedAccounts,
});
const [activeAddress] = canFetchConnectedAccounts
? yield this.getConnectedAccounts(true)
: [];
const isWalletActive = activeAddress &&
isSameAddress(activeAddress, expectedAddress, this.connectedChain);
const walletUiUtils = this.constructorProps
.walletUiUtils;
if (isWalletActive) {
logger.debug('validateActiveWallet - wallet is active');
return;
}
logger.debug('validateActiveWallet - trying to reconnect wallet...');
// not possible to auto-reconnect walletconnect
const reconnectedAddress = !this.isWalletConnect && (yield this.getAddress());
if (reconnectedAddress &&
isSameAddress(reconnectedAddress, expectedAddress, this.connectedChain)) {
logger.debug('validateActiveWallet - wallet reconnected successfuly');
return;
}
logger.debug('validateActiveWallet - wallet is not active', {
activeAddress,
expectedAddress,
reconnectedAddress,
});
const currentActiveAddress = activeAddress || reconnectedAddress || '';
if (!walletUiUtils) {
throw new WalletAddressMismatchError(`Wallet ${expectedAddress !== null && expectedAddress !== void 0 ? expectedAddress : ''} is not currently active in ${(_a = this.name) !== null && _a !== void 0 ? _a : this.key}.`, {
activeAddress,
activeAddress: currentActiveAddress,
expectedAddress,

@@ -382,3 +411,3 @@ walletName: (_b = this.name) !== null && _b !== void 0 ? _b : this.key,

return walletUiUtils.syncWallet({
activeAddress,
activeAddress: currentActiveAddress,
expectedAddress,

@@ -385,0 +414,0 @@ walletConnector: this,

@@ -1,5 +0,5 @@

import { WalletConnector } from '.';
import { InternalWalletConnector } from '.';
export interface WalletConnectorExtension {
extend(connector: WalletConnector): void;
extend(connector: InternalWalletConnector): void;
name: string;
}
import type { BaseWalletProps } from '@dynamic-labs/types';
import { BaseWallet } from '@dynamic-labs/types';
import { NameServiceData, WalletConnector } from '../../';
type WalletProps = BaseWalletProps & {
connector: WalletConnector;
import { WalletConnector, NameServiceData, InternalWalletConnector } from '../../';
export type WalletProps<T extends InternalWalletConnector = InternalWalletConnector> = BaseWalletProps & {
connector: T;
};
export declare class Wallet extends BaseWallet {
#private;
constructor({ connector, ...props }: WalletProps);
export declare class Wallet<T extends InternalWalletConnector = InternalWalletConnector> extends BaseWallet {
protected _connector: T;
constructor({ connector, ...props }: WalletProps<T>);
/**

@@ -27,32 +27,2 @@ * Gets the wallet connector.

/**
* Retrieves the network that the wallet is connected to.
* @returns A promise that resolves to the network value as a string or number,
* or undefined if the network cannot be retrieved.
*/
getNetwork(): Promise<string | number | undefined>;
/**
* Retrieves the rpc provider for the wallet.
* @returns A promise that resolves to the provider,
* or undefined if the provider cannot be retrieved.
*/
getPublicClient<T>(): Promise<T>;
/**
* Retrieves the signer for the wallet.
* @returns A promise that resolves to the signer,
* or undefined if the signer cannot be retrieved.
*/
getSigner<T>(): Promise<T>;
/**
* Retrieves the wallet client.
* @param chainId - (optional) Chain id to be used by the wallet client.
* @returns A promise that resolves to the wallet client,
* or undefined if the wallet client cannot be retrieved.
*/
getWalletClient<T>(chainId?: string): Promise<T>;
/**
* If the wallet is availble to use. A wallet is available if its provider is available.
* @returns True if the wallet is available, false otherwise.
*/
isAvailable(): boolean;
/**
* If the wallet is connected.

@@ -88,2 +58,4 @@ * @returns A promise that resolves to true the wallet is connected or false if it's not connected.

}
export {};
export interface WalletConstructor<T extends InternalWalletConnector> {
new (props: WalletProps<T>): Wallet<T>;
}
'use client'
import { __rest, __classPrivateFieldSet, __classPrivateFieldGet, __awaiter } from '../../../../_virtual/_tslib.js';
import { __rest, __awaiter } from '../../../../_virtual/_tslib.js';
import { BaseWallet } from '@dynamic-labs/types';

@@ -9,3 +9,2 @@ import { logger } from '../../../utils/logger.js';

var _Wallet_connector;
class Wallet extends BaseWallet {

@@ -15,4 +14,3 @@ constructor(_a) {

super(props);
_Wallet_connector.set(this, void 0);
__classPrivateFieldSet(this, _Wallet_connector, connector, "f");
this._connector = connector;
}

@@ -23,3 +21,3 @@ /**

get connector() {
return __classPrivateFieldGet(this, _Wallet_connector, "f");
return this._connector;
}

@@ -33,3 +31,3 @@ /**

return __awaiter(this, void 0, void 0, function* () {
return __classPrivateFieldGet(this, _Wallet_connector, "f").getBalance(this.address);
return this._connector.getBalance(this.address);
});

@@ -44,54 +42,6 @@ }

return __awaiter(this, void 0, void 0, function* () {
return __classPrivateFieldGet(this, _Wallet_connector, "f").getNameService(this.address);
return this._connector.getNameService(this.address);
});
}
/**
* Retrieves the network that the wallet is connected to.
* @returns A promise that resolves to the network value as a string or number,
* or undefined if the network cannot be retrieved.
*/
getNetwork() {
return __awaiter(this, void 0, void 0, function* () {
return __classPrivateFieldGet(this, _Wallet_connector, "f").getNetwork();
});
}
/**
* Retrieves the rpc provider for the wallet.
* @returns A promise that resolves to the provider,
* or undefined if the provider cannot be retrieved.
*/
getPublicClient() {
return __awaiter(this, void 0, void 0, function* () {
return __classPrivateFieldGet(this, _Wallet_connector, "f").getPublicClient();
});
}
/**
* Retrieves the signer for the wallet.
* @returns A promise that resolves to the signer,
* or undefined if the signer cannot be retrieved.
*/
getSigner() {
return __awaiter(this, void 0, void 0, function* () {
return __classPrivateFieldGet(this, _Wallet_connector, "f").getSigner();
});
}
/**
* Retrieves the wallet client.
* @param chainId - (optional) Chain id to be used by the wallet client.
* @returns A promise that resolves to the wallet client,
* or undefined if the wallet client cannot be retrieved.
*/
getWalletClient(chainId) {
return __awaiter(this, void 0, void 0, function* () {
return __classPrivateFieldGet(this, _Wallet_connector, "f").getWalletClient(chainId);
});
}
/**
* If the wallet is availble to use. A wallet is available if its provider is available.
* @returns True if the wallet is available, false otherwise.
*/
isAvailable() {
return __classPrivateFieldGet(this, _Wallet_connector, "f").isAvailable;
}
/**
* If the wallet is connected.

@@ -103,3 +53,3 @@ * @returns A promise that resolves to true the wallet is connected or false if it's not connected.

try {
const connectedAccounts = yield __classPrivateFieldGet(this, _Wallet_connector, "f").getConnectedAccounts();
const connectedAccounts = yield this._connector.getConnectedAccounts();
return connectedAccounts

@@ -123,4 +73,3 @@ .map((address) => normalizeAddress(address, this.chain))

return __awaiter(this, void 0, void 0, function* () {
yield this.sync();
return __classPrivateFieldGet(this, _Wallet_connector, "f").proveOwnership(messageToSign);
return this._connector.proveOwnership(this.address, messageToSign);
});

@@ -137,3 +86,3 @@ }

yield this.sync();
return __classPrivateFieldGet(this, _Wallet_connector, "f").signMessage(messageToSign);
return this._connector.signMessage(messageToSign);
});

@@ -148,3 +97,3 @@ }

return __awaiter(this, void 0, void 0, function* () {
return __classPrivateFieldGet(this, _Wallet_connector, "f").switchNetwork({
return this._connector.switchNetwork({
networkChainId,

@@ -160,8 +109,7 @@ });

return __awaiter(this, void 0, void 0, function* () {
return __classPrivateFieldGet(this, _Wallet_connector, "f").validateActiveWallet(this.address);
return this._connector.validateActiveWallet(this.address);
});
}
}
_Wallet_connector = new WeakMap();
export { Wallet };

@@ -53,4 +53,8 @@ 'use client'

const chainOverrides = {
algo: 'algorand',
bip122: 'bitcoin',
btc: 'bitcoin',
eip155: 'evm',
eth: 'evm',
sol: 'solana',
stark: 'starknet',

@@ -57,0 +61,0 @@ };

@@ -1,2 +0,2 @@

import { WalletConnector } from '../lib';
export declare const getWalletConnectorByKey: (wallets: WalletConnector[], key: string) => WalletConnector | null;
import { InternalWalletConnector } from '../lib';
export declare const getWalletConnectorByKey: (wallets: InternalWalletConnector[], key: string) => InternalWalletConnector | null;

@@ -16,3 +16,2 @@ export * from './logger';

export * from './isPasskeyWalletConnector';
export * from './isSmartWalletConnector';
export * from './isAccountAbstractionConnector';

@@ -28,3 +27,3 @@ export * from './isBitcoinConnector';

export * from './isSendBalanceWalletConnector';
export * from './isSessionKeyCompatibleWalletConnector';
export * from './isSessionKeyCompatible';
export * from './getMobileExperience';

@@ -1,1 +0,1 @@

export { isAccountAbstractionConnector } from './isAccountAbstractionConnector';
export * from './isAccountAbstractionConnector';
import { IHardwareWalletConnector, WalletConnector } from '../../lib';
export declare const isHardwareWalletConnector: (connector: WalletConnector | IHardwareWalletConnector) => connector is IHardwareWalletConnector & import("../../lib").WalletConnectorCore.WalletConnector;
export declare const isHardwareWalletConnector: (connector: WalletConnector | IHardwareWalletConnector) => connector is IHardwareWalletConnector;

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc