New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@mysten/zksend

Package Overview
Dependencies
Maintainers
0
Versions
249
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@mysten/zksend - npm Package Compare versions

Comparing version 0.0.0-experimental-20240819192704 to 0.0.0-experimental-20240830182100

dist/cjs/wallet/types.d.ts

12

CHANGELOG.md
# @mysten/zksend
## 0.0.0-experimental-20240819192704
## 0.0.0-experimental-20240830182100
### Minor Changes
- 4bdef4a: Add support for testnet in Stashed and zkSend SDKs.
## 0.10.6
### Patch Changes

@@ -12,4 +18,4 @@

- Updated dependencies [00a974d]
- @mysten/sui@0.0.0-experimental-20240819192704
- @mysten/wallet-standard@0.0.0-experimental-20240819192704
- @mysten/sui@1.7.0
- @mysten/wallet-standard@0.13.2

@@ -16,0 +22,0 @@ ## 0.10.5

@@ -7,4 +7,4 @@ export { ZkSendLinkBuilder, type ZkSendLinkBuilderOptions, type CreateZkSendLinkOptions, } from './links/builder.js';

export { getSentTransactionsWithLinks } from './links/get-sent-transactions.js';
export { MAINNET_CONTRACT_IDS } from './links/zk-bag.js';
export { MAINNET_CONTRACT_IDS, TESTNET_CONTRACT_IDS } from './links/zk-bag.js';
export * from './wallet/index.js';
export * from './wallet/channel/index.js';

@@ -23,2 +23,3 @@ "use strict";

MAINNET_CONTRACT_IDS: () => import_zk_bag2.MAINNET_CONTRACT_IDS,
TESTNET_CONTRACT_IDS: () => import_zk_bag2.TESTNET_CONTRACT_IDS,
ZkBag: () => import_zk_bag.ZkBag,

@@ -25,0 +26,0 @@ ZkSendLink: () => import_claim.ZkSendLink,

@@ -54,3 +54,3 @@ "use strict";

redirect,
contract = network === "mainnet" ? import_zk_bag.MAINNET_CONTRACT_IDS : void 0
contract = (0, import_zk_bag.getContractIds)(network)
}) {

@@ -147,3 +147,3 @@ __privateAdd(this, _ZkSendLinkBuilder_instances);

transaction = new import_transactions.Transaction(),
contract: contractIds = import_zk_bag.MAINNET_CONTRACT_IDS
contract: contractIds = (0, import_zk_bag.getContractIds)(network)
}) {

@@ -150,0 +150,0 @@ const contract = new import_zk_bag.ZkBag(contractIds.packageId, contractIds);

@@ -53,3 +53,3 @@ "use strict";

keypair,
contract = network === "mainnet" ? import_zk_bag.MAINNET_CONTRACT_IDS : null,
contract = (0, import_zk_bag.getContractIds)(network),
address,

@@ -56,0 +56,0 @@ host = DEFAULT_ZK_SEND_LINK_OPTIONS.host,

@@ -33,3 +33,3 @@ "use strict";

network = "mainnet",
contract = import_zk_bag.MAINNET_CONTRACT_IDS,
contract = (0, import_zk_bag.getContractIds)(network),
client = new import_client.SuiClient({ url: (0, import_client.getFullnodeUrl)(network) }),

@@ -36,0 +36,0 @@ loadClaimedAssets = false,

@@ -55,3 +55,3 @@ "use strict";

network,
contract = import_zk_bag.MAINNET_CONTRACT_IDS,
contract = (0, import_zk_bag.getContractIds)(network),
fetch: fetchFn,

@@ -58,0 +58,0 @@ ...linkOptions

@@ -7,3 +7,5 @@ import type { Argument, Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';

}
export declare const TESTNET_CONTRACT_IDS: ZkBagContractOptions;
export declare const MAINNET_CONTRACT_IDS: ZkBagContractOptions;
export declare function getContractIds(network?: 'mainnet' | 'testnet'): ZkBagContractOptions;
export declare class ZkBag<IDs> {

@@ -10,0 +12,0 @@ #private;

@@ -29,6 +29,13 @@ "use strict";

MAINNET_CONTRACT_IDS: () => MAINNET_CONTRACT_IDS,
ZkBag: () => ZkBag
TESTNET_CONTRACT_IDS: () => TESTNET_CONTRACT_IDS,
ZkBag: () => ZkBag,
getContractIds: () => getContractIds
});
module.exports = __toCommonJS(zk_bag_exports);
var _package, _module;
const TESTNET_CONTRACT_IDS = {
packageId: "0x036fee67274d0d85c3532f58296abe0dee86b93864f1b2b9074be6adb388f138",
bagStoreId: "0x5c63e71734c82c48a3cb9124c54001d1a09736cfb1668b3b30cd92a96dd4d0ce",
bagStoreTableId: "0x4e1bc4085d64005e03eb4eab2510d527aeba9548cda431cb8f149ff37451f870"
};
const MAINNET_CONTRACT_IDS = {

@@ -39,2 +46,8 @@ packageId: "0x5bb7d0bb3240011336ca9015f553b2646302a4f05f821160344e9ec5a988f740",

};
function getContractIds(network) {
if (!network) {
return MAINNET_CONTRACT_IDS;
}
return network === "mainnet" ? MAINNET_CONTRACT_IDS : TESTNET_CONTRACT_IDS;
}
class ZkBag {

@@ -41,0 +54,0 @@ constructor(packageAddress, ids) {

import type { InferOutput } from 'valibot';
import type { StashedSupportedNetwork } from '../types.js';
import type { StashedRequestData, StashedResponsePayload, StashedResponseTypes } from './events.js';

@@ -8,4 +9,5 @@ import { StashedRequest, StashedResponse } from './events.js';

#private;
constructor({ name, origin }: {
constructor({ name, network, origin, }: {
name: string;
network: StashedSupportedNetwork;
origin?: string;

@@ -12,0 +14,0 @@ });

@@ -39,6 +39,10 @@ "use strict";

var import_events = require("./events.js");
var _popup, _id, _origin, _name, _promise, _resolve, _reject, _interval, _listener, _StashedPopup_instances, cleanup_fn, _request;
var _popup, _id, _origin, _name, _network, _promise, _resolve, _reject, _interval, _listener, _StashedPopup_instances, cleanup_fn, _request;
const DEFAULT_STASHED_ORIGIN = "https://getstashed.com";
class StashedPopup {
constructor({ name, origin = DEFAULT_STASHED_ORIGIN }) {
constructor({
name,
network,
origin = DEFAULT_STASHED_ORIGIN
}) {
__privateAdd(this, _StashedPopup_instances);

@@ -49,2 +53,3 @@ __privateAdd(this, _popup);

__privateAdd(this, _name);
__privateAdd(this, _network);
__privateAdd(this, _promise);

@@ -75,2 +80,3 @@ __privateAdd(this, _resolve);

__privateSet(this, _name, name);
__privateSet(this, _network, network);
const { promise, resolve, reject } = (0, import_withResolvers.withResolvers)();

@@ -99,2 +105,3 @@ __privateSet(this, _promise, promise);

origin: window.origin,
network: __privateGet(this, _network),
name: __privateGet(this, _name)

@@ -114,2 +121,3 @@ })}${data ? `#${new URLSearchParams(data)}` : ""}`

_name = new WeakMap();
_network = new WeakMap();
_promise = new WeakMap();

@@ -116,0 +124,0 @@ _resolve = new WeakMap();

import type { StandardConnectFeature, StandardDisconnectFeature, StandardEventsFeature, SuiSignPersonalMessageFeature, SuiSignTransactionBlockFeature, SuiSignTransactionFeature, Wallet } from '@mysten/wallet-standard';
import { ReadonlyWalletAccount } from '@mysten/wallet-standard';
import type { StashedSupportedNetwork } from './types.js';
export declare const STASHED_WALLET_NAME: "Stashed";

@@ -12,10 +13,12 @@ export declare class StashedWallet implements Wallet {

get features(): StandardConnectFeature & StandardDisconnectFeature & StandardEventsFeature & SuiSignTransactionBlockFeature & SuiSignTransactionFeature & SuiSignPersonalMessageFeature;
constructor({ name, address, origin, }: {
constructor({ name, network, address, origin, }: {
name: string;
network: StashedSupportedNetwork;
origin?: string;
address?: string | null;
name: string;
});
}
export declare function registerStashedWallet(name: string, { origin, }: {
export declare function registerStashedWallet(name: string, { origin, network, }?: {
origin?: string;
network?: StashedSupportedNetwork;
}): {

@@ -22,0 +25,0 @@ wallet: StashedWallet;

@@ -49,3 +49,3 @@ "use strict";

var import_channel = require("./channel/index.js");
var _events, _accounts, _origin, _name, _signTransactionBlock, _signTransaction, _signPersonalMessage, _on, _StashedWallet_instances, setAccount_fn, _connect, _disconnect;
var _events, _accounts, _origin, _name, _network, _signTransactionBlock, _signTransaction, _signPersonalMessage, _on, _StashedWallet_instances, setAccount_fn, _connect, _disconnect;
const STASHED_RECENT_ADDRESS_KEY = "stashed:recentAddress";

@@ -56,2 +56,3 @@ const STASHED_WALLET_NAME = "Stashed";

name,
network,
address,

@@ -65,2 +66,3 @@ origin = import_channel.DEFAULT_STASHED_ORIGIN

__privateAdd(this, _name);
__privateAdd(this, _network);
__privateAdd(this, _signTransactionBlock, async ({ transactionBlock, account }) => {

@@ -71,3 +73,4 @@ transactionBlock.setSenderIfNotSet(account.address);

name: __privateGet(this, _name),
origin: __privateGet(this, _origin)
origin: __privateGet(this, _origin),
network: __privateGet(this, _network)
});

@@ -87,3 +90,4 @@ const response = await popup.send({

name: __privateGet(this, _name),
origin: __privateGet(this, _origin)
origin: __privateGet(this, _origin),
network: __privateGet(this, _network)
});

@@ -106,3 +110,4 @@ const tx = import_transactions.Transaction.from(await transaction.toJSON());

name: __privateGet(this, _name),
origin: __privateGet(this, _origin)
origin: __privateGet(this, _origin),
network: __privateGet(this, _network)
});

@@ -132,3 +137,7 @@ const bytes = (0, import_utils.toB64)(message);

}
const popup = new import_channel.StashedPopup({ name: __privateGet(this, _name), origin: __privateGet(this, _origin) });
const popup = new import_channel.StashedPopup({
name: __privateGet(this, _name),
origin: __privateGet(this, _origin),
network: __privateGet(this, _network)
});
const response = await popup.send({

@@ -151,2 +160,3 @@ type: "connect"

__privateSet(this, _name, name);
__privateSet(this, _network, network);
if (address) {

@@ -204,2 +214,3 @@ __privateMethod(this, _StashedWallet_instances, setAccount_fn).call(this, address);

_name = new WeakMap();
_network = new WeakMap();
_signTransactionBlock = new WeakMap();

@@ -230,4 +241,5 @@ _signTransaction = new WeakMap();

function registerStashedWallet(name, {
origin
}) {
origin,
network = "mainnet"
} = {}) {
const wallets = (0, import_wallet_standard.getWallets)();

@@ -242,2 +254,3 @@ let addressFromRedirect = null;

name,
network,
origin,

@@ -244,0 +257,0 @@ address: addressFromRedirect

@@ -7,4 +7,4 @@ export { ZkSendLinkBuilder, type ZkSendLinkBuilderOptions, type CreateZkSendLinkOptions, } from './links/builder.js';

export { getSentTransactionsWithLinks } from './links/get-sent-transactions.js';
export { MAINNET_CONTRACT_IDS } from './links/zk-bag.js';
export { MAINNET_CONTRACT_IDS, TESTNET_CONTRACT_IDS } from './links/zk-bag.js';
export * from './wallet/index.js';
export * from './wallet/channel/index.js';

@@ -9,3 +9,3 @@ import {

import { getSentTransactionsWithLinks } from "./links/get-sent-transactions.js";
import { MAINNET_CONTRACT_IDS } from "./links/zk-bag.js";
import { MAINNET_CONTRACT_IDS, TESTNET_CONTRACT_IDS } from "./links/zk-bag.js";
export * from "./wallet/index.js";

@@ -15,2 +15,3 @@ export * from "./wallet/channel/index.js";

MAINNET_CONTRACT_IDS,
TESTNET_CONTRACT_IDS,
ZkBag,

@@ -17,0 +18,0 @@ ZkSendLink,

@@ -15,3 +15,3 @@ var __typeError = (msg) => {

import { normalizeStructTag, normalizeSuiAddress, SUI_TYPE_ARG, toB64 } from "@mysten/sui/utils";
import { MAINNET_CONTRACT_IDS, ZkBag } from "./zk-bag.js";
import { getContractIds, ZkBag } from "./zk-bag.js";
const DEFAULT_ZK_SEND_LINK_OPTIONS = {

@@ -32,3 +32,3 @@ host: "https://zksend.com",

redirect,
contract = network === "mainnet" ? MAINNET_CONTRACT_IDS : void 0
contract = getContractIds(network)
}) {

@@ -125,3 +125,3 @@ __privateAdd(this, _ZkSendLinkBuilder_instances);

transaction = new Transaction(),
contract: contractIds = MAINNET_CONTRACT_IDS
contract: contractIds = getContractIds(network)
}) {

@@ -128,0 +128,0 @@ const contract = new ZkBag(contractIds.packageId, contractIds);

@@ -25,3 +25,3 @@ var __typeError = (msg) => {

import { getAssetsFromTransaction, isOwner, ownedAfterChange } from "./utils.js";
import { MAINNET_CONTRACT_IDS, ZkBag } from "./zk-bag.js";
import { getContractIds, ZkBag } from "./zk-bag.js";
const DEFAULT_ZK_SEND_LINK_OPTIONS = {

@@ -39,3 +39,3 @@ host: "https://zksend.com",

keypair,
contract = network === "mainnet" ? MAINNET_CONTRACT_IDS : null,
contract = getContractIds(network),
address,

@@ -42,0 +42,0 @@ host = DEFAULT_ZK_SEND_LINK_OPTIONS.host,

import { getFullnodeUrl, SuiClient } from "@mysten/sui/client";
import { normalizeSuiAddress } from "@mysten/sui/utils";
import { ZkSendLink } from "./claim.js";
import { MAINNET_CONTRACT_IDS } from "./zk-bag.js";
import { getContractIds } from "./zk-bag.js";
async function getSentTransactionsWithLinks({

@@ -10,3 +10,3 @@ address,

network = "mainnet",
contract = MAINNET_CONTRACT_IDS,
contract = getContractIds(network),
client = new SuiClient({ url: getFullnodeUrl(network) }),

@@ -13,0 +13,0 @@ loadClaimedAssets = false,

@@ -6,3 +6,3 @@ import { bcs } from "@mysten/sui/bcs";

import { ZkSendLink } from "./claim.js";
import { MAINNET_CONTRACT_IDS } from "./zk-bag.js";
import { getContractIds } from "./zk-bag.js";
const ListCreatedLinksQuery = graphql(`

@@ -33,3 +33,3 @@ query listCreatedLinks($address: SuiAddress!, $function: String!, $cursor: String) {

network,
contract = MAINNET_CONTRACT_IDS,
contract = getContractIds(network),
fetch: fetchFn,

@@ -36,0 +36,0 @@ ...linkOptions

@@ -7,3 +7,5 @@ import type { Argument, Transaction, TransactionObjectArgument } from '@mysten/sui/transactions';

}
export declare const TESTNET_CONTRACT_IDS: ZkBagContractOptions;
export declare const MAINNET_CONTRACT_IDS: ZkBagContractOptions;
export declare function getContractIds(network?: 'mainnet' | 'testnet'): ZkBagContractOptions;
export declare class ZkBag<IDs> {

@@ -10,0 +12,0 @@ #private;

@@ -9,2 +9,7 @@ var __typeError = (msg) => {

var _package, _module;
const TESTNET_CONTRACT_IDS = {
packageId: "0x036fee67274d0d85c3532f58296abe0dee86b93864f1b2b9074be6adb388f138",
bagStoreId: "0x5c63e71734c82c48a3cb9124c54001d1a09736cfb1668b3b30cd92a96dd4d0ce",
bagStoreTableId: "0x4e1bc4085d64005e03eb4eab2510d527aeba9548cda431cb8f149ff37451f870"
};
const MAINNET_CONTRACT_IDS = {

@@ -15,2 +20,8 @@ packageId: "0x5bb7d0bb3240011336ca9015f553b2646302a4f05f821160344e9ec5a988f740",

};
function getContractIds(network) {
if (!network) {
return MAINNET_CONTRACT_IDS;
}
return network === "mainnet" ? MAINNET_CONTRACT_IDS : TESTNET_CONTRACT_IDS;
}
class ZkBag {

@@ -112,4 +123,6 @@ constructor(packageAddress, ids) {

MAINNET_CONTRACT_IDS,
ZkBag
TESTNET_CONTRACT_IDS,
ZkBag,
getContractIds
};
//# sourceMappingURL=zk-bag.js.map
import type { InferOutput } from 'valibot';
import type { StashedSupportedNetwork } from '../types.js';
import type { StashedRequestData, StashedResponsePayload, StashedResponseTypes } from './events.js';

@@ -8,4 +9,5 @@ import { StashedRequest, StashedResponse } from './events.js';

#private;
constructor({ name, origin }: {
constructor({ name, network, origin, }: {
name: string;
network: StashedSupportedNetwork;
origin?: string;

@@ -12,0 +14,0 @@ });

@@ -9,3 +9,3 @@ var __typeError = (msg) => {

var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
var _popup, _id, _origin, _name, _promise, _resolve, _reject, _interval, _listener, _StashedPopup_instances, cleanup_fn, _request;
var _popup, _id, _origin, _name, _network, _promise, _resolve, _reject, _interval, _listener, _StashedPopup_instances, cleanup_fn, _request;
import { parse, safeParse } from "valibot";

@@ -16,3 +16,7 @@ import { withResolvers } from "../../utils/withResolvers.js";

class StashedPopup {
constructor({ name, origin = DEFAULT_STASHED_ORIGIN }) {
constructor({
name,
network,
origin = DEFAULT_STASHED_ORIGIN
}) {
__privateAdd(this, _StashedPopup_instances);

@@ -23,2 +27,3 @@ __privateAdd(this, _popup);

__privateAdd(this, _name);
__privateAdd(this, _network);
__privateAdd(this, _promise);

@@ -49,2 +54,3 @@ __privateAdd(this, _resolve);

__privateSet(this, _name, name);
__privateSet(this, _network, network);
const { promise, resolve, reject } = withResolvers();

@@ -73,2 +79,3 @@ __privateSet(this, _promise, promise);

origin: window.origin,
network: __privateGet(this, _network),
name: __privateGet(this, _name)

@@ -88,2 +95,3 @@ })}${data ? `#${new URLSearchParams(data)}` : ""}`

_name = new WeakMap();
_network = new WeakMap();
_promise = new WeakMap();

@@ -90,0 +98,0 @@ _resolve = new WeakMap();

import type { StandardConnectFeature, StandardDisconnectFeature, StandardEventsFeature, SuiSignPersonalMessageFeature, SuiSignTransactionBlockFeature, SuiSignTransactionFeature, Wallet } from '@mysten/wallet-standard';
import { ReadonlyWalletAccount } from '@mysten/wallet-standard';
import type { StashedSupportedNetwork } from './types.js';
export declare const STASHED_WALLET_NAME: "Stashed";

@@ -12,10 +13,12 @@ export declare class StashedWallet implements Wallet {

get features(): StandardConnectFeature & StandardDisconnectFeature & StandardEventsFeature & SuiSignTransactionBlockFeature & SuiSignTransactionFeature & SuiSignPersonalMessageFeature;
constructor({ name, address, origin, }: {
constructor({ name, network, address, origin, }: {
name: string;
network: StashedSupportedNetwork;
origin?: string;
address?: string | null;
name: string;
});
}
export declare function registerStashedWallet(name: string, { origin, }: {
export declare function registerStashedWallet(name: string, { origin, network, }?: {
origin?: string;
network?: StashedSupportedNetwork;
}): {

@@ -22,0 +25,0 @@ wallet: StashedWallet;

@@ -9,3 +9,3 @@ var __typeError = (msg) => {

var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
var _events, _accounts, _origin, _name, _signTransactionBlock, _signTransaction, _signPersonalMessage, _on, _StashedWallet_instances, setAccount_fn, _connect, _disconnect;
var _events, _accounts, _origin, _name, _network, _signTransactionBlock, _signTransaction, _signPersonalMessage, _on, _StashedWallet_instances, setAccount_fn, _connect, _disconnect;
import { Transaction } from "@mysten/sui/transactions";

@@ -21,2 +21,3 @@ import { toB64 } from "@mysten/sui/utils";

name,
network,
address,

@@ -30,2 +31,3 @@ origin = DEFAULT_STASHED_ORIGIN

__privateAdd(this, _name);
__privateAdd(this, _network);
__privateAdd(this, _signTransactionBlock, async ({ transactionBlock, account }) => {

@@ -36,3 +38,4 @@ transactionBlock.setSenderIfNotSet(account.address);

name: __privateGet(this, _name),
origin: __privateGet(this, _origin)
origin: __privateGet(this, _origin),
network: __privateGet(this, _network)
});

@@ -52,3 +55,4 @@ const response = await popup.send({

name: __privateGet(this, _name),
origin: __privateGet(this, _origin)
origin: __privateGet(this, _origin),
network: __privateGet(this, _network)
});

@@ -71,3 +75,4 @@ const tx = Transaction.from(await transaction.toJSON());

name: __privateGet(this, _name),
origin: __privateGet(this, _origin)
origin: __privateGet(this, _origin),
network: __privateGet(this, _network)
});

@@ -97,3 +102,7 @@ const bytes = toB64(message);

}
const popup = new StashedPopup({ name: __privateGet(this, _name), origin: __privateGet(this, _origin) });
const popup = new StashedPopup({
name: __privateGet(this, _name),
origin: __privateGet(this, _origin),
network: __privateGet(this, _network)
});
const response = await popup.send({

@@ -116,2 +125,3 @@ type: "connect"

__privateSet(this, _name, name);
__privateSet(this, _network, network);
if (address) {

@@ -169,2 +179,3 @@ __privateMethod(this, _StashedWallet_instances, setAccount_fn).call(this, address);

_name = new WeakMap();
_network = new WeakMap();
_signTransactionBlock = new WeakMap();

@@ -195,4 +206,5 @@ _signTransaction = new WeakMap();

function registerStashedWallet(name, {
origin
}) {
origin,
network = "mainnet"
} = {}) {
const wallets = getWallets();

@@ -207,2 +219,3 @@ let addressFromRedirect = null;

name,
network,
origin,

@@ -209,0 +222,0 @@ address: addressFromRedirect

{
"name": "@mysten/zksend",
"version": "0.0.0-experimental-20240819192704",
"version": "0.0.0-experimental-20240830182100",
"description": "TODO: Write Description",

@@ -40,4 +40,4 @@ "license": "Apache-2.0",

"valibot": "^0.36.0",
"@mysten/sui": "0.0.0-experimental-20240819192704",
"@mysten/wallet-standard": "0.0.0-experimental-20240819192704"
"@mysten/sui": "1.7.0",
"@mysten/wallet-standard": "0.13.2"
},

@@ -44,0 +44,0 @@ "scripts": {

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

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

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

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

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