@ael-protocol/sdk 0.1.0 → 0.2.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/abi/market.d.ts +394 -0
- package/dist/abi/market.d.ts.map +1 -0
- package/dist/abi/market.js +264 -0
- package/dist/abi/market.js.map +1 -0
- package/dist/agent-wallet.d.ts +79 -0
- package/dist/agent-wallet.d.ts.map +1 -0
- package/dist/agent-wallet.js +483 -0
- package/dist/agent-wallet.js.map +1 -0
- package/dist/hub.d.ts +125 -0
- package/dist/hub.d.ts.map +1 -0
- package/dist/hub.js +237 -0
- package/dist/hub.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +39 -1
- package/dist/index.js.map +1 -1
- package/dist/market.d.ts +73 -0
- package/dist/market.d.ts.map +1 -0
- package/dist/market.js +388 -0
- package/dist/market.js.map +1 -0
- package/dist/marketplace.d.ts +137 -0
- package/dist/marketplace.d.ts.map +1 -0
- package/dist/marketplace.js +479 -0
- package/dist/marketplace.js.map +1 -0
- package/dist/networks.d.ts +66 -0
- package/dist/networks.d.ts.map +1 -0
- package/dist/networks.js +106 -0
- package/dist/networks.js.map +1 -0
- package/dist/parser.d.ts +39 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +134 -0
- package/dist/parser.js.map +1 -0
- package/dist/strategies/dca.d.ts +39 -0
- package/dist/strategies/dca.d.ts.map +1 -0
- package/dist/strategies/dca.js +124 -0
- package/dist/strategies/dca.js.map +1 -0
- package/dist/strategies/grid.d.ts +54 -0
- package/dist/strategies/grid.d.ts.map +1 -0
- package/dist/strategies/grid.js +161 -0
- package/dist/strategies/grid.js.map +1 -0
- package/dist/strategies/stop-loss.d.ts +55 -0
- package/dist/strategies/stop-loss.d.ts.map +1 -0
- package/dist/strategies/stop-loss.js +152 -0
- package/dist/strategies/stop-loss.js.map +1 -0
- package/dist/strategy.d.ts +72 -0
- package/dist/strategy.d.ts.map +1 -0
- package/dist/strategy.js +78 -0
- package/dist/strategy.js.map +1 -0
- package/package.json +1 -1
package/dist/networks.js
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Network configurations for AEL Protocol
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.INTENT_TYPES = exports.EIP712_DOMAIN = exports.TOKEN_INFO = exports.NETWORKS = void 0;
|
|
7
|
+
exports.getNetwork = getNetwork;
|
|
8
|
+
exports.resolveToken = resolveToken;
|
|
9
|
+
exports.getTokenDecimals = getTokenDecimals;
|
|
10
|
+
exports.getTokenSymbol = getTokenSymbol;
|
|
11
|
+
const chains_1 = require("viem/chains");
|
|
12
|
+
exports.NETWORKS = {
|
|
13
|
+
base: {
|
|
14
|
+
chainId: 8453,
|
|
15
|
+
chain: chains_1.base,
|
|
16
|
+
name: 'Base Mainnet',
|
|
17
|
+
rpcUrl: 'https://mainnet.base.org',
|
|
18
|
+
contracts: {
|
|
19
|
+
router: '0x85977BD37d8100F81566A1c6815047f5557bCDCB',
|
|
20
|
+
solverRegistry: '0xd14D394631C32Ea35fFF8407157C6867bCc8E946',
|
|
21
|
+
feeVault: '0xF8E3646b03a83465D6DAE65edbF380C77feb5DE0',
|
|
22
|
+
market: '0xA114e245A4096B8E8821E4344D8FE7E1a8DEFC57',
|
|
23
|
+
},
|
|
24
|
+
tokens: {
|
|
25
|
+
ETH: '0x0000000000000000000000000000000000000000',
|
|
26
|
+
WETH: '0x4200000000000000000000000000000000000006',
|
|
27
|
+
USDC: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
|
|
28
|
+
},
|
|
29
|
+
uniswap: {
|
|
30
|
+
quoterV2: '0x3d4e44Eb1374240CE5F1B871ab261CD16335B76a',
|
|
31
|
+
swapRouter: '0x2626664c2603336E57B271c5C0b26F421741e481',
|
|
32
|
+
factory: '0x33128a8fC17869897dcE68Ed026d694621f6FDfD',
|
|
33
|
+
},
|
|
34
|
+
explorer: 'https://basescan.org',
|
|
35
|
+
},
|
|
36
|
+
'base-sepolia': {
|
|
37
|
+
chainId: 84532,
|
|
38
|
+
chain: chains_1.baseSepolia,
|
|
39
|
+
name: 'Base Sepolia',
|
|
40
|
+
rpcUrl: 'https://sepolia.base.org',
|
|
41
|
+
contracts: {
|
|
42
|
+
router: '0x0000000000000000000000000000000000000000', // TODO: Deploy to testnet
|
|
43
|
+
solverRegistry: '0x0000000000000000000000000000000000000000',
|
|
44
|
+
feeVault: '0x0000000000000000000000000000000000000000',
|
|
45
|
+
market: '0x0000000000000000000000000000000000000000',
|
|
46
|
+
},
|
|
47
|
+
tokens: {
|
|
48
|
+
ETH: '0x0000000000000000000000000000000000000000',
|
|
49
|
+
WETH: '0x4200000000000000000000000000000000000006',
|
|
50
|
+
USDC: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',
|
|
51
|
+
},
|
|
52
|
+
uniswap: {
|
|
53
|
+
quoterV2: '0xC5290058841028F1614F3A6F0F5816cAd0df5E27',
|
|
54
|
+
swapRouter: '0x94cC0AaC535CCDB3C01d6787D6413C739ae12bc4',
|
|
55
|
+
factory: '0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24',
|
|
56
|
+
},
|
|
57
|
+
explorer: 'https://sepolia.basescan.org',
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
// Token info with decimals
|
|
61
|
+
exports.TOKEN_INFO = {
|
|
62
|
+
'0x0000000000000000000000000000000000000000': { symbol: 'ETH', decimals: 18 },
|
|
63
|
+
'0x4200000000000000000000000000000000000006': { symbol: 'WETH', decimals: 18 },
|
|
64
|
+
'0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913': { symbol: 'USDC', decimals: 6 },
|
|
65
|
+
'0x036CbD53842c5426634e7929541eC2318f3dCF7e': { symbol: 'USDC', decimals: 6 },
|
|
66
|
+
};
|
|
67
|
+
// EIP-712 Domain (must match contract)
|
|
68
|
+
exports.EIP712_DOMAIN = {
|
|
69
|
+
name: 'AEL Router',
|
|
70
|
+
version: '2',
|
|
71
|
+
};
|
|
72
|
+
exports.INTENT_TYPES = {
|
|
73
|
+
AgentIntent: [
|
|
74
|
+
{ name: 'agent', type: 'address' },
|
|
75
|
+
{ name: 'tokenIn', type: 'address' },
|
|
76
|
+
{ name: 'tokenOut', type: 'address' },
|
|
77
|
+
{ name: 'amountIn', type: 'uint256' },
|
|
78
|
+
{ name: 'minAmountOut', type: 'uint256' },
|
|
79
|
+
{ name: 'deadline', type: 'uint256' },
|
|
80
|
+
{ name: 'nonce', type: 'uint256' },
|
|
81
|
+
],
|
|
82
|
+
};
|
|
83
|
+
function getNetwork(name) {
|
|
84
|
+
const network = exports.NETWORKS[name];
|
|
85
|
+
if (!network) {
|
|
86
|
+
throw new Error(`Unknown network: ${name}. Available: ${Object.keys(exports.NETWORKS).join(', ')}`);
|
|
87
|
+
}
|
|
88
|
+
return network;
|
|
89
|
+
}
|
|
90
|
+
function resolveToken(symbol, network) {
|
|
91
|
+
const upper = symbol.toUpperCase();
|
|
92
|
+
const token = network.tokens[upper];
|
|
93
|
+
if (!token) {
|
|
94
|
+
throw new Error(`Unknown token: ${symbol}. Available: ${Object.keys(network.tokens).join(', ')}`);
|
|
95
|
+
}
|
|
96
|
+
return token;
|
|
97
|
+
}
|
|
98
|
+
function getTokenDecimals(address) {
|
|
99
|
+
const info = exports.TOKEN_INFO[address.toLowerCase()] || exports.TOKEN_INFO[address];
|
|
100
|
+
return info?.decimals ?? 18;
|
|
101
|
+
}
|
|
102
|
+
function getTokenSymbol(address) {
|
|
103
|
+
const info = exports.TOKEN_INFO[address.toLowerCase()] || exports.TOKEN_INFO[address];
|
|
104
|
+
return info?.symbol ?? 'UNKNOWN';
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=networks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"networks.js","sourceRoot":"","sources":["../src/networks.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Natural language trade parser
|
|
3
|
+
* Supports formats:
|
|
4
|
+
* - '0.1 ETH -> USDC'
|
|
5
|
+
* - '100 USDC -> ETH'
|
|
6
|
+
* - 'sell 0.5 ETH buy USDC'
|
|
7
|
+
* - 'swap 1 ETH for USDC'
|
|
8
|
+
* - { sell: { token: 'ETH', amount: '0.1' }, buy: { token: 'USDC' }, maxSlippage: 0.5 }
|
|
9
|
+
*/
|
|
10
|
+
export interface ParsedTrade {
|
|
11
|
+
sellToken: string;
|
|
12
|
+
sellAmount: string;
|
|
13
|
+
buyToken: string;
|
|
14
|
+
maxSlippage?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface TradeObject {
|
|
17
|
+
sell: {
|
|
18
|
+
token: string;
|
|
19
|
+
amount: string;
|
|
20
|
+
};
|
|
21
|
+
buy: {
|
|
22
|
+
token: string;
|
|
23
|
+
};
|
|
24
|
+
maxSlippage?: number;
|
|
25
|
+
}
|
|
26
|
+
export type TradeInput = string | TradeObject;
|
|
27
|
+
/**
|
|
28
|
+
* Parse trade input into structured format
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseTrade(input: TradeInput): ParsedTrade;
|
|
31
|
+
/**
|
|
32
|
+
* Format trade for display
|
|
33
|
+
*/
|
|
34
|
+
export declare function formatTrade(trade: ParsedTrade): string;
|
|
35
|
+
/**
|
|
36
|
+
* Validate parsed trade
|
|
37
|
+
*/
|
|
38
|
+
export declare function validateTrade(trade: ParsedTrade): void;
|
|
39
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,WAAW,CAAC;AAE9C;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAKzD;AAgGD;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAGtD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAuBtD"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Natural language trade parser
|
|
4
|
+
* Supports formats:
|
|
5
|
+
* - '0.1 ETH -> USDC'
|
|
6
|
+
* - '100 USDC -> ETH'
|
|
7
|
+
* - 'sell 0.5 ETH buy USDC'
|
|
8
|
+
* - 'swap 1 ETH for USDC'
|
|
9
|
+
* - { sell: { token: 'ETH', amount: '0.1' }, buy: { token: 'USDC' }, maxSlippage: 0.5 }
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.parseTrade = parseTrade;
|
|
13
|
+
exports.formatTrade = formatTrade;
|
|
14
|
+
exports.validateTrade = validateTrade;
|
|
15
|
+
/**
|
|
16
|
+
* Parse trade input into structured format
|
|
17
|
+
*/
|
|
18
|
+
function parseTrade(input) {
|
|
19
|
+
if (typeof input === 'object') {
|
|
20
|
+
return parseTradeObject(input);
|
|
21
|
+
}
|
|
22
|
+
return parseTradeString(input);
|
|
23
|
+
}
|
|
24
|
+
function parseTradeObject(obj) {
|
|
25
|
+
if (!obj.sell?.token || !obj.sell?.amount || !obj.buy?.token) {
|
|
26
|
+
throw new Error('Invalid trade object. Required: { sell: { token, amount }, buy: { token } }');
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
sellToken: normalizeToken(obj.sell.token),
|
|
30
|
+
sellAmount: obj.sell.amount.toString(),
|
|
31
|
+
buyToken: normalizeToken(obj.buy.token),
|
|
32
|
+
maxSlippage: obj.maxSlippage,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function parseTradeString(input) {
|
|
36
|
+
const normalized = input.trim().toLowerCase();
|
|
37
|
+
// Pattern 1: '0.1 ETH -> USDC' or '0.1 ETH → USDC'
|
|
38
|
+
const arrowMatch = normalized.match(/^([\d.]+)\s*(\w+)\s*(?:->|→|to)\s*(\w+)$/i);
|
|
39
|
+
if (arrowMatch) {
|
|
40
|
+
return {
|
|
41
|
+
sellToken: normalizeToken(arrowMatch[2]),
|
|
42
|
+
sellAmount: arrowMatch[1],
|
|
43
|
+
buyToken: normalizeToken(arrowMatch[3]),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// Pattern 2: 'sell 0.5 ETH buy USDC'
|
|
47
|
+
const sellBuyMatch = normalized.match(/^sell\s+([\d.]+)\s*(\w+)\s+buy\s+(\w+)$/i);
|
|
48
|
+
if (sellBuyMatch) {
|
|
49
|
+
return {
|
|
50
|
+
sellToken: normalizeToken(sellBuyMatch[2]),
|
|
51
|
+
sellAmount: sellBuyMatch[1],
|
|
52
|
+
buyToken: normalizeToken(sellBuyMatch[3]),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// Pattern 3: 'swap 1 ETH for USDC'
|
|
56
|
+
const swapMatch = normalized.match(/^swap\s+([\d.]+)\s*(\w+)\s+(?:for|to)\s+(\w+)$/i);
|
|
57
|
+
if (swapMatch) {
|
|
58
|
+
return {
|
|
59
|
+
sellToken: normalizeToken(swapMatch[2]),
|
|
60
|
+
sellAmount: swapMatch[1],
|
|
61
|
+
buyToken: normalizeToken(swapMatch[3]),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// Pattern 4: 'buy USDC with 0.1 ETH'
|
|
65
|
+
const buyWithMatch = normalized.match(/^buy\s+(\w+)\s+with\s+([\d.]+)\s*(\w+)$/i);
|
|
66
|
+
if (buyWithMatch) {
|
|
67
|
+
return {
|
|
68
|
+
sellToken: normalizeToken(buyWithMatch[3]),
|
|
69
|
+
sellAmount: buyWithMatch[2],
|
|
70
|
+
buyToken: normalizeToken(buyWithMatch[1]),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// Pattern 5: 'convert 100 USDC to ETH'
|
|
74
|
+
const convertMatch = normalized.match(/^convert\s+([\d.]+)\s*(\w+)\s+to\s+(\w+)$/i);
|
|
75
|
+
if (convertMatch) {
|
|
76
|
+
return {
|
|
77
|
+
sellToken: normalizeToken(convertMatch[2]),
|
|
78
|
+
sellAmount: convertMatch[1],
|
|
79
|
+
buyToken: normalizeToken(convertMatch[3]),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
throw new Error(`Cannot parse trade: "${input}". ` +
|
|
83
|
+
`Supported formats: "0.1 ETH -> USDC", "sell 0.5 ETH buy USDC", "swap 1 ETH for USDC"`);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Normalize token symbol
|
|
87
|
+
*/
|
|
88
|
+
function normalizeToken(token) {
|
|
89
|
+
const upper = token.toUpperCase().trim();
|
|
90
|
+
// Common aliases
|
|
91
|
+
const aliases = {
|
|
92
|
+
ETHER: 'ETH',
|
|
93
|
+
ETHEREUM: 'ETH',
|
|
94
|
+
WRAPPED: 'WETH',
|
|
95
|
+
'WRAPPED ETH': 'WETH',
|
|
96
|
+
'WRAPPED ETHER': 'WETH',
|
|
97
|
+
USD: 'USDC',
|
|
98
|
+
'USD COIN': 'USDC',
|
|
99
|
+
DOLLAR: 'USDC',
|
|
100
|
+
DOLLARS: 'USDC',
|
|
101
|
+
};
|
|
102
|
+
return aliases[upper] || upper;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Format trade for display
|
|
106
|
+
*/
|
|
107
|
+
function formatTrade(trade) {
|
|
108
|
+
const slippage = trade.maxSlippage ? ` (${trade.maxSlippage}% slippage)` : '';
|
|
109
|
+
return `${trade.sellAmount} ${trade.sellToken} -> ${trade.buyToken}${slippage}`;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Validate parsed trade
|
|
113
|
+
*/
|
|
114
|
+
function validateTrade(trade) {
|
|
115
|
+
const amount = parseFloat(trade.sellAmount);
|
|
116
|
+
if (isNaN(amount) || amount <= 0) {
|
|
117
|
+
throw new Error(`Invalid amount: ${trade.sellAmount}`);
|
|
118
|
+
}
|
|
119
|
+
if (!trade.sellToken) {
|
|
120
|
+
throw new Error('Sell token is required');
|
|
121
|
+
}
|
|
122
|
+
if (!trade.buyToken) {
|
|
123
|
+
throw new Error('Buy token is required');
|
|
124
|
+
}
|
|
125
|
+
if (trade.sellToken === trade.buyToken) {
|
|
126
|
+
throw new Error('Sell and buy tokens must be different');
|
|
127
|
+
}
|
|
128
|
+
if (trade.maxSlippage !== undefined) {
|
|
129
|
+
if (trade.maxSlippage < 0 || trade.maxSlippage > 50) {
|
|
130
|
+
throw new Error('Slippage must be between 0 and 50%');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DCA (Dollar Cost Averaging) Strategy
|
|
3
|
+
* Executes trades at regular intervals to average out price volatility
|
|
4
|
+
*/
|
|
5
|
+
import { Strategy, StrategyConfig, StrategyStatus } from '../strategy';
|
|
6
|
+
import type { AgentWallet } from '../agent-wallet';
|
|
7
|
+
import type { MarketFeed } from '../market';
|
|
8
|
+
export interface DCAConfig extends StrategyConfig {
|
|
9
|
+
side: 'buy' | 'sell';
|
|
10
|
+
amountPerTrade: string;
|
|
11
|
+
interval: string | number;
|
|
12
|
+
totalBudget: string;
|
|
13
|
+
}
|
|
14
|
+
export interface DCAStatus extends StrategyStatus {
|
|
15
|
+
totalSpent: string;
|
|
16
|
+
totalReceived: string;
|
|
17
|
+
avgPrice: number;
|
|
18
|
+
budgetRemaining: string;
|
|
19
|
+
nextTradeAt?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare class DCAStrategy extends Strategy<DCAConfig, DCAStatus> {
|
|
22
|
+
private wallet;
|
|
23
|
+
private marketFeed;
|
|
24
|
+
private tradeInterval?;
|
|
25
|
+
private totalSpent;
|
|
26
|
+
private totalReceived;
|
|
27
|
+
private spentToken;
|
|
28
|
+
private receivedToken;
|
|
29
|
+
private budget;
|
|
30
|
+
private amountPerTrade;
|
|
31
|
+
private nextTradeAt?;
|
|
32
|
+
constructor(wallet: AgentWallet, marketFeed: MarketFeed, config: DCAConfig);
|
|
33
|
+
start(): void;
|
|
34
|
+
stop(): void;
|
|
35
|
+
status(): DCAStatus;
|
|
36
|
+
private executeTrade;
|
|
37
|
+
private complete;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=dca.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dca.d.ts","sourceRoot":"","sources":["../../src/strategies/dca.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,iBAAiB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,WAAW,SAAU,SAAQ,cAAc;IAC/C,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAU,SAAQ,cAAc;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,WAAY,SAAQ,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC7D,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAC,CAAiB;IAEvC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAC,CAAS;gBAEjB,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS;IA+B1E,KAAK,IAAI,IAAI;IAqBJ,IAAI,IAAI,IAAI;IASrB,MAAM,IAAI,SAAS;YAiBL,YAAY;IAwC1B,OAAO,CAAC,QAAQ;CAIjB"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DCA (Dollar Cost Averaging) Strategy
|
|
4
|
+
* Executes trades at regular intervals to average out price volatility
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DCAStrategy = void 0;
|
|
8
|
+
const strategy_1 = require("../strategy");
|
|
9
|
+
class DCAStrategy extends strategy_1.Strategy {
|
|
10
|
+
wallet;
|
|
11
|
+
marketFeed;
|
|
12
|
+
tradeInterval;
|
|
13
|
+
totalSpent = 0;
|
|
14
|
+
totalReceived = 0;
|
|
15
|
+
spentToken;
|
|
16
|
+
receivedToken;
|
|
17
|
+
budget;
|
|
18
|
+
amountPerTrade;
|
|
19
|
+
nextTradeAt;
|
|
20
|
+
constructor(wallet, marketFeed, config) {
|
|
21
|
+
super(config);
|
|
22
|
+
this.wallet = wallet;
|
|
23
|
+
this.marketFeed = marketFeed;
|
|
24
|
+
// Parse amounts
|
|
25
|
+
const { amount: budgetAmount, token: budgetToken } = this.parseAmount(config.totalBudget);
|
|
26
|
+
const { amount: tradeAmount, token: tradeToken } = this.parseAmount(config.amountPerTrade);
|
|
27
|
+
this.budget = parseFloat(budgetAmount);
|
|
28
|
+
this.amountPerTrade = parseFloat(tradeAmount);
|
|
29
|
+
// Determine spent/received tokens based on side and pair
|
|
30
|
+
const [baseToken, quoteToken] = config.pair.split(/[\/\-]/).map(t => t.toUpperCase());
|
|
31
|
+
if (config.side === 'buy') {
|
|
32
|
+
// Buying base token with quote token
|
|
33
|
+
this.spentToken = quoteToken;
|
|
34
|
+
this.receivedToken = baseToken;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Selling base token for quote token
|
|
38
|
+
this.spentToken = baseToken;
|
|
39
|
+
this.receivedToken = quoteToken;
|
|
40
|
+
}
|
|
41
|
+
// Validate tokens match
|
|
42
|
+
if (budgetToken !== this.spentToken || tradeToken !== this.spentToken) {
|
|
43
|
+
throw new Error(`Budget and trade amounts must be in ${this.spentToken}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
start() {
|
|
47
|
+
if (this._running)
|
|
48
|
+
return;
|
|
49
|
+
this._running = true;
|
|
50
|
+
this._startedAt = Date.now();
|
|
51
|
+
const intervalMs = this.parsePeriodMs(this.config.interval);
|
|
52
|
+
// Execute first trade immediately
|
|
53
|
+
this.executeTrade();
|
|
54
|
+
// Schedule subsequent trades
|
|
55
|
+
this.tradeInterval = setInterval(() => {
|
|
56
|
+
if (this._running) {
|
|
57
|
+
this.executeTrade();
|
|
58
|
+
}
|
|
59
|
+
}, intervalMs);
|
|
60
|
+
this.nextTradeAt = Date.now() + intervalMs;
|
|
61
|
+
}
|
|
62
|
+
stop() {
|
|
63
|
+
super.stop();
|
|
64
|
+
if (this.tradeInterval) {
|
|
65
|
+
clearInterval(this.tradeInterval);
|
|
66
|
+
this.tradeInterval = undefined;
|
|
67
|
+
}
|
|
68
|
+
this.nextTradeAt = undefined;
|
|
69
|
+
}
|
|
70
|
+
status() {
|
|
71
|
+
const avgPrice = this.totalReceived > 0
|
|
72
|
+
? this.totalSpent / this.totalReceived
|
|
73
|
+
: 0;
|
|
74
|
+
return {
|
|
75
|
+
running: this._running,
|
|
76
|
+
startedAt: this._startedAt,
|
|
77
|
+
tradesCompleted: this._tradesCompleted,
|
|
78
|
+
totalSpent: `${this.totalSpent.toFixed(6)} ${this.spentToken}`,
|
|
79
|
+
totalReceived: `${this.totalReceived.toFixed(6)} ${this.receivedToken}`,
|
|
80
|
+
avgPrice: parseFloat(avgPrice.toFixed(6)),
|
|
81
|
+
budgetRemaining: `${(this.budget - this.totalSpent).toFixed(6)} ${this.spentToken}`,
|
|
82
|
+
nextTradeAt: this.nextTradeAt,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async executeTrade() {
|
|
86
|
+
try {
|
|
87
|
+
// Check if we have budget remaining
|
|
88
|
+
const remaining = this.budget - this.totalSpent;
|
|
89
|
+
if (remaining <= 0) {
|
|
90
|
+
this.complete();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Determine trade amount (use remaining if less than amountPerTrade)
|
|
94
|
+
const tradeAmount = Math.min(this.amountPerTrade, remaining);
|
|
95
|
+
// Build trade string
|
|
96
|
+
const tradeStr = this.config.side === 'buy'
|
|
97
|
+
? `${tradeAmount} ${this.spentToken} -> ${this.receivedToken}`
|
|
98
|
+
: `${tradeAmount} ${this.spentToken} -> ${this.receivedToken}`;
|
|
99
|
+
// Execute trade
|
|
100
|
+
const result = await this.wallet.trade(tradeStr);
|
|
101
|
+
// Update totals
|
|
102
|
+
this.totalSpent += parseFloat(result.amountIn);
|
|
103
|
+
this.totalReceived += parseFloat(result.amountOut);
|
|
104
|
+
this._tradesCompleted++;
|
|
105
|
+
// Update next trade time
|
|
106
|
+
const intervalMs = this.parsePeriodMs(this.config.interval);
|
|
107
|
+
this.nextTradeAt = Date.now() + intervalMs;
|
|
108
|
+
this.emit('trade', result);
|
|
109
|
+
// Check if budget exhausted
|
|
110
|
+
if (this.totalSpent >= this.budget) {
|
|
111
|
+
this.complete();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
this.emit('error', error instanceof Error ? error : new Error(String(error)));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
complete() {
|
|
119
|
+
this.stop();
|
|
120
|
+
this.emit('complete', this.status());
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
exports.DCAStrategy = DCAStrategy;
|
|
124
|
+
//# sourceMappingURL=dca.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dca.js","sourceRoot":"","sources":["../../src/strategies/dca.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grid Trading Strategy
|
|
3
|
+
* Places buy orders below current price and sell orders above
|
|
4
|
+
* Profits from price oscillation within a range
|
|
5
|
+
*/
|
|
6
|
+
import { Strategy, StrategyConfig, StrategyStatus } from '../strategy';
|
|
7
|
+
import type { AgentWallet } from '../agent-wallet';
|
|
8
|
+
import type { MarketFeed } from '../market';
|
|
9
|
+
export interface GridConfig extends StrategyConfig {
|
|
10
|
+
upperPrice: number;
|
|
11
|
+
lowerPrice: number;
|
|
12
|
+
gridCount: number;
|
|
13
|
+
amountPerGrid: string;
|
|
14
|
+
}
|
|
15
|
+
export interface GridLevel {
|
|
16
|
+
price: number;
|
|
17
|
+
status: 'open' | 'filled-buy' | 'filled-sell';
|
|
18
|
+
lastTradeAt?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface GridStatus extends StrategyStatus {
|
|
21
|
+
buys: number;
|
|
22
|
+
sells: number;
|
|
23
|
+
profit: string;
|
|
24
|
+
currentPrice?: number;
|
|
25
|
+
levels: GridLevel[];
|
|
26
|
+
}
|
|
27
|
+
export declare class GridStrategy extends Strategy<GridConfig, GridStatus> {
|
|
28
|
+
private wallet;
|
|
29
|
+
private marketFeed;
|
|
30
|
+
private levels;
|
|
31
|
+
private buys;
|
|
32
|
+
private sells;
|
|
33
|
+
private profit;
|
|
34
|
+
private currentPrice?;
|
|
35
|
+
private lastPrice?;
|
|
36
|
+
private baseToken;
|
|
37
|
+
private quoteToken;
|
|
38
|
+
private amountPerGrid;
|
|
39
|
+
private amountToken;
|
|
40
|
+
constructor(wallet: AgentWallet, marketFeed: MarketFeed, config: GridConfig);
|
|
41
|
+
private initializeLevels;
|
|
42
|
+
start(): void;
|
|
43
|
+
stop(): void;
|
|
44
|
+
status(): GridStatus;
|
|
45
|
+
private onPriceUpdate;
|
|
46
|
+
private checkLevelCrossings;
|
|
47
|
+
private executeBuy;
|
|
48
|
+
private executeSell;
|
|
49
|
+
/**
|
|
50
|
+
* Reset all levels to open state
|
|
51
|
+
*/
|
|
52
|
+
reset(): void;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../src/strategies/grid.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,iBAAiB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,WAAW,CAAC;AAEvD,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,aAAa,CAAC;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,qBAAa,YAAa,SAAQ,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChE,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAa;IAE/B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAC,CAAS;IAE3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU;IAmB3E,OAAO,CAAC,gBAAgB;IAaxB,KAAK,IAAI,IAAI;IAcJ,IAAI,IAAI,IAAI;IAKrB,MAAM,IAAI,UAAU;YAaN,aAAa;YAuBb,mBAAmB;YAiBnB,UAAU;YAuBV,WAAW;IAyBzB;;OAEG;IACH,KAAK,IAAI,IAAI;CAOd"}
|