> ## Documentation Index
> Fetch the complete documentation index at: https://docs.garden.finance/llms.txt
> Use this file to discover all available pages before exploring further.

# Quickstart

<Steps>
  <Step title="Prerequistes">
    This guide assumes that you have completed the [Setup](/developers/sdk/nodejs/setup) guide.
  </Step>

  <Step title="Initialize wallets and providers">
    <Tip>
      Initialize wallets and providers only for the chains you need.
    </Tip>

    ```ts theme={null}
    import {
        BitcoinProvider,
        BitcoinNetwork,
        BitcoinWallet,
    } from '@gardenfi/core';
    import { with0x } from '@gardenfi/utils';
    import { createWalletClient, http } from 'viem';
    import { privateKeyToAccount } from 'viem/accounts';
    import { arbitrumSepolia } from 'viem/chains';
    import { RpcProvider, Account } from 'starknet';
    import * as anchor from '@coral-xyz/anchor';
    import { web3 } from '@coral-xyz/anchor';

    // Ethereum wallet setup
    const ethereumAccount = privateKeyToAccount(with0x('<YOUR_EVM_PRIVATE_KEY>'));
    const ethereumWalletClient = createWalletClient({
        account: ethereumAccount,
        chain: arbitrumSepolia,
        transport: http(),
    });

    // Starknet wallet setup
    const starknetProvider = new RpcProvider(); // Using default RPC URL
    const starknetWallet = new Account({
        provider: starknetProvider,
        signer: <YOUR_STARKNET_PRIVATE_KEY>,
        address: <YOUR_STARKNET_ADDRESS>,
    });

    // Solana wallet setup
    const solanaPrivKeyBytes = new Uint8Array('<YOUR_SOLANA_PRIVATE_KEY_IN_BYTES>');
    const solanaUser = web3.Keypair.fromSecretKey(solanaPrivKeyBytes);
    const solanaConnection = new web3.Connection(RPC_URL, { commitment: 'confirmed' });
    const solanaWallet = new anchor.Wallet(solanaUser);
    const solanaProvider = new anchor.AnchorProvider(solanaConnection, solanaWallet);
    ```
  </Step>

  <Step title="Configure Garden instance">
    <Tip>
      For API key, reach out to us in the [Townhall](https://discord.gg/B7RczEFuJ5) or raise a support ticket.
    </Tip>

    <Tabs>
      <Tab title="Default wallet clients">
        ```js theme={null}
        import { Garden } from '@gardenfi/core';
        import { Network } from '@gardenfi/utils';

        const garden = Garden.fromWallets({
            environment: Network.TESTNET,
            apiKey: '<YOUR_API_KEY>',
            wallets: {
                evm: ethereumWalletClient,
                starknet: starknetWallet,
                solana: solanaProvider
            }
        });
        ```
      </Tab>

      <Tab title="Custom client configuration">
        <Note>
          You can initialize the Garden instance with your own HTLC client implementations. Check out the [IEVMHTLC](https://github.com/gardenfi/garden.js/blob/main/packages/core/src/lib/evm/htlc.types.ts), [IStarknetHTLC](https://github.com/gardenfi/garden.js/blob/main/packages/core/src/lib/starknet/starknetHTLC.types.ts), and [ISolanaHTLC](https://github.com/gardenfi/garden.js/blob/main/packages/core/src/lib/solana/htlc/ISolanaHTLC.ts) interfaces for more details.
        </Note>

        ```js theme={null}
        import { Garden } from '@gardenfi/core';
        import { Network } from '@gardenfi/utils';

        const garden = new Garden({
            environment: Network.TESTNET,
            apiKey: '<YOUR_API_KEY>',
            htlc: {
                evm: <IEVMHTLC>,
                starknet: <IStarknetHTLC>,
                solana: <ISolanaHTLC>
            },
        });
        ```
      </Tab>
    </Tabs>
  </Step>

  <Step title="Create a swap">
    ```js theme={null}
    import { Quote, SwapParams } from '@gardenfi/core';
    import { Assets, ChainAsset } from '@gardenfi/orderbook';

    const fromAsset = ChainAsset.from(Assets.ethereum_sepolia.WBTC);
    const toAsset = ChainAsset.from(Assets.bitcoin_testnet.BTC);

    const sendAmount = '1000000'; // 0.01 WBTC

    // Get the quote for the send amount
    const quote = await garden.quote.getQuote(
        fromAsset,
        toAsset,
        sendAmount,
        false,
        {},
    );

    const receiveAmount = quote.val?.[0].destination.amount;
    const solverId = quote.val?.[0].solver_id;
    const sourceAddress = ethereumAccount.address;
    const destinationAddress = '<YOUR_BITCOIN_ADDRESS';

    const swapParams: SwapParams = {
        fromAsset,
        toAsset,
        sendAmount,
        receiveAmount,
        solverId,
        sourceAddress,
        destinationAddress
    };

    // Create the swap
    const swapResult = await garden.createSwap(swapParams);

    if (!swapResult.ok) {
        throw new Error(swapResult.error);
    }

    console.log('Order created and initiated ✅', swapResult.val);
    ```
  </Step>
</Steps>
