Getting Started with PwnDAO SDK
Introduction
PwnDAO SDK is a comprehensive toolkit for integrating decentralized lending and borrowing functionality into your applications. The SDK provides a set of tools and utilities for interacting with PwnDAO's protocols, making it easy to:
- Create and manage lending strategies
- Handle loan proposals and commitments
- Manage collateral and credit assets
- Interact with smart contracts
- Handle wallet connections and transactions
The SDK is framework-agnostic at its core (@pwndao/v1-core) but provides specialized integrations for popular frameworks:
- React/Next.js integration via
@pwndao/sdk-v1-react - Vue.js integration via
@pwndao/sdk-v1-vue
Quick Start
Installation
Install the core SDK and framework-specific package along with peer dependencies:
# For React/Next.js applications
npm install @pwndao/v1-core @pwndao/sdk-v1-react @wagmi/core viem
# For Vue.js applications
npm install @pwndao/v1-core @pwndao/sdk-v1-vue @tanstack/vue-query viemBasic Configuration
- React/Next.js Setup
// app/providers.tsx
import { createConfig, WagmiProvider } from 'wagmi';
import { mainnet, sepolia } from '@wagmi/core/chains';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { http } from 'viem';
const config = createConfig({
chains: [mainnet, sepolia],
transports: {
[mainnet.id]: http(),
[sepolia.id]: http(),
},
});
const queryClient = new QueryClient();
export function Providers({ children }) {
return (
<WagmiProvider config={config}>
<QueryClientProvider client={queryClient}>
{children}
</QueryClientProvider>
</WagmiProvider>
);
}- Vue.js Setup
// main.ts
import { createApp } from 'vue'
import { VueQueryPlugin } from '@tanstack/vue-query'
import App from './App.vue'
const app = createApp(App)
app.use(VueQueryPlugin)
app.mount('#app')Core Concepts
1. Strategies
Strategies are the foundation of PwnDAO's lending protocol. They define:
- Which assets can be used as collateral
- Which assets can be borrowed
- Loan terms (APR, LTV, duration)
- Expiration periods
- Minimum amounts
Example of working with strategies:
import { useStrategies, useStrategy } from '@pwndao/sdk-v1-react'; // or sdk-v1-vue
import { SupportedChain } from '@pwndao/v1-core';
// Fetch all available strategies
const { data: strategies } = useStrategies(SupportedChain.World);
// Fetch a specific strategy
const { data: strategy } = useStrategy('strategy-id');
// Access strategy information
if (strategy) {
console.log({
name: strategy.name,
apr: strategy.terms.apr,
ltv: strategy.terms.ltv,
assets: {
credit: strategy.terms.creditAssets,
collateral: strategy.terms.collateralAssets
},
stats: {
lending: {
totalCommitted: strategy.lendingStats.totalCommittedAmount,
totalUtilized: strategy.lendingStats.totalUtilizedAmount,
totalAvailable: strategy.lendingStats.totalAvailableAmount,
},
borrowing: {
totalBorrowed: strategy.borrowingStats.totalBorrowedAmount,
totalRepaid: strategy.borrowingStats.totalRepaidAmount,
activeAmount: strategy.borrowingStats.activeBorrowedAmount,
}
}
});
}2. Proposals
Proposals are requests for loans or lending commitments. The SDK supports creating multiple proposals in a single transaction and managing them efficiently.
Example of creating proposals:
import { useMakeProposals, useUserWithNonce } from '@pwndao/sdk-v1-react'; // or sdk-v1-vue
import { createElasticProposals } from '@pwndao/v1-core';
import { useAccount, useConfig } from 'wagmi';
import { sepolia } from 'wagmi/chains';
// Setup user with nonce management
const { userWithNonce: user } = useUserWithNonce([sepolia.id]);
const { address } = useAccount();
const config = useConfig();
// Initialize proposal creation hook
const { mutateAsync: makeProposal } = useMakeProposals(user);
// Create proposals
try {
const proposalsToCreate = createElasticProposals(
strategy,
address,
creditAmount,
config,
);
const result = await makeProposal(proposalsToCreate);
console.log("Proposals created:", result);
} catch (error) {
console.error("Error creating proposals:", error);
}3. Revoking Nonces
The SDK supports revoking proposal nonces for security purposes:
import { useRevokeNonces } from '@pwndao/sdk-v1-react'; // or sdk-v1-vue
import { SupportedChain } from '@pwndao/sdk-core';
import { useAccount } from 'wagmi';
const { address } = useAccount();
const { mutateAsync: revokeNonces } = useRevokeNonces();
try {
await revokeNonces({
proposalNonces: [1n, 2n], // Array of nonces to revoke
chainId: SupportedChain.Sepolia,
owner: address,
nonceSpace: 0n, // The nonce space these nonces belong to
});
console.log("Nonces revoked successfully");
} catch (error) {
console.error("Error revoking nonces:", error);
}This is particularly useful when you need to:
- Invalidate pending proposals
- Protect against unauthorized proposal submissions
- Clean up unused nonces
- Manage nonce spaces across different chains
Next Steps
-
Check out framework-specific examples:
-
Explore the API Reference for detailed documentation of:
- Core components and types
- React/Next.js hooks
- Vue.js composables
- Utility functions
-
Join our community: