Skip to content
This repository was archived by the owner on Jul 31, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 15 additions & 14 deletions docs/quick_start/application_session.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,18 @@ To create an application session, you'll use the `createAppSessionMessage` helpe
<TabItem value="react" label="React">

```javascript
import { createAppSessionMessage } from '@erc7824/nitrolite';
import { createAppSessionMessage, parseRPCResponse, MessageSigner, CreateAppSessionRPCParams } from '@erc7824/nitrolite';
import { useCallback } from 'react';
import { Address } from 'viem';

function useCreateApplicationSession() {
const createApplicationSession = useCallback(
async (
signer,
sendRequest,
participantA,
participantB,
amount,
signer: MessageSigner,
sendRequest: (message: string) => Promise<CreateAppSessionRPCParams>,
participantA: Address,
participantB: Address,
amount: string,
) => {
try {
// Define the application parameters
Expand Down Expand Up @@ -77,7 +78,7 @@ function useCreateApplicationSession() {

// Create a signed message using the createAppSessionMessage helper
const signedMessage = await createAppSessionMessage(
signer.sign,
signer,
[
{
definition: appDefinition,
Expand All @@ -90,10 +91,10 @@ function useCreateApplicationSession() {
const response = await sendRequest(signedMessage);

// Handle the response
if (response && response[0] && response[0].app_session_id) {
if (response.app_session_id) {
// Store the app session ID for future reference
localStorage.setItem('app_session_id', response[0].app_session_id);
return { success: true, app_session_id: response[0].app_session_id, response };
localStorage.setItem('app_session_id', response.app_session_id);
return { success: true, app_session_id: response.app_session_id, response };
} else {
return { success: true, response };
}
Expand All @@ -119,15 +120,15 @@ function MyComponent() {

const handleCreateSession = async () => {
// Define your WebSocket send wrapper
const sendRequest = async (payload) => {
const sendRequest = async (payload: string) => {
return new Promise((resolve, reject) => {
// Assuming ws is your WebSocket connection
const handleMessage = (event) => {
try {
const message = JSON.parse(event.data);
if (message.res && message.res[1] === 'create_app_session') {
const message = parseRPCResponse(event.data);
if (message.method === RPCMethod.CreateAppSession) {
ws.removeEventListener('message', handleMessage);
resolve(message.res[2]);
resolve(message.params);
}
} catch (error) {
console.error('Error parsing message:', error);
Expand Down
58 changes: 22 additions & 36 deletions docs/quick_start/balances.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ To retrieve these balances, use the `get_ledger_balances` request with the Clear
<TabItem value="using-helper" label="Using SDK Helper">

```javascript
import { createGetLedgerBalancesMessage } from '@erc7824/nitrolite';
import { createGetLedgerBalancesMessage, parseRPCMessage, RPCMethod } from '@erc7824/nitrolite';
import { ethers } from 'ethers';

// Your message signer function (same as in auth flow)
Expand All @@ -74,15 +74,15 @@ async function getLedgerBalances(ws, participant) {
return new Promise((resolve, reject) => {
// Create a unique handler for this specific request
const handleMessage = (event) => {
const message = JSON.parse(event.data);
const message = parseRPCMessage(event.data);

// Check if this is a response to our get_ledger_balances request
if (message.res && message.res[1] === 'get_ledger_balances') {
if (message.method === RPCMethod.GetLedgerBalances) {
// Remove the message handler to avoid memory leaks
ws.removeEventListener('message', handleMessage);

// Resolve with the balances data
resolve(message.res[2]);
resolve(message.params);
}
};

Expand Down Expand Up @@ -124,16 +124,14 @@ try {
// ]

// Process your balances
if (balances[0] && balances[0].length > 0) {
const balanceList = balances[0]; // Array of balance entries by asset

if (balances.length > 0) {
// Display each asset balance
balanceList.forEach(balance => {
balances.forEach(balance => {
console.log(`${balance.asset.toUpperCase()} balance: ${balance.amount}`);
});

// Example: find a specific asset
const usdcBalance = balanceList.find(b => b.asset.toLowerCase() === 'usdc');
const usdcBalance = balances.find(b => b.asset.toLowerCase() === 'usdc');
if (usdcBalance) {
console.log(`USDC balance: ${usdcBalance.amount}`);
}
Expand All @@ -150,12 +148,12 @@ try {

```javascript
import { ethers } from 'ethers';
import { generateRequestId, getCurrentTimestamp } from '@erc7824/nitrolite';
import { generateRequestId, getCurrentTimestamp, generateRequestId, parseRPCMessage, RPCMethod } from '@erc7824/nitrolite';

// Function to create a signed ledger balances request
async function createLedgerBalancesRequest(signer, participant) {
const requestId = generateRequestId();
const method = 'get_ledger_balances';
const method = RPCMethod.GetLedgerBalances; // Use the RPC method enum for clarity
const params = [{ participant }]; // Note: updated parameter name to 'participant'
const timestamp = getCurrentTimestamp();

Expand Down Expand Up @@ -183,18 +181,17 @@ async function getLedgerBalances(ws, participant, signer) {
// Set up message handler
const handleMessage = (event) => {
try {
const message = JSON.parse(event.data);
const message = parseRPCMessage(event.data);

// Check if this is our response
if (message.res &&
message.res[0] === requestId &&
message.res[1] === 'get_ledger_balances') {
if (message.requestId === requestId &&
message.method === RPCMethod.GetLedgerBalances) {

// Remove the listener
ws.removeEventListener('message', handleMessage);

// Resolve with the balances data
resolve(message.res[2]);
resolve(message.params);
}
} catch (error) {
console.error('Error parsing message:', error);
Expand Down Expand Up @@ -240,7 +237,7 @@ try {
To retrieve off-chain balances for a participant, use the `createGetLedgerBalancesMessage` helper function:

```javascript
import { createGetLedgerBalancesMessage } from '@erc7824/nitrolite';
import { createGetLedgerBalancesMessage, parseRPCResponse, RPCMethod } from '@erc7824/nitrolite';
import { ethers } from 'ethers';

// Function to get ledger balances for a participant
Expand All @@ -249,15 +246,15 @@ async function getLedgerBalances(ws, participant, messageSigner) {
// Message handler for the response
const handleMessage = (event) => {
try {
const message = JSON.parse(event.data);
const message = parseRPCResponse(event.data);

// Check if this is a response to our get_ledger_balances request
if (message.res && message.res[1] === 'get_ledger_balances') {
if (message.method === RPCMethod.GetLedgerBalances) {
// Clean up by removing the event listener
ws.removeEventListener('message', handleMessage);

// Resolve with the balance data
resolve(message.res[2]);
resolve(message.params);
}
} catch (error) {
console.error('Error parsing message:', error);
Expand Down Expand Up @@ -294,11 +291,9 @@ getLedgerBalances(ws, participantAddress, messageSigner)
console.log('Channel balances:', balances);

// Process and display your balances
if (balances[0] && balances[0].length > 0) {
const balanceList = balances[0]; // Array of balance entries by asset

if (balances.length > 0) {
console.log('My balances:');
balanceList.forEach(balance => {
balances.forEach(balance => {
console.log(`- ${balance.asset.toUpperCase()}: ${balance.amount}`);
});
} else {
Expand All @@ -317,15 +312,8 @@ When you receive balance data from the ClearNode, it's helpful to format it for
```javascript
// Simple function to format your balance data for display
function formatMyBalances(balances) {
if (!balances || !balances[0] || !Array.isArray(balances[0]) || balances[0].length === 0) {
return null; // No balance data available
}

// Extract your balances from the nested structure
const balanceList = balances[0]; // Array of balance entries by asset

// Return formatted balance information
return balanceList.map(balance => ({
return balances.map(balance => ({
asset: balance.asset.toUpperCase(),
amount: balance.amount,
// You can add additional formatting here if needed
Expand Down Expand Up @@ -378,11 +366,9 @@ function displayBalances(balances) {
console.log(`Balance update at ${new Date().toLocaleTimeString()}:`);

// Format and display your balances
if (balances[0] && balances[0].length > 0) {
const balanceList = balances[0]; // Array of balance entries by asset

if (balances.length > 0) {
console.log('My balances:');
balanceList.forEach(balance => {
balances.forEach(balance => {
console.log(`- ${balance.asset.toUpperCase()}: ${balance.amount}`);
});
} else {
Expand Down
28 changes: 14 additions & 14 deletions docs/quick_start/close_session.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,20 +39,20 @@ To close an application session, you'll use the `createCloseAppSessionMessage` h

```javascript
import { useCallback } from 'react';
import { createCloseAppSessionMessage } from '@erc7824/nitrolite';
import { createCloseAppSessionMessage, parseRPCResponse, MessageSigner, CloseAppSessionRPCParams } from '@erc7824/nitrolite';

/**
* Hook for closing an application session
*/
function useCloseApplicationSession() {
const closeApplicationSession = useCallback(
async (
signer,
sendRequest,
appId,
participantA,
participantB,
amount
signer: MessageSigner,
sendRequest: (message: string) => Promise<CloseAppSessionRPCParams>,
appId: string,
participantA: Address,
participantB: Address,
amount: string
) => {
try {
if (!appId) {
Expand Down Expand Up @@ -81,21 +81,21 @@ function useCloseApplicationSession() {

// Create the signed message
const signedMessage = await createCloseAppSessionMessage(
signer.sign,
signer,
[closeRequest]
);

// Send the request and wait for response
const response = await sendRequest(signedMessage);

// Check for success
if (response && response[0] && response[0].app_session_id) {
if (response.app_session_id) {
// Clean up local storage
localStorage.removeItem('app_session_id');
return {
success: true,
app_id: response[0].app_session_id,
status: response[0].status || "closed",
app_id: response.app_session_id,
status: response.status || "closed",
response
};
} else {
Expand Down Expand Up @@ -128,10 +128,10 @@ function MyComponent() {
// Assuming ws is your WebSocket connection
const handleMessage = (event) => {
try {
const message = JSON.parse(event.data);
if (message.res && message.res[1] === 'close_app_session') {
const message = parseRPCResponse(event.data);
if (message.method === RPCMethod.CloseAppSession) {
ws.removeEventListener('message', handleMessage);
resolve(message.res[2]);
resolve(message.params);
}
} catch (error) {
console.error('Error parsing message:', error);
Expand Down
Loading