| name | dapp-connect |
| description | This skill should be used when building a dApp that connects to a 1Sat wallet — using @1sat/connect for wallet connection via popup or browser extension, @1sat/react for React hooks and ConnectButton, or @1sat/extension for building browser wallet extensions. Triggers on 'connect wallet', 'dApp integration', 'wallet provider', 'ConnectButton', 'React hooks', 'useBalance', 'useOrdinals', 'browser extension', 'popup wallet', 'window.onesat', or 'OneSatProvider'. |
dApp Connect
Build dApps that connect to 1Sat wallets using @1sat/connect (vanilla JS) and @1sat/react (React).
Quick Start (React)
import { OneSatProvider, ConnectButton, useBalance, useOrdinals } from '@1sat/react'
function App() {
return (
<OneSatProvider appName="My dApp">
<ConnectButton />
<Dashboard />
</OneSatProvider>
)
}
function Dashboard() {
const { satoshis } = useBalance()
const { ordinals } = useOrdinals()
return (
<div>
<p>Balance: {satoshis} sats</p>
<p>Ordinals: {ordinals?.length}</p>
</div>
)
}
Vanilla JS
import { createOneSat } from '@1sat/connect'
const onesat = createOneSat({ appName: 'My dApp' })
const { paymentAddress, ordinalAddress, identityPubKey } = await onesat.connect()
const { satoshis } = await onesat.getBalance()
const { signature, address } = await onesat.signMessage('Hello world')
const { rawtx, txid } = await onesat.signTransaction({
rawtx: rawTransactionHex,
description: 'Payment transaction',
})
await onesat.disconnect()
Provider Detection
createOneSat() detects the wallet automatically:
- Browser extension — If
window.onesat.isOneSat is true, uses the injected provider
- Popup fallback — Otherwise, creates a popup-based provider
import { isOneSatInjected, waitForOneSat, createOneSat } from '@1sat/connect'
if (isOneSatInjected()) {
console.log('Extension detected!')
}
try {
const provider = await waitForOneSat(3000)
} catch {
console.log('No extension, using popup')
}
const onesat = createOneSat()
React Hooks
All hooks from @1sat/react:
| Hook | Returns | Description |
|---|
useOneSatContext() | OneSatContextValue | Provider connection state |
useBalance() | { satoshis, usd? } | BSV balance |
useOrdinals() | OrdinalOutput[] | List ordinals |
useTokens() | TokenOutput[] | List token outputs |
useUtxos() | Utxo[] | List payment UTXOs |
useSignTransaction() | (req) => Promise<result> | Sign transactions |
useSignMessage() | (msg) => Promise<result> | Sign messages (BSM) |
useInscribe() | (req) => Promise<result> | Create inscriptions |
useSendOrdinals() | (req) => Promise<result> | Send ordinals |
useTransferToken() | (req) => Promise<result> | Transfer tokens |
useCreateListing() | (req) => Promise<result> | List ordinals for sale |
usePurchaseListing() | (req) => Promise<result> | Buy listed ordinals |
useCancelListing() | (req) => Promise<result> | Cancel listings |
OneSatProvider Interface
The full provider interface available to dApps:
interface OneSatProvider {
connect(): Promise<ConnectResult>
disconnect(): Promise<void>
isConnected(): boolean
signTransaction(request: SignTransactionRequest): Promise<SignTransactionResult>
signMessage(message: string): Promise<SignMessageResult>
inscribe(request: InscribeRequest): Promise<InscribeResult>
sendOrdinals(request: SendOrdinalsRequest): Promise<SendResult>
createListing(request: CreateListingRequest): Promise<ListingResult>
purchaseListing(request: PurchaseListingRequest): Promise<SendResult>
cancelListing(request: CancelListingRequest): Promise<SendResult>
transferToken(request: TransferTokenRequest): Promise<SendResult>
getBalance(): Promise<BalanceResult>
getOrdinals(options?: ListOptions): Promise<OrdinalOutput[]>
getTokens(options?: ListOptions): Promise<TokenOutput[]>
getUtxos(): Promise<Utxo[]>
on(event: OneSatEvent, handler: EventHandler): void
off(event: OneSatEvent, handler: EventHandler): void
getAddresses(): { paymentAddress: string; ordinalAddress: string } | null
getIdentityPubKey(): string | null
}
Events
onesat.on('connect', (result) => {
console.log('Connected:', result.paymentAddress)
})
onesat.on('disconnect', () => {
console.log('Disconnected')
})
onesat.on('accountChange', (result) => {
console.log('Account changed:', result.paymentAddress)
})
Transport Modes
For popup-based connections, configure the transport:
import { createOneSat, createEmbedTransport, createRedirectTransport } from '@1sat/connect'
const onesat = createOneSat({ appName: 'My dApp' })
const embedTransport = createEmbedTransport({ walletUrl: 'https://1sat.market' })
const redirectTransport = createRedirectTransport({ walletUrl: 'https://1sat.market' })
Building a Browser Extension
Use @1sat/extension to build wallet extensions:
import { injectOneSatProvider } from '@1sat/extension'
injectOneSatProvider()
import { createContentBridge } from '@1sat/extension'
createContentBridge()
import { createBackgroundHandler, openApprovalPopup } from '@1sat/extension'
const handler = createBackgroundHandler({
handlers: {
async connect(request, sender) {
const approved = await openApprovalPopup('/popup/connect.html')
if (!approved) throw new UserRejectedError()
return { paymentAddress, ordinalAddress, identityPubKey }
},
async signTransaction(request, sender) { },
async getBalance(request, sender) { },
}
})
Persistent Connection
import { saveConnection, loadConnection, clearConnection } from '@1sat/connect'
const result = await onesat.connect()
saveConnection({ paymentAddress: result.paymentAddress, ... })
const stored = loadConnection()
if (stored) {
}
clearConnection()
Requirements
bun add @1sat/connect
bun add @1sat/react
bun add @1sat/extension