0.3.24 • Published 2 months ago

@neoswap/solana v0.3.24

Weekly downloads
-
License
MIT
Repository
-
Last release
2 months ago
</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 },
            },
        },
    ],
};
0.3.24

2 months ago

0.3.23

2 months ago

0.3.21

2 months ago

0.3.20-beta2

2 months ago

0.3.20-beta3

2 months ago

0.3.20-beta1

2 months ago

0.3.20-beta

2 months ago

0.3.19-beta

2 months ago

0.3.17-beta

2 months ago

0.3.17-beta1

2 months ago

0.3.18-beta

2 months ago

0.3.16

2 months ago

0.3.15

2 months ago

0.3.14

2 months ago

0.3.13

2 months ago

0.3.12

2 months ago

0.3.11

4 months ago

0.3.9

5 months ago

0.3.10

5 months ago

0.3.9-beta8

6 months ago

0.3.9-beta7

6 months ago

0.3.9-beta6

6 months ago

0.3.9-beta5

6 months ago

0.3.9-beta4

6 months ago

0.3.9-beta3

6 months ago

0.3.9-beta2

6 months ago

0.3.9-beta1

6 months ago

0.3.8

6 months ago

0.3.8-beta0

6 months ago

0.3.7

6 months ago

0.3.7-beta11

6 months ago

0.3.7-beta10

7 months ago

0.3.7-beta9

7 months ago

0.3.7-beta8

7 months ago

0.3.7-beta7

7 months ago

0.3.7-beta6

7 months ago

0.3.7-beta5

7 months ago

0.3.7-beta4

7 months ago

0.3.7-beta3

7 months ago

0.3.7-beta2

7 months ago

0.3.7-beta1

7 months ago

0.3.7-beta0

7 months ago

0.3.6

7 months ago

0.3.6-Beta39

7 months ago

0.3.6-Beta38

7 months ago

0.3.6-Beta37

7 months ago

0.3.6-Beta36

7 months ago

0.3.6-Beta35

7 months ago

0.3.6-Beta34

7 months ago

0.3.6-Beta33

7 months ago

0.3.6-Beta32

7 months ago

0.3.6-Beta31

7 months ago

0.3.6-Beta30

7 months ago

0.3.6-Beta29

7 months ago

0.3.6-Beta28

7 months ago

0.3.6-Beta27

7 months ago

0.3.6-Beta26

7 months ago

0.3.6-Beta25

7 months ago

0.3.6-Beta24

7 months ago

0.3.6-Beta23

7 months ago

0.3.6-Beta22

7 months ago

0.3.6-Beta21

7 months ago

0.3.6-Beta20

7 months ago

0.3.6-Beta19

7 months ago

0.3.6-Beta18

7 months ago

0.3.6-Beta17

7 months ago

0.3.6-Beta16

7 months ago

0.3.6-Beta15

7 months ago

0.3.6-Beta14

7 months ago

0.3.6-Beta13

7 months ago

0.3.6-Beta12

7 months ago

0.3.6-Beta11

7 months ago

0.3.6-Beta9

7 months ago

0.3.6-Beta8

7 months ago

0.3.6-Beta7

7 months ago

0.3.6-Beta6

7 months ago

0.3.6-Beta5

7 months ago

0.3.6-Beta4

7 months ago

0.3.6-Beta3

7 months ago

0.3.6-Beta2

7 months ago

0.3.6-Beta1

7 months ago

0.3.6-Beta0

7 months ago

0.3.5

8 months ago

0.3.4

8 months ago

0.3.3

8 months ago

0.3.2

8 months ago

0.3.1

8 months ago

0.3.1-beta3

8 months ago

0.3.1-beta2

8 months ago

0.3.1-beta1

8 months ago

0.3.1-beta0

8 months ago

0.3.0

8 months ago

0.3.0-beta93

8 months ago

0.3.0-beta92

8 months ago

0.3.0-beta91

8 months ago

0.3.0-beta90

8 months ago

0.3.0-beta89

8 months ago

0.3.0-beta88

8 months ago

0.3.0-beta87

8 months ago

0.3.0-beta86

8 months ago

0.3.0-beta85

8 months ago

0.3.0-beta83

8 months ago

0.3.0-beta81

8 months ago

0.3.0-beta80

8 months ago

0.3.0-beta79

8 months ago

0.3.0-beta78

8 months ago

0.3.0-beta77

8 months ago

0.3.0-beta75

8 months ago

0.3.0-beta74

8 months ago

0.3.0-beta73

8 months ago

0.3.0-beta72

8 months ago

0.3.0-beta71

8 months ago

0.3.0-beta70

8 months ago

0.3.0-beta69

8 months ago

0.3.0-beta68

8 months ago

0.3.0-beta67

8 months ago

0.3.0-beta66

8 months ago

0.3.0-beta65

8 months ago

0.3.0-beta64

8 months ago

0.3.0-beta63

8 months ago

0.3.0-beta62

8 months ago

0.3.0-beta61

8 months ago

0.3.0-beta60

8 months ago

0.3.0-beta59

8 months ago

0.3.0-beta58

8 months ago

0.3.0-beta57

8 months ago

0.3.0-beta56

8 months ago

0.3.0-beta55

8 months ago

0.3.0-beta54

8 months ago

0.3.0-beta53

8 months ago

0.3.0-beta52

8 months ago

0.3.0-beta51

8 months ago

0.3.0-beta50

8 months ago

0.3.0-beta49

8 months ago

0.3.0-beta48

8 months ago

0.3.0-beta47

8 months ago

0.3.0-beta46

8 months ago

0.3.0-beta45

8 months ago

0.3.0-beta44

8 months ago

0.3.0-beta43

8 months ago

0.3.0-beta42

8 months ago

0.3.0-beta41

8 months ago

0.3.0-beta40

8 months ago

0.3.0-beta39

8 months ago

0.3.0-beta38

8 months ago

0.3.0-beta37

8 months ago

0.3.0-beta36

8 months ago

0.3.0-beta35

8 months ago

0.3.0-beta34

8 months ago

0.3.0-beta33

8 months ago

0.3.0-beta32

8 months ago

0.3.0-beta31

8 months ago

0.3.0-beta30

8 months ago

0.3.0-beta29

8 months ago

0.3.0-beta28

8 months ago

0.3.0-beta27

8 months ago

0.3.0-beta25

8 months ago

0.3.0-beta24

8 months ago

0.3.0-beta23

8 months ago

0.3.0-beta22

8 months ago

0.3.0-beta21

8 months ago

0.3.0-beta20

8 months ago

0.3.0-beta19

8 months ago

0.3.0-beta18

8 months ago

0.3.0-beta17

8 months ago

0.3.0-beta15

8 months ago

0.3.0-beta14

8 months ago

0.3.0-beta12

8 months ago

0.3.0-beta11

8 months ago

0.3.0-beta10

8 months ago

0.3.0-beta9

8 months ago

0.3.0-beta8

8 months ago

0.3.0-beta7

8 months ago

0.3.0-beta6

8 months ago

0.3.0-beta5

8 months ago

0.3.0-beta4

8 months ago

0.3.0-beta3

8 months ago

0.3.0-beta2

8 months ago

0.3.0-beta1

8 months ago

0.3.0-beta0

8 months ago

0.2.50-beta0

8 months ago

0.2.5-0.beta0

8 months ago

0.2.49

9 months ago

0.2.49-beta.1

9 months ago

0.2.49-beta.0

9 months ago

0.2.48

9 months ago

0.2.47

9 months ago

0.2.46

9 months ago

0.2.45

9 months ago

0.2.44-beta.3

9 months ago

0.2.44-beta.2

9 months ago

0.2.44-beta.1

9 months ago

0.2.44-beta.0

9 months ago

0.2.43

9 months ago

0.2.42

9 months ago

0.2.40-beta.8

9 months ago

0.2.40-beta.7

9 months ago

0.2.40-beta.6

9 months ago

0.2.40-beta.5

9 months ago

0.2.40-beta.4

9 months ago

0.2.40-beta.3

9 months ago

0.2.41

9 months ago

0.2.40-beta.2

9 months ago

0.2.40-beta.1

9 months ago

0.2.40-beta.0

9 months ago

0.2.39

9 months ago

0.2.38-beta.1

9 months ago

0.2.38-beta.0

9 months ago

0.2.38

9 months ago

0.2.37

9 months ago

0.2.36-beta.1

9 months ago

0.2.36-beta.0

9 months ago

0.2.36

9 months ago

0.2.35

9 months ago

0.2.201

9 months ago

0.2.200

9 months ago

0.2.111

9 months ago

0.2.110

9 months ago

0.2.109

9 months ago

0.2.108

9 months ago

0.2.107

9 months ago

0.2.106

9 months ago

0.2.105

9 months ago

0.2.104

9 months ago

0.2.103

9 months ago

0.2.102

9 months ago

0.2.101

9 months ago

0.2.100

9 months ago

0.2.34

10 months ago

0.2.33

10 months ago

0.2.32

10 months ago

0.2.31

10 months ago

0.2.30

10 months ago

0.2.29

10 months ago

0.2.28

10 months ago

0.2.27

10 months ago

0.2.26

10 months ago

0.2.25

10 months ago

0.2.24

10 months ago

0.2.23

10 months ago

0.2.22

10 months ago

0.2.21

10 months ago

0.2.20

10 months ago

0.2.19

10 months ago

0.2.18

10 months ago

0.2.17

10 months ago

0.2.16

10 months ago

0.2.15

10 months ago

0.2.14

10 months ago

0.2.13

10 months ago

0.2.12

10 months ago

0.2.11

10 months ago

0.2.10

10 months ago

0.2.9

10 months ago

0.2.8

10 months ago

0.2.7

10 months ago

0.2.6

10 months ago

0.2.5

10 months ago

0.2.4

10 months ago

0.2.3

10 months ago

0.2.2

10 months ago

0.2.1

10 months ago

0.2.0

10 months ago

0.0.23

10 months ago

0.0.22

10 months ago

0.0.21

10 months ago

0.0.20

10 months ago

0.0.19

10 months ago

0.0.18

10 months ago

0.0.17

10 months ago

0.0.16

10 months ago

0.0.15

10 months ago

0.0.14

10 months ago

0.0.13

10 months ago

0.1.0

10 months ago

0.0.137

10 months ago

0.0.136

10 months ago

0.0.135

10 months ago

0.0.134

10 months ago

0.0.133

10 months ago

0.0.132

10 months ago

0.0.131

10 months ago

0.0.130

10 months ago

0.0.129

10 months ago

0.0.128

10 months ago

0.0.127

10 months ago

0.0.126

10 months ago

0.0.125

10 months ago

0.0.124

10 months ago

0.0.123

10 months ago

0.0.122

10 months ago

0.0.121

10 months ago

0.0.120

10 months ago

0.0.119

10 months ago

0.0.118

10 months ago

0.0.117

10 months ago

0.0.116

10 months ago

0.0.115

10 months ago

0.0.114

10 months ago

0.0.113

10 months ago

0.0.112

10 months ago

0.0.111

10 months ago

0.0.110

10 months ago

0.0.109

10 months ago

0.0.108

10 months ago

0.0.107

10 months ago

0.0.106

10 months ago

0.0.105

10 months ago

0.0.104

10 months ago

0.0.103

10 months ago

0.0.102

10 months ago

0.0.101

10 months ago

0.0.100

10 months ago

0.0.12

10 months ago

0.0.11

10 months ago

0.0.10

10 months ago

0.0.9

10 months ago

0.0.8

10 months ago

0.0.6

10 months ago

0.0.5

10 months ago

0.0.4

10 months ago

0.0.3

10 months ago

0.0.2

10 months ago

0.0.1

10 months ago