The official TypeScript/React SDK for PayStreamer, providing non-custodial recurring subscriptions and billing infrastructure on the Sui blockchain.
useSubscribe, usePlatform, useUserAccount, usePusdBalance, useSponsoredTransaction, etc.).SetupSubscriptionModal and TestnetFaucetButton.@paystreamer/sdk/core/deepbook, optional peer dependency).@paystreamer/sdk/core/seal, @paystreamer/sdk/core/walrus, optional peer dependencies).Tested against this exact combination — other versions may work but aren't verified:
| Package | Version |
|---|---|
@mysten/sui |
2.23.1 |
@mysten/dapp-kit-react |
2.1.10 |
@mysten/dapp-kit-core |
1.6.8 |
@tanstack/react-query |
^5.90.16 |
react / react-dom |
^18.2.0 || ^19.0.0 |
| Node.js | 20+ |
| Sui CLI (for local dev) | 1.75.x |
@mysten/sui, @mysten/dapp-kit-react, and @tanstack/react-query are peer
dependencies — install them alongside the SDK, and keep them at the versions
above until a new compatibility matrix is published here.
pnpm add @paystreamer/sdk @mysten/sui@2.23.1 @mysten/dapp-kit-react@2.1.10 @tanstack/react-query
PayStreamer sits on top of dApp Kit's
createDAppKit/DAppKitProvider, which manages the wallet connection and
the Sui client. Wrap that with PayStreamerProvider, which carries the
PayStreamer-specific contract addresses for whichever network you target.
import { createDAppKit, DAppKitProvider } from "@mysten/dapp-kit-react";
import { SuiGrpcClient } from "@mysten/sui/grpc";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { PayStreamerProvider, getConfig, CLOCK_OBJECT_ID } from "@paystreamer/sdk";
const queryClient = new QueryClient();
const sdkConfig = getConfig("testnet");
const dAppKit = createDAppKit({
networks: ["testnet"],
defaultNetwork: "testnet",
createClient: (network) =>
new SuiGrpcClient({
network,
baseUrl: `https://fullnode.${network}.sui.io:443`,
}),
});
function App({ children }: { children: React.ReactNode }) {
return (
<QueryClientProvider client={queryClient}>
<DAppKitProvider dAppKit={dAppKit}>
<PayStreamerProvider
config={{
network: "testnet",
packageId: sdkConfig.PACKAGE_ID,
registryId: sdkConfig.COIN_TYPE_REGISTRY_ID,
clockId: CLOCK_OBJECT_ID,
pusdPackageId: sdkConfig.PUSD_PACKAGE_ID,
pusdType: sdkConfig.PUSD_TYPE_ARG,
pusdTreasuryCapId: sdkConfig.PUSD_TREASURY_CAP_ID,
pusdTreasuryCapInitVersion: sdkConfig.PUSD_TREASURY_CAP_INIT_VERSION,
}}
>
{children}
</PayStreamerProvider>
</DAppKitProvider>
</QueryClientProvider>
);
}
import { useState } from 'react';
import { SetupSubscriptionModal } from '@paystreamer/sdk/ui';
export function SubscribeButton({ platformId }: { platformId: string }) {
const [isOpen, setIsOpen] = useState(false);
return (
<>
<button onClick={() => setIsOpen(true)}>
Subscribe Now
</button>
<SetupSubscriptionModal
isOpen={isOpen}
onClose={() => setIsOpen(false)}
platformId={platformId}
tierIndex={0}
onSuccess={(digest) => {
console.log('Subscription created!', digest);
}}
/>
</>
);
}
@paystreamer/sdk — Main bundle entry point (re-exports core + react + ui)@paystreamer/sdk/core — PTB builders, chain queries, and event queries@paystreamer/sdk/react — React hooks and context providers@paystreamer/sdk/ui — React UI components and modal dialogs@paystreamer/sdk/core/seal, @paystreamer/sdk/core/deepbook, @paystreamer/sdk/core/walrus — optional integrations, each behind its own optional peer dependency. These are deliberately not re-exported from @paystreamer/sdk/core — importing any of them there would make every consumer's bundler resolve @mysten/seal/@mysten/deepbook-v3/@mysten/walrus even if unused, which broke real builds before this split existed. Install only the peer dependency you actually need.Full guides at docs.usepaystreamer.xyz, including a complete Core API Reference and a generated TypeDoc reference for exact type signatures.
MIT