@silkysquad/silk 1.0.0 → 1.0.2

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.
Files changed (85) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +163 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/client.d.ts +6 -0
  6. package/dist/client.js +36 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/commands/account.d.ts +11 -0
  9. package/dist/commands/account.js +156 -0
  10. package/dist/commands/account.js.map +1 -0
  11. package/dist/commands/balance.d.ts +3 -0
  12. package/dist/commands/balance.js +12 -0
  13. package/dist/commands/balance.js.map +1 -0
  14. package/dist/commands/cancel.d.ts +3 -0
  15. package/dist/commands/cancel.js +28 -0
  16. package/dist/commands/cancel.js.map +1 -0
  17. package/dist/commands/chat.d.ts +1 -0
  18. package/dist/commands/chat.js +12 -0
  19. package/dist/commands/chat.js.map +1 -0
  20. package/dist/commands/claim.d.ts +3 -0
  21. package/dist/commands/claim.js +28 -0
  22. package/dist/commands/claim.js.map +1 -0
  23. package/dist/commands/config.d.ts +6 -0
  24. package/dist/commands/config.js +40 -0
  25. package/dist/commands/config.js.map +1 -0
  26. package/dist/commands/contacts.d.ts +4 -0
  27. package/dist/commands/contacts.js +23 -0
  28. package/dist/commands/contacts.js.map +1 -0
  29. package/dist/commands/init.d.ts +1 -0
  30. package/dist/commands/init.js +37 -0
  31. package/dist/commands/init.js.map +1 -0
  32. package/dist/commands/pay.d.ts +4 -0
  33. package/dist/commands/pay.js +35 -0
  34. package/dist/commands/pay.js.map +1 -0
  35. package/dist/commands/payments.d.ts +4 -0
  36. package/dist/commands/payments.js +23 -0
  37. package/dist/commands/payments.js.map +1 -0
  38. package/dist/commands/wallet.d.ts +7 -0
  39. package/dist/commands/wallet.js +61 -0
  40. package/dist/commands/wallet.js.map +1 -0
  41. package/dist/config.d.ts +36 -0
  42. package/dist/config.js +63 -0
  43. package/dist/config.js.map +1 -0
  44. package/dist/contacts.d.ts +15 -0
  45. package/dist/contacts.js +74 -0
  46. package/dist/contacts.js.map +1 -0
  47. package/dist/errors.d.ts +14 -0
  48. package/dist/errors.js +87 -0
  49. package/dist/errors.js.map +1 -0
  50. package/dist/index.js +8 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/output.d.ts +4 -0
  53. package/dist/output.js +42 -0
  54. package/dist/output.js.map +1 -0
  55. package/dist/transfers.d.ts +32 -0
  56. package/dist/transfers.js +12 -0
  57. package/dist/transfers.js.map +1 -0
  58. package/dist/validate.d.ts +8 -0
  59. package/dist/validate.js +69 -0
  60. package/dist/validate.js.map +1 -0
  61. package/package.json +29 -4
  62. package/CHANGELOG.md +0 -43
  63. package/SKILL.md +0 -698
  64. package/index.js +0 -1
  65. package/src/cli.ts +0 -175
  66. package/src/client.ts +0 -49
  67. package/src/commands/account.ts +0 -210
  68. package/src/commands/balance.ts +0 -14
  69. package/src/commands/cancel.ts +0 -34
  70. package/src/commands/chat.ts +0 -14
  71. package/src/commands/claim.ts +0 -34
  72. package/src/commands/config.ts +0 -46
  73. package/src/commands/contacts.ts +0 -26
  74. package/src/commands/init.ts +0 -44
  75. package/src/commands/pay.ts +0 -41
  76. package/src/commands/payments.ts +0 -29
  77. package/src/commands/wallet.ts +0 -67
  78. package/src/config.ts +0 -101
  79. package/src/contacts.ts +0 -94
  80. package/src/errors.ts +0 -95
  81. package/src/output.ts +0 -42
  82. package/src/transfers.ts +0 -49
  83. package/src/validate.ts +0 -80
  84. package/tsconfig.json +0 -19
  85. /package/{src/index.ts → dist/index.d.ts} +0 -0
@@ -0,0 +1,37 @@
1
+ import { Keypair } from '@solana/web3.js';
2
+ import bs58 from 'bs58';
3
+ import { loadConfig, saveConfig, ensureAgentId } from '../config.js';
4
+ import { initContacts } from '../contacts.js';
5
+ import { outputSuccess } from '../output.js';
6
+ export async function init() {
7
+ const config = loadConfig();
8
+ let walletCreated = false;
9
+ let mainWallet = config.wallets.find((w) => w.label === 'main');
10
+ if (!mainWallet) {
11
+ const keypair = Keypair.generate();
12
+ const address = keypair.publicKey.toBase58();
13
+ const privateKey = bs58.encode(keypair.secretKey);
14
+ mainWallet = { label: 'main', address, privateKey };
15
+ config.wallets.push(mainWallet);
16
+ if (config.wallets.length === 1) {
17
+ config.defaultWallet = 'main';
18
+ }
19
+ walletCreated = true;
20
+ }
21
+ const agentIdResult = ensureAgentId(config);
22
+ const contactsCreated = initContacts();
23
+ if (walletCreated || agentIdResult.created) {
24
+ saveConfig(config);
25
+ }
26
+ outputSuccess({
27
+ action: 'init',
28
+ wallet_created: walletCreated,
29
+ wallet_label: 'main',
30
+ wallet_address: mainWallet.address,
31
+ agent_id_created: agentIdResult.created,
32
+ agent_id: agentIdResult.agentId,
33
+ contacts_created: contactsCreated,
34
+ message: (walletCreated || agentIdResult.created || contactsCreated) ? 'Initialization complete' : 'Already initialized',
35
+ });
36
+ }
37
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;IAEhE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAElD,UAAU,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEhC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC;QAChC,CAAC;QAED,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,eAAe,GAAG,YAAY,EAAE,CAAC;IAEvC,IAAI,aAAa,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;QAC3C,UAAU,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAED,aAAa,CAAC;QACZ,MAAM,EAAE,MAAM;QACd,cAAc,EAAE,aAAa;QAC7B,YAAY,EAAE,MAAM;QACpB,cAAc,EAAE,UAAU,CAAC,OAAO;QAClC,gBAAgB,EAAE,aAAa,CAAC,OAAO;QACvC,QAAQ,EAAE,aAAa,CAAC,OAAO;QAC/B,gBAAgB,EAAE,eAAe;QACjC,OAAO,EAAE,CAAC,aAAa,IAAI,aAAa,CAAC,OAAO,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,qBAAqB;KACzH,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function pay(recipient: string, amount: string, opts: {
2
+ memo?: string;
3
+ wallet?: string;
4
+ }): Promise<void>;
@@ -0,0 +1,35 @@
1
+ import { Keypair, Transaction } from '@solana/web3.js';
2
+ import bs58 from 'bs58';
3
+ import { loadConfig, getWallet, getApiUrl, getClaimUrl } from '../config.js';
4
+ import { createHttpClient } from '../client.js';
5
+ import { outputSuccess } from '../output.js';
6
+ import { validatePay } from '../validate.js';
7
+ import { resolveRecipient } from '../contacts.js';
8
+ export async function pay(recipient, amount, opts) {
9
+ recipient = resolveRecipient(recipient);
10
+ const config = loadConfig();
11
+ const wallet = getWallet(config, opts.wallet);
12
+ const client = createHttpClient({ baseUrl: getApiUrl(config) });
13
+ const amountNum = await validatePay(client, recipient, amount, wallet.address);
14
+ // 1. Build unsigned transaction
15
+ const buildRes = await client.post('/api/tx/create-transfer', {
16
+ sender: wallet.address,
17
+ recipient,
18
+ amount: amountNum,
19
+ token: 'usdc',
20
+ memo: opts.memo || '',
21
+ });
22
+ const { transaction: txBase64, transferPda } = buildRes.data.data;
23
+ // 2. Sign the transaction
24
+ const tx = Transaction.from(Buffer.from(txBase64, 'base64'));
25
+ const keypair = Keypair.fromSecretKey(bs58.decode(wallet.privateKey));
26
+ tx.sign(keypair);
27
+ // 3. Submit signed transaction
28
+ const submitRes = await client.post('/api/tx/submit', {
29
+ signedTx: tx.serialize().toString('base64'),
30
+ });
31
+ const { txid } = submitRes.data.data;
32
+ const claimUrl = getClaimUrl(config, transferPda);
33
+ outputSuccess({ action: 'pay', transferPda, txid, amount: amountNum, recipient, claimUrl });
34
+ }
35
+ //# sourceMappingURL=pay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pay.js","sourceRoot":"","sources":["../../src/commands/pay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,SAAiB,EAAE,MAAc,EAAE,IAAwC;IACnG,SAAS,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEhE,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAE/E,gCAAgC;IAChC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE;QAC5D,MAAM,EAAE,MAAM,CAAC,OAAO;QACtB,SAAS;QACT,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;KACtB,CAAC,CAAC;IAEH,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;IAElE,0BAA0B;IAC1B,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IACtE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEjB,+BAA+B;IAC/B,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE;QACpD,QAAQ,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;KAC5C,CAAC,CAAC;IAEH,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IACrC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClD,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function paymentsList(opts: {
2
+ wallet?: string;
3
+ }): Promise<void>;
4
+ export declare function paymentsGet(transferPda: string): Promise<void>;
@@ -0,0 +1,23 @@
1
+ import { loadConfig, getWallet, getApiUrl } from '../config.js';
2
+ import { createHttpClient } from '../client.js';
3
+ import { SdkError } from '../errors.js';
4
+ import { outputSuccess } from '../output.js';
5
+ export async function paymentsList(opts) {
6
+ const config = loadConfig();
7
+ const wallet = getWallet(config, opts.wallet);
8
+ const client = createHttpClient({ baseUrl: getApiUrl(config) });
9
+ const res = await client.get(`/api/transfers`, { params: { wallet: wallet.address } });
10
+ const transfers = res.data.data.transfers;
11
+ outputSuccess({ transfers });
12
+ }
13
+ export async function paymentsGet(transferPda) {
14
+ const config = loadConfig();
15
+ const client = createHttpClient({ baseUrl: getApiUrl(config) });
16
+ const res = await client.get(`/api/transfers/${transferPda}`);
17
+ const transfer = res.data.data.transfer;
18
+ if (!transfer) {
19
+ throw new SdkError('TRANSFER_NOT_FOUND', `Transfer not found: ${transferPda}`);
20
+ }
21
+ outputSuccess({ transfer });
22
+ }
23
+ //# sourceMappingURL=payments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payments.js","sourceRoot":"","sources":["../../src/commands/payments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAyB;IAC1D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEhE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACvF,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;IAE1C,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB;IACnD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEhE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,kBAAkB,WAAW,EAAE,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;IAExC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,uBAAuB,WAAW,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function walletCreate(label: string): Promise<void>;
2
+ export declare function walletList(): Promise<void>;
3
+ export declare function walletFund(opts: {
4
+ sol?: boolean;
5
+ usdc?: boolean;
6
+ wallet?: string;
7
+ }): Promise<void>;
@@ -0,0 +1,61 @@
1
+ import { Keypair } from '@solana/web3.js';
2
+ import bs58 from 'bs58';
3
+ import { loadConfig, saveConfig, getWallet, getApiUrl } from '../config.js';
4
+ import { createHttpClient } from '../client.js';
5
+ import { SdkError } from '../errors.js';
6
+ import { outputSuccess } from '../output.js';
7
+ export async function walletCreate(label) {
8
+ const config = loadConfig();
9
+ if (config.wallets.find((w) => w.label === label)) {
10
+ throw new SdkError('WALLET_EXISTS', `Wallet "${label}" already exists.`);
11
+ }
12
+ const keypair = Keypair.generate();
13
+ const address = keypair.publicKey.toBase58();
14
+ const privateKey = bs58.encode(keypair.secretKey);
15
+ config.wallets.push({ label, address, privateKey });
16
+ if (config.wallets.length === 1) {
17
+ config.defaultWallet = label;
18
+ }
19
+ saveConfig(config);
20
+ outputSuccess({ action: 'wallet_created', label, address });
21
+ }
22
+ export async function walletList() {
23
+ const config = loadConfig();
24
+ const wallets = config.wallets.map((w) => ({
25
+ label: w.label,
26
+ address: w.address,
27
+ default: w.label === config.defaultWallet,
28
+ }));
29
+ outputSuccess({ wallets });
30
+ }
31
+ export async function walletFund(opts) {
32
+ const config = loadConfig();
33
+ const wallet = getWallet(config, opts.wallet);
34
+ const client = createHttpClient({ baseUrl: getApiUrl(config) });
35
+ const doSol = opts.sol || (!opts.sol && !opts.usdc);
36
+ const doUsdc = opts.usdc || (!opts.sol && !opts.usdc);
37
+ // Determine the token parameter for a single API call
38
+ let token;
39
+ if (doSol && doUsdc) {
40
+ token = 'both';
41
+ }
42
+ else if (doSol) {
43
+ token = 'sol';
44
+ }
45
+ else {
46
+ token = 'usdc';
47
+ }
48
+ const funded = {};
49
+ try {
50
+ const res = await client.post('/api/tx/faucet', { wallet: wallet.address, token });
51
+ if (res.data.data.sol)
52
+ funded.sol = res.data.data.sol;
53
+ if (res.data.data.usdc)
54
+ funded.usdc = res.data.data.usdc;
55
+ }
56
+ catch (e) {
57
+ funded.error = { code: e.code || 'FAUCET_FAILED', message: e.message };
58
+ }
59
+ outputSuccess({ action: 'wallet_funded', wallet: wallet.label, address: wallet.address, funded });
60
+ }
61
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export declare const CONFIG_DIR: string;
2
+ export interface WalletEntry {
3
+ label: string;
4
+ address: string;
5
+ privateKey: string;
6
+ }
7
+ export interface AccountInfo {
8
+ pda: string;
9
+ owner: string;
10
+ mint: string;
11
+ mintDecimals: number;
12
+ operatorIndex: number;
13
+ perTxLimit: number;
14
+ syncedAt: string;
15
+ }
16
+ export type SolanaCluster = 'mainnet-beta' | 'devnet';
17
+ export interface SilkConfig {
18
+ wallets: WalletEntry[];
19
+ defaultWallet: string;
20
+ preferences: Record<string, unknown>;
21
+ apiUrl?: string;
22
+ cluster?: SolanaCluster;
23
+ account?: AccountInfo;
24
+ agentId?: string;
25
+ }
26
+ export declare function loadConfig(): SilkConfig;
27
+ export declare function saveConfig(config: SilkConfig): void;
28
+ export declare function getWallet(config: SilkConfig, label?: string): WalletEntry;
29
+ export declare function getCluster(config: SilkConfig): SolanaCluster;
30
+ export declare function getApiUrl(config: SilkConfig): string;
31
+ export declare function ensureAgentId(config: SilkConfig): {
32
+ agentId: string;
33
+ created: boolean;
34
+ };
35
+ export declare function getClaimUrl(config: SilkConfig, transferPda: string): string;
36
+ export declare function getAgentId(config: SilkConfig): string;
package/dist/config.js ADDED
@@ -0,0 +1,63 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { SdkError } from './errors.js';
6
+ export const CONFIG_DIR = path.join(os.homedir(), '.config', 'silk');
7
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
8
+ function defaultConfig() {
9
+ return { wallets: [], defaultWallet: 'main', preferences: {}, cluster: 'mainnet-beta' };
10
+ }
11
+ export function loadConfig() {
12
+ try {
13
+ const raw = fs.readFileSync(CONFIG_FILE, 'utf-8');
14
+ return JSON.parse(raw);
15
+ }
16
+ catch {
17
+ return defaultConfig();
18
+ }
19
+ }
20
+ export function saveConfig(config) {
21
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
22
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
23
+ }
24
+ export function getWallet(config, label) {
25
+ const target = label || config.defaultWallet;
26
+ const wallet = config.wallets.find((w) => w.label === target);
27
+ if (!wallet) {
28
+ throw new SdkError('WALLET_NOT_FOUND', `Wallet "${target}" not found. Run: silk wallet create`);
29
+ }
30
+ return wallet;
31
+ }
32
+ const CLUSTER_API_URLS = {
33
+ 'mainnet-beta': 'https://api.silkyway.ai',
34
+ 'devnet': 'https://devnet-api.silkyway.ai',
35
+ };
36
+ export function getCluster(config) {
37
+ return config.cluster || 'mainnet-beta';
38
+ }
39
+ export function getApiUrl(config) {
40
+ return config.apiUrl || process.env.SILK_API_URL || CLUSTER_API_URLS[getCluster(config)];
41
+ }
42
+ export function ensureAgentId(config) {
43
+ if (config.agentId) {
44
+ return { agentId: config.agentId, created: false };
45
+ }
46
+ const agentId = randomUUID();
47
+ config.agentId = agentId;
48
+ return { agentId, created: true };
49
+ }
50
+ const APP_BASE_URL = 'https://app.silkyway.so';
51
+ export function getClaimUrl(config, transferPda) {
52
+ const base = `${APP_BASE_URL}/transfers/${transferPda}`;
53
+ const cluster = getCluster(config);
54
+ return cluster === 'devnet' ? `${base}?cluster=devnet` : base;
55
+ }
56
+ export function getAgentId(config) {
57
+ const result = ensureAgentId(config);
58
+ if (result.created) {
59
+ saveConfig(config);
60
+ }
61
+ return result.agentId;
62
+ }
63
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface Contact {
2
+ name: string;
3
+ address: string;
4
+ }
5
+ export interface ContactsStore {
6
+ contacts: Contact[];
7
+ }
8
+ export declare function loadContacts(): ContactsStore;
9
+ export declare function saveContacts(store: ContactsStore): void;
10
+ export declare function addContact(name: string, address: string): void;
11
+ export declare function removeContact(name: string): void;
12
+ export declare function getContact(name: string): Contact | null;
13
+ export declare function listContacts(): Contact[];
14
+ export declare function resolveRecipient(recipient: string): string;
15
+ export declare function initContacts(): boolean;
@@ -0,0 +1,74 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { PublicKey } from '@solana/web3.js';
4
+ import { CONFIG_DIR } from './config.js';
5
+ import { SdkError } from './errors.js';
6
+ const CONTACTS_FILE = path.join(CONFIG_DIR, 'contacts.json');
7
+ export function loadContacts() {
8
+ try {
9
+ const raw = fs.readFileSync(CONTACTS_FILE, 'utf-8');
10
+ return JSON.parse(raw);
11
+ }
12
+ catch {
13
+ return { contacts: [] };
14
+ }
15
+ }
16
+ export function saveContacts(store) {
17
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
18
+ fs.writeFileSync(CONTACTS_FILE, JSON.stringify(store, null, 2), 'utf-8');
19
+ }
20
+ function isValidSolanaAddress(address) {
21
+ try {
22
+ new PublicKey(address);
23
+ return true;
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ export function addContact(name, address) {
30
+ const normalized = name.toLowerCase();
31
+ if (isValidSolanaAddress(normalized)) {
32
+ throw new SdkError('INVALID_CONTACT_NAME', 'Contact name cannot be a valid Solana address');
33
+ }
34
+ if (!isValidSolanaAddress(address)) {
35
+ throw new SdkError('INVALID_ADDRESS', `"${address}" is not a valid Solana address`);
36
+ }
37
+ const store = loadContacts();
38
+ const existing = store.contacts.find((c) => c.name === normalized);
39
+ if (existing) {
40
+ throw new SdkError('CONTACT_EXISTS', `Contact "${normalized}" already exists (${existing.address})`);
41
+ }
42
+ store.contacts.push({ name: normalized, address });
43
+ saveContacts(store);
44
+ }
45
+ export function removeContact(name) {
46
+ const normalized = name.toLowerCase();
47
+ const store = loadContacts();
48
+ const index = store.contacts.findIndex((c) => c.name === normalized);
49
+ if (index === -1) {
50
+ throw new SdkError('CONTACT_NOT_FOUND', `Contact "${normalized}" not found`);
51
+ }
52
+ store.contacts.splice(index, 1);
53
+ saveContacts(store);
54
+ }
55
+ export function getContact(name) {
56
+ const normalized = name.toLowerCase();
57
+ const store = loadContacts();
58
+ return store.contacts.find((c) => c.name === normalized) || null;
59
+ }
60
+ export function listContacts() {
61
+ return loadContacts().contacts;
62
+ }
63
+ export function resolveRecipient(recipient) {
64
+ const contact = getContact(recipient);
65
+ return contact ? contact.address : recipient;
66
+ }
67
+ export function initContacts() {
68
+ if (fs.existsSync(CONTACTS_FILE)) {
69
+ return false;
70
+ }
71
+ saveContacts({ contacts: [] });
72
+ return true;
73
+ }
74
+ //# sourceMappingURL=contacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../src/contacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare class SdkError extends Error {
2
+ readonly code: string;
3
+ constructor(code: string, message: string);
4
+ }
5
+ export declare const ANCHOR_ERROR_MAP: Record<number, {
6
+ code: string;
7
+ message: string;
8
+ }>;
9
+ export declare const SILKYSIG_ERROR_MAP: Record<number, {
10
+ code: string;
11
+ message: string;
12
+ }>;
13
+ export declare function toSilkysigError(err: unknown): SdkError;
14
+ export declare function toSdkError(err: unknown): SdkError;
package/dist/errors.js ADDED
@@ -0,0 +1,87 @@
1
+ export class SdkError extends Error {
2
+ code;
3
+ constructor(code, message) {
4
+ super(message);
5
+ this.code = code;
6
+ this.name = 'SdkError';
7
+ }
8
+ }
9
+ export const ANCHOR_ERROR_MAP = {
10
+ 6000: { code: 'ANCHOR_MATH_OVERFLOW', message: 'Mathematical overflow occurred' },
11
+ 6001: { code: 'ANCHOR_TRANSFER_NOT_ACTIVE', message: 'Transfer is not in active status' },
12
+ 6002: { code: 'ANCHOR_CANNOT_CLAIM', message: 'Claim deadline has passed' },
13
+ 6003: { code: 'ANCHOR_CONDITIONS_NOT_MET', message: 'Release conditions not met' },
14
+ 6004: { code: 'ANCHOR_INVALID_CONDITION', message: 'Invalid condition parameters' },
15
+ 6005: { code: 'ANCHOR_INSUFFICIENT_FUNDS', message: 'Insufficient funds in vault' },
16
+ 6006: { code: 'ANCHOR_POOL_PAUSED', message: 'Pool is paused' },
17
+ 6007: { code: 'ANCHOR_UNAUTHORIZED', message: 'Unauthorized action' },
18
+ 6008: { code: 'ANCHOR_INVALID_TIME_WINDOW', message: 'Invalid time window' },
19
+ 6009: { code: 'ANCHOR_DEPOSIT_TOO_SMALL', message: 'Deposit amount too small' },
20
+ 6010: { code: 'ANCHOR_INVALID_FEE_CONFIG', message: 'Invalid fee configuration' },
21
+ 6011: { code: 'ANCHOR_INVALID_TRANSFER_FEE', message: 'Invalid transfer fee' },
22
+ 6012: { code: 'ANCHOR_TRANSFER_ALREADY_CLAIMED', message: 'Transfer already claimed' },
23
+ 6013: { code: 'ANCHOR_TRANSFER_ALREADY_CANCELLED', message: 'Transfer already cancelled' },
24
+ 6014: { code: 'ANCHOR_TRANSFER_ALREADY_REJECTED', message: 'Transfer already rejected' },
25
+ 6015: { code: 'ANCHOR_TRANSFER_EXPIRED', message: 'Transfer is expired' },
26
+ 6016: { code: 'ANCHOR_ONLY_SENDER_CAN_CANCEL', message: 'Only sender can cancel transfer' },
27
+ 6017: { code: 'ANCHOR_ONLY_RECIPIENT_CAN_CLAIM', message: 'Only recipient can claim transfer' },
28
+ 6018: { code: 'ANCHOR_ONLY_OPERATOR_CAN_REJECT', message: 'Only operator can reject transfer' },
29
+ 6019: { code: 'ANCHOR_INVALID_MEMO_LENGTH', message: 'Invalid memo length' },
30
+ 6020: { code: 'ANCHOR_CLAIM_DEADLINE_NOT_PASSED', message: 'Claim deadline has not passed' },
31
+ 6021: { code: 'ANCHOR_CALCULATION_ERROR', message: 'Calculation error' },
32
+ 6022: { code: 'ANCHOR_MISSING_ACCOUNT', message: 'Missing required account' },
33
+ 6023: { code: 'ANCHOR_INVALID_MINT', message: 'Invalid mint' },
34
+ 6024: { code: 'ANCHOR_STALE_POOL_VALUE', message: 'Pool value is stale and must be updated' },
35
+ 6025: { code: 'ANCHOR_INVALID_OPERATION', message: 'Invalid operation for this pool type' },
36
+ 6026: { code: 'ANCHOR_OUTSTANDING_TRANSFERS', message: 'Cannot reset pool with outstanding transfers' },
37
+ 6027: { code: 'ANCHOR_INVALID_TRANSFER', message: 'Invalid transfer' },
38
+ 6028: { code: 'ANCHOR_TRANSFER_ALREADY_DECLINED', message: 'Transfer already declined' },
39
+ 6029: { code: 'ANCHOR_ONLY_RECIPIENT_CAN_DECLINE', message: 'Only recipient can decline transfer' },
40
+ };
41
+ export const SILKYSIG_ERROR_MAP = {
42
+ 6000: { code: 'POLICY_UNAUTHORIZED', message: 'Unauthorized: signer is not owner or operator' },
43
+ 6001: { code: 'POLICY_EXCEEDS_TX_LIMIT', message: 'Transfer exceeds operator per-transaction limit' },
44
+ 6002: { code: 'ACCOUNT_PAUSED', message: 'Account is paused' },
45
+ 6003: { code: 'MAX_OPERATORS', message: 'Maximum operators reached' },
46
+ 6004: { code: 'OPERATOR_NOT_FOUND', message: 'Operator not found' },
47
+ 6005: { code: 'OPERATOR_EXISTS', message: 'Operator slot already occupied' },
48
+ 6006: { code: 'MATH_OVERFLOW', message: 'Mathematical overflow' },
49
+ 6007: { code: 'AMOUNT_MUST_BE_POSITIVE', message: 'Amount must be positive' },
50
+ 6008: { code: 'DRIFT_USER_ALREADY_INITIALIZED', message: 'Drift user already initialized' },
51
+ 6009: { code: 'DRIFT_DEPOSIT_FAILED', message: 'Drift deposit failed' },
52
+ 6010: { code: 'DRIFT_WITHDRAW_FAILED', message: 'Drift withdrawal failed' },
53
+ 6011: { code: 'INVALID_DRIFT_USER', message: 'Invalid Drift user account' },
54
+ 6012: { code: 'MISSING_DRIFT_ACCOUNTS', message: 'Missing required Drift accounts' },
55
+ 6013: { code: 'INVALID_DRIFT_PROGRAM', message: 'Invalid Drift program ID' },
56
+ 6014: { code: 'DRIFT_DELETE_USER_FAILED', message: 'Failed to delete Drift user' },
57
+ };
58
+ export function toSilkysigError(err) {
59
+ if (err instanceof SdkError)
60
+ return err;
61
+ const message = err instanceof Error ? err.message : String(err);
62
+ const hexMatch = message.match(/0x([0-9a-fA-F]+)/);
63
+ if (hexMatch) {
64
+ const errorCode = parseInt(hexMatch[1], 16);
65
+ const mapped = SILKYSIG_ERROR_MAP[errorCode];
66
+ if (mapped) {
67
+ return new SdkError(mapped.code, mapped.message);
68
+ }
69
+ }
70
+ return new SdkError('UNKNOWN_ERROR', message);
71
+ }
72
+ export function toSdkError(err) {
73
+ if (err instanceof SdkError)
74
+ return err;
75
+ const message = err instanceof Error ? err.message : String(err);
76
+ // Parse Anchor hex error codes from simulation messages (e.g. "0x1770")
77
+ const hexMatch = message.match(/0x([0-9a-fA-F]+)/);
78
+ if (hexMatch) {
79
+ const errorCode = parseInt(hexMatch[1], 16);
80
+ const anchor = ANCHOR_ERROR_MAP[errorCode];
81
+ if (anchor) {
82
+ return new SdkError(anchor.code, anchor.message);
83
+ }
84
+ }
85
+ return new SdkError('UNKNOWN_ERROR', message);
86
+ }
87
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export { loadConfig, saveConfig, getWallet, getApiUrl, CONFIG_DIR } from './config.js';
2
+ export { loadContacts, saveContacts, addContact, removeContact, getContact, listContacts, resolveRecipient, initContacts } from './contacts.js';
3
+ export { createHttpClient } from './client.js';
4
+ export { getTransfer } from './transfers.js';
5
+ export { SdkError, ANCHOR_ERROR_MAP, toSdkError } from './errors.js';
6
+ export { outputSuccess, outputError, wrapCommand } from './output.js';
7
+ export { validateAddress, validateAmount, fetchTransfer, validateClaim, validateCancel, validatePay } from './validate.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEvF,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEhJ,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { SdkError } from './errors.js';
2
+ export declare function outputSuccess(data: Record<string, unknown>): void;
3
+ export declare function outputError(err: SdkError): never;
4
+ export declare function wrapCommand<T extends (...args: any[]) => Promise<void>>(fn: T): T;
package/dist/output.js ADDED
@@ -0,0 +1,42 @@
1
+ import { toSdkError } from './errors.js';
2
+ function isHuman() {
3
+ return process.argv.includes('--human');
4
+ }
5
+ export function outputSuccess(data) {
6
+ if (isHuman()) {
7
+ for (const [key, value] of Object.entries(data)) {
8
+ if (typeof value === 'object' && value !== null) {
9
+ console.log(`${key}:`);
10
+ for (const [k, v] of Object.entries(value)) {
11
+ console.log(` ${k}: ${typeof v === 'object' ? JSON.stringify(v) : v}`);
12
+ }
13
+ }
14
+ else {
15
+ console.log(`${key}: ${value}`);
16
+ }
17
+ }
18
+ return;
19
+ }
20
+ console.log(JSON.stringify({ ok: true, data }));
21
+ }
22
+ export function outputError(err) {
23
+ if (isHuman()) {
24
+ console.log(`Error [${err.code}]: ${err.message}`);
25
+ }
26
+ else {
27
+ console.log(JSON.stringify({ ok: false, error: err.code, message: err.message }));
28
+ }
29
+ process.exit(1);
30
+ }
31
+ export function wrapCommand(fn) {
32
+ const wrapped = async (...args) => {
33
+ try {
34
+ await fn(...args);
35
+ }
36
+ catch (err) {
37
+ outputError(toSdkError(err));
38
+ }
39
+ };
40
+ return wrapped;
41
+ }
42
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnD,SAAS,OAAO;IACd,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAA6B;IACzD,IAAI,OAAO,EAAE,EAAE,CAAC;QACd,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;gBACvB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;oBACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAa;IACvC,IAAI,OAAO,EAAE,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAA8C,EAAK;IAC5E,MAAM,OAAO,GAAG,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IACF,OAAO,OAAuB,CAAC;AACjC,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { ClientConfig } from './client.js';
2
+ export interface TokenInfo {
3
+ mint: string;
4
+ name: string;
5
+ symbol: string;
6
+ decimals: number;
7
+ }
8
+ export interface PoolInfo {
9
+ poolPda: string;
10
+ poolId: string;
11
+ operatorKey: string;
12
+ feeBps: number;
13
+ }
14
+ export interface TransferInfo {
15
+ transferPda: string;
16
+ sender: string;
17
+ recipient: string;
18
+ amount: string;
19
+ amountRaw: string;
20
+ status: string;
21
+ memo?: string;
22
+ token: TokenInfo;
23
+ pool: PoolInfo;
24
+ createTxid: string;
25
+ claimTxid?: string;
26
+ cancelTxid?: string;
27
+ claimableAfter?: string;
28
+ claimableUntil?: string;
29
+ createdAt: string;
30
+ updatedAt: string;
31
+ }
32
+ export declare function getTransfer(transferPda: string, config?: ClientConfig): Promise<TransferInfo>;
@@ -0,0 +1,12 @@
1
+ import { createHttpClient } from './client.js';
2
+ import { SdkError } from './errors.js';
3
+ export async function getTransfer(transferPda, config) {
4
+ const client = createHttpClient(config);
5
+ const res = await client.get(`/api/transfers/${transferPda}`);
6
+ const transfer = res.data.data.transfer;
7
+ if (!transfer) {
8
+ throw new SdkError('TRANSFER_NOT_FOUND', `Transfer not found: ${transferPda}`);
9
+ }
10
+ return transfer;
11
+ }
12
+ //# sourceMappingURL=transfers.js.map