Skip to content

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 viem

Basic Configuration

  1. 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>
  );
}
  1. 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

  1. Check out framework-specific examples:

  2. Explore the API Reference for detailed documentation of:

    • Core components and types
    • React/Next.js hooks
    • Vue.js composables
    • Utility functions
  3. Join our community: