@d9-network/dapp-connector
v0.1.0
Published
Production SDK for connecting D9 Wallet from dapps via PAPI extension and WalletConnect.
Downloads
27
Maintainers
Readme
@d9-network/dapp-connector
Production SDK for connecting D9 Wallet from web dapps.
Supports:
- PAPI extension (
window.injectedWeb3["d9-wallet"]) inside the D9 Wallet in-app browser - WalletConnect v2 (
d9netnamespace) for external browsers / mobile deep links
Install
npm install @d9-network/dapp-connector
# or
pnpm add @d9-network/dapp-connectorQuick start
import {
createD9DAppConnector,
D9_DEFAULT_CHAIN_ID,
D9_DEFAULT_WALLET_CONNECT_PROJECT_ID,
D9_DEFAULT_WALLET_CONNECT_RELAY_URL,
buildD9WalletConnectAppLink,
} from "@d9-network/dapp-connector";
const connector = createD9DAppConnector({
dappName: "My DApp",
chainId: D9_DEFAULT_CHAIN_ID, // d9net:<genesis-ref>
walletConnect: {
projectId: D9_DEFAULT_WALLET_CONNECT_PROJECT_ID,
relayUrl: D9_DEFAULT_WALLET_CONNECT_RELAY_URL,
metadata: {
name: "My DApp",
description: "Example",
url: window.location.origin,
icons: [`${window.location.origin}/icon.png`],
},
},
});
// Prefer injected PAPI when available; otherwise WalletConnect.
const start = await connector.connect({ transport: "auto" });
if (start.transport === "papi") {
// Connected immediately after user approval in the wallet.
console.log(connector.getAccounts());
} else {
// Show QR / open deep link with start.uri
if (start.uri) {
// Mobile deep link into D9 Wallet
// window.location.href = buildD9WalletConnectAppLink(start.uri)
}
await start.approval();
}
const account = connector.getAccounts()[0];
if (!account) throw new Error("No account");
const signed = await connector.signMessage({
address: account.address,
message: "Hello from My DApp",
});
console.log(signed.signature);Explicit transports
// PAPI only (D9 Wallet browser)
await connector.papi.connect();
// WalletConnect only
const wc = await connector.walletConnect.connect({
requiredMethods: ["d9_signMessage"],
});
// show wc.uri, then:
const handle = await wc.approval();
await handle.requestMessage({
account: connector.getAccounts()[0]!.accountId!,
message: "0x0102",
});Snapshot / subscribe
const stop = connector.subscribe((snapshot) => {
console.log(snapshot.status, snapshot.transport, snapshot.accounts);
});
// later
stop();
await connector.disconnect();Protocol notes
| Surface | Value |
| --- | --- |
| Injected provider name | d9-wallet |
| WalletConnect namespace | d9net |
| Chain ID | d9net:<first 32 hex of genesis hash> |
| Message method | d9_signMessage |
| Transaction method | d9_signTransaction |
| Auth method | d9_authenticate |
| Account names (WC) | sessionProperties["d9.accountNames"] JSON map |
| Display addresses | Dn... prefix (signer still uses chain address under the hood) |
Build / publish
pnpm --filter @d9-network/dapp-connector typecheck
pnpm --filter @d9-network/dapp-connector test:run
pnpm --filter @d9-network/dapp-connector build
# dry-run
pnpm --filter @d9-network/dapp-connector exec npm pack --dry-run
# publish (npm login first)
pnpm --filter @d9-network/dapp-connector publish --access publicprepublishOnly runs typecheck + tests + tsdown build.
Example app
See apps/example-dapp in this monorepo for a Vite + React demo of both transports.
