diff --git a/packages/savings-sdk/README.md b/packages/savings-sdk/README.md new file mode 100644 index 0000000..ee1e769 --- /dev/null +++ b/packages/savings-sdk/README.md @@ -0,0 +1,251 @@ +# Savings SDK + +`@goodsdks/savings-sdk` provides the Savings SDK for interacting seamlessly with GoodDollar's savings smart contracts on Celo. It leverages both **Viem** and **Wagmi** SDKs to provide functionalities for managing user staking, and rewards. + +## Table of Contents + +- [Savings SDK](#savings-sdk) + - [Table of Contents](#table-of-contents) + - [Installation](#installation) + - [Getting Started](#getting-started) + - [Using the Wagmi SDK](#using-the-wagmi-sdk) + - [Initialization](#initialization) + - [Using the Viem SDK](#using-the-viem-sdk) + - [Initialization](#initialization-1) + - [API Reference](#api-reference) + - [Wagmi SDK](#wagmi-sdk) + - [`useGooddollarSavings`](#usegooddollarsavings) + - [Viem SDK](#viem-sdk) + - [`GooddollarSavingsSDK` Class](#gooddollarsavingssdk-class) + - [References](#references) + +## Installation + +To integrate the Savings SDK into your project, you can easily install it from npm: + +```bash file.sh +npm install @goodsdks/savings-sdk +``` + +or if you prefer using Yarn: + +```bash file.sh +yarn add @goodsdks/savings-sdk +``` + +## Getting Started + +### Using the Wagmi SDK + +The Savings SDK is built on top of `Wagmi` and provides a React hook for interacting with the savings smart contracts. It abstracts the complexity of blockchain interactions, making it easier to integrate savings functionalities into your React applications. + +#### Initialization + +First, ensure that you have set up `Wagmi` in your React application. Then, import and use the `useGooddollarSavings` hook as shown below. + +```typescript +import React from 'react'; +import { WagmiProvider } from 'wagmi'; +import { useGooddollarSavings } from './wagmi-sdk'; + +const SavingsComponent = () => { + const { sdk, loading, error } = useGooddollarSavings(); + + const getGlobalStats = async () => { + if (!sdk) return; + try { + const stats = await sdk.getGlobalStats(); + console.log(`Total Staked: ${stats.totalStaked}, APR: ${stats.annualAPR}%`); + } catch (error) { + console.error(error); + } + }; + + if (loading) return
Loading...
; + if (error) return
Error: {error}
; + if (!sdk) return
SDK not available
; + + return ( +
+ +
+ ); +}; + +const App = () => ( + + + +); + +export default App; +``` + +### Using the Viem SDK + +The Viem SDK provides a set of utility functions to interact directly with the savings smart contracts. + +WalletClient is optional. If there is no wallet connected, you don't have to provide. After wallet connection +you can set walletClient by using `setWalletClient` function or you can create a new SDK instance. + +#### Initialization + +```typescript +import { PublicClient, WalletClient } from "viem" +import { GooddollarSavingsSDK } from "./viem-sdk" + +const publicClient = new PublicClient({ + /* configuration for Celo mainnet */ +}) +const walletClient = new WalletClient({ + /* configuration for Celo mainnet */ +}) + +const savingsSDK = new GooddollarSavingsSDK(publicClient, walletClient) +``` + +## API Reference + +### Wagmi SDK + +#### `useGooddollarSavings` + +A React hook that provides access to the savings SDK functionality. + +**Usage:** + +```typescript +const { sdk, loading, error } = useGooddollarSavings(); +``` + +**Returns:** + +An object containing: +- `sdk`: A `GooddollarSavingsSDK` instance or `null` if not available +- `loading`: `boolean` indicating if the SDK is being initialized +- `error`: `string | null` containing any error message + +**Available Methods in the Savings SDK:** + +- `getGlobalStats(): Promise` +- `getUserStats(): Promise` +- `stake(amount: bigint, onHash?: (hash: `0x${string}`) => void): Promise` +- `unstake(amount: bigint, onHash?: (hash: `0x${string}`) => void): Promise` +- `claimReward(onHash?: (hash: `0x${string}`) => void): Promise` + +### Viem SDK + +#### `GooddollarSavingsSDK` Class + +Handles interactions with the Savings Contract on Celo. + +**Constructor:** + +```typescript +new GooddollarSavingsSDK(publicClient: PublicClient, walletClient?: WalletClient) +``` + +**Parameters:** + +- `publicClient`: The `PublicClient` instance (must be connected to Celo mainnet). +- `walletClient` _(optional)_: The `WalletClient` with wallet actions (must be connected to Celo mainnet). + +**Methods:** + +- **`getGlobalStats`** + + Retrieves global statistics about the savings pool. + + **Usage:** + + ```typescript + const stats = await savingsSDK.getGlobalStats() + ``` + + **Returns:** + + A `GlobalStats` object containing: + - `totalStaked`: Total amount staked in the pool (`bigint`) + - `annualAPR`: Annual percentage rate as a number + +- **`getUserStats`** + + Retrieves user-specific statistics and balances. + + **Usage:** + + ```typescript + const userStats = await savingsSDK.getUserStats() + ``` + + **Returns:** + + A `UserStats` object containing: + - `walletBalance`: User's wallet balance (`bigint`) + - `currentStake`: User's current stake amount (`bigint`) + - `unclaimedRewards`: User's unclaimed rewards (`bigint`) + - `userWeeklyRewards`: User's estimated weekly rewards (`bigint`) + +- **`stake`** + + Stakes a specified amount of G$ tokens. + + **Usage:** + + ```typescript + const receipt = await savingsSDK.stake(amount, onHashCallback) + ``` + + **Parameters:** + + - `amount`: The amount to stake (`bigint`) + - `onHash` _(optional)_: A callback function that receives the transaction hash + + **Returns:** + + A transaction receipt upon successful staking + +- **`unstake`** + + Unstakes a specified amount of G$ tokens. + + **Usage:** + + ```typescript + const receipt = await savingsSDK.unstake(amount, onHashCallback) + ``` + + **Parameters:** + + - `amount`: The amount to unstake (`bigint`) + - `onHash` _(optional)_: A callback function that receives the transaction hash + + **Returns:** + + A transaction receipt upon successful unstaking + +- **`claimReward`** + + Claims accumulated rewards. + + **Usage:** + + ```typescript + const receipt = await savingsSDK.claimReward(onHashCallback) + ``` + + **Parameters:** + + - `onHash` _(optional)_: A callback function that receives the transaction hash + + **Returns:** + + A transaction receipt upon successful reward claiming + +## References + +- Savings contract address on Celo: [0x799a23dA264A157Db6F9c02BE62F82CE8d602A45](https://celoscan.io/address/0x799a23dA264A157Db6F9c02BE62F82CE8d602A45) + +