UNPKG

@d8x/perpetuals-sdk

Version:

Node TypeScript SDK for D8X Perpetual Futures

153 lines (149 loc) 6.45 kB
import { ContractTransactionResponse, Overrides, Signer } from "ethers"; import { floatToDec18, floatToDecN } from "./d8XMath"; import type { NodeSDKConfig } from "./nodeSDKTypes"; import PerpetualDataHandler from "./perpetualDataHandler"; import WriteAccessHandler from "./writeAccessHandler"; /** * Functions to provide liquidity. This class requires a private key and executes * smart-contract interactions that require gas-payments. * @extends WriteAccessHandler */ export default class LiquidityProviderTool extends WriteAccessHandler { /** * Constructor * @param {NodeSDKConfig} config Configuration object, see PerpetualDataHandler. * readSDKConfig. * @example * import { LiquidityProviderTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; * async function main() { * console.log(LiquidityProviderTool); * // load configuration for Polygon zkEVM (testnet) * const config = PerpetualDataHandler.readSDKConfig("cardona"); * // LiquidityProviderTool (authentication required, PK is an environment variable with a private key) * const pk: string = <string>process.env.PK; * let lqudtProviderTool = new LiquidityProviderTool(config, pk); * // Create a proxy instance to access the blockchain * await lqudtProviderTool.createProxyInstance(); * } * main(); * * @param {string | Signer} signer Private key or ethers Signer of the account */ public constructor(config: NodeSDKConfig, signer: string | Signer) { super(config, signer); } /** * Add liquidity to the PnL participant fund. The address gets pool shares in return. * @param {string} poolSymbolName Name of pool symbol (e.g. MATIC) * @param {number} amountCC Amount in pool-collateral currency * @example * import { LiquidityProviderTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; * async function main() { * console.log(LiquidityProviderTool); * // setup (authentication required, PK is an environment variable with a private key) * const config = PerpetualDataHandler.readSDKConfig("cardona"); * const pk: string = <string>process.env.PK; * let lqudtProviderTool = new LiquidityProviderTool(config, pk); * await lqudtProviderTool.createProxyInstance(); * // add liquidity * await lqudtProviderTool.setAllowance("MATIC"); * let respAddLiquidity = await lqudtProviderTool.addLiquidity("MATIC", 0.1); * console.log(respAddLiquidity); * } * main(); * * @return Transaction object */ public async addLiquidity( poolSymbolName: string, amountCC: number, overrides?: Overrides ): Promise<ContractTransactionResponse> { if (this.proxyContract == null || this.signer == null) { throw Error("no proxy contract or wallet initialized. Use createProxyInstance()."); } let poolId = PerpetualDataHandler._getPoolIdFromSymbol(poolSymbolName, this.poolStaticInfos); let decimals = this.getMarginTokenDecimalsFromSymbol(poolSymbolName); let tx = await this.proxyContract.addLiquidity( poolId, floatToDecN(amountCC, decimals!), overrides || { gasLimit: this.gasLimit } ); return tx; } /** * Initiates a liquidity withdrawal from the pool * It triggers a time-delayed unlocking of the given number of pool shares. * The amount of pool shares to be unlocked is fixed by this call, but not their value in pool currency. * @param {string} poolSymbolName Name of pool symbol (e.g. MATIC). * @param {string} amountPoolShares Amount in pool-shares, removes everything if > available amount. * @example * import { LiquidityProviderTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; * async function main() { * console.log(LiquidityProviderTool); * // setup (authentication required, PK is an environment variable with a private key) * const config = PerpetualDataHandler.readSDKConfig("cardona"); * const pk: string = <string>process.env.PK; * let lqudtProviderTool = new LiquidityProviderTool(config, pk); * await lqudtProviderTool.createProxyInstance(); * // initiate withdrawal * let respRemoveLiquidity = await lqudtProviderTool.initiateLiquidityWithdrawal("MATIC", 0.1); * console.log(respRemoveLiquidity); * } * main(); * * @return Transaction object. */ public async initiateLiquidityWithdrawal( poolSymbolName: string, amountPoolShares: number, overrides?: Overrides ): Promise<ContractTransactionResponse> { if (this.proxyContract == null || this.signer == null) { throw Error("no proxy contract or wallet initialized. Use createProxyInstance()."); } let poolId = PerpetualDataHandler._getPoolIdFromSymbol(poolSymbolName, this.poolStaticInfos); let tx = await this.proxyContract.withdrawLiquidity( poolId, floatToDec18(amountPoolShares), overrides || { gasLimit: this.gasLimit } ); return tx; } /** * Withdraws as much liquidity as there is available after a call to initiateLiquidityWithdrawal. * The address loses pool shares in return. * @param poolSymbolName * @example * import { LiquidityProviderTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk'; * async function main() { * console.log(LiquidityProviderTool); * // setup (authentication required, PK is an environment variable with a private key) * const config = PerpetualDataHandler.readSDKConfig("cardona"); * const pk: string = <string>process.env.PK; * let lqudtProviderTool = new LiquidityProviderTool(config, pk); * await lqudtProviderTool.createProxyInstance(); * // remove liquidity * let respRemoveLiquidity = await lqudtProviderTool.executeLiquidityWithdrawal("MATIC", 0.1); * console.log(respRemoveLiquidity); * } * main(); * * @returns Transaction object. */ public async executeLiquidityWithdrawal( poolSymbolName: string, overrides?: Overrides ): Promise<ContractTransactionResponse> { if (this.proxyContract == null || this.signer == null) { throw Error("no proxy contract or wallet initialized. Use createProxyInstance()."); } let poolId = PerpetualDataHandler._getPoolIdFromSymbol(poolSymbolName, this.poolStaticInfos); let tx = await this.proxyContract.executeLiquidityWithdrawal( poolId, this.traderAddr, overrides || { gasLimit: this.gasLimit } ); return tx; } }