UNPKG

@crateprotocol/yi

Version:

The TypeScript SDK for Yi Token by Crate Protocol.

132 lines 5.08 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.YiSDK = void 0; const anchor_contrib_1 = require("@saberhq/anchor-contrib"); const solana_contrib_1 = require("@saberhq/solana-contrib"); const token_utils_1 = require("@saberhq/token-utils"); const web3_js_1 = require("@solana/web3.js"); const _1 = require("."); const constants_1 = require("./constants"); /** * Yi SDK. */ 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 = (0, anchor_contrib_1.newProgramMap)(provider, constants_1.YI_IDLS, constants_1.YI_ADDRESSES); return new YiSDK(new solana_contrib_1.SolanaAugmentedProvider(provider), programs); } /** * Creates a new Yi Token. * @returns */ async createYiToken({ underlyingToken, stakeFeeMillibps = 0, unstakeFeeMillibps = 0, mintKP = web3_js_1.Keypair.generate(), payer = this.provider.wallet.publicKey, }) { const [yiToken] = await (0, _1.findYiTokenAddress)(mintKP.publicKey); const underlyingTokens = await (0, token_utils_1.getOrCreateATA)({ provider: this.provider, mint: underlyingToken.mintAccount, owner: yiToken, }); const initMintTX = await (0, token_utils_1.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: web3_js_1.SystemProgram.programId, }, }), ])), }; } /** * Stakes underlying tokens for Yi tokens. * @returns */ async stake({ yiTokenMint, amount, authority = this.provider.wallet.publicKey, }) { const [yiToken] = await (0, _1.findYiTokenAddress)(yiTokenMint); const yiTokenData = await this.programs.Yi.account.yiToken.fetch(yiToken); const authorityATAs = await (0, token_utils_1.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_utils_1.TOKEN_PROGRAM_ID, }, }), ]); } /** * Unstakes Yi tokens. * @returns */ async unstake({ amount, authority = this.provider.wallet.publicKey, }) { const [yiToken] = await (0, _1.findYiTokenAddress)(amount.token.mintAccount); const yiTokenData = await this.programs.Yi.account.yiToken.fetch(yiToken); const authorityATAs = await (0, token_utils_1.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_utils_1.TOKEN_PROGRAM_ID, }, }), ]); } } exports.YiSDK = YiSDK; //# sourceMappingURL=sdk.js.map