From edb40c00fe9687a8c279c93e094c420942852b24 Mon Sep 17 00:00:00 2001 From: adi-21 Date: Sun, 16 Feb 2025 00:57:06 +0530 Subject: [PATCH 1/2] token analysis added --- .gitignore | 4 ++ bun.lockb | Bin 0 -> 168028 bytes package.json | 24 +++++--- src/actions.ts | 147 ++++++++++++++++++++++++++++++++++++++++++++++- src/agentkit.ts | 1 + src/langchain.ts | 3 +- src/services.ts | 60 +++++++++++++++++++ src/test.ts | 56 ++++++++++++++++++ 8 files changed, 284 insertions(+), 11 deletions(-) create mode 100644 .gitignore create mode 100755 bun.lockb create mode 100644 src/test.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3960fa3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.env* +/node_modules +/dist +/docs diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..420d98e2785b742a944fd670c65ac70ca6ee4da6 GIT binary patch literal 168028 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 OMGw15c2Hmb)8Aio7tvM# literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 6204554..127975e 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,12 @@ { "name": "@0xgasless/agentkit", "description": "0xGasless Agentkit - Gasless transactions and account abstraction toolkit", - "repository": "https://github.com/0xgasless/agentkit", - "version": "0.0.3", - "author": { - "name": "Permissionless Puter", - "email": "puter@prmsnls.xyz", - "url": "https://bento.me/puter" + "repository": { + "type": "git", + "url": "git+https://github.com/0xgasless/agentkit.git" }, + "version": "0.0.3", + "author": "Permissionless Puter (https://bento.me/puter)", "license": "Apache-2.0", "main": "dist/index.js", "types": "dist/types/index.d.ts", @@ -16,10 +15,10 @@ ], "scripts": { "build": "tsc", + "test": "bun run src/test.ts", "lint": "biome lint --write .", "format": "biome format --write .", "check": "tsc --noEmit", - "test": "bunx jest --no-cache --testMatch='**/*_test.ts'", "test:dry-run": "bun install && bun ci && bun publish --dry-run", "test:e2e": "bunx jest --no-cache --testMatch=**/e2e.ts --coverageThreshold '{}'", "test:types": "tsd --files src/tests/types.test-d.ts", @@ -28,10 +27,13 @@ "docs:serve": "bunx serve ./docs", "dev": "bun link && concurrently \"tsc --watch\" \"tsc-alias -w\"", "build:types": "tsc --project ./tsconfig.json && tsc-alias -p ./tsconfig.json", - "deploy": "bun run format && bun run lint && bun run clean && bun run build:types && bun run docs" + "deploy": "bun run format && bun run lint && bun run clean && bun run build:types && bun run docs && npm publish --access public" }, "dependencies": { "@0xgasless/smart-account": "latest", + "@langchain/core": "^0.3.39", + "axios": "^1.7.9", + "dotenv": "^16.4.7", "merkletreejs": "^0.4.1", "viem": "2", "zod": "^3.23.8" @@ -53,5 +55,9 @@ "types": "./dist/types/index.d.ts", "default": "./dist/index.js" } - } + }, + "bugs": { + "url": "https://github.com/0xgasless/agentkit/issues" + }, + "homepage": "https://github.com/0xgasless/agentkit#readme" } diff --git a/src/actions.ts b/src/actions.ts index 179d589..7c78376 100644 --- a/src/actions.ts +++ b/src/actions.ts @@ -20,7 +20,7 @@ import { fetchTokenDetails, } from "./services"; import { TokenABI } from "./constants"; -import { AgentkitAction, ActionSchemaAny } from "./agentkit"; +import { AgentkitAction, ActionSchemaAny, Agentkit } from "./agentkit"; const GET_BALANCE_PROMPT = ` This tool will get the balance of the smart account associated with the wallet. @@ -406,6 +406,149 @@ export class GetTokenDetailsAction implements AgentkitAction { + try { + const address = await agentkit.getAddress(); + return `Smart Account Address: ${address}`; + } catch (error) { + return `Error getting smart account address: ${error}`; + } +} + +/** + * Get smart account address action. + */ +export class GetAddressAction implements AgentkitAction { + public name = "get_address"; + public description = GET_ADDRESS_PROMPT; + public argsSchema = GetAddressInput; + public func = async ( + wallet: ZeroXgaslessSmartAccount, + _args: z.infer, + ) => { + const address = await wallet.getAddress(); + return `Smart Account Address: ${address}`; + }; + public smartAccountRequired = true; +} + +const TOKEN_ANALYSIS_PROMPT = ` +This tool provides comprehensive token analysis using CoinMarketCap data. It can: +- Get latest cryptocurrency listings and market data +- Fetch detailed token information and quotes +- Show upcoming airdrops +- Display market pairs and trading information +- Get global market metrics + +Required Setup: +- Set CMC_API_KEY environment variable with your CoinMarketCap API key + +Input options: +- type: Type of analysis ('listings', 'quotes', 'info', 'airdrops', 'marketPairs', 'global') +- symbol: Token symbol (e.g., 'BTC', 'ETH') +- limit: Number of results (default: 10) + +Note: You must have a valid CoinMarketCap API key set in your environment variables as CMC_API_KEY. +`; + +export const TokenAnalysisInput = z + .object({ + type: z.enum(["listings", "quotes", "info", "airdrops", "marketPairs", "global"]), + symbol: z.string().optional(), + limit: z.number().optional().default(10), + }) + .strip() + .describe("Instructions for analyzing token data from CoinMarketCap"); + +interface CoinData { + name: string; + symbol: string; + quote: { + USD: { + price: number; + }; + }; +} + +/** + * Analyzes token data using CoinMarketCap API. + */ +export async function analyzeToken(args: z.infer): Promise { + try { + const api = axios.create({ + baseURL: "https://pro-api.coinmarketcap.com/v1", + headers: { + "X-CMC_PRO_API_KEY": process.env.CMC_API_KEY, + Accept: "application/json", + }, + }); + + switch (args.type) { + case "listings": { + const response = await api.get("/cryptocurrency/listings/latest", { + params: { limit: args.limit }, + }); + const listings = response.data.data.map( + (coin: CoinData) => `${coin.name} (${coin.symbol}): $${coin.quote.USD.price.toFixed(2)}`, + ); + return `Latest Cryptocurrency Listings:\n${listings.join("\n")}`; + } + + case "quotes": { + if (!args.symbol) throw new Error("Symbol is required for quotes"); + const response = await api.get("/cryptocurrency/quotes/latest", { + params: { symbol: args.symbol }, + }); + const quote = response.data.data[args.symbol].quote.USD; + return ` + ${args.symbol} Quote: + Price: $${quote.price.toFixed(2)} + 24h Change: ${quote.percent_change_24h.toFixed(2)}% + Market Cap: $${quote.market_cap.toFixed(0)} + Volume 24h: $${quote.volume_24h.toFixed(0)} + `; + } + + // Add other cases for different analysis types... + + default: + return `Unsupported analysis type: ${args.type}`; + } + } catch (error) { + if (error instanceof Error) { + return `Error analyzing token: ${error.message}`; + } + return "Unknown error occurred during token analysis"; + } +} + +/** + * Token analysis action. + */ +export class TokenAnalysisAction implements AgentkitAction { + public name = "analyze_token"; + public description = TOKEN_ANALYSIS_PROMPT; + public argsSchema = TokenAnalysisInput; + public func = analyzeToken; + public smartAccountRequired = true; +} + /** * Retrieves all AgentkitAction instances. * WARNING: All new AgentkitAction classes must be instantiated here to be discovered. @@ -419,6 +562,8 @@ export function getAllAgentkitActions(): AgentkitAction[] { new SwapAction(), new CreateWalletAction(), new GetTokenDetailsAction(), + new GetAddressAction(), + new TokenAnalysisAction(), ]; } diff --git a/src/agentkit.ts b/src/agentkit.ts index 40c301f..7111055 100644 --- a/src/agentkit.ts +++ b/src/agentkit.ts @@ -57,6 +57,7 @@ export interface SmartAgentOptions extends PublicAgentOptions { accountPath?: number; privateKey?: `0x${string}`; apiKey: string; + cmcApiKey?: string; } export class Agentkit { diff --git a/src/langchain.ts b/src/langchain.ts index b72bc79..84c7605 100644 --- a/src/langchain.ts +++ b/src/langchain.ts @@ -72,13 +72,14 @@ type ActionSchemaAny = z.ZodObject; * export 0xGASLESS_API_KEY="your-0xgasless-api-key" * export 0xGASLESS_CHAIN_ID="your-0xgasless-chain-id" * export 0xGASLESS_PRIVATE_KEY="your-0xgasless-private-key" + * export CMC_API_KEY = "your-coinmarketcap-api-key"; + * * * Optional: * export 0xGASLESS_MNEMONIC_PHRASE="your-0xgasless-mnemonic-phrase" * export 0xGASLESS_RPC_URL="your-0xgasless-rpc-url" * ``` */ - export class AgentkitTool extends StructuredTool { /** * Schema definition for the tool's input diff --git a/src/services.ts b/src/services.ts index 4a42579..167107e 100644 --- a/src/services.ts +++ b/src/services.ts @@ -7,6 +7,7 @@ import { import { TokenABI } from "./constants"; import { generatePrivateKey } from "viem/accounts"; import { getContract } from "viem"; +import { Agentkit } from "./agentkit"; /** * get token details @@ -77,3 +78,62 @@ export async function fetchTokenDetails(wallet: ZeroXgaslessSmartAccount, tokenA chainId: wallet.rpcProvider.chain?.id ?? 0, } as TokenDetails; } + +export async function getCMCData(type: string, symbol?: string, limit: number = 10) { + const cmcApiKey = process.env.NEXT_PUBLIC_CMC_API_KEY; + if (!cmcApiKey) { + throw new Error("CMC API key is required for token analysis"); + } + + const baseUrl = "https://pro-api.coinmarketcap.com/v1"; + let endpoint = ""; + + switch (type) { + case "listings": + endpoint = `/cryptocurrency/listings/latest?limit=${limit}`; + break; + case "quotes": + if (!symbol) throw new Error("Symbol is required for quotes"); + endpoint = `/cryptocurrency/quotes/latest?symbol=${symbol}`; + break; + case "info": + if (!symbol) throw new Error("Symbol is required for info"); + endpoint = `/cryptocurrency/info?symbol=${symbol}`; + break; + case "marketPairs": + if (!symbol) throw new Error("Symbol is required for market pairs"); + endpoint = `/cryptocurrency/market-pairs/latest?symbol=${symbol}&limit=${limit}`; + break; + case "global": + endpoint = "/global-metrics/quotes/latest"; + break; + default: + throw new Error("Invalid analysis type"); + } + + const response = await fetch(`${baseUrl}${endpoint}`, { + headers: { + "X-CMC_PRO_API_KEY": cmcApiKey, + Accept: "application/json", + }, + }); + + if (!response.ok) { + throw new Error(`CMC API error: ${response.statusText}`); + } + + const data = await response.json(); + return data; +} + +export async function getSmartAccountAddress(agentkit: Agentkit): Promise { + try { + const address = await agentkit.getAddress(); + if (!address) { + throw new Error("Could not get smart account address"); + } + return address; + } catch (error) { + throw new Error(`Failed to get smart account address: ${error}`); + } +} diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 0000000..6fff1e7 --- /dev/null +++ b/src/test.ts @@ -0,0 +1,56 @@ +import { Agentkit } from "./agentkit"; +import dotenv from "dotenv"; +import { getAllAgentkitActions } from "./actions"; +import { z } from "zod"; + +dotenv.config(); + +async function testActions() { + try { + console.log("Config:", { + hasPrivateKey: !!process.env.PRIVATE_KEY, + hasApiKey: !!process.env.API_KEY, + hasCmcApiKey: !!process.env.CMC_API_KEY, + }); + + // Initialize Agentkit + const agentkit = await Agentkit.configureWithWallet({ + privateKey: process.env.PRIVATE_KEY as `0x${string}`, + rpcUrl: process.env.RPC_URL as string, + apiKey: process.env.API_KEY as string, + chainID: Number(process.env.CHAIN_ID) || 8453, + cmcApiKey: process.env.CMC_API_KEY as string, + }); + + // Get all actions + const actions = getAllAgentkitActions(); + + // Test get_address + console.log("\nTesting get_address:"); + const addressResult = await agentkit.run(actions[5], actions[5].argsSchema.parse({})); + console.log(addressResult); + + // Test get_balance + console.log("\nTesting get_balance:"); + const balanceResult = await agentkit.run(actions[0], actions[0].argsSchema.parse({})); + console.log(balanceResult); + + // Test token_analysis + console.log("\nTesting token_analysis:"); + const analysisResult = await agentkit.run( + actions[6], + actions[6].argsSchema.parse({ + type: "listings", + limit: 5, + }), + ); + console.log(analysisResult); + } catch (error) { + console.error("Test failed:", error); + } +} + +// Run tests +testActions(); + +// "test": "bunx jest --no-cache --testMatch='**/*_test.ts'", From bc0c2507f49ca159a87352d75e9e6db781c565d2 Mon Sep 17 00:00:00 2001 From: adi-21 Date: Mon, 17 Feb 2025 18:37:37 +0530 Subject: [PATCH 2/2] added uniswapV3 swap functionality --- bun.lockb | Bin 168028 -> 248614 bytes package.json | 3 + src/actions.ts | 175 +++++++++++++++++++++++++----------------------- src/agentkit.ts | 4 ++ src/test.ts | 168 ++++++++++++++++++++++++++++++++++------------ src/uniswap.ts | 134 ++++++++++++++++++++++++++++++++++++ 6 files changed, 357 insertions(+), 127 deletions(-) create mode 100644 src/uniswap.ts diff --git a/bun.lockb b/bun.lockb index 420d98e2785b742a944fd670c65ac70ca6ee4da6..9c3f8fa26a7e6b73f36256886417efbbf4052e26 100755 GIT binary patch delta 82703 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 delta 34595 zcmeI5d3;UR_xJBT*CiJrh7b|N94bLVZU`}tHP51kNJ2s;iI6Cg8d@`TutSY)4V`q< zs8Uq*t4gbbR%0kSY1L4jRMF?X&Om;?+TZiMUeBLBFQ2>4`s{u7UVH7e_u1#(BYVrL z@~1YIUKZB)rCWo8P|x>Ys`Xllf=WxC-PU|@jkax$EY%!xY<50A ztfuSnjn2n&z0JRKIviCTj{G8|FY+cCL|(C^KYUsA)-H#m4AS%XxvJG>ktpQk%*4dx zak-8uB^(Y9dXiqjSvBuvx5MFw_7t)lat%^aRY`}VG%__gH8C_{tYaQ}dGryb%zSZK zxoPnelP70Uy6{tc9FB^}?Cj(OC`U$UX5!?`Tt^QIliE#9_(|D`*@+IT33>U~$siTZ zpf-`I*;$k0;*%0nDNyvR#MCK?nGQz}8sv|D4Jj4IC&i^qq@r9(7sHd{vO>qD#Ep;S zI%#_c93#G2#)mW{22%JzR(fwP@;LGw`8^>dLkFuuyMWs0QsD?H2|!NHG8*RSgS(_4 zg%krb6XOy>GbWC=^)406@_t70FaI+>Y9JFcGt)Ce6LT)$Cb|Bgq~~!muad)22RRcd zhGZk9;HG4d-u|Pq!x4mh1Z%{g-}#U(yMPo=WFy7JKafxK%*3qplqrdhsZ|}0TIi`r zDR(r|@>KfNG>7A5TGc>YWV^VcW$C!&w1m*?3`Zxcr5{$)TbF5&XWL`fQx~Je&fK_^ zl;o_*j@;^|T@&T<^l^@_Nf*1~GBYLa91}dFLes}iaE!3@-bk^loh47#G|RQ~ zSsjy?A5I3bw*gWLwmqJin2?w@+2L3kZ1N|O(%@N0$=}-QshzdWik?FX-v_UYEI`t9 z>B;!Xp~+e6t@QCJ>0`%Y_|tWz#|V`tIFS|)sApDCfE0afW?XzCBcXhKlOK$f7HvgJ zdTL_k_{4CBqZ|39>yxuWrEJIY24;RQy!2?*h7JdvpP!DD2EK_Dk2REZeR0|9c~?Ws z5|hWLrDrBO99b!GSxE$FT`s44^P4s{OQ?&K623tSUxbvJk0DDVk33+?jFfD~mc!Ap ziRpp>E8j_U!YSVeT`arV$S5!Gj?b?^i0^ubnd81aQuNB?7L&VEs5E^}Q?sJONYSSt z#Wkt9SWcc)i;quApO~BwmpLvgaSEN8^;!xnvj*AMjejviD@!tIua7c zW{;PaOY=DvwKY9B6Dgiaq#WtG+;$EJfu5fZFZD>omh^No=aDW}g$4Rz#la%oq^M zyj{(SiR$7~;t~=Yql+O`kd=|8k&^G;3F2xSv*HyioOzlr1rG?8Z*_p1D3BlRlOZ_X5;<#(@GFVy;HH%%1lu^47DIsD^ z9`y96VP<&)kz!7AT2f*r_vGZXaVg2;lO|8ijLXQ#b?EKfp1ggSByFk@Yv!$J$x^gc z%KQsmZ1~0E?fdG=5vEO>!%dswlS3&!-SNGZZ)}#_ogI!6BTXBpa$6Q=Cc3m?a%x5j z$@*h{74imCm(-CFnv$HFJlSz}lxa(1PGWo$KG6|1XM0k{E-niIVp5vVs09` zwDaN^(=YA0Nb*fhN{*LVFgc5okO|}ye~mzj4e4o#lUc{)Iatjk$A^wfi@*?ZMkM2< z67nqlDFyk%OFt$gn1S&rQVOy=tUtQsPmP<%swg?LJ-U?B3@Jl!);QDPI_Tn5f25Q< zhyh<(?jVUdG@IjwRbh(EcIcm?OG^`R%jCq&+(VY$GufSTaDwTH8#G&5 z*viV+$V#tf$qf_D^s?x_d1S0bXGlf6tqNX8mlkYAO3Phj^dMg*U0m(NI)CJqRI}?| zM;HFIr5{5|3zw#wE#6{X*Db>|xCK%?)(Dv=7j~IsR@4S56-8Jw!McgZQ;-}ti8pcm zF=9z#W>A(nW@3=CDhjdWUecuj8}VyZWH1#;xpH3!jZaB_B-=DNBQt$yY6k1oN>j{& zC#EDC_rBb?%<+`vI0`QXy@eD{*sBc6$i^v-b5qTNbDKv=k2!W*25t}611r_cyLZeQ z3uLm*BAeKgnjSwfbX=B$xy|T+5)Ye>`(v7E-&LgKONg7CNQ7pUm~J|>AF>jBN_v8E ztIy1tAl5o2XQd>MMK%F`4#$J}OoT?yklBd67iXI5&J{?R{2oSDL&hTmkPlk21yUSW z6Df}MnW>+zbXgCmkrVLYSC2I7Rpp@*T@J*@A8q(^rhY1Em+!EXhxOp90s68U!9I_< zmxr8;K6z4qsYZ@Z*8J|bU)x-7x*k%qU$faSC4ShrRo^$BnlL3h_x6Yy-PsHgX<73@e^iX!voj!j9SBd29NpiuN%wae$#hW4G#WgOU1R?@^Q=7Kl)~;ZMVv8nL20Ow_$y= zTb5pTu4qoFuOjqgwUYE^0U=RuytH>s@S_=ltJ@xE*KGMue%dtO*B8|B%bv95v|~!c zYDvT2pZn{LD}(m69`|gP-f+}}{S~8s9o=jB`+C3NsP5BCj(no+qRnaDuGEbsJ+F1{Q%yib>d@Bgr4=ICCN+~2K?Oe@%4w!)epss?=d>3ILm zP2RqE{@ADQto`DHhSR6~dFZ8%s|#}CO6xgwoB7=7=52My`29Mv-=bSthZ{HD8nf@) zxnpPOKJ^NGzW#An;J)BnA3e3Pp3`rYUw(&(k=wh>`D@4eKLh;J^o{jHeEPod(bP+y zS8J&ss=qPd>(l-JlYFVhs27u;JAS0nTUGA#?U;Z7J*Pp4UoGwYsQ#BPXAIwa*}eA6 zr4W5%gMPvL&QEE(u2r8;S2n5SUeK(~x~>~eKl^0WH?RK@Ja^}L$Fh;j8x}a1=&KvH zbMDc<;4@UO7Shg{tPkgNyS_T4op#Hq7lp()d+5~~wR0}ihx7TazM4;`{so_1^lFXU zIj8Hx`P`weZro1$&7~JLj&X+Q)gEZ)%+rVSNx}o|JXcCM9Gw{yPQ7*`uQNig)});? zNgvMVetmV5cAnBD?etAMqI^(VlevVEd6Paow4HXQq`oFJ#_eCq;pnQbYaH!K=FBWH zF5T;VK_4F0PWz^mUX&5zp6BCm^w!rkjP{)8tT`o>*2(0l#Jmt`lpELBs}1((MU!GY zOCcj59eUglujg$mOG%w99w!qgi$5_W%IoQbCT6+xO%HfIk6M~jigq7Ci_+IU5bY_! zq_b8 zW<>d*a6^?OTH)e05o2nRUQZu1F;Np=X={A-H63C+pFzq6MzghY<@BP-F`gmiOv9+I zqt~+xjVYAMr7=gWG@4DBC7HIR2Dg#c8Lc}SPKfYoi^}VPQ)0Al%ImRHVm!l{F(qdy zsok>?&20K6v?4Sy!YrjPw*<>AoxGm;Xi~e8<}Oju;pnN?pi}#B#$+rGYVP&CgeE0m zW4PDzGn&+eW7~SQ=9ToKoEYudN_t>!jK`0Ay4f0R^z=fLx(t80A4MCapKc!Q@#h9S z2A&RV<@KyW8(?VSxl&d1*l96ZzbblB^BB)6Ch+z~T3l9?vx*-0aE#Wlsvi3=NzC!A zPB4nj&~8@M1EXTJr~ti)v>5?rZ)^HF%y(tMMUgR{815V_1Zm*8re4o# zG%FzKgd#MnW9jCAK)Vy9(}$pmD`*lqm!QdYn$cbFpoJTnbmebo&ConXu*~OinQ2vOIvni`Z4;#rMw95qeo9|$X(jdA8D7t~Xst=Z#tzYL%OZkuNG+2m zWSV>3%g{RN>tfsZaMFS7mGyHiy;`MUea);GPoH4ZE|<}=C(x|Ur0#Ff+8CBd$kyg= zFMVW$iYFc|8m)%DX}ni^x3*q1JH}I{j>Ex|9%S5vs1hh`_0zMXwP)(+Yv#mwet>92 zYDL4Wx^>Ab$)0hXwS+HYH1S2W7&N+ldXx`}w9uv3ZtC?sRL``hguaOxXA_#FnFHV? zn)ui3y=pvyiRBEo2(LRHt+QUEQMBhJ&g2^A7~1y(n$;)xwq}DnQAEWkrbDG0*P^x2 zYeYnACmQH$9*yxd=25SUS@%e<=V3JQnmIunMl<_%QxC7(FNEIINA`%;`iAI5kHvUq zL71H_BWov`1S<{1#eblQd8Uga8ky$Njg0B>XcD?+N3BL1V&)tjCEu9zK`~-nTh>@# z(<8=n6H;=R`3F2;HqOUr_%bwc4`CD(HcINW)iG z(E6cqCwRcCwF}i_7sPnxhnjAnd&0fid!hQ8F)><+Fn!H}7;SWzUbG;_y*Z4i(N8yy z*3O3Mu?u6g@TU5jg)yEbO-+Ls0nF&1potrpH@KJhGDJHYcF<>9|7LpZq8QH{NXg>S zF;07{nI70F##4g(mpGFNo@i-iA^pWY&9*xMTI)3)k9M!%Y?xjn zH`@IpXYGaaG{IHk@iO|kNnUpXn!&r@;EW*Ts$V(lXynacvXa{IGeP!b2R(L0jHhl# z^H$`Pj`w7vnK8;rK-=3<4_q1JsY$!d0VsFBgiiXJl`-0ro%EuWG47f~M6B4P<#g6# zSH-vk7{;RvBd2iIRVvnYchLh?jJr354AMuojP^XsnHeYazjnT>zDC7p^}Fdsh$-Fl zz=9aho^ED9x@E@k{EkNNVY+Cc^r9GK#$Hx;J#cl5`*+A8`p8w$?%q8}(`&4b){gej zi%4oslcwsYS4X>F<}6*#Ji!k-9BJe$rEluzbuU4C#Nf;KayaJP;dQilga3`Qv3K}k zy}4RHy)xSUE@v4=Ws!aK*tIe4rjjB{o2xqf)}HF2AN}lseddpDw??7SP^?JqscvosbqxL z-JGG;Mn4@E?MdZK#+EUGxp$xq(QCBD%|q_2bhyE0q7jbdBH}%-Sem&A_!CWLAfl7d z>pWC1dNRiI)KGICW8uYg{v{gmM&;+Qx$ZD?cBKbu1{A)>my%p<9tXj+RWk(-Rf9wv7e$f zlRKol+(_~9$gpU4PtID%1Bmw6NIh_CjOT3#%Wyn!4K0$2N*L2($S89WU>N8giPl>` z{YD!fP9&2t2Y4=`#h@9z=4mwAoF9xK=iZFg$C!_P=8SnkhTHropD|_^n&FU*W)5VD zq8HGlIG!9Dd)+tCx*7%ajx!4|C-`U3!j0nSMfXY3j9k79uQu>RBz@fjO~S!=xbVzI z6SKJ~a6fwkO=>moL_eY3?TQ}p=DpjD5rx*4oMtzDigtH6Oiy4sC5@Im7v)UQ16#&; z0u#-fys_H!WS}vIW!Ax>x6q_k^KSkdnsh7SfbUz6Goz23JY6k8YflgMV_rk+PDUQgSkjiAV8*D~v>|BHapppB1zPl-%0EQwa!0GogeIjh%vyNe522ZB z&TX7YcbRc@9__B%A4n-)-Z(VV{BucBJ}5nn;>3#;Qtf$NX1bwhQl#nc$IBGNByECbJdZiclt&HN6?iMtw>*>N@ z(C$_~Xp(Iv_fgLpG%=G|4DC}i(|2)6QO-;~wveaaO!GcZpz-`U3(fLPhU5s`8RMCl zWv*dZMi206yR!5(kUo>mb}*WndfkK39+Z`cyO1+(Ff8=TW!oO&xx~{QO(MaJ_4R0X zO+Jk#5gg&EE4j zZW}M6$)(I~43Hnt#1rPjK)oC@pjmD6jmMxIz39yt&oW5yKYdD+pFwMiMsKw6YQDMp zn%z96=9Xqlwi-G&$c#6DRTz6zA0{PM5WgCw{uwJzPH4 ztGxo*C&qIDQU)xyAKD%;!}J8#q4h+Q7&oS3ZQ%?(a9@mebcPeqR!d*|nNOZv;X(9;VT_hC5g3xOY8=I-c!Ggu93rJ)qTD!&OEG{5H#|f%8^`^m zl$V!praMH+g^yTrmL+E+`-!ECl&gNs3utTltV0 z-PF6NYMxYc0h9;719A6FApC70#s3B55GlHRNcANR#guYdiVu-Kmh_0iAyQ6DTe`>^ z=nb88lT_5mN)TBYy)DuY+1rvMt@QgzNg8FP-%m>UW2|(MGG&an^zlwT_Px@^ygCs| z+MZ!0iIht-Exovu4$ZcBk&ezf(vnYGa*HLmS@Ky+K5xnG zNNL$CNd7rq&_#knO|G^ic1ORA1wYp(hSlctqdaN^b#LZ;1!E6E@k%p)5>=fDSna6lGP~} zSyC!4W$7X%-N%x~e2VVTI++Qjt%Nex1;wR!zz<$pT*=B;*~%x8?DQBN<9q(v6h7rI7q{l;%S!EGLR3 zC7J`#W$LVrl>BwA^x{&|8(aMSq$K5q@+l|Htc>@QVqkO9#gLXr(IYMCwPX}h4v~`H z%F;zjmvprBdt{!GAQyD9F6?Y&EG{Lzi^Yo+y(>~$-W@3}?PsO`ze)PvzJN016&nNg zxmX@33WrFkFbGJ6^?)4rlVV_fAo&{tIYf$$|Kq761ftku2b%Ht@!#^_rw;MSaO>{; z?^A~(A9qNYJz~jOmYj{0L*&0t9pZ_9pE|?~##4#RTVETRA^&~qz!(2MbvPXVK6RK2 z!uvdJ7^4OL-=_{dQT*vcZa)7$b>M`5pE~}1>aZUo{_kW7dFpsI_WMeu)!aVL2lbsl z`>NBNXtf-wabM>UJ?R%;wYV=tZHFonBH&kF)wUl*U58rG58@ESB_ZlNRO|i_IluX; zb^Re4I@AwBg#7NSdJlkT`)pH=kyz9Oyw5;<%XQ;|8>l~^_{o$*! zOQSbcABlbey`?XDbM=TXdch4}^};|3h;XPIQb6}VebvZ85G@_**+CH3Ar5*Vybh%e zhS+w~S0xUHXys6^2r=xIuks%P5$#Z8hd}t;<`N;=I#k7>5IZ5VheEV-sJDek`pZ|< z9|qCEp)!X#hpY^6`l{nXbaJRV!yyhq%pDHV#i2fiP&rPRbtPcB;n7%_5DjK=EKCnv zD$EIC+KzyE5TA~KndgGJBusCd`VdT12`T3xn7(*bmubku@stVlbn@2i( zIUVZSNQfRKon_VFQO;ia8@Gq5>m^BkVH5=n#b=`^U|T7eqy8|%9csX6m|;FJJ4VBd zz-wb*d^|9TV_-(&Heq%O;~xhz8o$NCB$b9aC`=rV8w(Rq1}1wfOgx?w=8!P;<6#nU zT|7)qS(xL(jK_BgFd@D$a}!{aah@YY^wp$wi?80HNP6fu$mB;Ahah4X}QLymSmYkmUU_py`pvs zal8y!HW1^J$dVK+jF&8%RP89T1k{#NxJG-5uFE9LAz{{K!fdANgvqG`(>n`hD|1N} zOh{drTQJUNR0ltbIU&U0$z*wso|{aTdG(~2@??2IeP5m|QS~7<`$4>@ev)f02r*K6 z>1E}VUMgq+;m)RzSLy6*3hCYuW`{64={2NpGUKQ7v%99>|sGm!g{d8O|Spu5C92e#Q9XAc; zkT7$n!5pOHgvkkY`szpjdQkfh6V1aAAz@@${4nLdr&d>|+!JBWa_V+!kLUzp3Yx?8o(b~_oiG!odpOK3VU9DS z=fPYT=7l_%&zWw7*%kpaG9Ts(=IDHwVJ%>MAAvdPP_d7|__T!CBg|>W!Yr7b!lcfE z`O=|w36m5FQ)4#FIft4s8z#UD(3QM6LX=UB9*3CM1!D2z5WeaQA)>l+ z)^<5Wc{P7I#04QP2~k0{(jf}EL9ElUtddi;E{|p1yTkknbo5HAFgrK(fS z(#W!{2aLN0Of{z(Py=RIPnaDr&gyElT;wA*+*$!qL-kk*u~Uc_RzlQLe+ZG(3u5Fd z3aRZ>6-$dxdP^ZN&brE}$Z|-CL= zHKjh_RBx}Q)Or12>aT$bb*juYFj4(sj#q(c>Qr^A!dx&I$37CQbfOoUT? zEKK)-FfG@@w8RZ-VXh1FjWAxP3SS4aZ4k`Lbug`*>bx++2E%k&4-@TF%h$vB41xJo zn6^&UaRbawVK#4oY3Eeegh?6-Gk7CR2d8>+BTT?B822WaPELKmO@@;YBZcVVRL^cA zOU`f@-zQHX4`a9KOVG2gVgl>Tu=v33Tz;qu4b6S|ePStoT%ynTFZ-p63&PSTKa0O|638*~d2)=$U(b^xBoW5<1(;;~^#aTZ zVfF|!(Wx{an0e!1{I|oTI@Q?iFj3=S4hoY_*uDsJL740pVI~oB!W1OI)PD&ki;#N> zrh78XabdCvu$N)33p4j+n5hJqFxw`;w0s37mjHVOX4piSZ-jZ60DBe2Ck1BZt1vSN zFkyBI)8#doJOb=Bn50yg(^X*}p(g@h0@7f9l{~Wvxg9Wv3`VBsxiHmXa?;7Oc?Zm6 z1fk>!$$%OBI?Q~6@O79I!ng}z7Sey^VCGGNxl|5jF*89SOjIV!4#~3=AMS*?AWY&; zn8%&!6=4dpVEo^J(edgVFx@A^9290HUfl(AU6|}$Fw6yGYr$;GhB+$CYU1)um|;_3 z_B4Wd0zV7mGZp6en=tF}^KO=$>xoa18}PEojre2_auYrl`6RI^@+mz07V>Fl;exlE zyEJ`S!xC!D+fE<%alRMzRr?P)mm1vK&*1iz=KFKC|A4cq!CgH7H>wQz3dzR^m5UdB z4q3#HoSs>ogsVeru^2)Aj?Z#L(RIxs%nN+BuYm6?|FRLmb#?C_dW7G&C~7q zkMh!(T2j961nZA+jPJmYb9bt(!r#y^{`WWksXR>nAGZ|f?OJ%|ob#}zk7*cU*!KL_ zP9IO#LFRws<~6{kO{FmbF2!e#QToz2>c*bcNWZ)7J!_a;+y0X%#hYjUH~2-_{C9e> z=Vzm;luNYk(;Txjqjmgc18i~_oaB30<-hOr(J$~nrp7cZD;K$q|EjLeopU~CntK`d zzQa3RMms+#Ty({m*ssiqjp7yjLTo%z+Eqyn9jCR*dmK`D`3qHYh%VI%eiDL1xAI7q zkp{!h&lbmHy<@b+t+Y7#m6upB4teK;f5uPGRpf+2SsXvs<~jOVq`VX&r}B0EA<4zD z+T!FV$@vDun_w1)w;hWt?g@({R2^{^w-!zsA-@ONzXZ$sCH#}WkKpJaiSpCh28%3* z`kth6Y_vFe7bL>+%qEMIw}Kv*OdRrpid-VUp(X$^;3)_xyCV32b18STm9G-#$K(PI zd6~u8lN0$dU4CMg%C=e=AJ7-b@5tSN{H`oNR!iqcgEpWohym?Dd(Z*MTUpn^AK(VK0KNx5 zfQ#Tqa0y%nSH!7TIg#j*x5hpLpMw+N3s3}xgIMqokcb)uB#NRyE6^H5gEoLsEid@W z`_GQ{pabXxnt|pZ9LUefVSp)xzMxaZ`QmKxt@u)WCm|UC%F;W&pd2UogUr-+S$xAMkfIpC!uL=S{H4q4@gPNcg z2nMx5Jy0KLpagIOc?s?oXhsDtDwcQA`hdPbhE0Dk01O0!z+f;0!6^zk z4bFfs!C7z)dQJERp^n z!$}+%1|-CLfo`BX=mNTe2+#tw1dTu)uoGk71Y0>D0%YJGK^_J2vP2NrhbP_v?}9_% z2>1ki3XX#j@`6hPPCnqGO~@y~R`5J{5xfFk1qEOoSPv$GRFDa#f*ddni~}t(s5OWN zZGgOG^&7YWT9e)ev;{JwbOfE`jmFNP3)oAh{{Wd;{Ltma#F9W>Y?Sv)WOiu*7Qm&z zrGhk&jy@AeEaihoKn@rOMge&baR>R{0AGWBU^{pbPUgXLf*hzA2e58wrnU^kTwMar8ub->r?-+*ty1@Jw%LF4`eNz(txWS#)zU7;_* zIq((u4qOD4z-=y)caGi!yTLT_KMdrBr`bT>xO$#EZ9xoZ2ik)Upd;u6I)g5tE9eHg zgC6oWVNXsT1o8%(ywxVJb@clnQYya_gd>C|t$p*!Hp2h0FDAREYQWS^1#Igt0}YJ0uOQi7;-GA z4L$}l;0`0#fYl%Yj05t5RDTMR+n3y#bhvad3CK&29|3t8Y6bcuVB0eg92Z_Uq>9Ma zYJ>_QH(|LsuK~-zt8hz^uOPPondd3T(MrwD)(Z1v`nO|FriBO)0vdw4AQ;pFlpucy z&5(7FwLyJQ4>SPbpb2OU?CWHTk!%0rcmOH43b8Q^ShtcqV?NppAq|@j#KR+j%wy3& z20>fU2FUy*^I1C(13H6_paWgT{FtG0TaJzW$&e zuzOE#m|{dM7y%vv(i<5-JSE0S56RRa15XAZBhl#1vB*(CJRoI{24cV%5C;;0^n5(^ z8-njD#JJ3T za?N_M2|Nv+0?&iz#3t$UXTdXIE7%6aN-^qX@Dh*~YzLC(1@I!sw;f<~On^l=a=foLDEqPxT=(@5NhvJ<=pBts!`2atJYD3BJs1$F~*`!4VXc+--5 zkb8kF7bLHANj=WR7;(FJMaq{loN&otEZ8WCa&M6}g{&{yg9C7~=9r4CiR=Je;B9o7 zm2V+Kk^7NitmKz8skjNev^X0`<u3`0zZO_;CmnyUjUuKC*U+V35vkS;3M#%I7h5H0^SGjfkQz0 z?_F>hd;q!tyCC~wxlZyQv(khYPGFy(;QToF6nqXo17BED_>ZJ>{=XNwptL$qeKqdHOfh}F=Mv7}?D3%B1Kv^J-EQw4-4h3a6 zFD0+L$Pn|O$SSQg5SL2@(uZ=fFQ^Rsfan!~tn@2_Ko9_AwJ+&afII;RFDrjR4G;uE zfXpW^0J|YOrT=A2)+bShNHCDr$YX-=l2K$GWNjd`oOndWc0N+PAn9^#1JDpO0*!%O zE3Pg+x|+d-S!qp?ZDg$}i`>>g7QJGrR2BikL37XoL|HNt=>@HTtkT2)nKNXiCKHm~ zT~fJioERVzlX$Usx=c!Wb|$;^QkbmbWHsjkvb^gC?1@Jz>H?%&I)jct`dcO<8IGN- zw0pa-5ovNwR}jj%=sl$Wr7$T#td{`lg)WwfrF}V%M2eAi^a|e}zIY2a!imvhWbszY zLz(1@1H~IU3SAaw2c-Wcf~BR>@3F|?U>J}`yyC643$qInw+dp1kam8#(@7bUUxuO7 zA>A$p>=Sp1^$(-SqCgfP;vQ+W7-U~C9o@9p^o-=431)z~U^Y0%lq@P{;?>IHG(t<(;q9FB~&pi*l-O7ibU21DbivQq>n~y<1*E^QA#A z>=}J&MwbnnHD~j%sIca+vTTu*$hY?foh)^O9~GO2d5sj0TDOp275!D=LcY{rr5;{| zwo#=n;&(WY+O)_>dlM1#-=&Xg9u^taOiEW*7ij@OMc68}Y@L58u|Zr&H_h2HteH{E zcTQDru@)Zm_jXXmzQtOAv$a~d_`a3RwAykv;}?syF4{$x3SOcGJCjt0CD=MejaY)^ zYt&M->h?|rOLqBwx8|vh6*MO%Hy4xnb+bV8S0|QeHLK4nX?(+(-*;-`4J|)<@wSnx zSy&XSb5&uf77=7`WKcP0X7zd-&#u*+7}HFOsqLfk-_ioKNFU|*9v-ka2C)Cwspgb< zS&p7Q>H~6y*?S5&2Xy_aPQCK;tjd~)JM3KyqGp|Kv1DDxs+x1OkE*;^o2O0jQS0|= zy|f-4_2XV@vG+mP_T|st{j~FHbIOPa3m1EeoGN%9IqV%0&i-0&Z?%VyjJIkbM@$(t zXrC6Y^(dp}?bFso+Iu7v4F7Zcg@tKdZF{(*_?W+V^lAF`lhqC%s7y)=(|NgN)%LaY zW(PW3`g`o8dTra6DIY}+tdI_0=BsY5#V@_fshIuPWB;l526NlB{Cdfw-SJ?{uohtv zj8;FDxgUF4`>Bj`T4l9szg9EI-c6v}^h%q?jykv1sM>INA3ycWeyta8;dFRgtEN?~ zpdNag@|#vLzDUjgbKt0IUz}NR#;}Co<0f1|Eh7gP?BA|cE@i~)!3ye~x3%y{d%K0` z1y7y|ul>h<W)S+i-v6Bg+PTY*g7itOZXKm08x{%qOl^ zdhWof)xM-)ia0adU)_`{AMt0|Mvm4m_8R$J?+%l#9GH8-Up0G&Du4G^Gm-z0)5;NP zZ}4FM&0W(D@s7O(g#A}}Ns(apGGA3yN8X{UUJh7wkV-zRX2!>m{_ppR^Ly<-WR&5K zIi37e)CTPVHTt0ZHf=h-c@!xOf@547Y43|Mc<7P-i9gOH97cJ~wl=74{4SDj|M^$3 zs~NE!;Rvs;YQD?0_SO$6B@TS{<@ViaUPyIb#$xe!SXYd*-Wt~QcGYg$3=dY3kiuBt9eZTIP~7N(_t-(PiuRGa@W zT)z%d3;sh{wE8WP9emU^WRSgSMgOn*=XLh%ynz)~nX`gb`$O2dG}!dQxHAXlzw*kn z;pC85z_llX)#O8zwZ67`>m2qzS6j8eiQHLRof6)fh_pU+RFh-y1$9*C_q6;VdpnBe z?VhebeRhRFqr~vAR@{N=sZ!5FNPCkD`_C^MWkg5}+uL2V{dwQZhy7Y6k;45)QU=#o$JT2B zmABUC0f+h7&`iRQcB!_CUUJKTiH&A`Zp|&5^0we8xFOHV&{b}ruD~&X#^l?jO z*#B;T*e@yR4b|<#IOENRD&T$0y&9r=y^ovijVb=fnf=pO_19N3jH0**$IV9klu1|F zds^6k`I#INFccclSbZR6)orYfm2~;L>6@mFRnQSArpJCqsP0%})qXp&sIkh}s0H-2 zH`sVSz4>b?m*dw{nANNH78|k7wI{p&zCk7v>&|I!wsGfAQX5mf8uOP{E!en`*}HGp zf1{d9nKUF+jDhD*t_Vka9>`>(jv1xx{`86uecKqf$k97Ytrwe9o2rkG5VKR7s^Ftq zK=>S1L8ZCk==b|N?%nX%14hHcWdgK!=Vly;b+|U4zOO(H_TRy#2I(&hFQ})MeXse~BEx+Hs+mlemZ93L zaFuqH;_U4d=Cu2?de38rSbNxme{;BM_7QiMV@I``+V*gDmG)`7!&T`IXm^9^D&_;C z-`N#%UcR zRJjk);g9`@>=mJ!xm^L3v$)NP_t!sJamtH(lB-m94vSD}9}?MLMW|(RMUxh)*EdA? z+aGEzwC`G|jhBc{dzTT_viI3TQNFA?Mm3jNGRk2M?jU<#k{K1-guh;x@(DStfbwst z#xVRN?Hx;Qt@GwJ8Q7F=v^(D3+oWJi<4eDPJMQA$l-ZGLyG$Kby=vc9jQaSJ7O2i1 z)B0$pCj(@-mpxAo3GhuwyTO*_+7n*YUedRC)sc^AiM>InDk96)}PI+ zaYlD|)!AF*wD&Sd4!OP5FKLW%do*)?>Q#L{CdXNBMB>aZhrb+q=7kea+%4;pcjbCl zfOf;H){^ng%vdT)9g_>~{ThxuUc&QvtFtriUU)v7KL^Q`^`cbGPq;E7O0EAH**Qw> z`xQAjO5xjp$nmTQx##6SHm_vz&N=6o-YwyNJ#79Zeak4TX!YYKxY1nd1l)1w=iw^j zQ|htZXuB`5m3m9~d*^z~-XMEN5r4mz-<-BItpIyiNyrGwZ>8EFFV=!(tI>og?_QoiB!@Rh` zm-}2dazx3HENHF#KBIJdE0q9p zqvTq9dzQ=nhAz2KA!VSMLq>d;XqMYFZCLE=Av>Kr2v{tOk|pH0X!ShT1}Sn#cr+iY85)@zjBu8j)&oNMi! zXWmHtxo*dTH#(b^iS70tHG3AUt~veqE?FpZZ<7>yw%Hj?{xGz?pN(VOTkl+2Ht7_3 zShGl9u^4?x%FpLs?1%LiCp`S9r*-58qm=MShP%DVPK)V_3$9InMHaX8NF?PqXsd2> zZBUoC=E|qr`IIh=_ZOOeC5P8Bu&r9pB2*jGR`oi8OmD09ozyCqlyZr$e7GQcHzDsv z?~+l8*OpPf^?0+0@_%9qIC4U3qOEVMZk*6st6i(Lz#x0aq52263~X3^LJ8BRmMkc& zWv^znE9mdrb+2ufJ?e)qm<6rNH9M1)sM+#f-rGTKKTQMsbWooau@w2K1K)Sz&M`gW z%hZ`axCjGTh={{|I+{cCj|zzsZ?`zQ+Gs9MHZ2^UPAcXkUGaB0n%&tiDfg!xCr-B8 zJ(Fvjh4Jjwf}NJsBCfUUt5U-2FkKxGr13qmEbK>paW$;Z#=!ai?J6rwO7Mf1(Iu5j ziX*M-<@q5n$lf36>N_(s)_#6Orh4wVvVJ<%SuH!I1?1UVFTER7>Grzs%Lka%NR-%{ zGhKWxar63*H@tq=0DJePh~@Fq_OIK>oOr8?IlbEZGhK|1i+eA;kB4hm_JnyO9F6%B zUnbzffP<%w9lQNCDRSR-H*dw;X{yO-ZmRMGL|;_4-(X8G_^|xUdA*dMb5mEf=rlJz ztG9ys&`UC<{iI`v0c)`SPFh|G%bR{s;Sl>>ijO zz5lV(hSQBnuvm-!H;eDBp}4LFoznvE+)M7gN0@rAJGbh4?=8ReTiK6Wp8fd1Xj{S^ zJILO}>d3?|pW7X|QXWmLMcJzU>h1F^a_(IN(3<<+ysX>qotx^u0qX2m_}`jRw2ua; zMRL<+yoPg~P^O(_E?4D}Etp%a>fKadW{3*@lce@CoX-y3}50{1U6)x=e}o`sc4$weJGDy_~bV+|rxb+kCz6^L>M!eGVVF zTcW)Yn7um;DLnS8_G`5WmHxd}OEZ`Dcb7VL6_zRLx9^$jN{lq0Jzm-J=HT>xrDVBC zPfCZ+9I2Z8fSYZL?5MX_YWJ*j)Y%`nlUSLn**l2YyVMxP${j(4Ueu~b+8cm<)~D;% zi%ZY7xZA3P(WX5iKb^UfRrP8iDOLccjaD-+61?_CX>SckKA_$HMDC!n5NB=j555|$ zj&N;|y@A>0RqKCr2aoAs)N9L0AKw>;Ay^lpD8s;zt}VSN!&Cqb3HLI~PR^JWREJ$jJ6iQ3JvjvF2Ss=9(J%x{Mr z_bl3j{=UWi6VyvAYBa`d7&7QSQ-{^P2?@&YDmkq=D)8@@`6^8(aP2MN?5&Rs>mubQ zZPg`H$@7#LWbemVzEjte<=bA0A}33_2=4mk%wbr^j1r(K{=_VAUT%D|z!$FpY8qsa zy@6cL!pVCo{di+BWmp5-ZlP&+l@j3&vzPtdm|{)9LFPVl>`NGM?AygFi+Ih!2ni-L z>#{}3p}v(&_IR{2*~8lW8ii-C1ar;s-yLms+qfWmbGqxB z_xwIBymMb^jQQYal^x_tHoqU*`S|oNJ8qmRV@!gDS>fJV?Rm|5sMN|PtKGlQ1nXJM zzBAdeWlww6l2r_kdqMWTc;&xZ*`Q9dp>pT8#!9PXb@>Jb^-NY{en;LDbCG`^bN_4e z?)cYsoi*fw?A`pHI({hR=T|j;|KRL9A(*NJemZzP%m z)m0WYYL&2d1MEudXM3v)Bki3Cx21pf=0}r!gC%Orn6URM{Pg&f&o7E*pD*b|<6B~) zqR$`2?wj{E*{;jJEB^oZYT{U`+9-i@Z|KP`wmZ-!tU3rRgg6rk1Y-XQ)&1-Lu_Gd=KWw zmpJyCGpGw+pUHQKNi9cjY1-t{N=j~NKJ)(FqOnnidY%&g;R_>sOxrfu5n(T6?ZMn4 zLp}5awsgx-({Cd!f2r-a2`k3f;oB@D?5?)E#p(vt^Dk|d7BNYE@Ymhe1=*WW)}Q;I z&3l7Ce2dmtw~2cr$XZ)lasChAX;~AJWqVMUN#>3Iz!RT+^ynKeJWCB$G~0c4Z=6`) z=NQB0PB+-**eB(uV9#hd2ZduYCiJ*_ci(T$limq?D8&yD$F^-_p|mlkuh1SoQrGiT{~+$ z-ZL$JqdxU+jzqp1DN7(#sq}5Hka^wZcRKkZ^lrUDf1kr#um=R$dw%wB7*==3ni19R zw$l1y%X-qRVm^h-7jHph_*$hr^>*w#xNq;px^%ghr+tQ>?HO$ETEcbrsp#IXfFH?L zH^qb2H=*`d!gs!;v^w&Be)L%wuIl)>)@WC!skeNH0egqj(qWbJy7w43owBT- z{p~$apSszh!#nfKr^{4m{5s{}=a#Y_S3ppS>E@SURc_bmviHSLmKePiE-UGN(^Y$q zE8Jers!R_)Glxax))GfPGtHlmzxg9#;@5RuS_xi{XeAGi4tuB5=ZmVe-2YpjkM5?l zn5j-lwf5eq?LwdNnNU>o%H16CGnHRy8fEXMy65@s?Sh6zZMd7m-fwl+n#6!^D<&Mc zoATmJHHvG?%#;5P#L>N+CjT|A9j_|Lq4t$_HOrG1OJrQkiE4SonN#j|Vpc|6W>%u( zNXM96e|8(OZ{Z;GE5$<#Ub%UoU;iynpv#2()#O>pehEEJZbp}k3jYHFkAYl^c<*T}zi+ z{n6OhY7V^h5NFSc+D(UhV*NT(Xs0`O8bt2f+M*WrH zdOidUXwM$5wOm#_9SL;>HT)(K*GhNkH z{pqe2YHgTnmwIlxt88K7bk{8{!ssRGp^QZSS87T!wPt3guz_`Yd{#>O_|UA})UoL) zS*9hSQT(|b`lylXNtK)L>S?+@{z2Ci!!?D6^IhGXRpZlB zQ{!k*W?Fh?YFrAPkKq(kVV3J@wI|C}RviqbQ+LdArK%TuxGGnSkhhG&CXb(nx5g%? z#bxHIxKNyWE7Y|?wQuDrp)U4t`Kbv_>Fh&IT~UQ~X1nHTCDPIp5(}T2>+;dmzDHdp z)qxJKJQci~vzH!oRVgz*GcG=HTy_c@Ef>D~n9E(#@V|Pgmdmd!H$T2yrAGEmR(=Ou zb=1|xu5>jl(lx4Z^b*%ErPRYMG4Z9=E_dOuRjw7KS2c81R+(Gy>h}#?O;p4tOv!HJ zYF9XPlk1wZELJz2kQJI6mzol$D)_o;s2a^(6$__4<(j0GNKH;lHv6YvJB;($;;N>` zG;#G(qqew8mm3?G5|B4OELU+W{WFJ z{S@hHucp>y`x4VN)PT2L(duwZ*OJ0* zZ@cO^mEB}Nw|t!)sm@6!E^Xp!pc(~X%Had9-I{tXiuOGEt}9th?cl1VetpnYr|` { try { const walletAddress = await wallet.getAddress(); + console.log('Smart Account Address:', walletAddress); + const chainId = await wallet.rpcProvider.getChainId(); const isFromEth = args.fromTokenAddress.toLowerCase() === "eth"; - // Get token decimals and calculate amount with proper decimals - const decimals = isFromEth ? 18 : await getDecimals(wallet, args.fromTokenAddress); - const amountWithDecimals = parseUnits(args.amount, Number(decimals)).toString(); - - // Check and set allowance for Permit2 if needed - if (!isFromEth) { - const tokenContract = getContract({ - address: args.fromTokenAddress as `0x${string}`, - abi: TokenABI, - client: wallet.rpcProvider, - }); + // Get token decimals and details + const fromDecimals = isFromEth ? 18 : await getDecimals(wallet, args.fromTokenAddress); + const toDecimals = await getDecimals(wallet, args.toTokenAddress); + + console.log('Swap Details:', { + fromToken: args.fromTokenAddress, + toToken: args.toTokenAddress, + amount: args.amount, + fromDecimals, + toDecimals + }); - const currentAllowance = (await tokenContract.read.allowance([ - walletAddress as `0x${string}`, - PERMIT2_ADDRESS as `0x${string}`, - ])) as bigint; + // Create token instances + const fromToken = new Token( + chainId, + isFromEth ? WRAPPED_NATIVE_TOKEN[chainId] : args.fromTokenAddress, + Number(fromDecimals) + ); + const toToken = new Token(chainId, args.toTokenAddress, Number(toDecimals)); - if (currentAllowance < BigInt(amountWithDecimals)) { - const approveData = encodeFunctionData({ - abi: TokenABI, - functionName: "approve", - args: [PERMIT2_ADDRESS, amountWithDecimals], - }); + // Calculate amount with decimals + const amountIn = parseUnits(args.amount, Number(fromDecimals)); - await sendTransaction(wallet, { - to: args.fromTokenAddress, - data: approveData, - value: 0n, - }); - } - } + // Get pool with best liquidity + const { pool } = await getUniswapV3Pool(wallet, fromToken, toToken, chainId); - // Get quote with permit2 - const quoteParams = new URLSearchParams({ - chainId: chainId.toString(), - sellToken: isFromEth ? "ETH" : args.fromTokenAddress, - buyToken: args.toTokenAddress, - sellAmount: amountWithDecimals, - takerAddress: walletAddress, - slippagePercentage: (args.slippageTolerance / 10000).toString(), + // Create route and trade + const route = new Route([pool], fromToken, toToken); + const trade = await Trade.createUncheckedTrade({ + route, + inputAmount: CurrencyAmount.fromRawAmount(fromToken, amountIn.toString()), + outputAmount: CurrencyAmount.fromRawAmount(toToken, '0'), + tradeType: TradeType.EXACT_INPUT, }); - const quoteResponse = await axios.get( - `https://api.0x.org/swap/permit2/quote?${quoteParams.toString()}`, - { headers }, - ); - - let txData = quoteResponse.data.transaction.data; + // Prepare swap parameters + const slippageTolerance = new Percent(args.slippageTolerance, 10000); + const deadline = Math.floor(Date.now() / 1000) + 1800; // 30 minutes - // If permit2 signature is required, sign and append to transaction data - if (quoteResponse.data.permit2?.eip712) { - const signature = await wallet.signTypedData(quoteResponse.data.permit2.eip712); + const methodParameters = SwapRouter.swapCallParameters(trade, { + slippageTolerance, + recipient: walletAddress, + deadline, + }); - // Append signature length (32 bytes) and signature to transaction data - const signatureLengthHex = numberToHex(size(signature), { - signed: false, - size: 32, - }); + // Execute swap + const receipt = await sendTransaction(wallet, { + to: UNISWAP_V3_ROUTER, + data: methodParameters.calldata, + value: BigInt(isFromEth ? amountIn.toString() : 0), + }); - txData = concat([txData, signatureLengthHex as `0x${string}`, signature as `0x${string}`]); - } + // After successful swap, get transaction details + const txHash = receipt.transactionHash; + const receiptDetails = await wallet.rpcProvider.waitForTransactionReceipt({ + hash: txHash as `0x${string}` + }); - // Execute swap transaction with permit2 signature - const receipt = await sendTransaction(wallet, { - to: quoteResponse.data.transaction.to, - data: txData, - value: BigInt(isFromEth ? amountWithDecimals : 0), + // Log detailed transaction info + console.log('Transaction Details:', { + hash: receiptDetails.transactionHash, + from: receiptDetails.from, + to: receiptDetails.to, + status: receiptDetails.status === 'success' ? 'Success' : 'Failed', + logs: receiptDetails.logs.map(log => ({ + address: log.address, + topics: log.topics, + data: log.data + })) }); - return `Successfully swapped ${args.amount} ${isFromEth ? "ETH" : args.fromTokenAddress} - to ${args.toTokenAddress}. TX: ${receipt.transactionHash}`; + // Parse transfer events + const transfers = receiptDetails.logs + .filter(log => log.topics[0] === '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef') // Transfer event + .map(log => ({ + token: log.address, + from: `0x${log.topics[1]?.slice(26)}`, + to: `0x${log.topics[2]?.slice(26)}`, + amount: BigInt(log.data).toString() + })); + + console.log('Token Transfers:', transfers); + + return `Swap completed successfully!\n + Transaction Hash: ${receiptDetails.transactionHash}\n + From Token: ${args.fromTokenAddress}\n + To Token: ${args.toTokenAddress}\n + Amount: ${args.amount}\n + Transfers: ${JSON.stringify(transfers, null, 2)}`; + } catch (error) { - if (axios.isAxiosError(error) && error.response?.data?.reason) { - return `Swap failed: ${error.response.data.reason}`; - } - return `Swap failed: ${error instanceof Error ? error.message : error}`; + console.error('Swap error:', error); + return `Swap failed: ${error instanceof Error ? error.message : 'Unknown error'}`; } } diff --git a/src/agentkit.ts b/src/agentkit.ts index 7111055..8369216 100644 --- a/src/agentkit.ts +++ b/src/agentkit.ts @@ -179,4 +179,8 @@ export class Agentkit { } return await this.smartAccount.getAddress(); } + + public async getProvider() { + return this.smartAccount?.rpcProvider; + } } diff --git a/src/test.ts b/src/test.ts index 6fff1e7..eb75c07 100644 --- a/src/test.ts +++ b/src/test.ts @@ -1,53 +1,135 @@ import { Agentkit } from "./agentkit"; import dotenv from "dotenv"; import { getAllAgentkitActions } from "./actions"; -import { z } from "zod"; +import { UNISWAP_V3_ROUTER } from './uniswap'; +import { encodeFunctionData } from "viem"; +import { parseUnits } from "viem"; +import { TokenABI } from "./constants"; dotenv.config(); async function testActions() { - try { - console.log("Config:", { - hasPrivateKey: !!process.env.PRIVATE_KEY, - hasApiKey: !!process.env.API_KEY, - hasCmcApiKey: !!process.env.CMC_API_KEY, - }); - - // Initialize Agentkit - const agentkit = await Agentkit.configureWithWallet({ - privateKey: process.env.PRIVATE_KEY as `0x${string}`, - rpcUrl: process.env.RPC_URL as string, - apiKey: process.env.API_KEY as string, - chainID: Number(process.env.CHAIN_ID) || 8453, - cmcApiKey: process.env.CMC_API_KEY as string, - }); - - // Get all actions - const actions = getAllAgentkitActions(); - - // Test get_address - console.log("\nTesting get_address:"); - const addressResult = await agentkit.run(actions[5], actions[5].argsSchema.parse({})); - console.log(addressResult); - - // Test get_balance - console.log("\nTesting get_balance:"); - const balanceResult = await agentkit.run(actions[0], actions[0].argsSchema.parse({})); - console.log(balanceResult); - - // Test token_analysis - console.log("\nTesting token_analysis:"); - const analysisResult = await agentkit.run( - actions[6], - actions[6].argsSchema.parse({ - type: "listings", - limit: 5, - }), - ); - console.log(analysisResult); - } catch (error) { - console.error("Test failed:", error); - } + try { + console.log("Config:", { + hasPrivateKey: !!process.env.PRIVATE_KEY, + hasApiKey: !!process.env.API_KEY, + hasCmcApiKey: !!process.env.CMC_API_KEY, + }); + + // Initialize Agentkit + const agentkit = await Agentkit.configureWithWallet({ + privateKey: process.env.PRIVATE_KEY as `0x${string}`, + rpcUrl: process.env.RPC_URL as string, + apiKey: process.env.API_KEY as string, + chainID: Number(process.env.CHAIN_ID) || 8453, + cmcApiKey: process.env.CMC_API_KEY as string, + }); + + // Get all actions + const actions = getAllAgentkitActions(); + + // Test get_address + console.log("\nTesting get_address:"); + const addressResult = await agentkit.run(actions[5], actions[5].argsSchema.parse({})); + console.log(addressResult); + + // Test get_balance + console.log("\nTesting get_balance:"); + const balanceResult = await agentkit.run(actions[0], actions[0].argsSchema.parse({})); + console.log(balanceResult); + + // Test token_analysis + console.log("\nTesting token_analysis:"); + const analysisResult = await agentkit.run( + actions[6], + actions[6].argsSchema.parse({ + type: "listings", + limit: 5, + }), + ); + console.log(analysisResult); + + // Test USDT and USDC balances before swap + console.log("\nChecking balances before swap:"); + const beforeBalances = await agentkit.run( + actions[0], + actions[0].argsSchema.parse({ + tokenAddresses: [ + "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7", // USDT + "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E" // USDC + ] + }) + ); + console.log("Before swap balances:", beforeBalances); + + // Check USDT balance first + console.log("\nChecking USDT balance before approval:"); + const usdtBalance = await agentkit.run( + actions[0], + actions[0].argsSchema.parse({ + tokenAddresses: ["0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7"] // USDT + }) + ); + console.log("USDT Balance:", usdtBalance); + + // Approve USDT first + console.log("\nApproving USDT..."); + const data = encodeFunctionData({ + abi: TokenABI, + functionName: "approve", + args: [ + UNISWAP_V3_ROUTER[43114], + parseUnits("0.01", 6) // USDT has 6 decimals, reduced amount + ], + }); + + const approveResult = await agentkit.run( + actions[1], // SmartTransferAction + actions[1].argsSchema.parse({ + tokenAddress: "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7", // USDT + destination: "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7", // USDT contract + amount: "0.01", // Reduced amount for testing + data: data + }) + ); + console.log("Approval result:", approveResult); + + // Wait for approval + await new Promise(resolve => setTimeout(resolve, 15000)); + + // Then proceed with swap if approval successful + if (!approveResult.includes("Error")) { + console.log("\nTesting swap:"); + const swapResult = await agentkit.run( + actions[2], + actions[2].argsSchema.parse({ + fromTokenAddress: "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7", + toTokenAddress: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", + amount: "0.01", + slippageTolerance: 100 + }) + ); + console.log("Swap result:", swapResult); + } + + // Wait for swap to be confirmed + await new Promise(resolve => setTimeout(resolve, 15000)); + + // Test balances after swap + console.log("\nChecking balances after swap:"); + const afterBalances = await agentkit.run( + actions[0], + actions[0].argsSchema.parse({ + tokenAddresses: [ + "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7", // USDT + "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E" // USDC + ] + }) + ); + console.log("After swap balances:", afterBalances); + } catch (error) { + console.error("Test failed:", error); + } } // Run tests diff --git a/src/uniswap.ts b/src/uniswap.ts new file mode 100644 index 0000000..9b2cf89 --- /dev/null +++ b/src/uniswap.ts @@ -0,0 +1,134 @@ +import { Token } from '@uniswap/sdk-core'; +import { Pool, FeeAmount } from '@uniswap/v3-sdk'; +import { ZeroXgaslessSmartAccount } from "@0xgasless/smart-account"; +import { getContract } from 'viem'; +import IUniswapV3Pool from '@uniswap/v3-core/artifacts/contracts/interfaces/IUniswapV3Pool.sol/IUniswapV3Pool.json'; +import IUniswapV3Factory from '@uniswap/v3-core/artifacts/contracts/interfaces/IUniswapV3Factory.sol/IUniswapV3Factory.json'; + + +export const UNISWAP_V3_FACTORY_ADDRESS: { [chainId: number]: string } = { + 1: '0x1F98431c8aD98523631AE4a59f267346ea31F984', + 43114: '0x740b1c1de25031C31FF4fC9A62f554A55cdC1baD', + 8453: '0x33128a8fC17869897dcE68Ed026d694621f6FDfD', +}; + +export const WRAPPED_NATIVE_TOKEN: { [chainId: number]: string } = { + 1: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', + 43114: '0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7', + 8453: '0x4200000000000000000000000000000000000006', +}; + +// Add Uniswap V3 Router addresses for each chain +export const UNISWAP_V3_ROUTER: { [chainId: number]: string } = { + 1: '0xE592427A0AEce92De3Edee1F18E0157C05861564', // Ethereum + 43114: '0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45', // Avalanche + 8453: '0x2626664c2603336E57B271c5C0b26F421741e481', // Base +}; + +interface Slot0Data { + sqrtPriceX96: bigint; + tick: number; +} + +export async function getUniswapV3Pool( + wallet: ZeroXgaslessSmartAccount, + tokenA: Token, + tokenB: Token, + chainId: number +): Promise<{ pool: Pool; fee: FeeAmount }> { + console.log('Searching pool for tokens:', { + tokenA: tokenA.address, + tokenB: tokenB.address, + chainId + }); + + const factoryAddress = UNISWAP_V3_FACTORY_ADDRESS[chainId]; + if (!factoryAddress) { + throw new Error(`Uniswap V3 not supported on chain ${chainId}`); + } + + const factory = getContract({ + address: factoryAddress as `0x${string}`, + abi: IUniswapV3Factory.abi, + client: wallet.rpcProvider, + }); + + for (const fee of [FeeAmount.MEDIUM, FeeAmount.LOW, FeeAmount.HIGH]) { + try { + console.log(`Trying fee tier: ${fee}`); + const poolAddress = await factory.read.getPool([ + tokenA.address, + tokenB.address, + fee + ]) as `0x${string}`; + + console.log('Found pool address:', poolAddress); + + if (poolAddress === '0x0000000000000000000000000000000000000000') { + console.log('No pool for this fee tier'); + continue; + } + + const pool = await getPool(wallet, poolAddress, tokenA, tokenB, fee); + return { pool, fee }; + } catch (error) { + console.error(`Error with fee ${fee}:`, error); + continue; + } + } + + throw new Error(`No active pool found for ${tokenA.symbol}/${tokenB.symbol}`); +} + +export async function getPool( + wallet: ZeroXgaslessSmartAccount, + poolAddress: string, + tokenA: Token, + tokenB: Token, + fee: FeeAmount +): Promise { + try { + const [token0, token1] = tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA]; + + console.log('Pool Address:', poolAddress); + console.log('Tokens:', { + token0: token0.address, + token1: token1.address, + decimals0: token0.decimals, + decimals1: token1.decimals + }); + + const poolContract = getContract({ + address: poolAddress as `0x${string}`, + abi: IUniswapV3Pool.abi, + client: wallet.rpcProvider, + }); + + const [slot0Array, liquidity] = await Promise.all([ + poolContract.read.slot0() as Promise<[bigint, number, ...unknown[]]>, + poolContract.read.liquidity() as Promise + ]); + + const slot0Data: Slot0Data = { + sqrtPriceX96: slot0Array[0], + tick: slot0Array[1] + }; + + console.log('Pool Data:', { + slot0: slot0Data, + liquidity + }); + + return new Pool( + token0, + token1, + fee, + slot0Data.sqrtPriceX96.toString(), + (liquidity as bigint).toString(), + slot0Data.tick + ); + } catch (error) { + console.error('Pool creation error:', error); + throw new Error(`Failed to create pool: ${error instanceof Error ? error.message : 'Unknown error'}`); + } +} \ No newline at end of file