@rebelfi/agent-sdk 1.0.1
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/README.md +337 -0
- package/dist/amount-utils.d.ts +9 -0
- package/dist/amount-utils.js +80 -0
- package/dist/amount-utils.js.map +1 -0
- package/dist/cjs/amount-utils.js +87 -0
- package/dist/cjs/amount-utils.js.map +1 -0
- package/dist/cjs/cli.js +189 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/cjs/client.js +49 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/commands/account.js +250 -0
- package/dist/cjs/commands/account.js.map +1 -0
- package/dist/cjs/commands/auth.js +78 -0
- package/dist/cjs/commands/auth.js.map +1 -0
- package/dist/cjs/commands/balance.js +15 -0
- package/dist/cjs/commands/balance.js.map +1 -0
- package/dist/cjs/commands/cancel.js +34 -0
- package/dist/cjs/commands/cancel.js.map +1 -0
- package/dist/cjs/commands/chat.js +15 -0
- package/dist/cjs/commands/chat.js.map +1 -0
- package/dist/cjs/commands/claim.js +34 -0
- package/dist/cjs/commands/claim.js.map +1 -0
- package/dist/cjs/commands/config.js +29 -0
- package/dist/cjs/commands/config.js.map +1 -0
- package/dist/cjs/commands/contacts.js +29 -0
- package/dist/cjs/commands/contacts.js.map +1 -0
- package/dist/cjs/commands/init.js +43 -0
- package/dist/cjs/commands/init.js.map +1 -0
- package/dist/cjs/commands/orders.js +167 -0
- package/dist/cjs/commands/orders.js.map +1 -0
- package/dist/cjs/commands/pay.js +41 -0
- package/dist/cjs/commands/pay.js.map +1 -0
- package/dist/cjs/commands/payments.js +27 -0
- package/dist/cjs/commands/payments.js.map +1 -0
- package/dist/cjs/commands/wallet.js +69 -0
- package/dist/cjs/commands/wallet.js.map +1 -0
- package/dist/cjs/config.js +91 -0
- package/dist/cjs/config.js.map +1 -0
- package/dist/cjs/contacts.js +87 -0
- package/dist/cjs/contacts.js.map +1 -0
- package/dist/cjs/errors.js +93 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +64 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/intent/chains.js +29 -0
- package/dist/cjs/intent/chains.js.map +1 -0
- package/dist/cjs/intent/constraints.js +46 -0
- package/dist/cjs/intent/constraints.js.map +1 -0
- package/dist/cjs/intent/helpers.js +34 -0
- package/dist/cjs/intent/helpers.js.map +1 -0
- package/dist/cjs/intent/index.js +99 -0
- package/dist/cjs/intent/index.js.map +1 -0
- package/dist/cjs/intent/matcher.js +119 -0
- package/dist/cjs/intent/matcher.js.map +1 -0
- package/dist/cjs/intent/program-registry.js +68 -0
- package/dist/cjs/intent/program-registry.js.map +1 -0
- package/dist/cjs/intent/token-registry.js +99 -0
- package/dist/cjs/intent/token-registry.js.map +1 -0
- package/dist/cjs/intent/types.js +3 -0
- package/dist/cjs/intent/types.js.map +1 -0
- package/dist/cjs/orders/evaluate.js +168 -0
- package/dist/cjs/orders/evaluate.js.map +1 -0
- package/dist/cjs/orders/index.js +14 -0
- package/dist/cjs/orders/index.js.map +1 -0
- package/dist/cjs/orders/store.js +47 -0
- package/dist/cjs/orders/store.js.map +1 -0
- package/dist/cjs/orders/sugar.js +35 -0
- package/dist/cjs/orders/sugar.js.map +1 -0
- package/dist/cjs/orders/types.js +3 -0
- package/dist/cjs/orders/types.js.map +1 -0
- package/dist/cjs/output.js +47 -0
- package/dist/cjs/output.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/transfers.js +15 -0
- package/dist/cjs/transfers.js.map +1 -0
- package/dist/cjs/validate.js +77 -0
- package/dist/cjs/validate.js.map +1 -0
- package/dist/cjs/verify/decoders/ata.js +19 -0
- package/dist/cjs/verify/decoders/ata.js.map +1 -0
- package/dist/cjs/verify/decoders/compute-budget.js +32 -0
- package/dist/cjs/verify/decoders/compute-budget.js.map +1 -0
- package/dist/cjs/verify/decoders/handshake.js +180 -0
- package/dist/cjs/verify/decoders/handshake.js.map +1 -0
- package/dist/cjs/verify/decoders/jupiter.js +39 -0
- package/dist/cjs/verify/decoders/jupiter.js.map +1 -0
- package/dist/cjs/verify/decoders/memo.js +12 -0
- package/dist/cjs/verify/decoders/memo.js.map +1 -0
- package/dist/cjs/verify/decoders/silkysig.js +162 -0
- package/dist/cjs/verify/decoders/silkysig.js.map +1 -0
- package/dist/cjs/verify/decoders/spl-token.js +125 -0
- package/dist/cjs/verify/decoders/spl-token.js.map +1 -0
- package/dist/cjs/verify/decoders/system.js +87 -0
- package/dist/cjs/verify/decoders/system.js.map +1 -0
- package/dist/cjs/verify/flags.js +87 -0
- package/dist/cjs/verify/flags.js.map +1 -0
- package/dist/cjs/verify/index.js +384 -0
- package/dist/cjs/verify/index.js.map +1 -0
- package/dist/cjs/verify/registry.js +24 -0
- package/dist/cjs/verify/registry.js.map +1 -0
- package/dist/cjs/verify/rpc.js +52 -0
- package/dist/cjs/verify/rpc.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +224 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +7 -0
- package/dist/client.js +43 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/account.d.ts +21 -0
- package/dist/commands/account.js +239 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/auth.d.ts +5 -0
- package/dist/commands/auth.js +70 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/balance.d.ts +3 -0
- package/dist/commands/balance.js +12 -0
- package/dist/commands/balance.js.map +1 -0
- package/dist/commands/cancel.d.ts +3 -0
- package/dist/commands/cancel.js +28 -0
- package/dist/commands/cancel.js.map +1 -0
- package/dist/commands/chat.d.ts +1 -0
- package/dist/commands/chat.js +12 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/claim.d.ts +3 -0
- package/dist/commands/claim.js +28 -0
- package/dist/commands/claim.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.js +24 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/contacts.d.ts +4 -0
- package/dist/commands/contacts.js +23 -0
- package/dist/commands/contacts.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +37 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/orders.d.ts +19 -0
- package/dist/commands/orders.js +157 -0
- package/dist/commands/orders.js.map +1 -0
- package/dist/commands/pay.d.ts +4 -0
- package/dist/commands/pay.js +35 -0
- package/dist/commands/pay.js.map +1 -0
- package/dist/commands/payments.d.ts +4 -0
- package/dist/commands/payments.js +23 -0
- package/dist/commands/payments.js.map +1 -0
- package/dist/commands/wallet.d.ts +7 -0
- package/dist/commands/wallet.js +61 -0
- package/dist/commands/wallet.js.map +1 -0
- package/dist/config.d.ts +40 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/contacts.d.ts +15 -0
- package/dist/contacts.js +74 -0
- package/dist/contacts.js.map +1 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.js +87 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/intent/chains.d.ts +7 -0
- package/dist/intent/chains.js +24 -0
- package/dist/intent/chains.js.map +1 -0
- package/dist/intent/constraints.d.ts +8 -0
- package/dist/intent/constraints.js +43 -0
- package/dist/intent/constraints.js.map +1 -0
- package/dist/intent/helpers.d.ts +6 -0
- package/dist/intent/helpers.js +27 -0
- package/dist/intent/helpers.js.map +1 -0
- package/dist/intent/index.d.ts +11 -0
- package/dist/intent/index.js +87 -0
- package/dist/intent/index.js.map +1 -0
- package/dist/intent/matcher.d.ts +8 -0
- package/dist/intent/matcher.js +116 -0
- package/dist/intent/matcher.js.map +1 -0
- package/dist/intent/program-registry.d.ts +13 -0
- package/dist/intent/program-registry.js +65 -0
- package/dist/intent/program-registry.js.map +1 -0
- package/dist/intent/token-registry.d.ts +17 -0
- package/dist/intent/token-registry.js +96 -0
- package/dist/intent/token-registry.js.map +1 -0
- package/dist/intent/types.d.ts +89 -0
- package/dist/intent/types.js +2 -0
- package/dist/intent/types.js.map +1 -0
- package/dist/orders/evaluate.d.ts +28 -0
- package/dist/orders/evaluate.js +165 -0
- package/dist/orders/evaluate.js.map +1 -0
- package/dist/orders/index.d.ts +7 -0
- package/dist/orders/index.js +4 -0
- package/dist/orders/index.js.map +1 -0
- package/dist/orders/store.d.ts +9 -0
- package/dist/orders/store.js +37 -0
- package/dist/orders/store.js.map +1 -0
- package/dist/orders/sugar.d.ts +13 -0
- package/dist/orders/sugar.js +32 -0
- package/dist/orders/sugar.js.map +1 -0
- package/dist/orders/types.d.ts +37 -0
- package/dist/orders/types.js +2 -0
- package/dist/orders/types.js.map +1 -0
- package/dist/output.d.ts +4 -0
- package/dist/output.js +42 -0
- package/dist/output.js.map +1 -0
- package/dist/transfers.d.ts +32 -0
- package/dist/transfers.js +12 -0
- package/dist/transfers.js.map +1 -0
- package/dist/validate.d.ts +8 -0
- package/dist/validate.js +69 -0
- package/dist/validate.js.map +1 -0
- package/dist/verify/decoders/ata.d.ts +5 -0
- package/dist/verify/decoders/ata.js +16 -0
- package/dist/verify/decoders/ata.js.map +1 -0
- package/dist/verify/decoders/compute-budget.d.ts +5 -0
- package/dist/verify/decoders/compute-budget.js +29 -0
- package/dist/verify/decoders/compute-budget.js.map +1 -0
- package/dist/verify/decoders/handshake.d.ts +5 -0
- package/dist/verify/decoders/handshake.js +177 -0
- package/dist/verify/decoders/handshake.js.map +1 -0
- package/dist/verify/decoders/jupiter.d.ts +5 -0
- package/dist/verify/decoders/jupiter.js +36 -0
- package/dist/verify/decoders/jupiter.js.map +1 -0
- package/dist/verify/decoders/memo.d.ts +5 -0
- package/dist/verify/decoders/memo.js +9 -0
- package/dist/verify/decoders/memo.js.map +1 -0
- package/dist/verify/decoders/silkysig.d.ts +5 -0
- package/dist/verify/decoders/silkysig.js +159 -0
- package/dist/verify/decoders/silkysig.js.map +1 -0
- package/dist/verify/decoders/spl-token.d.ts +5 -0
- package/dist/verify/decoders/spl-token.js +122 -0
- package/dist/verify/decoders/spl-token.js.map +1 -0
- package/dist/verify/decoders/system.d.ts +5 -0
- package/dist/verify/decoders/system.js +84 -0
- package/dist/verify/decoders/system.js.map +1 -0
- package/dist/verify/flags.d.ts +3 -0
- package/dist/verify/flags.js +83 -0
- package/dist/verify/flags.js.map +1 -0
- package/dist/verify/index.d.ts +75 -0
- package/dist/verify/index.js +380 -0
- package/dist/verify/index.js.map +1 -0
- package/dist/verify/registry.d.ts +13 -0
- package/dist/verify/registry.js +21 -0
- package/dist/verify/registry.js.map +1 -0
- package/dist/verify/rpc.d.ts +14 -0
- package/dist/verify/rpc.js +48 -0
- package/dist/verify/rpc.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { evaluateConstraint } from './constraints.js';
|
|
2
|
+
import { normalizeAddress } from './chains.js';
|
|
3
|
+
import { extractAmountFromHuman } from '../amount-utils.js';
|
|
4
|
+
// Known actions that get deep field-level verification
|
|
5
|
+
const KNOWN_ACTIONS = new Set([
|
|
6
|
+
'transfer', 'swap', 'stake', 'lend', 'borrow', 'approve', 'withdraw',
|
|
7
|
+
]);
|
|
8
|
+
export function matchIntent(actions, instructions, globalFlags, chain, strict, expectedProgram) {
|
|
9
|
+
const discrepancies = [];
|
|
10
|
+
let lowestConfidence = 'full';
|
|
11
|
+
// Error-severity flags are automatic failures
|
|
12
|
+
for (const flag of globalFlags) {
|
|
13
|
+
if (flag.severity === 'error') {
|
|
14
|
+
discrepancies.push(flag.message);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// Match each action against the instructions
|
|
18
|
+
const usedIndices = new Set();
|
|
19
|
+
for (const action of actions) {
|
|
20
|
+
const actionResult = matchSingleAction(action, instructions, usedIndices, chain, expectedProgram);
|
|
21
|
+
discrepancies.push(...actionResult.discrepancies);
|
|
22
|
+
if (confidenceRank(actionResult.confidence) < confidenceRank(lowestConfidence)) {
|
|
23
|
+
lowestConfidence = actionResult.confidence;
|
|
24
|
+
}
|
|
25
|
+
if (actionResult.matchedIndex !== null) {
|
|
26
|
+
usedIndices.add(actionResult.matchedIndex);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// In strict mode, check for unaccounted instructions
|
|
30
|
+
if (strict) {
|
|
31
|
+
for (const ix of instructions) {
|
|
32
|
+
if (!usedIndices.has(ix.index) && !isAncillary(ix)) {
|
|
33
|
+
discrepancies.push(`Strict mode: instruction ${ix.index} (${ix.type ?? ix.programId}) is not part of the intent.`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const matched = discrepancies.length === 0 && lowestConfidence !== 'unverified';
|
|
38
|
+
return { matched, confidence: lowestConfidence, discrepancies };
|
|
39
|
+
}
|
|
40
|
+
function matchSingleAction(action, instructions, usedIndices, chain, expectedProgram) {
|
|
41
|
+
const discrepancies = [];
|
|
42
|
+
// Find matching instruction by action/type
|
|
43
|
+
const match = instructions.find((ix) => ix.type === action.action && !usedIndices.has(ix.index));
|
|
44
|
+
if (!match) {
|
|
45
|
+
discrepancies.push(`Expected a '${action.action}' instruction but none was found in the transaction.`);
|
|
46
|
+
return { confidence: 'full', discrepancies, matchedIndex: null };
|
|
47
|
+
}
|
|
48
|
+
// Check expected program
|
|
49
|
+
if (expectedProgram && match.programId !== expectedProgram) {
|
|
50
|
+
discrepancies.push(`Expected program ${expectedProgram} but instruction calls ${match.programId}`);
|
|
51
|
+
}
|
|
52
|
+
// Unknown actions get structural match only
|
|
53
|
+
if (!KNOWN_ACTIONS.has(action.action)) {
|
|
54
|
+
return { confidence: 'unverified', discrepancies, matchedIndex: match.index };
|
|
55
|
+
}
|
|
56
|
+
// Deep field comparison for known actions
|
|
57
|
+
const params = match.params;
|
|
58
|
+
const fieldDiscrepancies = compareFields(action, params, chain);
|
|
59
|
+
discrepancies.push(...fieldDiscrepancies);
|
|
60
|
+
return { confidence: 'full', discrepancies, matchedIndex: match.index };
|
|
61
|
+
}
|
|
62
|
+
function compareFields(action, params, chain) {
|
|
63
|
+
const discrepancies = [];
|
|
64
|
+
// Address fields to compare
|
|
65
|
+
const addressFields = ['from', 'to', 'owner', 'spender', 'validator'];
|
|
66
|
+
for (const field of addressFields) {
|
|
67
|
+
const intentValue = action[field];
|
|
68
|
+
const paramValue = params[field];
|
|
69
|
+
if (intentValue && paramValue) {
|
|
70
|
+
if (normalizeAddress(intentValue, chain) !== normalizeAddress(paramValue, chain)) {
|
|
71
|
+
discrepancies.push(`Field '${field}' mismatch: expected ${intentValue}, got ${paramValue}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Amount fields to compare (with constraint support)
|
|
76
|
+
const amountFields = ['amount', 'amountIn', 'amountOut'];
|
|
77
|
+
for (const field of amountFields) {
|
|
78
|
+
const intentValue = action[field];
|
|
79
|
+
if (intentValue === undefined)
|
|
80
|
+
continue;
|
|
81
|
+
const humanKey = field === 'amount' ? 'amountHuman' : `${field}Human`;
|
|
82
|
+
const humanStr = params[humanKey];
|
|
83
|
+
if (!humanStr)
|
|
84
|
+
continue;
|
|
85
|
+
const actual = extractAmountFromHuman(humanStr);
|
|
86
|
+
if (!actual)
|
|
87
|
+
continue;
|
|
88
|
+
if (!evaluateConstraint(intentValue, actual)) {
|
|
89
|
+
discrepancies.push(`Field '${field}' mismatch: expected ${JSON.stringify(intentValue)}, got ${humanStr}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Memo field (exact match)
|
|
93
|
+
const intentMemo = action['memo'];
|
|
94
|
+
const paramMemo = params['memo'];
|
|
95
|
+
if (intentMemo && paramMemo && intentMemo !== paramMemo) {
|
|
96
|
+
discrepancies.push(`Memo mismatch: expected "${intentMemo}", got "${paramMemo}"`);
|
|
97
|
+
}
|
|
98
|
+
return discrepancies;
|
|
99
|
+
}
|
|
100
|
+
function confidenceRank(c) {
|
|
101
|
+
switch (c) {
|
|
102
|
+
case 'full': return 2;
|
|
103
|
+
case 'partial': return 1;
|
|
104
|
+
case 'unverified': return 0;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Instructions that are considered ancillary (not part of the user's intent)
|
|
108
|
+
const ANCILLARY_TYPES = new Set([
|
|
109
|
+
'set_compute_unit_price', 'set_compute_unit_limit',
|
|
110
|
+
'memo',
|
|
111
|
+
'create', 'create_idempotent',
|
|
112
|
+
]);
|
|
113
|
+
function isAncillary(ix) {
|
|
114
|
+
return ANCILLARY_TYPES.has(ix.type ?? '');
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/intent/matcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ProgramInfo {
|
|
2
|
+
address: string;
|
|
3
|
+
name: string;
|
|
4
|
+
}
|
|
5
|
+
type OverrideMap = Record<string, Record<string, Record<string, {
|
|
6
|
+
address: string;
|
|
7
|
+
}>>>;
|
|
8
|
+
export declare function createProgramRegistry(overrides?: OverrideMap): {
|
|
9
|
+
resolveName: (chain: string, network: string, name: string) => ProgramInfo | null;
|
|
10
|
+
resolveAddress: (chain: string, network: string, address: string) => ProgramInfo | null;
|
|
11
|
+
crossCheck: (chain: string, network: string, name: string, address: string) => boolean;
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { isEvmChain } from './chains.js';
|
|
2
|
+
// ─── Bundled program data ────────────────────────────────────
|
|
3
|
+
// Structure: chain → network → name → { address }
|
|
4
|
+
const BUNDLED_PROGRAMS = {
|
|
5
|
+
solana: {
|
|
6
|
+
mainnet: {
|
|
7
|
+
handshake: { address: 'HANDu9uNdnraNbcueGfXhd3UPu6BXfQroKAsSxFhPXEQ' },
|
|
8
|
+
silkysig: { address: 'SiLKos3MCFggwLsjSeuRiCdcs2MLoJNwq59XwTvEwcS' },
|
|
9
|
+
jupiter: { address: 'JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4' },
|
|
10
|
+
},
|
|
11
|
+
devnet: {
|
|
12
|
+
handshake: { address: 'HANDu9uNdnraNbcueGfXhd3UPu6BXfQroKAsSxFhPXEQ' },
|
|
13
|
+
silkysig: { address: 'SiLKos3MCFggwLsjSeuRiCdcs2MLoJNwq59XwTvEwcS' },
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
export function createProgramRegistry(overrides) {
|
|
18
|
+
const programs = mergeDeep(BUNDLED_PROGRAMS, overrides ?? {});
|
|
19
|
+
function getChainNetwork(chain, network) {
|
|
20
|
+
return programs[chain]?.[network] ?? {};
|
|
21
|
+
}
|
|
22
|
+
function resolveName(chain, network, name) {
|
|
23
|
+
const entry = getChainNetwork(chain, network)[name];
|
|
24
|
+
if (!entry)
|
|
25
|
+
return null;
|
|
26
|
+
return { address: entry.address, name };
|
|
27
|
+
}
|
|
28
|
+
function resolveAddress(chain, network, address) {
|
|
29
|
+
const entries = getChainNetwork(chain, network);
|
|
30
|
+
const evm = isEvmChain(chain);
|
|
31
|
+
const normalizedAddr = evm ? address.toLowerCase() : address;
|
|
32
|
+
for (const [name, entry] of Object.entries(entries)) {
|
|
33
|
+
const entryAddr = evm ? entry.address.toLowerCase() : entry.address;
|
|
34
|
+
if (entryAddr === normalizedAddr) {
|
|
35
|
+
return { address: entry.address, name };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
function crossCheck(chain, network, name, address) {
|
|
41
|
+
const resolved = resolveName(chain, network, name);
|
|
42
|
+
if (!resolved)
|
|
43
|
+
return false;
|
|
44
|
+
const evm = isEvmChain(chain);
|
|
45
|
+
const a = evm ? resolved.address.toLowerCase() : resolved.address;
|
|
46
|
+
const b = evm ? address.toLowerCase() : address;
|
|
47
|
+
return a === b;
|
|
48
|
+
}
|
|
49
|
+
return { resolveName, resolveAddress, crossCheck };
|
|
50
|
+
}
|
|
51
|
+
function mergeDeep(base, overrides) {
|
|
52
|
+
const result = { ...base };
|
|
53
|
+
for (const [chain, networks] of Object.entries(overrides)) {
|
|
54
|
+
if (!result[chain]) {
|
|
55
|
+
result[chain] = networks;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
result[chain] = { ...result[chain] };
|
|
59
|
+
for (const [network, progs] of Object.entries(networks)) {
|
|
60
|
+
result[chain][network] = { ...result[chain][network], ...progs };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=program-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program-registry.js","sourceRoot":"","sources":["../../src/intent/program-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASzC,gEAAgE;AAChE,kDAAkD;AAElD,MAAM,gBAAgB,GAAwE;IAC5F,MAAM,EAAE;QACN,OAAO,EAAE;YACP,SAAS,EAAE,EAAE,OAAO,EAAE,8CAA8C,EAAE;YACtE,QAAQ,EAAE,EAAE,OAAO,EAAE,6CAA6C,EAAE;YACpE,OAAO,EAAE,EAAE,OAAO,EAAE,6CAA6C,EAAE;SACpE;QACD,MAAM,EAAE;YACN,SAAS,EAAE,EAAE,OAAO,EAAE,8CAA8C,EAAE;YACtE,QAAQ,EAAE,EAAE,OAAO,EAAE,6CAA6C,EAAE;SACrE;KACF;CACF,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,SAAuB;IAC3D,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC;IAE9D,SAAS,eAAe,CAAC,KAAa,EAAE,OAAe;QACrD,OAAO,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,SAAS,WAAW,CAAC,KAAa,EAAE,OAAe,EAAE,IAAY;QAC/D,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,SAAS,cAAc,CAAC,KAAa,EAAE,OAAe,EAAE,OAAe;QACrE,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAE7D,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACpD,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;YACpE,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;gBACjC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,UAAU,CAAC,KAAa,EAAE,OAAe,EAAE,IAAY,EAAE,OAAe;QAC/E,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5B,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAClE,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,SAAS,CAChB,IAAyE,EACzE,SAA8E;IAE9E,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC;YACzB,SAAS;QACX,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;QACnE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface TokenInfo {
|
|
2
|
+
address: string;
|
|
3
|
+
decimals: number;
|
|
4
|
+
symbol?: string;
|
|
5
|
+
}
|
|
6
|
+
type OverrideMap = Record<string, Record<string, Record<string, {
|
|
7
|
+
address: string;
|
|
8
|
+
decimals: number;
|
|
9
|
+
}>>>;
|
|
10
|
+
export declare function createTokenRegistry(overrides?: OverrideMap): {
|
|
11
|
+
resolveSymbol: (chain: string, network: string, symbol: string) => TokenInfo | null;
|
|
12
|
+
resolveAddress: (chain: string, network: string, address: string) => (TokenInfo & {
|
|
13
|
+
symbol: string;
|
|
14
|
+
}) | null;
|
|
15
|
+
crossCheck: (chain: string, network: string, symbol: string, address: string) => boolean;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { isEvmChain } from './chains.js';
|
|
2
|
+
// ─── Bundled token data ───────────────────────────────────────
|
|
3
|
+
// Structure: chain → network → symbol → { address, decimals }
|
|
4
|
+
const BUNDLED_TOKENS = {
|
|
5
|
+
solana: {
|
|
6
|
+
mainnet: {
|
|
7
|
+
USDC: { address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', decimals: 6 },
|
|
8
|
+
USDT: { address: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB', decimals: 6 },
|
|
9
|
+
SOL: { address: 'So11111111111111111111111111111111111111112', decimals: 9 },
|
|
10
|
+
},
|
|
11
|
+
devnet: {
|
|
12
|
+
USDC: { address: 'uSDCYMsmqUKxijtDMwPnkJDnSwXkZ3RFWq6cznL5Lt2', decimals: 6 },
|
|
13
|
+
USDT: { address: 'USdTT7wzvFCGkabDLMfawUm4QZqFm8qVX69SFjcUtXk', decimals: 6 },
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
ethereum: {
|
|
17
|
+
mainnet: {
|
|
18
|
+
USDC: { address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', decimals: 6 },
|
|
19
|
+
USDT: { address: '0xdAC17F958D2ee523a2206206994597C13D831ec7', decimals: 6 },
|
|
20
|
+
WETH: { address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', decimals: 18 },
|
|
21
|
+
},
|
|
22
|
+
sepolia: {
|
|
23
|
+
USDC: { address: '0x7F65D6637485C6744475d0f9220Dce2695b30C3F', decimals: 6 },
|
|
24
|
+
USDT: { address: '0x404171543Fec71E8E9Cdac46cA143bc191482e2A', decimals: 6 },
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
polygon: {
|
|
28
|
+
mainnet: {
|
|
29
|
+
USDC: { address: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359', decimals: 6 },
|
|
30
|
+
USDT: { address: '0xc2132D05D31c914a87C6611C10748AEb04B58e8F', decimals: 6 },
|
|
31
|
+
},
|
|
32
|
+
amoy: {
|
|
33
|
+
USDC: { address: '0xac7AB7E28c295275DA0f66E38e7117EAAD2a10Df', decimals: 6 },
|
|
34
|
+
USDT: { address: '0x452e6e4e90E21B64DFAF33205E1726D75820947E', decimals: 6 },
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
base: {
|
|
38
|
+
mainnet: {
|
|
39
|
+
USDC: { address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', decimals: 6 },
|
|
40
|
+
USDT: { address: '0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2', decimals: 6 },
|
|
41
|
+
},
|
|
42
|
+
sepolia: {
|
|
43
|
+
USDC: { address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', decimals: 6 },
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
export function createTokenRegistry(overrides) {
|
|
48
|
+
// Merge overrides on top of bundled
|
|
49
|
+
const tokens = mergeDeep(BUNDLED_TOKENS, overrides ?? {});
|
|
50
|
+
function getChainNetwork(chain, network) {
|
|
51
|
+
return tokens[chain]?.[network] ?? {};
|
|
52
|
+
}
|
|
53
|
+
function resolveSymbol(chain, network, symbol) {
|
|
54
|
+
const entry = getChainNetwork(chain, network)[symbol];
|
|
55
|
+
if (!entry)
|
|
56
|
+
return null;
|
|
57
|
+
return { address: entry.address, decimals: entry.decimals, symbol };
|
|
58
|
+
}
|
|
59
|
+
function resolveAddress(chain, network, address) {
|
|
60
|
+
const entries = getChainNetwork(chain, network);
|
|
61
|
+
const evm = isEvmChain(chain);
|
|
62
|
+
const normalizedAddr = evm ? address.toLowerCase() : address;
|
|
63
|
+
for (const [symbol, entry] of Object.entries(entries)) {
|
|
64
|
+
const entryAddr = evm ? entry.address.toLowerCase() : entry.address;
|
|
65
|
+
if (entryAddr === normalizedAddr) {
|
|
66
|
+
return { address: entry.address, decimals: entry.decimals, symbol };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
function crossCheck(chain, network, symbol, address) {
|
|
72
|
+
const resolved = resolveSymbol(chain, network, symbol);
|
|
73
|
+
if (!resolved)
|
|
74
|
+
return false;
|
|
75
|
+
const evm = isEvmChain(chain);
|
|
76
|
+
const a = evm ? resolved.address.toLowerCase() : resolved.address;
|
|
77
|
+
const b = evm ? address.toLowerCase() : address;
|
|
78
|
+
return a === b;
|
|
79
|
+
}
|
|
80
|
+
return { resolveSymbol, resolveAddress, crossCheck };
|
|
81
|
+
}
|
|
82
|
+
function mergeDeep(base, overrides) {
|
|
83
|
+
const result = { ...base };
|
|
84
|
+
for (const [chain, networks] of Object.entries(overrides)) {
|
|
85
|
+
if (!result[chain]) {
|
|
86
|
+
result[chain] = networks;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
result[chain] = { ...result[chain] };
|
|
90
|
+
for (const [network, tokens] of Object.entries(networks)) {
|
|
91
|
+
result[chain][network] = { ...result[chain][network], ...tokens };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return result;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=token-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-registry.js","sourceRoot":"","sources":["../../src/intent/token-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { TransactionAnalysis } from '../verify/index.js';
|
|
2
|
+
export type Constraint<T> = T | {
|
|
3
|
+
gte?: T;
|
|
4
|
+
lte?: T;
|
|
5
|
+
gt?: T;
|
|
6
|
+
lt?: T;
|
|
7
|
+
};
|
|
8
|
+
export type TokenRef = {
|
|
9
|
+
tokenSymbol?: string;
|
|
10
|
+
token?: string;
|
|
11
|
+
};
|
|
12
|
+
export type ProgramRef = {
|
|
13
|
+
programName?: string;
|
|
14
|
+
program?: string;
|
|
15
|
+
};
|
|
16
|
+
export type ExecutionRef = {
|
|
17
|
+
signer: string;
|
|
18
|
+
feePayer?: string;
|
|
19
|
+
};
|
|
20
|
+
export type TransferIntent = {
|
|
21
|
+
action: 'transfer';
|
|
22
|
+
from: string;
|
|
23
|
+
to: string;
|
|
24
|
+
amount: Constraint<string>;
|
|
25
|
+
memo?: string;
|
|
26
|
+
} & TokenRef;
|
|
27
|
+
export type SwapIntent = {
|
|
28
|
+
action: 'swap';
|
|
29
|
+
from: string;
|
|
30
|
+
tokenIn: TokenRef;
|
|
31
|
+
tokenOut: TokenRef;
|
|
32
|
+
amountIn?: Constraint<string>;
|
|
33
|
+
amountOut?: Constraint<string>;
|
|
34
|
+
slippage?: number;
|
|
35
|
+
};
|
|
36
|
+
export type StakeIntent = {
|
|
37
|
+
action: 'stake';
|
|
38
|
+
from: string;
|
|
39
|
+
amount: Constraint<string>;
|
|
40
|
+
validator?: string;
|
|
41
|
+
protocol?: string;
|
|
42
|
+
} & TokenRef;
|
|
43
|
+
export type LendIntent = {
|
|
44
|
+
action: 'lend';
|
|
45
|
+
from: string;
|
|
46
|
+
amount: Constraint<string>;
|
|
47
|
+
protocol?: string;
|
|
48
|
+
} & TokenRef;
|
|
49
|
+
export type BorrowIntent = {
|
|
50
|
+
action: 'borrow';
|
|
51
|
+
from: string;
|
|
52
|
+
amount: Constraint<string>;
|
|
53
|
+
protocol?: string;
|
|
54
|
+
} & TokenRef;
|
|
55
|
+
export type ApproveIntent = {
|
|
56
|
+
action: 'approve';
|
|
57
|
+
owner: string;
|
|
58
|
+
spender: string;
|
|
59
|
+
amount: Constraint<string>;
|
|
60
|
+
} & TokenRef;
|
|
61
|
+
export type WithdrawIntent = {
|
|
62
|
+
action: 'withdraw';
|
|
63
|
+
from: string;
|
|
64
|
+
amount: Constraint<string>;
|
|
65
|
+
protocol?: string;
|
|
66
|
+
} & TokenRef;
|
|
67
|
+
export type CustomIntent = {
|
|
68
|
+
action: string;
|
|
69
|
+
[key: string]: unknown;
|
|
70
|
+
};
|
|
71
|
+
export type ActionIntent = TransferIntent | SwapIntent | StakeIntent | LendIntent | BorrowIntent | ApproveIntent | WithdrawIntent | CustomIntent;
|
|
72
|
+
export type SingleIntent = {
|
|
73
|
+
chain: string;
|
|
74
|
+
strict?: boolean;
|
|
75
|
+
} & ExecutionRef & ActionIntent & ProgramRef;
|
|
76
|
+
export type CompoundIntent = {
|
|
77
|
+
chain: string;
|
|
78
|
+
strict?: boolean;
|
|
79
|
+
actions: ActionIntent[];
|
|
80
|
+
} & ExecutionRef & ProgramRef;
|
|
81
|
+
export type Intent = SingleIntent | CompoundIntent;
|
|
82
|
+
export type Confidence = 'full' | 'partial' | 'unverified';
|
|
83
|
+
export interface VerifyResult {
|
|
84
|
+
matched: boolean;
|
|
85
|
+
confidence: Confidence;
|
|
86
|
+
discrepancies: string[];
|
|
87
|
+
analysis: TransactionAnalysis;
|
|
88
|
+
}
|
|
89
|
+
export type { TransactionAnalysis, InstructionAnalysis, RiskFlag } from '../verify/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/intent/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Order, EvaluationResult, PriceFeed } from './types.js';
|
|
2
|
+
export interface EvaluateOptions {
|
|
3
|
+
dryRun?: boolean;
|
|
4
|
+
priceFeed?: PriceFeed;
|
|
5
|
+
/** Override for testing — async function that calls the server. If not provided, uses the real HTTP client. */
|
|
6
|
+
serverEvaluate?: (order: Order) => Promise<ServerEvaluateResponse>;
|
|
7
|
+
/** Override for testing — function that signs and submits a transaction. */
|
|
8
|
+
signAndSubmit?: (txBase64: string, order: Order) => Promise<string>;
|
|
9
|
+
/** Override for testing — function that verifies an intent against a transaction. */
|
|
10
|
+
verifyTransaction?: (txBase64: string, order: Order) => Promise<{
|
|
11
|
+
matched: boolean;
|
|
12
|
+
discrepancies: string[];
|
|
13
|
+
}>;
|
|
14
|
+
/** Override for time source — defaults to Date.now(). */
|
|
15
|
+
now?: () => number;
|
|
16
|
+
}
|
|
17
|
+
export interface ServerEvaluateResponse {
|
|
18
|
+
executable: boolean;
|
|
19
|
+
transaction?: string;
|
|
20
|
+
quote?: {
|
|
21
|
+
price: string;
|
|
22
|
+
amountIn: string;
|
|
23
|
+
amountOut: string;
|
|
24
|
+
};
|
|
25
|
+
reason?: string;
|
|
26
|
+
detail?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function evaluateOrders(opts?: EvaluateOptions): Promise<EvaluationResult[]>;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { loadOrders, saveOrders } from './store.js';
|
|
2
|
+
function nowMs(opts) {
|
|
3
|
+
return opts.now ? opts.now() : Date.now();
|
|
4
|
+
}
|
|
5
|
+
function isExpired(order, now) {
|
|
6
|
+
if (!order.policy.expiresAt)
|
|
7
|
+
return false;
|
|
8
|
+
return new Date(order.policy.expiresAt).getTime() <= now;
|
|
9
|
+
}
|
|
10
|
+
function isInCooldown(order, now) {
|
|
11
|
+
const cooldown = order.policy.cooldown ?? 60;
|
|
12
|
+
const lastAttempt = [...order.history].reverse().find((e) => e.type === 'attempted' || e.type === 'filled' || e.type === 'failed');
|
|
13
|
+
if (!lastAttempt)
|
|
14
|
+
return false;
|
|
15
|
+
const elapsed = (now - new Date(lastAttempt.timestamp).getTime()) / 1000;
|
|
16
|
+
return elapsed < cooldown;
|
|
17
|
+
}
|
|
18
|
+
function attemptCount(order) {
|
|
19
|
+
return order.history.filter((e) => e.type === 'attempted').length;
|
|
20
|
+
}
|
|
21
|
+
function makeEvent(type, now, extra = {}) {
|
|
22
|
+
return { timestamp: new Date(now).toISOString(), type, ...extra };
|
|
23
|
+
}
|
|
24
|
+
/** Extract price target from a swap intent for pre-check comparison. */
|
|
25
|
+
function getSwapPriceTarget(order) {
|
|
26
|
+
const intent = order.intent;
|
|
27
|
+
if (intent.action !== 'swap')
|
|
28
|
+
return null;
|
|
29
|
+
const tokenIn = intent.tokenIn?.tokenSymbol;
|
|
30
|
+
const tokenOut = intent.tokenOut?.tokenSymbol;
|
|
31
|
+
if (!tokenIn || !tokenOut)
|
|
32
|
+
return null;
|
|
33
|
+
const amountIn = parseFloat(intent.amountIn);
|
|
34
|
+
const amountOutGte = intent.amountOut?.gte ? parseFloat(intent.amountOut.gte) : null;
|
|
35
|
+
if (!amountIn || !amountOutGte || amountOutGte <= 0)
|
|
36
|
+
return null;
|
|
37
|
+
// maxPrice = amountIn / amountOutGte (e.g., 500 USDC / 5.882 SOL = ~85 USDC/SOL)
|
|
38
|
+
return { base: tokenOut, quote: tokenIn, maxPrice: amountIn / amountOutGte };
|
|
39
|
+
}
|
|
40
|
+
export async function evaluateOrders(opts = {}) {
|
|
41
|
+
const store = loadOrders();
|
|
42
|
+
const results = [];
|
|
43
|
+
const now = nowMs(opts);
|
|
44
|
+
let modified = false;
|
|
45
|
+
for (const order of store.orders) {
|
|
46
|
+
if (order.status !== 'pending')
|
|
47
|
+
continue;
|
|
48
|
+
// Check expiry
|
|
49
|
+
if (isExpired(order, now)) {
|
|
50
|
+
order.status = 'expired';
|
|
51
|
+
order.updatedAt = new Date(now).toISOString();
|
|
52
|
+
const event = makeEvent('expired', now, { detail: `Expired at ${order.policy.expiresAt}` });
|
|
53
|
+
order.history.push(event);
|
|
54
|
+
results.push({ orderId: order.id, status: 'expired', event });
|
|
55
|
+
modified = true;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// Check cooldown
|
|
59
|
+
if (isInCooldown(order, now))
|
|
60
|
+
continue;
|
|
61
|
+
// Check maxAttempts
|
|
62
|
+
if (order.policy.maxAttempts !== undefined && attemptCount(order) >= order.policy.maxAttempts) {
|
|
63
|
+
order.status = 'failed';
|
|
64
|
+
order.updatedAt = new Date(now).toISOString();
|
|
65
|
+
const event = makeEvent('failed', now, { reason: 'MAX_ATTEMPTS', detail: `Reached ${order.policy.maxAttempts} attempts` });
|
|
66
|
+
order.history.push(event);
|
|
67
|
+
results.push({ orderId: order.id, status: 'failed', event });
|
|
68
|
+
modified = true;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Optional price pre-check
|
|
72
|
+
if (opts.priceFeed) {
|
|
73
|
+
const target = getSwapPriceTarget(order);
|
|
74
|
+
if (target) {
|
|
75
|
+
const currentPrice = await opts.priceFeed.getPrice(target.base, target.quote);
|
|
76
|
+
if (currentPrice !== null && currentPrice > target.maxPrice * 1.05) {
|
|
77
|
+
// Price is more than 5% away — skip server call
|
|
78
|
+
const event = makeEvent('attempted', now, { reason: 'PRICE_PRE_CHECK_SKIP', detail: `Current ${target.quote}/${target.base}: ${currentPrice}, need <= ${target.maxPrice.toFixed(2)}` });
|
|
79
|
+
order.history.push(event);
|
|
80
|
+
order.updatedAt = new Date(now).toISOString();
|
|
81
|
+
results.push({ orderId: order.id, status: 'pending', event });
|
|
82
|
+
modified = true;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Dry run stops here
|
|
88
|
+
if (opts.dryRun) {
|
|
89
|
+
const event = makeEvent('attempted', now, { reason: 'DRY_RUN', detail: 'Would evaluate against server' });
|
|
90
|
+
results.push({ orderId: order.id, status: 'pending', event });
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
// Call server
|
|
94
|
+
if (!opts.serverEvaluate)
|
|
95
|
+
continue; // No server function provided — skip
|
|
96
|
+
try {
|
|
97
|
+
const response = await opts.serverEvaluate(order);
|
|
98
|
+
if (!response.executable || !response.transaction) {
|
|
99
|
+
const event = makeEvent('attempted', now, { reason: response.reason, detail: response.detail });
|
|
100
|
+
order.history.push(event);
|
|
101
|
+
order.updatedAt = new Date(now).toISOString();
|
|
102
|
+
results.push({ orderId: order.id, status: 'pending', event });
|
|
103
|
+
modified = true;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
// Transaction returned — set executing
|
|
107
|
+
order.status = 'executing';
|
|
108
|
+
order.updatedAt = new Date(now).toISOString();
|
|
109
|
+
modified = true;
|
|
110
|
+
// Verify
|
|
111
|
+
if (opts.verifyTransaction) {
|
|
112
|
+
const verification = await opts.verifyTransaction(response.transaction, order);
|
|
113
|
+
if (!verification.matched) {
|
|
114
|
+
order.status = 'pending';
|
|
115
|
+
const event = makeEvent('attempted', now, { reason: 'VERIFICATION_FAILED', detail: verification.discrepancies.join('; ') });
|
|
116
|
+
order.history.push(event);
|
|
117
|
+
order.updatedAt = new Date(now).toISOString();
|
|
118
|
+
results.push({ orderId: order.id, status: 'pending', event });
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Sign and submit
|
|
123
|
+
if (opts.signAndSubmit) {
|
|
124
|
+
const txid = await opts.signAndSubmit(response.transaction, order);
|
|
125
|
+
order.status = 'filled';
|
|
126
|
+
order.updatedAt = new Date(now).toISOString();
|
|
127
|
+
const event = makeEvent('filled', now, { txid, detail: response.quote ? `Price: ${response.quote.price}` : undefined });
|
|
128
|
+
order.history.push(event);
|
|
129
|
+
results.push({ orderId: order.id, status: 'filled', event });
|
|
130
|
+
// Handle recurrence
|
|
131
|
+
if (order.policy.recurrence) {
|
|
132
|
+
const remaining = order.policy.recurrence.remaining;
|
|
133
|
+
if (remaining === undefined || remaining > 1) {
|
|
134
|
+
const clone = {
|
|
135
|
+
...JSON.parse(JSON.stringify(order)),
|
|
136
|
+
id: `${order.id}-r${now}`,
|
|
137
|
+
status: 'pending',
|
|
138
|
+
history: [makeEvent('created', now, { detail: `Recurring from ${order.id}` })],
|
|
139
|
+
createdAt: new Date(now).toISOString(),
|
|
140
|
+
updatedAt: new Date(now).toISOString(),
|
|
141
|
+
};
|
|
142
|
+
if (remaining !== undefined) {
|
|
143
|
+
clone.policy.recurrence = { ...order.policy.recurrence, remaining: remaining - 1 };
|
|
144
|
+
}
|
|
145
|
+
store.orders.push(clone);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
order.status = 'pending';
|
|
152
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
153
|
+
const event = makeEvent('attempted', now, { reason: 'SERVER_ERROR', detail: message });
|
|
154
|
+
order.history.push(event);
|
|
155
|
+
order.updatedAt = new Date(now).toISOString();
|
|
156
|
+
results.push({ orderId: order.id, status: 'pending', event });
|
|
157
|
+
modified = true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (modified) {
|
|
161
|
+
saveOrders(store);
|
|
162
|
+
}
|
|
163
|
+
return results;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/orders/evaluate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { Order, OrderStatus, ExecutionPolicy, OrderEvent, EvaluationResult, PriceFeed } from './types.js';
|
|
2
|
+
export type { OrdersStore } from './store.js';
|
|
3
|
+
export { loadOrders, saveOrders, addOrder, getOrder, updateOrder } from './store.js';
|
|
4
|
+
export { evaluateOrders } from './evaluate.js';
|
|
5
|
+
export type { EvaluateOptions, ServerEvaluateResponse } from './evaluate.js';
|
|
6
|
+
export { parseSwapSugar } from './sugar.js';
|
|
7
|
+
export type { SwapSugarInput } from './sugar.js';
|