zebec-instant-card-sdk
Version:
An sdk for interacting with zebec instant card program in solana.
331 lines (330 loc) • 12.3 kB
TypeScript
/// <reference types="@coral-xyz/anchor/node_modules/@solana/web3.js" />
import { Address } from "@coral-xyz/anchor";
import { Commitment, Connection, PublicKey, Transaction, VersionedTransaction } from "@solana/web3.js";
import { ZebecCardInstructions } from "./instructions";
import { TransactionPayload } from "./payload";
import { BigIntString, DecimalString, EmailString, PercentString, PublicKeyString } from "./types";
/**
* Jupiter quote routes info
*/
export type RouteInfo = {
swapInfo: {
ammKey: PublicKeyString;
label: string;
inputMint: PublicKeyString;
outputMint: PublicKeyString;
inAmount: BigIntString;
outAmount: BigIntString;
feeAmount: BigIntString;
feeMint: PublicKeyString;
};
percent: number;
};
/**
* Juptier quote info
*/
export type QuoteInfo = {
inputMint: PublicKeyString;
inAmount: BigIntString;
outputMint: PublicKeyString;
outAmount: BigIntString;
otherAmountThreshold: BigIntString;
swapMode: "ExactIn" | "ExactOut";
slippageBps: number;
platformFee: string | null;
priceImpactPct: PercentString;
routePlan: RouteInfo[];
contextSlot: number;
timeTaken: number;
} | {
error: string;
};
/**
* Info stored in buyerPda
*/
export type CardPurchaseInfo = {
address: PublicKeyString;
index: bigint;
buyerAddress: PublicKeyString;
amount: DecimalString;
purchaseAt: number;
};
export type FeeTier = {
minAmount: DecimalString;
maxAmount: DecimalString;
feePercent: PercentString;
};
export type ProviderConfig = {
minCardAmount: DecimalString;
maxCardAmount: DecimalString;
feeTiers: FeeTier[];
};
/**
* Info stored in cardPda
*/
export type CardConfigInfo = {
address: PublicKeyString;
index: bigint;
zicOwner: PublicKeyString;
nativeFeePercent: PercentString;
nonNativeFeePercent: PercentString;
revenueFeePercent: PercentString;
usdcMint: PublicKeyString;
revenueVault: PublicKeyString;
commissionVault: PublicKeyString;
cardVault: PublicKeyString;
totalCardSold: DecimalString;
providerConfig: ProviderConfig;
dailyCardPurchaseLimit: DecimalString;
};
export type TokenFeeRecord = {
tokenAddress: PublicKeyString;
fee: PercentString;
};
export type TokenFeeRecordList = TokenFeeRecord[];
export type UserPurchaseRecordInfo = {
address: PublicKeyString;
owner: PublicKeyString;
lastCardBoughtTimestamp: number;
totalCardBoughtPerDay: DecimalString;
};
export type CardBotConfigInfo = {
botAdmin: PublicKeyString;
};
export type BotUserCustodyInfo = {
userId: string;
lastCardBoughtTimestamp: number;
totalCardBoughtPerDay: DecimalString;
};
export type OnRampConfigInfo = {
onRampAdmin: PublicKeyString;
zbcnToken: PublicKeyString;
};
export type OnRampUserCustodyInfo = {
userId: string;
};
export type InitCardConfigParams = {
zicOwnerAddress: Address;
cardVaultAddress: Address;
revenueVaultAddress: Address;
commissionVaultAddress: Address;
usdcAddress: Address;
revenueFeePercent: PercentString;
nativeFeePercent: PercentString;
nonNativeFeePercent: PercentString;
minCardAmount: DecimalString;
maxCardAmount: DecimalString;
dailyCardPurchaseLimit: DecimalString;
feeTiers: Array<FeeTier>;
};
export type SetCardConfigParams = {
zicOwnerAddress: Address;
newZicOwnerAddress: Address;
cardVaultAddress: Address;
revenueVaultAddress: Address;
commissionVaultAddress: Address;
revenueFeePercent: PercentString;
nativeFeePercent: PercentString;
nonNativeFeePercent: PercentString;
minCardAmount: DecimalString;
maxCardAmount: DecimalString;
dailyCardPurchaseLimit: DecimalString;
feeTiers: Array<FeeTier>;
};
export type SetCustomFeesParams = {
zicOwnerAddress: PublicKeyString;
tokenFeeList: TokenFeeRecordList;
};
export type DeleteCustomFeesParams = {
zicOwnerAddress: PublicKeyString;
tokenAddressList: PublicKeyString[];
};
export type SwapMode = "ExactOut" | "ExactIn";
export type SwapAndDepositParams = {
userAddress: Address;
quoteInfo: QuoteInfo;
};
export type DepositParams = {
userAddress: Address;
mintAddress: Address;
amount: DecimalString;
};
export type WithdrawParams = {
userAddress: Address;
mintAddress: Address;
amount: DecimalString;
};
export type CardType = "silver" | "carbon";
export type BuyCardParams = {
mintAddress: Address;
buyerAddress: Address;
nextBuyerCounter: bigint;
amount: DecimalString;
cardType: CardType;
buyerEmail: EmailString;
};
export type BuyCardDirectParams = {
buyerAddress: Address;
nextBuyerCounter: bigint;
amount: DecimalString;
cardType: CardType;
buyerEmail: EmailString;
mintAddress: Address;
};
export type SwapAndBuyCardDirectParams = {
quoteInfo: QuoteInfo;
buyerAddress: Address;
nextBuyerCounter: bigint;
cardType: CardType;
buyerEmail: EmailString;
};
export type GetQuoteInfoParams = {
inputMintAddress: Address;
outputMintAddress: Address;
inputAmount: DecimalString;
slippagePercent: PercentString;
swapMode?: SwapMode;
};
export type GenerateYieldParams = {
userAddress: Address;
mintAddress: Address;
amount: DecimalString;
};
export type WithdrawYieldParams = {
userAddress: Address;
mintAddress: Address;
amount: DecimalString;
withdrawAll?: boolean;
};
export type InitBotConfigParams = {
zicOwnerAddress: PublicKeyString;
botAdminAddress: PublicKeyString;
};
export type InitBotUserCustodyParams = {
botAdminAddress: PublicKeyString;
usdcMintAddress: PublicKeyString;
userId: string;
};
export type SetNewBotAdminParams = {
newBotAdminAddress: PublicKeyString;
zicOwnerAddress: PublicKeyString;
};
export type BuyCardThroughBotParams = {
botAdminAddress: PublicKeyString;
usdcMintAddress: PublicKeyString;
userId: string;
cardType: CardType;
amount: DecimalString;
};
export type InitOnRampConfigParams = {
zicOwnerAddress: PublicKeyString;
onRampAdminAddress: PublicKeyString;
zbcnAddress: PublicKeyString;
};
export type InitOnRampUserCustodyParams = {
onRampAdminAddress: PublicKeyString;
userId: string;
};
export type SetNewOnRampAdminParams = {
zicOwnerAddress: PublicKeyString;
newOnRampAdminAddress: PublicKeyString;
};
export type OnRampTransferZbcnParams = {
onRampAdminAddress: PublicKeyString;
senderUserId: string;
receiverAddress: PublicKeyString;
amount: DecimalString;
durationInDays: number;
};
/**
* Data emitted from Deposit Event
*/
export type DepositToUserPdaEvent = {
from: PublicKeyString;
to: PublicKeyString;
amount: DecimalString;
};
export type CardPurchaseEvent = {
index: bigint;
from: PublicKeyString;
to: PublicKeyString;
amount: DecimalString;
};
/**
* Zebec card service for interacting with zebec instant card program
*
* @example
*
* ```
* const connection = new Connection(process.env.RPC_URL || clusterApiUrl("mainnet-beta"));
* const wallet = useWallet();
* const provider = getAnchorProvider(connection, wallet);
* const program = ZebecCardProgramFactory.getProgram(provider);
* const instructions = new ZebecCardInstructions(program);
* const service = new ZebecCardService(instructions, connection, wallet.signTranaction);
*
* // or
* const provider = getZebecConnectionProvider(connection);
* const program = ZebecCardProgramFactory.getProgram(provider);
* const instructions = new ZebecCardInstructions(program);
* const service = new ZebecCardService(instructions, connection);
* ```
*/
export declare class ZebecCardService {
readonly instructions: ZebecCardInstructions;
private readonly _connection;
private readonly _signTransaction?;
static deriveCardConfigPda(cardProgramId: Address): PublicKey;
static deriveTokenFeeMapPda(cardProgramId: Address): PublicKey;
static deriveCardPurchaseInfoPda(buyerAddress: Address, cardProgramId: Address, buyerCounter: bigint): PublicKey;
static deriveUserVaultPda(userAddress: Address, cardProgramId: Address): PublicKey;
static deriveUserPurchaseRecordPda(userAddress: Address, cardProgramId: Address): PublicKey;
static deriveFlexlendUserPda(userAddress: Address, flexlendProgramId: Address): PublicKey;
static deriveFlexlendPromotionReservePda(reserveAdminAddress: Address, flexlendProgramId: Address): PublicKey;
static deriveCardBotConfigPda(cardProgramId: Address): PublicKey;
static deriveBotUserCustodyPda(userId: string, cardProgramId: Address): PublicKey;
static deriveOnRampConfigPda(cardProgramId: Address): PublicKey;
static deriveOnRampUserCustodyPda(userId: string, cardProgramId: Address): PublicKey;
static deriveReloadableCardPda(cardProgramId: Address): PublicKey;
private readonly _programId;
constructor(instructions: ZebecCardInstructions, _connection: Connection, _signTransaction?: (<T extends Transaction | VersionedTransaction>(transaction: T) => Promise<T>) | undefined);
private _createPayload;
initCardConfig(params: InitCardConfigParams): Promise<TransactionPayload>;
setCardConfig(params: SetCardConfigParams): Promise<TransactionPayload>;
setCustomFees(params: SetCustomFeesParams): Promise<TransactionPayload>;
deleteCustomFees(params: DeleteCustomFeesParams): Promise<TransactionPayload>;
swapAndDeposit(params: SwapAndDepositParams): Promise<TransactionPayload>;
deposit(params: DepositParams): Promise<TransactionPayload>;
withdraw(params: WithdrawParams): Promise<TransactionPayload>;
buyCard(params: BuyCardParams): Promise<TransactionPayload>;
swapAndBuyCardDirect(params: SwapAndBuyCardDirectParams): Promise<TransactionPayload>;
buyCardDirect(params: BuyCardDirectParams): Promise<TransactionPayload>;
private _checkAmountIsWithinDailyCardLimit;
private _checkAmountIsWithinProviderRange;
initBotConfig(params: InitBotConfigParams): Promise<TransactionPayload>;
initBotUserCustody(params: InitBotUserCustodyParams): Promise<TransactionPayload>;
setBotAdmin(params: SetNewBotAdminParams): Promise<TransactionPayload>;
buyCardThroughBot(params: BuyCardThroughBotParams): Promise<TransactionPayload>;
private _checkAmountIsWithinDailyCardLimitForBot;
generateYield(params: GenerateYieldParams): Promise<TransactionPayload>;
withdrawYield(params: WithdrawYieldParams): Promise<TransactionPayload>;
initOnRampConfig(params: InitOnRampConfigParams): Promise<TransactionPayload>;
setOnRampAdmin(params: SetNewOnRampAdminParams): Promise<TransactionPayload>;
initOnRampUserCustody(params: InitOnRampUserCustodyParams): Promise<TransactionPayload>;
onRampTransferZbcn(params: OnRampTransferZbcnParams): Promise<TransactionPayload>;
getQuoteInfo(params: GetQuoteInfoParams): Promise<QuoteInfo>;
getUserVaultBalance(userAddress: Address, mintAddress: Address, commitment?: Commitment): Promise<DecimalString>;
getNextBuyerCounter(): Promise<bigint>;
getCardConfigInfo(commitment?: Commitment): Promise<CardConfigInfo>;
getCardPurchaseInfo(cardPurchaseInfoPda: Address, commitment?: Commitment): Promise<CardPurchaseInfo>;
getUserPurchaseRecord(userPurchaseRecordKey: Address, commitment?: Commitment): Promise<UserPurchaseRecordInfo>;
getCustomTokenFees(commitment?: Commitment): Promise<TokenFeeRecordList>;
getCardBotConfigInfo(commitment?: Commitment): Promise<CardBotConfigInfo>;
getBotUserCustodyInfo(userCustody: Address, commitment?: Commitment): Promise<BotUserCustodyInfo>;
getOnRampConfigInfo(commitment?: Commitment): Promise<OnRampConfigInfo>;
getOnRampUserCustodyInfo(onRampUserCustody: Address, commitment?: Commitment): Promise<OnRampUserCustodyInfo>;
getAllCardPurchaseInfo(buyerAddress: Address): Promise<Array<CardPurchaseInfo>>;
addDepositToUserPdaEventLister(callback: (event: DepositToUserPdaEvent, slot: number, signature: string) => void): number;
addCardPurchaseEventLister(callback: (event: CardPurchaseEvent, slot: number, signature: string) => void): number;
removeEventLister(eventListener: number): Promise<void>;
}