UNPKG

initia-daily-bot

Version:

Initia Daily Routine Bot

252 lines (230 loc) 7.58 kB
import * as initia from "@initia/initia.js"; import { AppConstant } from "../../utils/constant.js"; import { Initia } from "../initia/initia.js"; import { TucanaSigner } from "./operation/signer.js"; import { TucanaException } from "./exception/exception.js"; import { getTucanaFaucet } from "../../repository/tucana_repo.js"; class Tucana extends TucanaSigner { /** @param {Initia} initiaClass */ constructor(address, pk, initiaClass) { const chainId = "birdee-1"; const privateKeyBytes = Buffer.from(pk, "hex"); const key = new initia.RawKey(Uint8Array.from(privateKeyBytes)); const lcd = new initia.LCDClient( "https://maze-rest-c9796789-107d-49ab-b6de-059724d2a91d.ue1-prod.newmetric.xyz", { chainId: "birdee-1", gasPrices: "0.15utuc", gasAdjustment: "2.0", } ); const wallet = new initia.Wallet(lcd, key); super(wallet, lcd); this.address = address; this.pk = pk; this.chainId = chainId; this.privateKeyBytes = privateKeyBytes; this.key = key; this.lcd = lcd; this.wallet = wallet; /** @type {TucanaException} */ this.exception = new TucanaException(this); /** @type {Initia} */ this.initia = initiaClass; } async swap(oneWaySwap = false) { try { //Swap 1 Initia To USDC var args = [ "Ari0w69X9eSgBvo1sCsf52UCM8WEtsf7YupiNqom7hs8iFZu7rMJRPyo/OnsbG7e6VNi2s/uVfxfWUnnNZzNQX8=", initia.bcs.vector(initia.bcs.bool()).serialize([true, true]).toBase64(), initia.bcs.bool().serialize(true).toBase64(), initia.bcs.u64().serialize(100000).toBase64(), ]; const calculate = await this.initia.lcd.move.viewFunction( AppConstant.TUCANAMODULEADDRESS, "router", "calculate_multi_hops_swap_result", [], args ); // console.log(calculate); args.push(initia.bcs.u64().serialize(calculate.amount_out).toBase64()); const msg = new initia.MsgExecute(); msg.sender = this.address; msg.module_address = AppConstant.TUCANAMODULEADDRESS; msg.function_name = "multi_hops_swap"; msg.module_name = "router"; msg.type_args = []; msg.args = args; // console.log(msg); await this.initia .signAndBroadcast(msg) .then(() => { console.log( `Successfully Swap 1 Initia To ${ calculate.amount_out / 1000000 } USDC for Address : ${this.address}` ); }) .catch((err) => { throw err; }); if (!oneWaySwap) { //SWAP Back USDC To Initia var backArgs = [ "Ari0w69X9eSgBvo1sCsf52UCM8WEtsf7YupiNqom7hs8iFZu7rMJRPyo/OnsbG7e6VNi2s/uVfxfWUnnNZzNQX8=", initia.bcs .vector(initia.bcs.bool()) .serialize([true, true]) .toBase64(), initia.bcs.bool().serialize(true).toBase64(), initia.bcs .u64() .serialize(Math.ceil((calculate.amount_out * 50) / 100)) .toBase64(), ]; const calculateBack = await this.initia.lcd.move.viewFunction( AppConstant.TUCANAMODULEADDRESS, "router", "calculate_multi_hops_swap_result", [], backArgs ); // console.log(calculate); backArgs.push( initia.bcs.u64().serialize(calculateBack.amount_out).toBase64() ); const backMsg = new initia.MsgExecute(); backMsg.sender = this.address; backMsg.module_address = AppConstant.TUCANAMODULEADDRESS; backMsg.function_name = "multi_hops_swap"; backMsg.module_name = "router"; backMsg.type_args = []; backMsg.args = backArgs; await this.initia .signAndBroadcast(backMsg) .then(() => { console.log( `Successfully Swap ${ Math.ceil((calculate.amount_out * 50) / 100) / 1000000 } (50%) USDC To ${ calculateBack.amount_out / 1000000 } INIT for Address : ${this.address}` ); }) .catch((err) => { throw err; }); } } catch (error) { console.log(error); this.exception.handlingError(error, "swapTucana"); } } async tucanaPerpAddLiquidity() { try { const msg = new initia.MsgExecute(); msg.module_address = AppConstant.TUCANAPERPMODULEADDRESS; msg.module_name = "router"; msg.function_name = "add_liquidity"; msg.sender = this.address; msg.args = [ initia.bcs .u64() .serialize(1 * 1000000) .toBase64(), initia.bcs .address() .serialize(AppConstant.TUCPERPMETADATAADDRESS) .toBase64(), initia.bcs.address().serialize(this.address).toBase64(), initia.bcs.u256().serialize(0).toBase64(), initia.bcs.u256().serialize(0).toBase64(), ]; // console.log(msg); await this.signAndBroadcast(msg) .then(() => { console.log( `Successfully Add 1 TUC to Tucana Liquidity PERP For Address ${this.address}` ); }) .catch((err) => { throw err; }); } catch (error) { this.exception.handlingError(error, "tucanaPerpAddLiquidity"); } } async requestFaucet() { try { await getTucanaFaucet(this.address); } catch (error) { this.exception.handlingError(error, "requestFaucet"); } } async tucanaPoolAddLiquidity() { try { const pool = await this.initia.lcd.move.viewFunction( AppConstant.TUCANAPOOLMODULEADDRESS, "position", "position_metadata", undefined, [ initia.bcs .address() .serialize(AppConstant.TUCANAINITIAUSDCPOSITIONADDRESS) .toBase64(), ] ); const position = await this.initia.lcd.move.viewFunction( AppConstant.TUCANAPOOLMODULEADDRESS, "pool", "get_position_amounts", undefined, [ initia.bcs .address() .serialize(AppConstant.TUCANAINITIAUSDCPOSITIONADDRESS) .toBase64(), ] ); // console.log(pool); // console.log(position); const msg = new initia.MsgExecute(); msg.module_address = AppConstant.TUCANAPOOLMODULEADDRESS; msg.module_name = "router"; msg.function_name = "open_position_with_liquidity_with_all"; msg.sender = this.address; msg.args = [ initia.bcs .address() .serialize(AppConstant.TUCANAINITIAUSDCLIQUIDITYADDRESS) .toBase64(), initia.bcs.u32().serialize(pool.tick_lower_index.bits).toBase64(), //tick lower initia.bcs.u32().serialize(pool.tick_upper_index.bits).toBase64(), //tick upper initia.bcs .u64() .serialize(0.01 * 1000000) .toBase64(), initia.bcs.u64().serialize(position[1]).toBase64(), initia.bcs.bool().serialize(true).toBase64(), ]; // console.log(msg); await this.initia .signAndBroadcast(msg) .then(() => { console.log( `Successfully Add 0.01 USDC LP to Tucana Liquidity POOL For Address ${this.address}` ); }) .catch((err) => { throw err; }); } catch (error) { console.log(error); this.exception.handlingError(error, "tucanaPoolAddLiquidity"); } } } export { Tucana };