@suiware/ai-tools
Version:
Pluggable tools for Vercel AI SDK which allow AI assistants to interact with Sui Network and perform various actions.
1 lines • 12.5 kB
Source Map (JSON)
{"version":3,"sources":["../src/services/SuinsService.ts","../src/core/config/coins.ts","../src/services/NaviService.ts"],"names":[],"mappings":";;;;;AAIO,IAAM,eAAN,MAAmB;AAAA,EAIxB,YAAY,SAAsB,EAAA;AAChC,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AAEjB,IAAK,IAAA,CAAA,WAAA,GAAc,IAAI,WAAY,CAAA;AAAA,MACjC,QAAQ,IAAK,CAAA,SAAA;AAAA,MACb,OAAA,EAAS,WAAW,aAAa;AAAA,KAClC,CAAA;AAAA;AACH,EAEa,iBAAiB,IAAsC,EAAA;AAAA,IAAA,OAAA,OAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAClE,MAAA,MAAM,UAAa,GAAA,MAAM,IAAK,CAAA,WAAA,CAAY,cAAc,IAAI,CAAA;AAC5D,MAAA,OAAA,CAAO,yCAAY,aAAiB,KAAA,IAAA;AAAA,KACtC,CAAA;AAAA;AAAA,EAEA,OAAc,iBAAiB,IAAuB,EAAA;AACpD,IAAA,OAAO,KAAK,QAAS,CAAA,MAAM,CAAK,IAAA,IAAA,CAAK,WAAW,GAAG,CAAA;AAAA;AAEvD;ACIO,IAAM,eAA8B,GAAA;AAAA,EACzC,IAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,EAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA;;;AC7Ca,IAAA,WAAA,GAAN,MAAM,YAAY,CAAA;AAAA,EAKvB,WAAc,GAAA;AACZ,IAAM,MAAA,UAAA,GAAa,WAAW,iBAAiB,CAAA;AAC/C,IAAA,IAAI,CAAC,UAAA,CAAW,iBAAkB,CAAA,UAAU,CAAG,EAAA;AAC7C,MAAM,MAAA,IAAI,MAAM,uCAAuC,CAAA;AAAA;AAGzD,IAAM,MAAA,UAAA,GAAa,WAAW,aAAa,CAAA;AAE3C,IAAK,IAAA,CAAA,UAAA,GAAa,IAAI,aAAc,CAAA;AAAA,MAClC,cAAA,EAAgB,CAAC,UAAU,CAAA;AAAA,MAC3B,WAAa,EAAA;AAAA,KACd,CAAA;AAED,IAAA,IAAA,CAAK,OAAU,GAAA,IAAA,CAAK,UAAW,CAAA,QAAA,CAAS,CAAC,CAAA;AAEzC,IAAK,IAAA,CAAA,SAAA,GAAY,IAAI,SAAU,CAAA;AAAA,MAC7B,GAAA,EAAK,eAAe,UAAU;AAAA,KAC/B,CAAA;AAAA;AACH,EAEO,YAAe,GAAA;AACpB,IAAA,OAAO,IAAK,CAAA,SAAA;AAAA;AACd,EAEO,UAAa,GAAA;AAClB,IAAA,OAAO,KAAK,OAAQ,CAAA,OAAA;AAAA;AACtB,EAEa,cAAiB,GAAA;AAAA,IAAA,OAAA,OAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC5B,MAAA,MAAM,WAAc,GAAA,MAAM,IAAK,CAAA,UAAA,CAAW,cAAe,EAAA;AAEzD,MAAA,OAAO,YAAY,CAAA,iBAAA,EAAoB,CAAA,GAAA,CAAI,CAAC,CAAO,MAAA;AAAA,QACjD,CAAC,aAAY,cAAe,CAAA,CAAA,CAAE,MAAM,CAAC,GAAG,WAAY,CAAA,CAAA,CAAE,OAAO;AAAA,OAC7D,CAAA,CAAA;AAAA,KACJ,CAAA;AAAA;AAAA,EAEa,IAAA,CACX,WACA,EAAA,WAAA,EACA,MACA,EAAA;AAAA,IAAA,OAAA,OAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACA,MAAI,IAAA,IAAA,CAAK,UAAW,CAAA,WAAA,KAAgB,SAAW,EAAA;AAC7C,QAAM,MAAA,IAAI,MAAM,2BAA2B,CAAA;AAAA;AAG7C,MAAM,MAAA,mBAAA,GACJ,YAAY,CAAA,wBAAA,CAAyB,WAAW,CAAA;AAClD,MAAM,MAAA,mBAAA,GACJ,YAAY,CAAA,wBAAA,CAAyB,WAAW,CAAA;AAElD,MAAM,MAAA,QAAA,GAAA,CACH,OAAO,MAAW,KAAA,QAAA,GAAW,WAAW,MAAM,CAAA,GAAI,MACnD,IAAA,KAAA,CAAA,EAAA,EAAM,mBAAqB,CAAA,OAAA,CAAA;AAE7B,MAAO,OAAA,MAAM,KAAK,OAAQ,CAAA,IAAA;AAAA,QACxB,mBAAqB,CAAA,OAAA;AAAA,QACrB,mBAAqB,CAAA,OAAA;AAAA,QACrB,QAAA;AAAA,QACA;AAAA,OACF;AAAA,KACF,CAAA;AAAA;AAAA,EAEa,QAAA,CACX,KACA,EAAA,OAAA,EACA,MACA,EAAA;AAAA,IAAA,OAAA,OAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AACA,MAAA,IAAI,eAAiC,GAAA,OAAA;AAErC,MAAI,IAAA,YAAA,CAAa,gBAAiB,CAAA,OAAO,CAAG,EAAA;AAC1C,QAAA,MAAM,YAAe,GAAA,IAAI,YAAa,CAAA,IAAA,CAAK,cAAc,CAAA;AACzD,QAAkB,eAAA,GAAA,MAAM,YAAa,CAAA,gBAAA,CAAiB,OAAO,CAAA;AAC7D,QAAA,IAAI,CAAC,eAAiB,EAAA;AACpB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAc,WAAA,EAAA,OAAO,CAAY,UAAA,CAAA,CAAA;AAAA;AACnD;AAGF,MAAI,IAAA,eAAA,IAAmB,IAAK,CAAA,UAAA,EAAc,EAAA;AACxC,QAAM,MAAA,IAAI,MAAM,yCAAyC,CAAA;AAAA;AAG3D,MAAM,MAAA,mBAAA,GAAsB,YAAY,CAAA,wBAAA,CAAyB,KAAK,CAAA;AAEtE,MAAM,MAAA,QAAA,GAAA,CACH,OAAO,MAAW,KAAA,QAAA,GAAW,WAAW,MAAM,CAAA,GAAI,MACnD,IAAA,KAAA,CAAA,EAAA,EAAM,mBAAqB,CAAA,OAAA,CAAA;AAE7B,MAAO,OAAA,MAAM,KAAK,OAAQ,CAAA,QAAA;AAAA,QACxB,mBAAqB,CAAA,OAAA;AAAA,QACrB,eAAA;AAAA,QACA;AAAA,OACF;AAAA,KACF,CAAA;AAAA;AAAA,EAEM,qBAAwB,GAAA;AAAA,IAAA,OAAA,OAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC5B,MAAA,MAAM,WAAc,GAAA,MAAM,IAAK,CAAA,SAAA,CAAU,cAAe,CAAA;AAAA,QACtD,KAAA,EAAO,KAAK,OAAQ,CAAA;AAAA,OACrB,CAAA;AAED,MAAA,MAAM,eAAuC,EAAC;AAE9C,MAAA,KAAA,MAAW,EAAE,QAAA,EAAU,YAAa,EAAA,IAAK,WAAa,EAAA;AACpD,QAAI,IAAA,UAAA,CAAW,YAAY,CAAA,IAAK,CAAG,EAAA;AACjC,UAAA;AAAA;AAGF,QAAM,MAAA,QAAA,GAAW,IAAK,CAAA,yBAAA,CAA0B,QAAQ,CAAA;AACxD,QAAA,IAAI,QAAU,EAAA;AACZ,UAAa,YAAA,CAAA,QAAA,CAAS,MAAM,CAAI,GAAA,aAAA;AAAA,YAC9B,YAAA;AAAA,YACA,QAAS,CAAA;AAAA,WACX;AACA,UAAA;AAAA;AAGF,QAAA,MAAM,YAAe,GAAA,MAAM,IAAK,CAAA,iBAAA,CAAkB,QAAQ,CAAA;AAC1D,QAAA,IAAI,YAAc,EAAA;AAChB,UAAa,YAAA,CAAA,YAAA,CAAa,MAAM,CAAI,GAAA,aAAA;AAAA,YAClC,YAAA;AAAA,YACA,YAAa,CAAA;AAAA,WACf;AACA,UAAA;AAAA;AAGF,QAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,OAAA,CAAQ,eAAe,QAAQ,CAAA;AAC1D,QAAA,YAAA,CAAa,QAAQ,CAAA,GAAI,aAAc,CAAA,YAAA,EAAc,OAAO,CAAA;AAAA;AAG9D,MAAO,OAAA,YAAA;AAAA,KACT,CAAA;AAAA;AAAA,EAEa,gBAAmB,GAAA;AAAA,IAAA,OAAA,OAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC9B,MAAA,OAAO,MAAM,IAAK,CAAA,UAAA,CAAW,QAAS,CAAA,CAAC,EAAE,gBAAiB,EAAA;AAAA,KAC5D,CAAA;AAAA;AAAA,EAEA,OAAc,iBAAgC,GAAA;AAC5C,IAAO,OAAA,eAAA;AAAA;AACT,EAEA,OAAc,gBAAgB,MAAgB,EAAA;AAC5C,IAAO,OAAA,IAAA,CAAK,mBAAoB,CAAA,IAAA;AAAA,MAC9B,CAAC,IACC,KAAA,IAAA,CAAK,cAAe,CAAA,IAAA,CAAK,MAAM,CAAE,CAAA,WAAA,EAAkB,KAAA,MAAA,CAAO,WAAY;AAAA,KAC1E;AAAA;AACF,EAEA,OAAc,yBAAyB,MAAgB,EAAA;AACrD,IAAO,OAAA,IAAA,CAAK,mBAAoB,CAAA,IAAA;AAAA,MAC9B,CAAC,IACC,KAAA,IAAA,CAAK,cAAe,CAAA,IAAA,CAAK,MAAM,CAAE,CAAA,WAAA,EAAkB,KAAA,MAAA,CAAO,WAAY;AAAA,KAC1E;AAAA;AACF,EAEA,OAAc,wBAAwB,MAAgB,EAAA;AACpD,IAAO,OAAA,IAAA,CAAK,mBAAoB,CAAA,IAAA;AAAA,MAC9B,CAAC,IACC,KAAA,IAAA,CAAK,cAAe,CAAA,IAAA,CAAK,MAAM,CAAE,CAAA,WAAA,EAAkB,KAAA,MAAA,CAAO,WAAY;AAAA,KAC1E;AAAA;AACF,EAEO,0BAA0B,OAAiB,EAAA;AAChD,IAAM,MAAA,SAAA,GAAY,aAAY,iBAAkB,EAAA;AAEhD,IAAA,OAAO,UAAU,IAAK,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,YAAY,OAAO,CAAA;AAAA;AACpD,EAEa,kBACX,QAC8B,EAAA;AAAA,IAAA,OAAA,OAAA,CAAA,IAAA,EAAA,IAAA,EAAA,aAAA;AAC9B,MAAA,OAAO,IAAK,CAAA,SAAA,CAAU,eAAgB,CAAA,EAAE,UAAoB,CAAA;AAAA,KAC9D,CAAA;AAAA;AAAA,EAEA,OAAe,eAAe,MAAgB,EAAA;AAC5C,IAAO,OAAA,MAAA,KAAW,UAAU,MAAS,GAAA,MAAA;AAAA;AAEzC","file":"chunk-OZX7KUX2.mjs","sourcesContent":["import { SuiClient } from '@mysten/sui/client'\nimport { SuinsClient } from '@mysten/suins'\nimport { getSetting } from '../core/utils/environment'\n\nexport class SuinsService {\n private suinsClient: SuinsClient\n private suiClient: SuiClient\n\n constructor(suiClient: SuiClient) {\n this.suiClient = suiClient\n\n this.suinsClient = new SuinsClient({\n client: this.suiClient,\n network: getSetting('SUI_NETWORK') as 'mainnet' | 'testnet',\n })\n }\n\n public async resolveSuinsName(name: string): Promise<string | null> {\n const nameRecord = await this.suinsClient.getNameRecord(name)\n return nameRecord?.targetAddress || null\n }\n\n public static isValidSuinsName(name: string): boolean {\n return name.endsWith('.sui') || name.startsWith('@')\n }\n}\n","import {\n AUSD,\n BLUE,\n BUCK,\n CETUS,\n CoinInfo,\n DEEP,\n ETH,\n FDUSD,\n haSui,\n LBTC,\n LorenzoBTC,\n NAVX,\n NS,\n nUSDC,\n stSUI,\n Sui,\n suiBTC,\n suiUSDT,\n USDT,\n USDY,\n vSui,\n WAL,\n WBTC,\n WETH,\n WSOL,\n wUSDC,\n} from 'navi-sdk'\n\nexport const SUPPORTED_COINS: CoinInfo[] = [\n NAVX,\n Sui,\n vSui,\n USDT,\n WETH,\n CETUS,\n haSui,\n WBTC,\n AUSD,\n wUSDC,\n nUSDC,\n ETH,\n USDY,\n NS,\n LorenzoBTC,\n DEEP,\n FDUSD,\n BLUE,\n BUCK,\n suiUSDT,\n stSUI,\n suiBTC,\n WSOL,\n LBTC,\n WAL,\n]\n","import { CoinMetadata, getFullnodeUrl, SuiClient } from '@mysten/sui/client'\nimport { AccountManager, NAVISDKClient } from 'navi-sdk'\nimport { CoinInfo } from 'navi-sdk/dist/types'\nimport { SUPPORTED_COINS } from '../core/config/coins'\nimport { getSetting } from '../core/utils/environment'\nimport { formatBalance } from '../core/utils/utils'\nimport { TSuiNetwork } from '../types/TSuiNetwork'\nimport { SuiService } from './SuiService'\nimport { SuinsService } from './SuinsService'\n\nexport class NaviService {\n private naviClient: NAVISDKClient\n private suiClient: SuiClient\n private account: AccountManager\n\n constructor() {\n const privateKey = getSetting('SUI_PRIVATE_KEY') as string\n if (!SuiService.isValidPrivateKey(privateKey)) {\n throw new Error('Invalid SUI_PRIVATE_KEY in the config')\n }\n\n const suiNetwork = getSetting('SUI_NETWORK') as TSuiNetwork\n\n this.naviClient = new NAVISDKClient({\n privateKeyList: [privateKey],\n networkType: suiNetwork,\n })\n\n this.account = this.naviClient.accounts[0]\n\n this.suiClient = new SuiClient({\n url: getFullnodeUrl(suiNetwork),\n })\n }\n\n public getSuiClient() {\n return this.suiClient\n }\n\n public getAddress() {\n return this.account.address\n }\n\n public async getAllBalances() {\n const allBalances = await this.naviClient.getAllBalances()\n\n return NaviService.getSupportedCoins().map((x) => ({\n [NaviService.naviUsdcToUsdc(x.symbol)]: allBalances[x.address],\n }))\n }\n\n public async swap(\n sourceToken: string,\n targetToken: string,\n amount: string | number\n ) {\n if (this.naviClient.networkType !== 'mainnet') {\n throw new Error('Only mainnet is supported')\n }\n\n const sourceTokenMetadata =\n NaviService.getSupportedCoinBySymbol(sourceToken)\n const targetTokenMetadata =\n NaviService.getSupportedCoinBySymbol(targetToken)\n\n const amountIn =\n (typeof amount === 'string' ? parseFloat(amount) : amount) *\n 10 ** sourceTokenMetadata!.decimal\n\n return await this.account.swap(\n sourceTokenMetadata!.address,\n targetTokenMetadata!.address,\n amountIn,\n 0\n )\n }\n\n public async transfer(\n token: string,\n address: string,\n amount: string | number\n ) {\n let resolvedAddress: string | null = address\n // If it's a Suins name, try to resolve it to a Sui address.\n if (SuinsService.isValidSuinsName(address)) {\n const suinsService = new SuinsService(this.getSuiClient())\n resolvedAddress = await suinsService.resolveSuinsName(address)\n if (!resolvedAddress) {\n throw new Error(`Suins name ${address} not found`)\n }\n }\n\n if (resolvedAddress == this.getAddress()) {\n throw new Error('You cannot transfer to your own address')\n }\n\n const sourceTokenMetadata = NaviService.getSupportedCoinBySymbol(token)\n\n const amountIn =\n (typeof amount === 'string' ? parseFloat(amount) : amount) *\n 10 ** sourceTokenMetadata!.decimal\n\n return await this.account.sendCoin(\n sourceTokenMetadata!.address,\n resolvedAddress,\n amountIn\n )\n }\n\n async getWalletNonZeroCoins() {\n const allBalances = await this.suiClient.getAllBalances({\n owner: this.account.address,\n })\n\n const coinBalances: Record<string, string> = {}\n\n for (const { coinType, totalBalance } of allBalances) {\n if (parseFloat(totalBalance) == 0) {\n continue\n }\n\n const coinInfo = this.getSupportedCoinByAddress(coinType)\n if (coinInfo) {\n coinBalances[coinInfo.symbol] = formatBalance(\n totalBalance,\n coinInfo.decimal\n )\n continue\n }\n\n const coinMetadata = await this.fetchCoinMetadata(coinType)\n if (coinMetadata) {\n coinBalances[coinMetadata.symbol] = formatBalance(\n totalBalance,\n coinMetadata.decimals\n )\n continue\n }\n\n const decimal = await this.account.getCoinDecimal(coinType)\n coinBalances[coinType] = formatBalance(totalBalance, decimal)\n }\n\n return coinBalances\n }\n\n public async getWalletBalance() {\n return await this.naviClient.accounts[0].getWalletBalance()\n }\n\n public static getSupportedCoins(): CoinInfo[] {\n return SUPPORTED_COINS\n }\n\n public static isSupportedCoin(symbol: string) {\n return this.getSupportedCoins().some(\n (coin) =>\n this.naviUsdcToUsdc(coin.symbol).toUpperCase() === symbol.toUpperCase()\n )\n }\n\n public static getSupportedCoinBySymbol(symbol: string) {\n return this.getSupportedCoins().find(\n (coin) =>\n this.naviUsdcToUsdc(coin.symbol).toUpperCase() === symbol.toUpperCase()\n )\n }\n\n public static getMissingSupportedCoin(symbol: string) {\n return this.getSupportedCoins().find(\n (coin) =>\n this.naviUsdcToUsdc(coin.symbol).toUpperCase() !== symbol.toUpperCase()\n )\n }\n\n public getSupportedCoinByAddress(address: string) {\n const naviCoins = NaviService.getSupportedCoins()\n\n return naviCoins.find((x) => x.address === address)\n }\n\n public async fetchCoinMetadata(\n coinType: string\n ): Promise<CoinMetadata | null> {\n return this.suiClient.getCoinMetadata({ coinType: coinType })\n }\n\n private static naviUsdcToUsdc(symbol: string) {\n return symbol === 'nUSDC' ? 'USDC' : symbol\n }\n}\n"]}