npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@neoswap/solana

v0.3.26

Published

NPM package for NeoSwap test

Downloads

21

Readme

</li>
<li>
  <a href="#Install-NPM-package">Installation</a>

</li>
<li><a href="#usage">Usage</a></li>

About The Project

Neoswap Website

Install NPM package

npm install @neoswap/solana

Usage

Examples can be found in the examples folder https://github.com/neoswap-ai/neo-swap-npm/tree/cNFT/examples

Create Swap

With signer Keypair

import { neoSwap, neoTypes } from "@neoswap/solana";

const initializeData: {
    initializeData: neoTypes.InitializeData; // Data after initializing the swap
    transactionHashs: string[]; // Array of string containing the hashes of the executed transactions
} = await neoSwap.initializeSwap({
    clusterOrUrl: string, // "mainnet-beta" or "devnet" or URL
    swapInfo: neoTypes.swapInfo, // Data of the swap
    signer: Keypair, // Wallet that will Create the swap and be admin of the swap
    simulation: Option<boolean>, // default skip simulation and broadcast to blockchain (recommanded). If true: make simulation of the transactions before broadcasting them
    skipConfirmation: Option<boolean>, // default iterates through the transactions to confirm status (return error if one fails with array of transactionhashes). If true: skip confirmation
});

Without signer Keypair

import { neoSwap, neoTypes } from "@neoswap/solana";

const initializeSwapData: {
    initializeData: neoTypes.InitializeData; // Data after initializing the swap
} = await neoSwap.CREATE_INSTRUCTIONS.createInitializeSwapInstructions({
    clusterOrUrl: string, // "mainnet-beta" or "devnet" or URL
    swapInfo: neoTypes.SwapInfo, // Data of the swap
    signer: PublicKey, // Wallet that will Create the swap and be admin of the swap
    program: Option<Program>; // If you want to use your own program, import it and pass it here

});

const provider = await getProvider(); //Import your own provider to broadcast transaction to blockchain via the user Wallet

for (let index = 0; index < initializeSwapData.transactions.length; index++) {
    const transaction = initializeSwapData.transactions[index].tx;

    const hash = await provider.sendAndConfirm(transaction);
}

Deposit Swap

With signer Keypair

import { neoSwap, neoTypes } from "@neoswap/solana";

const depositSwapHashes: string[] = // Array of confirmed transaction Hashes
    await neoSwap.depositSwap({
        clusterOrUrl: string, // "mainnet-beta" or "devnet" or URL
        swapDataAccount: PublicKey, // PublicKey of the PDA swapDataAccount
        signer: Keypair, // Wallet that will deposit in the swap
        simulation: Option<boolean>, // OPTIONAL default: skip simulation and broadcast to blockchain (recommanded). If true: make simulation of the transactions before broadcasting them
        skipConfirmation: Option<boolean>, // OPTIONAL default: iterates through the transactions to confirm status (return error if one fails with array of transactionhashes). If true: skip confirmation
    });

Without signer Keypair

import { neoSwap, neoTypes } from "@neoswap/solana";

const depositTransactionsWithoutSigners: neoTypes.TxWithSigner[] =
    await neoSwap.CREATE_INSTRUCTIONS.createDepositSwapInstructions({
        clusterOrUrl: string, // "mainnet-beta" or "devnet" or URL
        swapDataAccount: PublicKey, // PublicKey of the PDA swapDataAccount
        user: PublicKey, // User that will deposit assets in the swap
        program: Option<Program>, // If you want to use your own program, import it and pass it here
    });

const provider = await getProvider(); //Import your own provider to broadcast transaction to blockchain via the user Wallet

for (let index = 0; index < depositTransactionsWithoutSigners.length; index++) {
    const transaction = depositTransactionsWithoutSigners[index].tx;

    const hash = await provider.sendAndConfirm(transaction);
}

Claim Swap

  • if signer is admin: function validates that all items are deposited (if needed), claims for all users (if needed) and closes the swap unless skipFinalize is set to true

  • if signer is user: function validates that all items are deposited (if needed) and claims for the user unless skipFinalize is set to true where it will claim all the items and close the swap

With signer Keypair

import { neoSwap, neoTypes } from "@neoswap/solana";

const claimAndCloseSwapHashes: string[] = // Array of confirmed transaction Hashes
    await neoSwap.claimAndCloseSwap({
        clusterOrUrl: string, // "mainnet-beta" or "devnet" or URL
        swapDataAccount: PublicKey, // PublicKey of the PDA swapDataAccount
        signer: Keypair, // Wallet admin of swap or User that wish to claim his items
        simulation: Option<boolean>, // OPTIONAL default: skip simulation and broadcast to blockchain (recommanded). If true: make simulation of the transactions before broadcasting them
        skipConfirmation: Option<boolean>, // OPTIONAL default: iterates through the transactions to confirm status (return error if one fails with array of transactionhashes). If true: skip confirmation
        skipFinalize: Option<boolean>, // OPTIONAL default: false: claim all the items and close the swap. If true: only claim the signer items
    });

Without signer Keypair

import { neoSwap, neoTypes } from "@neoswap/solana";

const transactionsWithoutSigners: neoTypes.TxWithSigner[] =
    await neoSwap.CREATE_INSTRUCTIONS.createClaimSwapInstructions({
        clusterOrUrl: string, // "mainnet-beta" or "devnet" or URL
        swapDataAccount: PublicKey, // PublicKey of the PDA swapDataAccount
        signer: PublicKey, // Wallet admin of swap or User that wish to claim his items
        skipFinalize: Option<boolean>, // OPTIONAL default: false: claim all the items and close the swap. If true: only claim the signer items
        program: Option<Program>, // If you want to use your own program, import it and pass it here
    });

const provider = await getProvider(); //Import your own provider to broadcast transaction to blockchain via the user Wallet

for (let index = 0; index < transactionsWithoutSigners.length; index++) {
    const transaction = transactionsWithoutSigners[index].tx;

    const hash = await provider.sendAndConfirm(transaction);
}

Cancel Swap (requires to be admin to finish closing accounts)

  • Cancelling a swap can only be initialized while the swap is in the state TradeStatus.WaitingToDeposit (1)

  • If the signer is the Initializer, it will cancel all remaining items and close the PDA

  • If signer is User, if skipFinalize is set to true , it will cancel his item(s) and change the swap state to TradeStatus.Canceling (100), otherwise, it will cancel all remaining items and close the PDA

  • If outsider wallet tries to cancel a swap, it can only cancel if the swap is in the state TradeStatus.Canceling (100)

With signer Keypair

import { neoSwap, neoTypes } from "@neoswap/solana";

const cancelAndCloseSwapHashes: string[] = // Array of confirmed transaction Hashes
    await neoSwap.cancelAndCloseSwap({
        clusterOrUrl: string, // "mainnet-beta" or "devnet" or URL
        swapDataAccount: PublicKey, // PublicKey of the PDA swapDataAccount
        signer: Keypair, // Wallet admin of swap OR User that want to cancel his item
        simulation: Option<boolean>, // OPTIONAL default: skip simulation and broadcast to blockchain (recommanded). If true: make simulation of the transactions before broadcasting them
        skipConfirmation: Option<boolean>, // OPTIONAL default: iterates through the transactions to confirm status (return error if one fails with array of transactionhashes). If true: skip confirmation
        skipFinalize: Option<boolean>, // OPTIONAL default: false: cancel all the items and close the swap. If true: only cancels the signer items
    });

Without signer Keypair

import { neoSwap, neoTypes } from "@neoswap/solana";

const transactionsWithoutSigners: neoTypes.TxWithSigner[] =
    await neoSwap.CREATE_INSTRUCTIONS.createCancelSwapInstructions({
        clusterOrUrl: string, // "mainnet-beta" or "devnet" or URL
        swapDataAccount: PublicKey, // PublicKey of the PDA swapDataAccount
        signer: PublicKey, // Wallet admin of swap OR User that want to cancel his item
        skipFinalize: Option<boolean>, // OPTIONAL default: false: cancel all the items and close the swap. If true: only cancels the signer items
        program: Option<Program>, // If you want to use your own program, import it and pass it herw
    });

const provider = await getProvider(); //Import your own provider to broadcast transaction to blockchain via the user Wallet

for (let index = 0; index < transactionsWithoutSigners.length; index++) {
    const transaction = transactionsWithoutSigners[index].tx;

    const hash = await provider.sendAndConfirm(transaction);
}

Broadcasting Transaction to blockchain using NeoSwap package and signer

import { neoSwap, neoTypes } from "@neoswap/solana";
import { Transaction, Keypair } from "@solana/web3.js";

const txsWithoutSigners: neoTypes.TxWithSigner[] = { tx: new Transaction().add(...transactionInstructions) };

const hashArray: string[] = await neoSwap.UTILS.sendBundledTransactions({
    clusterOrUrl: string,                       // "mainnet-beta" or "devnet" or URL
    signer: Keypair,                            // Keypair of the wallet signing the transaction
    txsWithoutSigners: neoTypes.TxWithSigner[], // Array of transactions with empty Signer
    simulation: Option<boolean>,                // OPTIONAL default skip simulation and broadcast to blockchain (recommanded). If true: make simulation of the transactions before broadcasting them
    skipConfirmation: Option<boolean>,          // OPTIONAL default iterates through the transactions to confirm status (return error if one fails with array of transactionhashes). If true: skip confirmation
    provider: Option<AnchorProvider>            // OPTIONAL default: undefined. If you want to use your own provider, import it and pass it here

});

Types section

Types converter


let swapInfo = neoSwap.UTILS.invertedSwapDataConverter({ swapData: SwapData }) 

let swapData = await neoSwap.UTILS.swapDataConverter({ swapInfo: SwapInfo })

Types

swapInfo represents the Data of a swap in a human readable way

type SwapInfo = {
    status?: "initializing" | "active" | "finalizing" | "finalized" | "canceling" | "canceled";
    preSeed?: string;
    currency: string;
    users: { address: string; items: SwapUserInfo }[];
};

SwapUserInfo represents the data a user in a swap in a human readable way

type SwapUserInfo = {
    give: GiveSwapItem[];
    get: GetSwapItem[];
    token: { amount: number; status?: string };
    status?:
        | "pending"
        | "partiallyDeposited"
        | "deposited"
        | "partiallyClaimed"
        | "claimed"
        | "partiallyCanceled"
        | "canceled";
};

GiveSwapItem and GetSwapItem represents the data of what a user will give or receive and from which user

type GiveSwapItem = {
    address: string;
    amount: number;
    getters: {
        address: string;
        amount: number;
        status?: "pending" | "deposited" | "claimed" | "returned";
    }[];
};

type GetSwapItem = {
    address: string;
    amount: number;
    givers: {
        amount: number;
        address: string;
        status?: "pending" | "deposited" | "claimed" | "returned";
    }[];
};

SwapIdentity represents the Identity of the swap

type SwapIdentity = {
    swapDataAccount_publicKey: PublicKey; // PublicKey of the swapDataAccount
    swapDataAccount_seed: Buffer; // Seed in Buffer format of the Swap
    swapDataAccount_seedString: string; // Seed in String format of the Swap
    swapDataAccount_bump: number; // Bump of the PDA
    swapData: SwapData; // Data of the swapDataAccount
};

SwapData represents the data of the swap inside the PDA

type SwapData = {
    initializer: PublicKey;
    status: number;
    nbItems: number;
    preSeed: string;
    items: Array<NftSwapItem>;
    acceptedPayement: PublicKey;
};

NftSwapItem represents the data of one Item in SwapData

type NftSwapItem = {
    isCompressed: boolean; // true if the item is a compressed NFT (cNFT)
    isNft: boolean; // true if the item is a NFT
    mint: PublicKey; // if NFT mint, if cNFT: tokenId, if token: token address, if sol: system program
    merkleTree: PublicKey; // if cNFT: PublicKey of the merkleTree, else same as mint
    index: BN; // if cNFT: Index of the item in the merkleTree, else: 0
    amount: BN; // Amount of the item to be sent
    owner: PublicKey; // Owner of the item
    destinary: PublicKey; // Destinary of the item
    status: number; // Status of the item
};

InitializeData represents the data after initializing the swap

type InitializeData = {
    programId: string; // ProgramId of the solana program the swap is being deployed to
    swapIdentity: neoTypes.SwapIdentity; // Object containing most relevant information of the swap
    txWithoutSigner: neoTypes.TxWithSigner[]; // Array of transactions to broadcast with empty Signer
    warning: string; // string containing information that the SwapData contains some NFT that user do not own
};

TxWithSigner is an array of transaction to be broadcasted using sendAll method from anchor library

type TxWithSigner = { tx: Transaction; signers?: Signer[] };

Error Type

ErrorFeedback represents the feedback thrown when an error is found

type ErrorFeedback = {
    blockchain: "solana";
    status: "error";
    message: string | unknown;
    swapStatus?: number;
};

Statuses

Program Swap status

TradeStatus:
    0 => Initializing
    1 => WaitingToDeposit
    2 => WaitingToClaim
    3 => Closed

    100 => Canceling
    101 => Canceled

Program Items status

ItemStatus :
    10 => NFTPending
    11 => SolPending

    20 => NFTDeposited
    21 => SolDeposited
    22 => SolToClaim

    30 => NFTClaimed
    31 => SolClaimed

    100 => NFTcanceled
    101 => Solcanceled

    110 => NFTcanceledRecovered
    111 => SolcanceledRecovered

UserDataInSwap from UTILS.userSwapDetails

type UserDataInSwap = {
    userNftToDeposit: NftSwapItem[] | undefined; // Array of NFT the user has to deposit
    userNftDeposited: NftSwapItem[] | undefined; // Array of NFT the user has deposited

    userNftToReceive: NftSwapItem[] | undefined; // Array of NFT the user has to receive
    userNftReceived: NftSwapItem[] | undefined; // Array of NFT the user has received

    userNftCancelled: NftSwapItem[] | undefined; // Array of NFT the user has cancelled
    userSolCancelled: NftSwapItem[] | undefined; // Array of SOL the user has cancelled

    userSolToDeposit: NftSwapItem[] | undefined; // Array of SOL the user has to deposit
    userSolDeposited: NftSwapItem[] | undefined; // Array of SOL the user has deposited
    userSolToClaim: NftSwapItem[] | undefined; // Array of SOL the user has to claim
    userSolClaimed: NftSwapItem[] | undefined; // Array of SOL the user has claimed
};

Dummy data

let swapInfo: neoTypes.SwapInfo = {
    currency: "usdcPublickey",
    preSeed: "0035",
    users: [
        {
            address: "user1Publickey",
            items: {
                give: [
                    {
                        address: "mint1",
                        amount: 1,
                        getters: [{ address: "user2Publickey", amount: 1 }],
                    },
                    {
                        address: "mint2",
                        amount: 1,
                        getters: [{ address: "user2Publickey", amount: 1 }],
                    },
                ],
                get: [
                    {
                        address: "mint3",
                        amount: 1,
                        givers: [{ address: "user2Publickey", amount: 1 }],
                    },
                    {
                        address: "mint4",
                        amount: 1,
                        givers: [{ address: "user2Publickey", amount: 1 }],
                    },
                    {
                        address: "mint5",
                        amount: 1,
                        givers: [{ address: "user2Publickey", amount: 1 }],
                    },
                ],
                token: { amount: 50000 },
            },
        },
        {
            address: "user2Publickey",
            items: {
                give: [
                    {
                        address: "mint3",
                        amount: 1,
                        getters: [{ address: "user1Publickey", amount: 1 }],
                    },
                    {
                        address: "mint5",
                        amount: 1,
                        getters: [{ address: "user1Publickey", amount: 1 }],
                    },
                    {
                        address: "mint4",
                        amount: 1,
                        getters: [{ address: "user1Publickey", amount: 1 }],
                    },
                ],
                get: [
                    {
                        address: "mint1",
                        amount: 1,
                        givers: [{ address: "user1Publickey", amount: 1 }],
                    },
                    {
                        address: "mint2",
                        amount: 1,
                        givers: [{ address: "user1Publickey", amount: 1 }],
                    },
                ],
                token: { amount: -50000 },
            },
        },
    ],
};