Transactions Guide
TipLink Minimums
Recommended Sol Minimum for links with non SOL values (SPL tokens, NFTs, SFTs etc.)
// TRANSACTION_FEE_LAMPORTS + 2 * RENT_EXEMPT_MINIMUM_LAMPORTS;
const TIPLINK_MINIMUM_LAMPORTS = 4083560;
Transactions Fees
If there is no extra SOL on your TipLinks users will be unable to withdraw to their personal wallets
Recommended Sol Minimum for links with only SOL
// TRANSACTION_FEE_LAMPORTS + RENT_EXEMPT_MINIMUM_LAMPORTS;
const TIPLINK_SOL_ONLY_LINK_MINIMUM_LAMPORTS = 900000;
Transactions Fees
Account minimums can be derived using getFeeForMessage and getMinimumBalanceRorRentExemption
Make a transaction with a TipLink wallet
Transaction logic adapted from: https://docs.solana.com/developing/clients/javascript-api
import { TipLink } from '@tiplink/api';
import {
  PublicKey,
  Keypair,
  Transaction,
  SystemProgram,
  sendAndConfirmTransaction,
} from '@solana/web3.js';
const fundTipLink = async (sourceKeypair, destinationTipLink) => {
  /* TipLink.create() should not be able to generate invalid addresses
   * this check is purely for demonstrational purposes
   */
  const isValidAddress = await PublicKey.isOnCurve(destinationTipLink.keypair.publicKey);
  if(!isValidAddress) {
    throw "Invalid TipLink";
  }
  let transaction = new Transaction();
  let connection = new Connection(clusterApiUrl("devnet"), "confirmed");
  transaction.add(
    SystemProgram.transfer({
      fromPubkey: sourceKeypair.publicKey,
      toPubkey: destinationTipLink.keypair.publicKey,
      lamports: TIPLINK_SOL_ONLY_LINK_MINIMUM_LAMPORTS,
    }),
  );
  const transactionSignature = await sendAndConfirmTransaction(connection, transaction, [sourceKeypair], {commitment: "confirmed"});
  if (transactionSignature === null) {
    throw "Unable to fund TipLink's public key";
  }
  return transactionSignature;
};
Note
You should use a fromKeypair you control which has enough funds in a production environment
Full Transaction Example
Transaction logic adapted from: https://docs.solana.com/developing/clients/javascript-api
Connection
Wallets on https://tiplink.io/ will only work with mainnet connections
import {
  PublicKey,
  Keypair,
  Connection,
  clusterApiUrl,
  sendAndConfirmTransaction,
  Transaction,
  SystemProgram,
  LAMPORTS_PER_SOL,
} from '@solana/web3.js';
import { TipLink } from '@tiplink/api';
const SOLANA_TRANSACTION_FEE_LAMPORTS = 5000; // to derive the real cost use: Connection.getFeeForMessage()
const TIPLINK_SOL_ONLY_LINK_MINIMUM_LAMPORTS = 900000;
const createAndFundKeypair = async () => {
  const sourceKeypair = Keypair.generate();
  const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
  const airdropSignature = await connection.requestAirdrop(
    sourceKeypair.publicKey,
    TIPLINK_SOL_ONLY_LINK_MINIMUM_LAMPORTS + SOLANA_TRANSACTION_FEE_LAMPORTS,
  );
  const confirmation = await connection.confirmTransaction(airdropSignature, "confirmed");
  if (confirmation.value.err !== null) {
    throw "Unable to fund new wallet";
  }
  return sourceKeypair;
}
const fundTipLink = async (sourceKeypair, destinationTipLink) => {
  /* TipLink.create() should not be able to generate invalid addresses
   * this check is purely for demonstrational purposes
   */
  const isValidAddress = await PublicKey.isOnCurve(destinationTipLink.keypair.publicKey);
  if(!isValidAddress) {
    throw "Invalid TipLink";
  }
  let transaction = new Transaction();
  let connection = new Connection(clusterApiUrl("devnet"), "confirmed");
  transaction.add(
    SystemProgram.transfer({
      fromPubkey: sourceKeypair.publicKey,
      toPubkey: destinationTipLink.keypair.publicKey,
      lamports: TIPLINK_SOL_ONLY_LINK_MINIMUM_LAMPORTS,
    }),
  );
  const transactionSignature = await sendAndConfirmTransaction(connection, transaction, [sourceKeypair], {commitment: "confirmed"});
  if (transactionSignature === null) {
    throw "Unable to fund TipLink's public key";
  }
  return transactionSignature;
};
const createAndFundTipLink = async () => {
  const sourceKeypair = await createAndFundKeypair();
  const destinationTipLink = await TipLink.create();
  await fundTipLink(sourceKeypair, destinationTipLink);
  console.log("visit", destinationTipLink.url.toString(), "to view your balance and perform other wallet actions");
  console.log("The TipLink should have 90000 lamports worth of sol on it: the minimum recommended amount for a usable TipLink");
};
createAndFundTipLink();
Connection
Wallets on https://tiplink.io/ will only work with mainnet connections