UNPKG

@crateprotocol/yi

Version:

The TypeScript SDK for Yi Token by Crate Protocol.

128 lines 4.85 kB
import { newProgramMap } from "@saberhq/anchor-contrib"; import { SolanaAugmentedProvider } from "@saberhq/solana-contrib"; import { createInitMintInstructions, getOrCreateATA, getOrCreateATAs, TOKEN_PROGRAM_ID, } from "@saberhq/token-utils"; import { Keypair, SystemProgram } from "@solana/web3.js"; import { findYiTokenAddress } from "."; import { YI_ADDRESSES, YI_IDLS } from "./constants"; /** * Yi SDK. */ export class YiSDK { constructor(provider, programs) { this.provider = provider; this.programs = programs; } /** * Creates a new instance of the SDK with the given keypair. */ withSigner(signer) { return YiSDK.load({ provider: this.provider.withSigner(signer), }); } /** * Loads the SDK. * @returns */ static load({ provider }) { const programs = newProgramMap(provider, YI_IDLS, YI_ADDRESSES); return new YiSDK(new SolanaAugmentedProvider(provider), programs); } /** * Creates a new Yi Token. * @returns */ async createYiToken({ underlyingToken, stakeFeeMillibps = 0, unstakeFeeMillibps = 0, mintKP = Keypair.generate(), payer = this.provider.wallet.publicKey, }) { const [yiToken] = await findYiTokenAddress(mintKP.publicKey); const underlyingTokens = await getOrCreateATA({ provider: this.provider, mint: underlyingToken.mintAccount, owner: yiToken, }); const initMintTX = await createInitMintInstructions({ provider: this.provider, mintKP, decimals: underlyingToken.decimals, mintAuthority: yiToken, freezeAuthority: yiToken, }); return { yiToken, mint: mintKP.publicKey, tx: initMintTX.combine(this.provider.newTX([ underlyingTokens.instruction, this.programs.Yi.instruction.createYiTokenWithFees(stakeFeeMillibps, unstakeFeeMillibps, { accounts: { mint: mintKP.publicKey, yiToken, underlyingTokenMint: underlyingToken.mintAccount, underlyingTokens: underlyingTokens.address, payer, systemProgram: SystemProgram.programId, }, }), ])), }; } /** * Stakes underlying tokens for Yi tokens. * @returns */ async stake({ yiTokenMint, amount, authority = this.provider.wallet.publicKey, }) { const [yiToken] = await findYiTokenAddress(yiTokenMint); const yiTokenData = await this.programs.Yi.account.yiToken.fetch(yiToken); const authorityATAs = await getOrCreateATAs({ provider: this.provider, mints: { underlying: yiTokenData.underlyingTokenMint, yi: yiTokenData.mint, }, owner: authority, }); return this.provider.newTX([ authorityATAs.createAccountInstructions.yi, this.programs.Yi.instruction.stake(amount, { accounts: { yiToken, yiMint: yiTokenMint, sourceTokens: authorityATAs.accounts.underlying, sourceAuthority: authority, yiUnderlyingTokens: yiTokenData.underlyingTokens, destinationYiTokens: authorityATAs.accounts.yi, tokenProgram: TOKEN_PROGRAM_ID, }, }), ]); } /** * Unstakes Yi tokens. * @returns */ async unstake({ amount, authority = this.provider.wallet.publicKey, }) { const [yiToken] = await findYiTokenAddress(amount.token.mintAccount); const yiTokenData = await this.programs.Yi.account.yiToken.fetch(yiToken); const authorityATAs = await getOrCreateATAs({ provider: this.provider, mints: { underlying: yiTokenData.underlyingTokenMint, yi: yiTokenData.mint, }, owner: authority, }); return this.provider.newTX([ ...authorityATAs.instructions, this.programs.Yi.instruction.unstake(amount.toU64(), { accounts: { yiToken, yiMint: amount.token.mintAccount, sourceYiTokens: authorityATAs.accounts.yi, sourceAuthority: authority, yiUnderlyingTokens: yiTokenData.underlyingTokens, destinationUnderlyingTokens: authorityATAs.accounts.underlying, tokenProgram: TOKEN_PROGRAM_ID, }, }), ]); } } //# sourceMappingURL=sdk.js.map