@paylobster/mcp-server 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +360 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/bridge.d.ts +142 -0
- package/dist/tools/bridge.d.ts.map +1 -0
- package/dist/tools/bridge.js +121 -0
- package/dist/tools/bridge.js.map +1 -0
- package/dist/tools/portfolio.d.ts +44 -0
- package/dist/tools/portfolio.d.ts.map +1 -0
- package/dist/tools/portfolio.js +166 -0
- package/dist/tools/portfolio.js.map +1 -0
- package/dist/tools/swap.d.ts +93 -0
- package/dist/tools/swap.d.ts.map +1 -0
- package/dist/tools/swap.js +150 -0
- package/dist/tools/swap.js.map +1 -0
- package/dist/tools/treasury.d.ts +169 -0
- package/dist/tools/treasury.d.ts.map +1 -0
- package/dist/tools/treasury.js +475 -0
- package/dist/tools/treasury.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/tools/bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.bridgeChainsSchema = exports.bridgeStatusSchema = exports.bridgeExecuteSchema = exports.bridgeQuoteSchema = void 0;
|
|
4
|
+
exports.bridgeQuote = bridgeQuote;
|
|
5
|
+
exports.bridgeExecute = bridgeExecute;
|
|
6
|
+
exports.bridgeStatus = bridgeStatus;
|
|
7
|
+
exports.bridgeChains = bridgeChains;
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
// Schema for bridge_quote
|
|
10
|
+
exports.bridgeQuoteSchema = zod_1.z.object({
|
|
11
|
+
fromChain: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).describe('Source chain ID or name'),
|
|
12
|
+
toChain: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).describe('Destination chain ID or name'),
|
|
13
|
+
fromToken: zod_1.z.string().describe('Source token address'),
|
|
14
|
+
toToken: zod_1.z.string().describe('Destination token address'),
|
|
15
|
+
fromAmount: zod_1.z.string().describe('Amount to bridge (in token units)'),
|
|
16
|
+
fromAddress: zod_1.z.string().optional().describe('Sender address'),
|
|
17
|
+
toAddress: zod_1.z.string().optional().describe('Recipient address (defaults to fromAddress)'),
|
|
18
|
+
});
|
|
19
|
+
// Schema for bridge_execute
|
|
20
|
+
exports.bridgeExecuteSchema = zod_1.z.object({
|
|
21
|
+
fromChain: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).describe('Source chain ID or name'),
|
|
22
|
+
toChain: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).describe('Destination chain ID or name'),
|
|
23
|
+
fromToken: zod_1.z.string().describe('Source token address'),
|
|
24
|
+
toToken: zod_1.z.string().describe('Destination token address'),
|
|
25
|
+
fromAmount: zod_1.z.string().describe('Amount to bridge (in token units)'),
|
|
26
|
+
toAddress: zod_1.z.string().optional().describe('Recipient address'),
|
|
27
|
+
});
|
|
28
|
+
// Schema for bridge_status
|
|
29
|
+
exports.bridgeStatusSchema = zod_1.z.object({
|
|
30
|
+
txHash: zod_1.z.string().describe('Transaction hash to check'),
|
|
31
|
+
fromChain: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).optional().describe('Source chain ID'),
|
|
32
|
+
toChain: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).optional().describe('Destination chain ID'),
|
|
33
|
+
});
|
|
34
|
+
// Schema for bridge_chains
|
|
35
|
+
exports.bridgeChainsSchema = zod_1.z.object({
|
|
36
|
+
query: zod_1.z.string().optional().describe('Filter chains by name'),
|
|
37
|
+
});
|
|
38
|
+
async function bridgeQuote(params, client) {
|
|
39
|
+
const fromAddress = params.fromAddress || client.getAccount().address;
|
|
40
|
+
const toAddress = params.toAddress || fromAddress;
|
|
41
|
+
const queryParams = new URLSearchParams({
|
|
42
|
+
fromChain: params.fromChain.toString(),
|
|
43
|
+
toChain: params.toChain.toString(),
|
|
44
|
+
fromToken: params.fromToken,
|
|
45
|
+
toToken: params.toToken,
|
|
46
|
+
fromAmount: params.fromAmount,
|
|
47
|
+
fromAddress,
|
|
48
|
+
toAddress,
|
|
49
|
+
});
|
|
50
|
+
try {
|
|
51
|
+
const response = await fetch(`https://li.quest/v1/quote?${queryParams}`);
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
const errorText = await response.text();
|
|
54
|
+
throw new Error(`Li.Fi API error: ${response.status} - ${errorText}`);
|
|
55
|
+
}
|
|
56
|
+
const data = await response.json();
|
|
57
|
+
return data;
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw new Error(`Failed to get bridge quote: ${error.message}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async function bridgeExecute(params, client) {
|
|
64
|
+
const fromAddress = client.getAccount().address;
|
|
65
|
+
const toAddress = params.toAddress || fromAddress;
|
|
66
|
+
// Get quote first
|
|
67
|
+
const quote = await bridgeQuote({
|
|
68
|
+
...params,
|
|
69
|
+
fromAddress,
|
|
70
|
+
toAddress,
|
|
71
|
+
}, client);
|
|
72
|
+
if (!quote.transactionRequest) {
|
|
73
|
+
throw new Error('No transaction data in quote response');
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
transaction: quote.transactionRequest,
|
|
77
|
+
quote,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
async function bridgeStatus(params, client) {
|
|
81
|
+
const queryParams = new URLSearchParams({
|
|
82
|
+
txHash: params.txHash,
|
|
83
|
+
...(params.fromChain && { fromChain: params.fromChain.toString() }),
|
|
84
|
+
...(params.toChain && { toChain: params.toChain.toString() }),
|
|
85
|
+
});
|
|
86
|
+
try {
|
|
87
|
+
const response = await fetch(`https://li.quest/v1/status?${queryParams}`);
|
|
88
|
+
if (!response.ok) {
|
|
89
|
+
const errorText = await response.text();
|
|
90
|
+
throw new Error(`Li.Fi API error: ${response.status} - ${errorText}`);
|
|
91
|
+
}
|
|
92
|
+
const data = await response.json();
|
|
93
|
+
return data;
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
throw new Error(`Failed to get bridge status: ${error.message}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function bridgeChains(params, client) {
|
|
100
|
+
try {
|
|
101
|
+
const response = await fetch('https://li.quest/v1/chains');
|
|
102
|
+
if (!response.ok) {
|
|
103
|
+
const errorText = await response.text();
|
|
104
|
+
throw new Error(`Li.Fi API error: ${response.status} - ${errorText}`);
|
|
105
|
+
}
|
|
106
|
+
const data = await response.json();
|
|
107
|
+
let chains = data.chains || [];
|
|
108
|
+
// Filter by query if provided
|
|
109
|
+
if (params.query) {
|
|
110
|
+
const query = params.query.toLowerCase();
|
|
111
|
+
chains = chains.filter((chain) => chain.name.toLowerCase().includes(query) ||
|
|
112
|
+
chain.key.toLowerCase().includes(query) ||
|
|
113
|
+
chain.id.toString().includes(query));
|
|
114
|
+
}
|
|
115
|
+
return { chains };
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
throw new Error(`Failed to fetch chains: ${error.message}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/tools/bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ContractClient } from '../utils/contracts';
|
|
3
|
+
export declare const getPortfolioSchema: z.ZodObject<{
|
|
4
|
+
address: z.ZodString;
|
|
5
|
+
}, "strip", z.ZodTypeAny, {
|
|
6
|
+
address: string;
|
|
7
|
+
}, {
|
|
8
|
+
address: string;
|
|
9
|
+
}>;
|
|
10
|
+
export declare const getTokenPriceSchema: z.ZodObject<{
|
|
11
|
+
tokenAddress: z.ZodString;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
tokenAddress: string;
|
|
14
|
+
}, {
|
|
15
|
+
tokenAddress: string;
|
|
16
|
+
}>;
|
|
17
|
+
interface TokenBalance {
|
|
18
|
+
token: string;
|
|
19
|
+
symbol: string;
|
|
20
|
+
name: string;
|
|
21
|
+
decimals: number;
|
|
22
|
+
balance: string;
|
|
23
|
+
balanceRaw: string;
|
|
24
|
+
priceUSD?: string;
|
|
25
|
+
valueUSD?: string;
|
|
26
|
+
}
|
|
27
|
+
interface PortfolioResponse {
|
|
28
|
+
address: string;
|
|
29
|
+
chainId: number;
|
|
30
|
+
totalValueUSD: string;
|
|
31
|
+
tokens: TokenBalance[];
|
|
32
|
+
lastUpdated: number;
|
|
33
|
+
}
|
|
34
|
+
interface TokenPriceResponse {
|
|
35
|
+
tokenAddress: string;
|
|
36
|
+
symbol: string;
|
|
37
|
+
priceUSD: string;
|
|
38
|
+
source: string;
|
|
39
|
+
lastUpdated: number;
|
|
40
|
+
}
|
|
41
|
+
export declare function getPortfolio(params: z.infer<typeof getPortfolioSchema>, client: ContractClient): Promise<PortfolioResponse>;
|
|
42
|
+
export declare function getTokenPrice(params: z.infer<typeof getTokenPriceSchema>, client: ContractClient): Promise<TokenPriceResponse>;
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=portfolio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../src/tools/portfolio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD,eAAO,MAAM,kBAAkB;;;;;;EAE7B,CAAC;AAGH,eAAO,MAAM,mBAAmB;;;;;;EAE9B,CAAC;AAEH,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,kBAAkB;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAQD,wBAAsB,YAAY,CAChC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,EAC1C,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,iBAAiB,CAAC,CA6F5B;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,EAC3C,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,kBAAkB,CAAC,CAgE7B"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getTokenPriceSchema = exports.getPortfolioSchema = void 0;
|
|
4
|
+
exports.getPortfolio = getPortfolio;
|
|
5
|
+
exports.getTokenPrice = getTokenPrice;
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
// Schema for get_portfolio
|
|
8
|
+
exports.getPortfolioSchema = zod_1.z.object({
|
|
9
|
+
address: zod_1.z.string().describe('Ethereum address to get portfolio for'),
|
|
10
|
+
});
|
|
11
|
+
// Schema for get_token_price
|
|
12
|
+
exports.getTokenPriceSchema = zod_1.z.object({
|
|
13
|
+
tokenAddress: zod_1.z.string().describe('Token contract address on Base'),
|
|
14
|
+
});
|
|
15
|
+
// Base chain native token (ETH) and common tokens
|
|
16
|
+
const BASE_TOKENS = {
|
|
17
|
+
'0x0000000000000000000000000000000000000000': { symbol: 'ETH', decimals: 18, address: '0x0000000000000000000000000000000000000000' },
|
|
18
|
+
'0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913': { symbol: 'USDC', decimals: 6, address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' },
|
|
19
|
+
};
|
|
20
|
+
async function getPortfolio(params, client) {
|
|
21
|
+
const publicClient = client.getPublicClient();
|
|
22
|
+
const address = params.address;
|
|
23
|
+
try {
|
|
24
|
+
const tokens = [];
|
|
25
|
+
let totalValueUSD = 0;
|
|
26
|
+
// ERC20 ABI for balance and metadata
|
|
27
|
+
const ERC20_ABI = [
|
|
28
|
+
{
|
|
29
|
+
inputs: [{ name: 'account', type: 'address' }],
|
|
30
|
+
name: 'balanceOf',
|
|
31
|
+
outputs: [{ name: '', type: 'uint256' }],
|
|
32
|
+
stateMutability: 'view',
|
|
33
|
+
type: 'function',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
inputs: [],
|
|
37
|
+
name: 'symbol',
|
|
38
|
+
outputs: [{ name: '', type: 'string' }],
|
|
39
|
+
stateMutability: 'view',
|
|
40
|
+
type: 'function',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
inputs: [],
|
|
44
|
+
name: 'name',
|
|
45
|
+
outputs: [{ name: '', type: 'string' }],
|
|
46
|
+
stateMutability: 'view',
|
|
47
|
+
type: 'function',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
inputs: [],
|
|
51
|
+
name: 'decimals',
|
|
52
|
+
outputs: [{ name: '', type: 'uint8' }],
|
|
53
|
+
stateMutability: 'view',
|
|
54
|
+
type: 'function',
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
// Get native ETH balance
|
|
58
|
+
const ethBalance = await publicClient.getBalance({ address });
|
|
59
|
+
const ethFormatted = (Number(ethBalance) / 1e18).toFixed(6);
|
|
60
|
+
tokens.push({
|
|
61
|
+
token: '0x0000000000000000000000000000000000000000',
|
|
62
|
+
symbol: 'ETH',
|
|
63
|
+
name: 'Ethereum',
|
|
64
|
+
decimals: 18,
|
|
65
|
+
balance: ethFormatted,
|
|
66
|
+
balanceRaw: ethBalance.toString(),
|
|
67
|
+
});
|
|
68
|
+
// Get common token balances
|
|
69
|
+
for (const [tokenAddress, tokenInfo] of Object.entries(BASE_TOKENS)) {
|
|
70
|
+
if (tokenAddress === '0x0000000000000000000000000000000000000000')
|
|
71
|
+
continue;
|
|
72
|
+
try {
|
|
73
|
+
const balance = await publicClient.readContract({
|
|
74
|
+
address: tokenAddress,
|
|
75
|
+
abi: ERC20_ABI,
|
|
76
|
+
functionName: 'balanceOf',
|
|
77
|
+
args: [address],
|
|
78
|
+
});
|
|
79
|
+
if (balance > 0n) {
|
|
80
|
+
const balanceFormatted = (Number(balance) / Math.pow(10, tokenInfo.decimals)).toFixed(tokenInfo.decimals);
|
|
81
|
+
tokens.push({
|
|
82
|
+
token: tokenAddress,
|
|
83
|
+
symbol: tokenInfo.symbol,
|
|
84
|
+
name: tokenInfo.symbol,
|
|
85
|
+
decimals: tokenInfo.decimals,
|
|
86
|
+
balance: balanceFormatted,
|
|
87
|
+
balanceRaw: balance.toString(),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
// Skip tokens that fail to load
|
|
93
|
+
console.error(`Failed to load balance for ${tokenInfo.symbol}:`, err);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
address: params.address,
|
|
98
|
+
chainId: 8453, // Base
|
|
99
|
+
totalValueUSD: totalValueUSD.toFixed(2),
|
|
100
|
+
tokens,
|
|
101
|
+
lastUpdated: Date.now(),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
throw new Error(`Failed to fetch portfolio: ${error.message}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async function getTokenPrice(params, client) {
|
|
109
|
+
const apiKey = process.env.ZEROX_API_KEY;
|
|
110
|
+
if (!apiKey) {
|
|
111
|
+
throw new Error('0x API key not configured (ZEROX_API_KEY)');
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
// Get price via 0x API by quoting 1 token -> USDC
|
|
115
|
+
const queryParams = new URLSearchParams({
|
|
116
|
+
chainId: '8453',
|
|
117
|
+
sellToken: params.tokenAddress,
|
|
118
|
+
buyToken: 'USDC',
|
|
119
|
+
sellAmount: '1000000000000000000', // 1 token (18 decimals)
|
|
120
|
+
});
|
|
121
|
+
const response = await fetch(`https://api.0x.org/swap/permit2/price?${queryParams}`, {
|
|
122
|
+
headers: {
|
|
123
|
+
'0x-api-key': apiKey,
|
|
124
|
+
'0x-version': 'v2',
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
const errorText = await response.text();
|
|
129
|
+
throw new Error(`0x API error: ${response.status} - ${errorText}`);
|
|
130
|
+
}
|
|
131
|
+
const data = await response.json();
|
|
132
|
+
// Get token symbol
|
|
133
|
+
let symbol = 'UNKNOWN';
|
|
134
|
+
try {
|
|
135
|
+
const publicClient = client.getPublicClient();
|
|
136
|
+
const tokenSymbol = await publicClient.readContract({
|
|
137
|
+
address: params.tokenAddress,
|
|
138
|
+
abi: [
|
|
139
|
+
{
|
|
140
|
+
inputs: [],
|
|
141
|
+
name: 'symbol',
|
|
142
|
+
outputs: [{ name: '', type: 'string' }],
|
|
143
|
+
stateMutability: 'view',
|
|
144
|
+
type: 'function',
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
functionName: 'symbol',
|
|
148
|
+
});
|
|
149
|
+
symbol = tokenSymbol;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// Fallback to address if symbol read fails
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
tokenAddress: params.tokenAddress,
|
|
156
|
+
symbol,
|
|
157
|
+
priceUSD: data.price || data.buyAmount,
|
|
158
|
+
source: '0x',
|
|
159
|
+
lastUpdated: Date.now(),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
throw new Error(`Failed to get token price: ${error.message}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=portfolio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../src/tools/portfolio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ContractClient } from '../utils/contracts';
|
|
3
|
+
export declare const swapQuoteSchema: z.ZodObject<{
|
|
4
|
+
sellToken: z.ZodString;
|
|
5
|
+
buyToken: z.ZodString;
|
|
6
|
+
sellAmount: z.ZodOptional<z.ZodString>;
|
|
7
|
+
buyAmount: z.ZodOptional<z.ZodString>;
|
|
8
|
+
slippagePercentage: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
9
|
+
takerAddress: z.ZodOptional<z.ZodString>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
sellToken: string;
|
|
12
|
+
buyToken: string;
|
|
13
|
+
slippagePercentage: number;
|
|
14
|
+
sellAmount?: string | undefined;
|
|
15
|
+
buyAmount?: string | undefined;
|
|
16
|
+
takerAddress?: string | undefined;
|
|
17
|
+
}, {
|
|
18
|
+
sellToken: string;
|
|
19
|
+
buyToken: string;
|
|
20
|
+
sellAmount?: string | undefined;
|
|
21
|
+
buyAmount?: string | undefined;
|
|
22
|
+
slippagePercentage?: number | undefined;
|
|
23
|
+
takerAddress?: string | undefined;
|
|
24
|
+
}>;
|
|
25
|
+
export declare const swapExecuteSchema: z.ZodObject<{
|
|
26
|
+
sellToken: z.ZodString;
|
|
27
|
+
buyToken: z.ZodString;
|
|
28
|
+
sellAmount: z.ZodOptional<z.ZodString>;
|
|
29
|
+
buyAmount: z.ZodOptional<z.ZodString>;
|
|
30
|
+
slippagePercentage: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
31
|
+
}, "strip", z.ZodTypeAny, {
|
|
32
|
+
sellToken: string;
|
|
33
|
+
buyToken: string;
|
|
34
|
+
slippagePercentage: number;
|
|
35
|
+
sellAmount?: string | undefined;
|
|
36
|
+
buyAmount?: string | undefined;
|
|
37
|
+
}, {
|
|
38
|
+
sellToken: string;
|
|
39
|
+
buyToken: string;
|
|
40
|
+
sellAmount?: string | undefined;
|
|
41
|
+
buyAmount?: string | undefined;
|
|
42
|
+
slippagePercentage?: number | undefined;
|
|
43
|
+
}>;
|
|
44
|
+
export declare const swapTokensSchema: z.ZodObject<{
|
|
45
|
+
query: z.ZodOptional<z.ZodString>;
|
|
46
|
+
}, "strip", z.ZodTypeAny, {
|
|
47
|
+
query?: string | undefined;
|
|
48
|
+
}, {
|
|
49
|
+
query?: string | undefined;
|
|
50
|
+
}>;
|
|
51
|
+
export declare const swapPriceSchema: z.ZodObject<{
|
|
52
|
+
token: z.ZodString;
|
|
53
|
+
}, "strip", z.ZodTypeAny, {
|
|
54
|
+
token: string;
|
|
55
|
+
}, {
|
|
56
|
+
token: string;
|
|
57
|
+
}>;
|
|
58
|
+
interface SwapQuoteResponse {
|
|
59
|
+
chainId: number;
|
|
60
|
+
price: string;
|
|
61
|
+
estimatedPriceImpact: string;
|
|
62
|
+
sellTokenAddress: string;
|
|
63
|
+
buyTokenAddress: string;
|
|
64
|
+
sellAmount: string;
|
|
65
|
+
buyAmount: string;
|
|
66
|
+
allowanceTarget: string;
|
|
67
|
+
to: string;
|
|
68
|
+
data: string;
|
|
69
|
+
value: string;
|
|
70
|
+
gas: string;
|
|
71
|
+
gasPrice: string;
|
|
72
|
+
}
|
|
73
|
+
interface TokenInfo {
|
|
74
|
+
address: string;
|
|
75
|
+
symbol: string;
|
|
76
|
+
name: string;
|
|
77
|
+
decimals: number;
|
|
78
|
+
}
|
|
79
|
+
export declare function swapQuote(params: z.infer<typeof swapQuoteSchema>, client: ContractClient): Promise<SwapQuoteResponse>;
|
|
80
|
+
export declare function swapExecute(params: z.infer<typeof swapExecuteSchema>, client: ContractClient): Promise<{
|
|
81
|
+
transaction: any;
|
|
82
|
+
quote: SwapQuoteResponse;
|
|
83
|
+
}>;
|
|
84
|
+
export declare function swapTokens(params: z.infer<typeof swapTokensSchema>, client: ContractClient): Promise<{
|
|
85
|
+
tokens: TokenInfo[];
|
|
86
|
+
}>;
|
|
87
|
+
export declare function swapPrice(params: z.infer<typeof swapPriceSchema>, client: ContractClient): Promise<{
|
|
88
|
+
token: string;
|
|
89
|
+
priceInUSDC: string;
|
|
90
|
+
source: string;
|
|
91
|
+
}>;
|
|
92
|
+
export {};
|
|
93
|
+
//# sourceMappingURL=swap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.d.ts","sourceRoot":"","sources":["../../src/tools/swap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;EAO1B,CAAC;AAGH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;EAM5B,CAAC;AAGH,eAAO,MAAM,gBAAgB;;;;;;EAE3B,CAAC;AAGH,eAAO,MAAM,eAAe;;;;;;EAE1B,CAAC;AAEH,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,EACvC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,iBAAiB,CAAC,CAuC5B;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,EACzC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC;IAAE,WAAW,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,iBAAiB,CAAA;CAAE,CAAC,CAsBzD;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,EACxC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC;IAAE,MAAM,EAAE,SAAS,EAAE,CAAA;CAAE,CAAC,CAuClC;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,EACvC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAwCjE"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.swapPriceSchema = exports.swapTokensSchema = exports.swapExecuteSchema = exports.swapQuoteSchema = void 0;
|
|
4
|
+
exports.swapQuote = swapQuote;
|
|
5
|
+
exports.swapExecute = swapExecute;
|
|
6
|
+
exports.swapTokens = swapTokens;
|
|
7
|
+
exports.swapPrice = swapPrice;
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
// Schema for swap_quote
|
|
10
|
+
exports.swapQuoteSchema = zod_1.z.object({
|
|
11
|
+
sellToken: zod_1.z.string().describe('Token address or symbol to sell'),
|
|
12
|
+
buyToken: zod_1.z.string().describe('Token address or symbol to buy'),
|
|
13
|
+
sellAmount: zod_1.z.string().optional().describe('Amount to sell (in token units)'),
|
|
14
|
+
buyAmount: zod_1.z.string().optional().describe('Amount to buy (in token units)'),
|
|
15
|
+
slippagePercentage: zod_1.z.number().optional().default(0.01).describe('Slippage tolerance (0.01 = 1%)'),
|
|
16
|
+
takerAddress: zod_1.z.string().optional().describe('Address that will submit the transaction'),
|
|
17
|
+
});
|
|
18
|
+
// Schema for swap_execute
|
|
19
|
+
exports.swapExecuteSchema = zod_1.z.object({
|
|
20
|
+
sellToken: zod_1.z.string().describe('Token address or symbol to sell'),
|
|
21
|
+
buyToken: zod_1.z.string().describe('Token address or symbol to buy'),
|
|
22
|
+
sellAmount: zod_1.z.string().optional().describe('Amount to sell (in token units)'),
|
|
23
|
+
buyAmount: zod_1.z.string().optional().describe('Amount to buy (in token units)'),
|
|
24
|
+
slippagePercentage: zod_1.z.number().optional().default(0.01).describe('Slippage tolerance (0.01 = 1%)'),
|
|
25
|
+
});
|
|
26
|
+
// Schema for swap_tokens
|
|
27
|
+
exports.swapTokensSchema = zod_1.z.object({
|
|
28
|
+
query: zod_1.z.string().optional().describe('Search query to filter tokens'),
|
|
29
|
+
});
|
|
30
|
+
// Schema for swap_price
|
|
31
|
+
exports.swapPriceSchema = zod_1.z.object({
|
|
32
|
+
token: zod_1.z.string().describe('Token address or symbol'),
|
|
33
|
+
});
|
|
34
|
+
async function swapQuote(params, client) {
|
|
35
|
+
const apiKey = process.env.ZEROX_API_KEY;
|
|
36
|
+
if (!apiKey) {
|
|
37
|
+
throw new Error('0x API key not configured (ZEROX_API_KEY)');
|
|
38
|
+
}
|
|
39
|
+
const takerAddress = params.takerAddress || client.getAccount().address;
|
|
40
|
+
const queryParams = new URLSearchParams({
|
|
41
|
+
chainId: '8453', // Base
|
|
42
|
+
sellToken: params.sellToken,
|
|
43
|
+
buyToken: params.buyToken,
|
|
44
|
+
...(params.sellAmount && { sellAmount: params.sellAmount }),
|
|
45
|
+
...(params.buyAmount && { buyAmount: params.buyAmount }),
|
|
46
|
+
slippagePercentage: params.slippagePercentage.toString(),
|
|
47
|
+
takerAddress,
|
|
48
|
+
});
|
|
49
|
+
try {
|
|
50
|
+
const response = await fetch(`https://api.0x.org/swap/permit2/quote?${queryParams}`, {
|
|
51
|
+
headers: {
|
|
52
|
+
'0x-api-key': apiKey,
|
|
53
|
+
'0x-version': 'v2',
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
if (!response.ok) {
|
|
57
|
+
const errorText = await response.text();
|
|
58
|
+
throw new Error(`0x API error: ${response.status} - ${errorText}`);
|
|
59
|
+
}
|
|
60
|
+
const data = await response.json();
|
|
61
|
+
return data;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
throw new Error(`Failed to get swap quote: ${error.message}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async function swapExecute(params, client) {
|
|
68
|
+
const takerAddress = client.getAccount().address;
|
|
69
|
+
// Get the quote with transaction data
|
|
70
|
+
const quote = await swapQuote({
|
|
71
|
+
...params,
|
|
72
|
+
takerAddress,
|
|
73
|
+
}, client);
|
|
74
|
+
return {
|
|
75
|
+
transaction: {
|
|
76
|
+
to: quote.to,
|
|
77
|
+
data: quote.data,
|
|
78
|
+
value: quote.value,
|
|
79
|
+
gas: quote.gas,
|
|
80
|
+
gasPrice: quote.gasPrice,
|
|
81
|
+
},
|
|
82
|
+
quote,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async function swapTokens(params, client) {
|
|
86
|
+
const apiKey = process.env.ZEROX_API_KEY;
|
|
87
|
+
if (!apiKey) {
|
|
88
|
+
throw new Error('0x API key not configured (ZEROX_API_KEY)');
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
const response = await fetch(`https://api.0x.org/swap/permit2/tokens?chainId=8453`, {
|
|
92
|
+
headers: {
|
|
93
|
+
'0x-api-key': apiKey,
|
|
94
|
+
'0x-version': 'v2',
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
const errorText = await response.text();
|
|
99
|
+
throw new Error(`0x API error: ${response.status} - ${errorText}`);
|
|
100
|
+
}
|
|
101
|
+
const data = await response.json();
|
|
102
|
+
let tokens = data.tokens || [];
|
|
103
|
+
// Filter by query if provided
|
|
104
|
+
if (params.query) {
|
|
105
|
+
const query = params.query.toLowerCase();
|
|
106
|
+
tokens = tokens.filter((token) => token.symbol.toLowerCase().includes(query) ||
|
|
107
|
+
token.name.toLowerCase().includes(query) ||
|
|
108
|
+
token.address.toLowerCase().includes(query));
|
|
109
|
+
}
|
|
110
|
+
return { tokens };
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw new Error(`Failed to fetch tokens: ${error.message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async function swapPrice(params, client) {
|
|
117
|
+
const apiKey = process.env.ZEROX_API_KEY;
|
|
118
|
+
if (!apiKey) {
|
|
119
|
+
throw new Error('0x API key not configured (ZEROX_API_KEY)');
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
// Get price by requesting a quote for 1 token -> USDC
|
|
123
|
+
const queryParams = new URLSearchParams({
|
|
124
|
+
chainId: '8453',
|
|
125
|
+
sellToken: params.token,
|
|
126
|
+
buyToken: 'USDC',
|
|
127
|
+
sellAmount: '1000000000000000000', // 1 token (assuming 18 decimals)
|
|
128
|
+
});
|
|
129
|
+
const response = await fetch(`https://api.0x.org/swap/permit2/price?${queryParams}`, {
|
|
130
|
+
headers: {
|
|
131
|
+
'0x-api-key': apiKey,
|
|
132
|
+
'0x-version': 'v2',
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
if (!response.ok) {
|
|
136
|
+
const errorText = await response.text();
|
|
137
|
+
throw new Error(`0x API error: ${response.status} - ${errorText}`);
|
|
138
|
+
}
|
|
139
|
+
const data = await response.json();
|
|
140
|
+
return {
|
|
141
|
+
token: params.token,
|
|
142
|
+
priceInUSDC: data.price || data.buyAmount,
|
|
143
|
+
source: '0x',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
throw new Error(`Failed to get token price: ${error.message}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=swap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/tools/swap.ts"],"names":[],"mappings":";;;AAuDA,8BA0CC;AAED,kCAyBC;AAED,gCA0CC;AAED,8BA2CC;AArND,6BAAwB;AAGxB,wBAAwB;AACX,QAAA,eAAe,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACjE,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC/D,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC7E,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC3E,kBAAkB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAClG,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;CACzF,CAAC,CAAC;AAEH,0BAA0B;AACb,QAAA,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACxC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACjE,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC/D,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC7E,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;IAC3E,kBAAkB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;CACnG,CAAC,CAAC;AAEH,yBAAyB;AACZ,QAAA,gBAAgB,GAAG,OAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;CACvE,CAAC,CAAC;AAEH,wBAAwB;AACX,QAAA,eAAe,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CACtD,CAAC,CAAC;AAyBI,KAAK,UAAU,SAAS,CAC7B,MAAuC,EACvC,MAAsB;IAEtB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC;IAExE,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,OAAO;QACxB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;QACxD,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE;QACxD,YAAY;KACb,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,yCAAyC,WAAW,EAAE,EACtD;YACE,OAAO,EAAE;gBACP,YAAY,EAAE,MAAM;gBACpB,YAAY,EAAE,IAAI;aACnB;SACF,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,WAAW,CAC/B,MAAyC,EACzC,MAAsB;IAEtB,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC;IAEjD,sCAAsC;IACtC,MAAM,KAAK,GAAG,MAAM,SAAS,CAC3B;QACE,GAAG,MAAM;QACT,YAAY;KACb,EACD,MAAM,CACP,CAAC;IAEF,OAAO;QACL,WAAW,EAAE;YACX,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB;QACD,KAAK;KACN,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,UAAU,CAC9B,MAAwC,EACxC,MAAsB;IAEtB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,qDAAqD,EACrD;YACE,OAAO,EAAE;gBACP,YAAY,EAAE,MAAM;gBACpB,YAAY,EAAE,IAAI;aACnB;SACF,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QAE/B,8BAA8B;QAC9B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAgB,EAAE,EAAE,CAC1C,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACxC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC5C,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,SAAS,CAC7B,MAAuC,EACvC,MAAsB;IAEtB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,CAAC;QACH,sDAAsD;QACtD,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;YACtC,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,MAAM,CAAC,KAAK;YACvB,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,qBAAqB,EAAE,iCAAiC;SACrE,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,yCAAyC,WAAW,EAAE,EACtD;YACE,OAAO,EAAE;gBACP,YAAY,EAAE,MAAM;gBACpB,YAAY,EAAE,IAAI;aACnB;SACF,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEnC,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,WAAW,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS;YACzC,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC"}
|