vendor-implementation
npx skills add https://github.com/no-trade-no-life/yuan --skill vendor-implementation
Agent 安装分布
Skill 文档
Vendor Implementation
为æ°ç交ææä¾åºåæä¾å®æ´ç Yuan æ¡æ¶éææåï¼åºäº HyperliquidãAsterãOKX çæåå®ç°ç»éªã
使ç¨åºæ¯
ä½¿ç¨æ¤æè½å½éè¦ï¼
- 为æ°äº¤ææå建ä¾åºåå®ç°
- 设计微æå¡æ¶æå API éæ
- å®ç°äº¤æç³»ç»æ ¸å¿åè½ï¼è´¦æ·ã订åãå¸åºæ°æ®ï¼
- éµå¾ª Yuan æ¡æ¶è§èåæä½³å®è·µ
æ ¸å¿åå
ç®æ´è³ä¸
ä¸ä¸æçªå£æ¯å ¬å ±èµæºãæè½ä¸ç³»ç»æç¤ºã对è¯åå²ãå ¶ä»æè½çå æ°æ®åç¨æ·è¯·æ±å ±äº«ä¸ä¸æã
**é»è®¤å设ï¼Claude å·²ç»å¾æºè½ã**åªæ·»å Claude ä¸å ·å¤çä¸ä¸æãå¯¹æ¯æ¡ä¿¡æ¯è¿è¡ææï¼”Claude ççéè¦è¿ä¸ªè§£éå44è¿ä¸ªæ®µè½æ¯å¦å¼å¾å ¶ä»¤çææ¬ï¼”
ä¼å 使ç¨ç®æ´ç¤ºä¾èéåé¿è§£éã
设置éå½çèªç±åº¦
å°ç¹å¼æ§çº§å«ä¸ä»»å¡çèå¼±æ§åå¯åæ§å¹é ï¼
é«èªç±åº¦ï¼ææ¬æä»¤ï¼ï¼å½å¤ç§æ¹æ³é½ææãå³çä¾èµä¸ä¸æï¼æå¯åå¼æå¯¼æ¹æ³æ¶ä½¿ç¨ã
ä¸çèªç±åº¦ï¼ä¼ªä»£ç æå¸¦åæ°çèæ¬ï¼ï¼å½åå¨é¦é模å¼ãæäºåå坿¥åï¼æé 置影åè¡ä¸ºæ¶ä½¿ç¨ã
ä½èªç±åº¦ï¼ç¹å®èæ¬ï¼å°æ°åæ°ï¼ï¼å½æä½æéãä¸è´æ§è³å ³éè¦ï¼æå¿ é¡»éµå¾ªç¹å®åºåæ¶ä½¿ç¨ã
æ åç®å½ç»æ
apps/vendor-{exchange}/src/
âââ api/ # APIå±
â âââ client.ts # HTTP客æ·ç«¯è®¾ç½®
â âââ public-api.ts # å
Œ
±API端ç¹
â âââ private-api.ts # ç§æAPI端ç¹
â âââ types.ts # TypeScriptç±»åå®ä¹
âââ services/ # æå¡å±
â âââ accounts/ # è´¦æ·æå¡
â â âââ perp.ts # æ°¸ç»è´¦æ·ä¿¡æ¯
â âââ orders/ # 订å管ç
â â âââ submitOrder.ts # 订åæäº¤
â â âââ cancelOrder.ts # 订ååæ¶
â â âââ modifyOrder.ts # 订åä¿®æ¹
â â âââ listOrders.ts # 订åå表
â âââ markets/ # å¸åºæ°æ®
â â âââ quote.ts # 宿¶æ¥ä»·
â â âââ product.ts # 产åä¿¡æ¯
â â âââ ohlc.ts # Kçº¿æ°æ®
â â âââ interest-rate.ts # å©çæ°æ®
â âââ account-actions-with-credential.ts # è´¦æ·RPC
â âââ order-actions-with-credential.ts # 订åRPC
â âââ fill-history.ts # æäº¤è®°å½ï¼å¦ææ¯æï¼
âââ utils.ts # å·¥å
·å½æ°
âââ sign.ts # 请æ±ç¾å
âââ index.ts # 主å
¥å£
âââ cli.ts # CLIå
¥å£
âââ AGENTS.md # Agentææ¡£
âââ SESSION_NOTES.md # ä¼è¯è®°å½
âââ package.json # ä¾èµ
æ ¸å¿å®ç°æ¨¡å¼
ç¼å模å¼ï¼ä½¿ç¨ createCacheï¼
import { createCache } from '@yuants/cache';
const CACHE_TTL = 60_000;
const metaCache = createCache<Map<string, AssetInfo>>(
async () => {
console.info(`[${formatTime(Date.now())}] å·æ°äº¤ææå
æ°æ®ç¼å`);
const data = await fetchExchangeMetadata();
return processData(data);
},
{ expire: CACHE_TTL },
);
export const getAssetInfo = async (symbol: string) => {
const cache = await metaCache.query('meta');
return cache.get(symbol);
};
æå¡æ³¨å模å¼
export const submitOrder = async (credential: ICredential, order: IOrder) => {
console.info(`[${formatTime(Date.now())}] æäº¤è®¢å: ${order.product_id}`);
try {
const payload = buildOrderPayload(order);
const result = await placeOrder(credential, payload);
if (!result.status || result.status !== 'ok') {
throw new Error(`订åæäº¤å¤±è´¥: ${result.error}`);
}
const orderId = extractOrderId(result);
console.info(`[${formatTime(Date.now())] 订åæäº¤æå: ${orderId}`);
return { order_id: `${orderId}` };
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'æªç¥é误';
console.error(`[${formatTime(Date.now())}] 订åæäº¤å¤±è´¥: ${errorMessage}`);
throw new Error(`订åæäº¤å¤±è´¥: ${errorMessage}`);
}
};
RPC æ³¨åæ¨¡å¼
import { provideOrderActionsWithCredential } from '@yuants/data-order';
provideOrderActionsWithCredential<ICredential>(
Terminal.fromNodeEnv(),
'EXCHANGE',
{
type: 'object',
required: ['private_key', 'address'],
properties: {
private_key: { type: 'string' },
address: { type: 'string' },
},
},
{
submitOrder,
cancelOrder,
modifyOrder,
listOrders,
},
);
å®ç°æ£æ¥æ¸ å
â å¿ éæ ¸å¿åè½
-
è´¦æ·ä¿¡æ¯
- ç°è´§è´¦æ·ä½é¢åæä»
- æ°¸ç»è´¦æ·ä¿è¯éåæä»
- å¤è´¦æ·ç±»åæ¯æ
-
订å管ç
- 订åæäº¤ï¼å¸ä»·/éä»·ï¼
- 订ååæ¶
- 订åä¿®æ¹ï¼å¦ææ¯æï¼
- å¾ æäº¤è®¢åå表
-
å¸åºæ°æ®
- 宿¶æ¥ä»·
- K çº¿æ°æ®
- 产åä¿¡æ¯
- å©çæ°æ®ï¼å¦éç¨ï¼
-
API éæ
- å ¬å ± API 端ç¹
- 带认è¯çç§æ API
- é误å¤çåéè¯é»è¾
ð¯ é«çº§åè½
-
交æåå²
- æäº¤è®°å½å®ç°
- 交æè®°å½
-
è½¬è´¦æ¯æ
- å é¨è½¬è´¦
- æç°
- å å¼å°å
è´¨éæ å
代ç è´¨é
- â TypeScript ä¸¥æ ¼æ¨¡å¼
- â å ¨é¢çé误å¤ç
- â åå æµè¯è¦ç
- â éææµè¯éªè¯
æ§è½
- â
createCache髿ç¼å - â API éçéå¶
- â æ¹éæä½ä¼å
ææ¡£
- â AGENTS.md å®ç°ç»è
- â SESSION_NOTES.md åæ´è·è¸ª
- â API ææ¡£éæ
- â 宿´ README
åèå®ç°
å¦ä¹ è¿äºç¤ºä¾
- Hyperliquid: åç modify order API + 宿´åè½é
- Aster: æ¸ æ°ç»æ + ç°è´§/æ°¸ç»å离
- OKX: 综ååè½ + è½¬è´¦æ¯æ
å ³é®å¦ä¹ ç¹
- ç®å½ç»æ: vendor-aster ç坿©å±æ¨¡å¼
- ç¼åçç¥:
createCachevs æå¨ç®¡ç - é误å¤ç: è·¨æå¡çä¸è´æ¨¡å¼
- ç±»åå®å ¨: 宿´ TypeScript æ¥å£
- ææ¡£ç»´æ¤: AGENTS.md + SESSION_NOTES.md
å ³é®ç»éª
1. 使ç¨åç API
ä¼å 使ç¨äº¤ææçåç API è鿍¡ææ¹æ¡ï¼
- ä½¿ç¨ modify order èé cancel + place new
- ä¿æè®¢åä¼å 级ï¼åå° API è°ç¨
2. æ¥å¿æ å
console.info(`[${formatTime(Date.now())] æä½æå`);
console.error(`[${formatTime(Date.now())] æä½å¤±è´¥: ${error.message}`);
3. ç±»åå®å ¨
interface IExchangeResponse {
status: string;
data?: any;
error?: string;
}
function validateResponse<T>(response: IExchangeResponse): T {
if (response.status !== 'ok') {
throw new Error(response.error || 'APIè°ç¨å¤±è´¥');
}
return response.data as T;
}
4. ææ¡£ç»´æ¤
SESSION_NOTES.md è®°å½æ¯æ¬¡éè¦åæ´ï¼å æ¬ï¼
- ææ¯å³ç (D1, D2, …)
- æ¶æåæ´
- é误解å³è®°å½
- TODO åé£é©é¡¹
常è§é·é±
- API éå¶ – å§ç»æ£æ¥å®æ¹ææ¡£
- éçéå¶ – å®ç°éå½èæµ
- 认è¯å®å ¨ – ç»ä¸å¨ä»£ç ä¸ç¡¬ç¼ç å¯é¥
- æ°æ®ä¸è´æ§ – å¤çé¨åå¤±è´¥åºæ¯
- æµè¯ä¾èµ – æ£ç¡®æ¨¡æå¤é¨æå¡
æåææ
æåçä¾åºåå®ç°åºè¯¥ï¼
- â éè¿ææéææµè¯
- â ä¼é å¤ç API éå¶
- â æä¾ä¸è´çéè¯¯æ¶æ¯
- â æ¯æææå¿ é RPC æ¹æ³
- â å å«å ¨é¢ææ¡£
- â éµå¾ªæ¢å®ç¼ç 模å¼
- â å¯ç»´æ¤å坿©å±
è¿é¶èµæº
- 工使µæ¨¡å¼: references/workflows.md
- è¾åºæ¨¡å¼: references/output-patterns.md
- é误å¤ç: references/error-handling.md
åºäº HyperliquidãAsterãOKX ä¾åºåå®ç°ç»éªçæ