fibx 0.1.0 → 0.1.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 (113) hide show
  1. package/README.md +39 -47
  2. package/dist/commands/auth/login.d.ts +3 -0
  3. package/dist/commands/auth/login.d.ts.map +1 -0
  4. package/dist/commands/auth/login.js +34 -0
  5. package/dist/commands/auth/login.js.map +1 -0
  6. package/dist/commands/auth/verify.d.ts +3 -0
  7. package/dist/commands/auth/verify.d.ts.map +1 -0
  8. package/dist/commands/auth/verify.js +61 -0
  9. package/dist/commands/auth/verify.js.map +1 -0
  10. package/dist/commands/balance.d.ts.map +1 -1
  11. package/dist/commands/balance.js +27 -8
  12. package/dist/commands/balance.js.map +1 -1
  13. package/dist/commands/trade/status.d.ts +3 -0
  14. package/dist/commands/trade/status.d.ts.map +1 -0
  15. package/dist/commands/trade/status.js +31 -0
  16. package/dist/commands/trade/status.js.map +1 -0
  17. package/dist/commands/trade/swap.d.ts +7 -0
  18. package/dist/commands/trade/swap.d.ts.map +1 -0
  19. package/dist/commands/trade/swap.js +69 -0
  20. package/dist/commands/trade/swap.js.map +1 -0
  21. package/dist/commands/wallet/address.d.ts +3 -0
  22. package/dist/commands/wallet/address.d.ts.map +1 -0
  23. package/dist/commands/wallet/address.js +15 -0
  24. package/dist/commands/wallet/address.js.map +1 -0
  25. package/dist/commands/wallet/balance.d.ts +3 -0
  26. package/dist/commands/wallet/balance.d.ts.map +1 -0
  27. package/dist/commands/wallet/balance.js +48 -0
  28. package/dist/commands/wallet/balance.js.map +1 -0
  29. package/dist/commands/wallet/list.d.ts +3 -0
  30. package/dist/commands/wallet/list.d.ts.map +1 -0
  31. package/dist/commands/wallet/list.js +39 -0
  32. package/dist/commands/wallet/list.js.map +1 -0
  33. package/dist/commands/wallet/send.d.ts +3 -0
  34. package/dist/commands/wallet/send.d.ts.map +1 -0
  35. package/dist/commands/wallet/send.js +58 -0
  36. package/dist/commands/wallet/send.js.map +1 -0
  37. package/dist/fibrous/balances.d.ts +14 -0
  38. package/dist/fibrous/balances.d.ts.map +1 -0
  39. package/dist/fibrous/balances.js +26 -0
  40. package/dist/fibrous/balances.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +85 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/lib/cache.d.ts +3 -0
  46. package/dist/lib/cache.d.ts.map +1 -0
  47. package/dist/lib/cache.js +23 -0
  48. package/dist/lib/cache.js.map +1 -0
  49. package/dist/lib/config.d.ts +7 -0
  50. package/dist/lib/config.d.ts.map +1 -0
  51. package/dist/lib/config.js +8 -0
  52. package/dist/lib/config.js.map +1 -0
  53. package/dist/lib/errors.d.ts +22 -0
  54. package/dist/lib/errors.d.ts.map +1 -0
  55. package/dist/lib/errors.js +29 -0
  56. package/dist/lib/errors.js.map +1 -0
  57. package/dist/lib/format.d.ts +8 -0
  58. package/dist/lib/format.d.ts.map +1 -0
  59. package/dist/lib/format.js +69 -0
  60. package/dist/lib/format.js.map +1 -0
  61. package/dist/lib/parseAmount.d.ts +3 -0
  62. package/dist/lib/parseAmount.d.ts.map +1 -0
  63. package/dist/lib/parseAmount.js +10 -0
  64. package/dist/lib/parseAmount.js.map +1 -0
  65. package/dist/lib/validation.d.ts +6 -0
  66. package/dist/lib/validation.d.ts.map +1 -0
  67. package/dist/lib/validation.js +24 -0
  68. package/dist/lib/validation.js.map +1 -0
  69. package/dist/services/auth/policy.d.ts +2 -0
  70. package/dist/services/auth/policy.d.ts.map +1 -0
  71. package/dist/services/auth/policy.js +3 -0
  72. package/dist/services/auth/policy.js.map +1 -0
  73. package/dist/services/auth/session.d.ts +15 -0
  74. package/dist/services/auth/session.d.ts.map +1 -0
  75. package/dist/services/auth/session.js +47 -0
  76. package/dist/services/auth/session.js.map +1 -0
  77. package/dist/services/chain/client.d.ts +24029 -0
  78. package/dist/services/chain/client.d.ts.map +1 -0
  79. package/dist/services/chain/client.js +74 -0
  80. package/dist/services/chain/client.js.map +1 -0
  81. package/dist/services/chain/constants.d.ts +14 -0
  82. package/dist/services/chain/constants.d.ts.map +1 -0
  83. package/dist/services/chain/constants.js +21 -0
  84. package/dist/services/chain/constants.js.map +1 -0
  85. package/dist/services/chain/erc20.d.ts +6 -0
  86. package/dist/services/chain/erc20.d.ts.map +1 -0
  87. package/dist/services/chain/erc20.js +72 -0
  88. package/dist/services/chain/erc20.js.map +1 -0
  89. package/dist/services/fibrous/abi/base.d.ts +768 -0
  90. package/dist/services/fibrous/abi/base.d.ts.map +1 -0
  91. package/dist/services/fibrous/abi/base.js +984 -0
  92. package/dist/services/fibrous/abi/base.js.map +1 -0
  93. package/dist/services/fibrous/balances.d.ts +14 -0
  94. package/dist/services/fibrous/balances.d.ts.map +1 -0
  95. package/dist/services/fibrous/balances.js +26 -0
  96. package/dist/services/fibrous/balances.js.map +1 -0
  97. package/dist/services/fibrous/health.d.ts +11 -0
  98. package/dist/services/fibrous/health.d.ts.map +1 -0
  99. package/dist/services/fibrous/health.js +18 -0
  100. package/dist/services/fibrous/health.js.map +1 -0
  101. package/dist/services/fibrous/route.d.ts +47 -0
  102. package/dist/services/fibrous/route.d.ts.map +1 -0
  103. package/dist/services/fibrous/route.js +60 -0
  104. package/dist/services/fibrous/route.js.map +1 -0
  105. package/dist/services/fibrous/tokens.d.ts +10 -0
  106. package/dist/services/fibrous/tokens.d.ts.map +1 -0
  107. package/dist/services/fibrous/tokens.js +37 -0
  108. package/dist/services/fibrous/tokens.js.map +1 -0
  109. package/dist/services/privy/client.d.ts +15 -0
  110. package/dist/services/privy/client.d.ts.map +1 -0
  111. package/dist/services/privy/client.js +63 -0
  112. package/dist/services/privy/client.js.map +1 -0
  113. package/package.json +4 -4
@@ -0,0 +1,39 @@
1
+ import { getPrivyClient } from "../../services/privy/client.js";
2
+ import { outputResult, outputError, withSpinner } from "../../lib/format.js";
3
+ export async function walletsCommand(email, opts) {
4
+ try {
5
+ const privy = getPrivyClient();
6
+ const user = await withSpinner(`Fetching wallets for ${email}...`, async () => privy.users().getByEmailAddress({ address: email }), opts);
7
+ const wallets = user.linked_accounts.filter((a) => (a.type === "wallet" || a.type === "smart_wallet") && "id" in a);
8
+ if (wallets.length === 0) {
9
+ outputResult({ message: "No wallets found for this user." }, opts);
10
+ return;
11
+ }
12
+ // Format for output
13
+ const walletList = wallets.map((w) => ({
14
+ address: w.address,
15
+ id: w.id,
16
+ chainType: w.chain_type,
17
+ connectorType: w.connector_type,
18
+ firstVerifiedAt: w.first_verified_at
19
+ ? new Date(w.first_verified_at * 1000).toISOString()
20
+ : "N/A",
21
+ }));
22
+ if (opts.json) {
23
+ console.log(JSON.stringify(walletList, null, 2));
24
+ }
25
+ else {
26
+ console.log(`Found ${wallets.length} wallet(s):`);
27
+ walletList.forEach((w) => {
28
+ console.log(`\nAddress: ${w.address}`);
29
+ console.log(`ID: ${w.id}`);
30
+ console.log(`Created: ${w.firstVerifiedAt}`);
31
+ console.log(`Type: ${w.connectorType} (${w.chainType})`);
32
+ });
33
+ }
34
+ }
35
+ catch (error) {
36
+ outputError(error, opts);
37
+ }
38
+ }
39
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/wallet/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAsB,MAAM,qBAAqB,CAAC;AAUjG,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa,EAAE,IAAmB;IACtE,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;QAE/B,MAAM,IAAI,GAAG,MAAM,WAAW,CAC7B,wBAAwB,KAAK,KAAK,EAClC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAC/D,IAAI,CACJ,CAAC;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI,IAAI,IAAI,CAAC,CAC1C,CAAC;QAE9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,YAAY,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,EAAE,IAAI,CAAC,CAAC;YACnE,OAAO;QACR,CAAC;QAED,oBAAoB;QACpB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,aAAa,EAAE,CAAC,CAAC,cAAc;YAC/B,eAAe,EAAE,CAAC,CAAC,iBAAiB;gBACnC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;gBACpD,CAAC,CAAC,KAAK;SACR,CAAC,CAAC,CAAC;QAEJ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;YAClD,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACxB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;YAC7D,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type OutputOptions } from "../../lib/format.js";
2
+ export declare function sendCommand(amount: string, recipient: string, tokenSymbol: string, opts: OutputOptions): Promise<void>;
3
+ //# sourceMappingURL=send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../../src/commands/wallet/send.ts"],"names":[],"mappings":"AAUA,OAAO,EAA0C,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEjG,wBAAsB,WAAW,CAChC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,aAAa,GACjB,OAAO,CAAC,IAAI,CAAC,CA4Df"}
@@ -0,0 +1,58 @@
1
+ import { requireSession } from "../../services/auth/session.js";
2
+ import { getPrivyClient } from "../../services/privy/client.js";
3
+ import { getWalletClient } from "../../services/chain/client.js";
4
+ import { getChainConfig } from "../../services/chain/constants.js";
5
+ import { encodeTransfer } from "../../services/chain/erc20.js";
6
+ import { ACTIVE_NETWORK } from "../../lib/config.js";
7
+ import { resolveToken } from "../../services/fibrous/tokens.js";
8
+ import { validateAddress, validateAmount } from "../../lib/validation.js";
9
+ import { parseAmount } from "../../lib/parseAmount.js";
10
+ import { outputResult, outputError, withSpinner } from "../../lib/format.js";
11
+ export async function sendCommand(amount, recipient, tokenSymbol, opts) {
12
+ try {
13
+ validateAmount(amount);
14
+ validateAddress(recipient);
15
+ const chain = getChainConfig(ACTIVE_NETWORK);
16
+ const session = requireSession();
17
+ const privy = getPrivyClient();
18
+ const walletClient = getWalletClient(privy, session);
19
+ let txHash;
20
+ let amountBigInt;
21
+ const isEth = tokenSymbol.toUpperCase() === "ETH";
22
+ if (isEth) {
23
+ // Native ETH Transfer
24
+ amountBigInt = parseAmount(amount, 18);
25
+ txHash = await withSpinner(`Sending ${amount} ETH...`, async () => {
26
+ return walletClient.sendTransaction({
27
+ to: recipient,
28
+ value: amountBigInt,
29
+ data: undefined,
30
+ });
31
+ }, opts);
32
+ }
33
+ else {
34
+ // ERC20 Transfer
35
+ const token = await resolveToken(tokenSymbol);
36
+ amountBigInt = parseAmount(amount, token.decimals);
37
+ const data = encodeTransfer(recipient, amountBigInt);
38
+ txHash = await withSpinner(`Sending ${amount} ${token.symbol}...`, async () => {
39
+ return walletClient.sendTransaction({
40
+ to: token.address,
41
+ data,
42
+ value: 0n,
43
+ });
44
+ }, opts);
45
+ }
46
+ outputResult({
47
+ txHash,
48
+ amount,
49
+ recipient,
50
+ token: isEth ? "ETH" : tokenSymbol.toUpperCase(),
51
+ chain: chain.name,
52
+ }, opts);
53
+ }
54
+ catch (error) {
55
+ outputError(error, opts);
56
+ }
57
+ }
58
+ //# sourceMappingURL=send.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.js","sourceRoot":"","sources":["../../../src/commands/wallet/send.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAsB,MAAM,qBAAqB,CAAC;AAEjG,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,MAAc,EACd,SAAiB,EACjB,WAAmB,EACnB,IAAmB;IAEnB,IAAI,CAAC;QACJ,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,eAAe,CAAC,SAAS,CAAC,CAAC;QAE3B,MAAM,KAAK,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAErD,IAAI,MAAqB,CAAC;QAC1B,IAAI,YAAoB,CAAC;QACzB,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;QAElD,IAAI,KAAK,EAAE,CAAC;YACX,sBAAsB;YACtB,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACvC,MAAM,GAAG,MAAM,WAAW,CACzB,WAAW,MAAM,SAAS,EAC1B,KAAK,IAAI,EAAE;gBACV,OAAO,YAAY,CAAC,eAAe,CAAC;oBACnC,EAAE,EAAE,SAAoB;oBACxB,KAAK,EAAE,YAAY;oBACnB,IAAI,EAAE,SAAS;iBACf,CAAC,CAAC;YACJ,CAAC,EACD,IAAI,CACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACP,iBAAiB;YACjB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;YAC9C,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,cAAc,CAAC,SAAoB,EAAE,YAAY,CAAC,CAAC;YAEhE,MAAM,GAAG,MAAM,WAAW,CACzB,WAAW,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,EACtC,KAAK,IAAI,EAAE;gBACV,OAAO,YAAY,CAAC,eAAe,CAAC;oBACnC,EAAE,EAAE,KAAK,CAAC,OAAkB;oBAC5B,IAAI;oBACJ,KAAK,EAAE,EAAE;iBACT,CAAC,CAAC;YACJ,CAAC,EACD,IAAI,CACJ,CAAC;QACH,CAAC;QAED,YAAY,CACX;YACC,MAAM;YACN,MAAM;YACN,SAAS;YACT,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE;YAChD,KAAK,EAAE,KAAK,CAAC,IAAI;SACjB,EACD,IAAI,CACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;AACF,CAAC"}
@@ -0,0 +1,14 @@
1
+ interface TokenInput {
2
+ address: string;
3
+ decimal: number;
4
+ }
5
+ export interface BalanceResponse {
6
+ token: TokenInput;
7
+ balance: string;
8
+ }
9
+ export declare function getBalances(tokens: {
10
+ address: string;
11
+ decimals: number;
12
+ }[], walletAddress: string): Promise<BalanceResponse[]>;
13
+ export {};
14
+ //# sourceMappingURL=balances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balances.d.ts","sourceRoot":"","sources":["../../src/fibrous/balances.ts"],"names":[],"mappings":"AAIA,UAAU,UAAU;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CAChB;AAOD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CAChB;AAID,wBAAsB,WAAW,CAChC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,EAC/C,aAAa,EAAE,MAAM,GACnB,OAAO,CAAC,eAAe,EAAE,CAAC,CAyB5B"}
@@ -0,0 +1,26 @@
1
+ import { FIBROUS_GRAPH_URL, ACTIVE_NETWORK } from "../utils/config.js";
2
+ import { getChainConfig } from "../chain/chains.js";
3
+ import { ErrorCode, FibxError } from "../utils/errors.js";
4
+ const chain = getChainConfig(ACTIVE_NETWORK);
5
+ export async function getBalances(tokens, walletAddress) {
6
+ try {
7
+ const payload = {
8
+ tokenAddresses: tokens.map((t) => ({ address: t.address, decimal: t.decimals })),
9
+ walletAddress,
10
+ };
11
+ const res = await fetch(`${FIBROUS_GRAPH_URL}/${chain.fibrousNetwork}/balances`, {
12
+ method: "POST",
13
+ headers: { "Content-Type": "application/json" },
14
+ body: JSON.stringify(payload),
15
+ });
16
+ if (!res.ok) {
17
+ throw new Error(`HTTP ${res.status} ${res.statusText}`);
18
+ }
19
+ const data = (await res.json());
20
+ return data;
21
+ }
22
+ catch (error) {
23
+ throw new FibxError(ErrorCode.FIBROUS_ERROR, `Failed to fetch balances: ${error instanceof Error ? error.message : String(error)}`);
24
+ }
25
+ }
26
+ //# sourceMappingURL=balances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balances.js","sourceRoot":"","sources":["../../src/fibrous/balances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAiB1D,MAAM,KAAK,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,MAA+C,EAC/C,aAAqB;IAErB,IAAI,CAAC;QACJ,MAAM,OAAO,GAAmB;YAC/B,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAChF,aAAa;SACb,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,iBAAiB,IAAI,KAAK,CAAC,cAAc,WAAW,EAAE;YAChF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC7B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAsB,CAAC;QACrD,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,SAAS,CAClB,SAAS,CAAC,aAAa,EACvB,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACrF,CAAC;IACH,CAAC;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { statusCommand } from "./commands/trade/status.js";
4
+ import { authLoginCommand } from "./commands/auth/login.js";
5
+ import { authVerifyCommand } from "./commands/auth/verify.js";
6
+ import { addressCommand } from "./commands/wallet/address.js";
7
+ import { balanceCommand } from "./commands/wallet/balance.js";
8
+ import { sendCommand } from "./commands/wallet/send.js";
9
+ import { tradeCommand } from "./commands/trade/swap.js";
10
+ import { walletsCommand } from "./commands/wallet/list.js";
11
+ const program = new Command();
12
+ program
13
+ .name("fibx")
14
+ .description("Fibrous DeFi CLI — wallet, transfer, swap")
15
+ .version("0.1.2")
16
+ .option("--json", "Output results as JSON", false);
17
+ const auth = program.command("auth").description("Authentication commands");
18
+ auth.command("login")
19
+ .description("Initiate email OTP login via Privy")
20
+ .argument("<email>", "Email address for OTP login")
21
+ .action(async (email, _opts, cmd) => {
22
+ const globalOpts = cmd.parent.parent.opts();
23
+ await authLoginCommand(email, { json: globalOpts.json });
24
+ });
25
+ auth.command("verify")
26
+ .description("Verify OTP code and create wallet session")
27
+ .argument("<email>", "Email used for login")
28
+ .argument("<code>", "OTP code from email")
29
+ .action(async (email, code, _opts, cmd) => {
30
+ const globalOpts = cmd.parent.parent.opts();
31
+ await authVerifyCommand(email, code, { json: globalOpts.json });
32
+ });
33
+ program
34
+ .command("status")
35
+ .description("Check auth status and Fibrous health")
36
+ .action(async (_opts, cmd) => {
37
+ const globalOpts = cmd.parent.opts();
38
+ await statusCommand({ json: globalOpts.json });
39
+ });
40
+ program
41
+ .command("wallets")
42
+ .description("List wallets linked to a user email")
43
+ .argument("<email>", "User email address")
44
+ .option("-j, --json", "Output as JSON")
45
+ .action(walletsCommand);
46
+ program
47
+ .command("address")
48
+ .description("Show active wallet address")
49
+ .action(async (_opts, cmd) => {
50
+ const globalOpts = cmd.parent.opts();
51
+ await addressCommand({ json: globalOpts.json });
52
+ });
53
+ program
54
+ .command("balance")
55
+ .description("Show ETH and USDC balances")
56
+ .action(async (_opts, cmd) => {
57
+ const globalOpts = cmd.parent.opts();
58
+ await balanceCommand({ json: globalOpts.json });
59
+ });
60
+ program
61
+ .command("send")
62
+ .description("Send tokens (ETH, USDC, etc.)")
63
+ .argument("<amount>", "Amount to send")
64
+ .argument("<recipient>", "Recipient address (0x...)")
65
+ .argument("[token]", "Token symbol or address", "ETH")
66
+ .action(async (amount, recipient, token, _opts, cmd) => {
67
+ const globalOpts = cmd.parent.opts();
68
+ await sendCommand(amount, recipient, token, { json: globalOpts.json });
69
+ });
70
+ program
71
+ .command("trade")
72
+ .description("Swap tokens via Fibrous")
73
+ .argument("<amount>", "Amount to swap")
74
+ .argument("<from>", "Source token (symbol or address)")
75
+ .argument("<to>", "Destination token (symbol or address)")
76
+ .option("-s, --slippage <number>", "Slippage tolerance", "0.5")
77
+ .action(async (amount, from, to, opts, cmd) => {
78
+ const globalOpts = cmd.parent.opts();
79
+ await tradeCommand(amount, from, to, {
80
+ json: globalOpts.json,
81
+ slippage: parseFloat(opts.slippage),
82
+ });
83
+ });
84
+ program.parseAsync();
85
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function readCache<T>(key: string, ttlMs?: number): T | null;
2
+ export declare function writeCache(key: string, data: unknown): void;
3
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"AAaA,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAA2B,GAAG,CAAC,GAAG,IAAI,CAQtF;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAM3D"}
@@ -0,0 +1,23 @@
1
+ import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
2
+ import { join, dirname } from "node:path";
3
+ import { paths, TOKEN_CACHE_TTL_MS } from "./config.js";
4
+ function getCachePath(key) {
5
+ return join(paths.cache, `${key}.json`);
6
+ }
7
+ export function readCache(key, ttlMs = TOKEN_CACHE_TTL_MS) {
8
+ try {
9
+ const raw = readFileSync(getCachePath(key), "utf-8");
10
+ const entry = JSON.parse(raw);
11
+ return Date.now() - entry._cachedAt > ttlMs ? null : entry.data;
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ export function writeCache(key, data) {
18
+ const filePath = getCachePath(key);
19
+ mkdirSync(dirname(filePath), { recursive: true });
20
+ const entry = { _cachedAt: Date.now(), data };
21
+ writeFileSync(filePath, JSON.stringify(entry, null, 2), "utf-8");
22
+ }
23
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAOxD,SAAS,YAAY,CAAC,GAAW;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAI,GAAW,EAAE,QAAgB,kBAAkB;IAC3E,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,KAAK,GAAkB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,IAAa;IACpD,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACnC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,MAAM,KAAK,GAAwB,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC;IACnE,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const paths: import("env-paths").Paths;
2
+ export declare const ACTIVE_NETWORK = "base";
3
+ export declare const FIBROUS_BASE_URL = "https://api.fibrous.finance";
4
+ export declare const FIBROUS_GRAPH_URL = "https://graph.fibrous.finance";
5
+ export declare const DEFAULT_SLIPPAGE = 0.5;
6
+ export declare const TOKEN_CACHE_TTL_MS: number;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,2BAAmB,CAAC;AAEtC,eAAO,MAAM,cAAc,SAAS,CAAC;AAErC,eAAO,MAAM,gBAAgB,gCAAgC,CAAC;AAC9D,eAAO,MAAM,iBAAiB,kCAAkC,CAAC;AAEjE,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,kBAAkB,QAAsB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import envPaths from "env-paths";
2
+ export const paths = envPaths("fibx");
3
+ export const ACTIVE_NETWORK = "base";
4
+ export const FIBROUS_BASE_URL = "https://api.fibrous.finance";
5
+ export const FIBROUS_GRAPH_URL = "https://graph.fibrous.finance";
6
+ export const DEFAULT_SLIPPAGE = 0.5;
7
+ export const TOKEN_CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24h
8
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;AAEtC,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AAErC,MAAM,CAAC,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AAC9D,MAAM,CAAC,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AAEjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM"}
@@ -0,0 +1,22 @@
1
+ export declare enum ErrorCode {
2
+ NOT_AUTHENTICATED = "NOT_AUTHENTICATED",
3
+ INSUFFICIENT_BALANCE = "INSUFFICIENT_BALANCE",
4
+ TOKEN_NOT_SUPPORTED = "TOKEN_NOT_SUPPORTED",
5
+ ROUTE_NOT_FOUND = "ROUTE_NOT_FOUND",
6
+ RPC_ERROR = "RPC_ERROR",
7
+ INVALID_ADDRESS = "INVALID_ADDRESS",
8
+ INVALID_AMOUNT = "INVALID_AMOUNT",
9
+ PRIVY_ERROR = "PRIVY_ERROR",
10
+ FIBROUS_ERROR = "FIBROUS_ERROR",
11
+ SESSION_ERROR = "SESSION_ERROR"
12
+ }
13
+ export declare class FibxError extends Error {
14
+ readonly code: ErrorCode;
15
+ constructor(code: ErrorCode, message: string);
16
+ toJSON(): {
17
+ error: boolean;
18
+ code: ErrorCode;
19
+ message: string;
20
+ };
21
+ }
22
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,oBAAY,SAAS;IACpB,iBAAiB,sBAAsB;IACvC,oBAAoB,yBAAyB;IAC7C,mBAAmB,wBAAwB;IAC3C,eAAe,oBAAoB;IACnC,SAAS,cAAc;IACvB,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;IACjC,WAAW,gBAAgB;IAC3B,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;CAC/B;AAED,qBAAa,SAAU,SAAQ,KAAK;IACnC,SAAgB,IAAI,EAAE,SAAS,CAAC;gBAEpB,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM;IAM5C,MAAM;;;;;CAON"}
@@ -0,0 +1,29 @@
1
+ export var ErrorCode;
2
+ (function (ErrorCode) {
3
+ ErrorCode["NOT_AUTHENTICATED"] = "NOT_AUTHENTICATED";
4
+ ErrorCode["INSUFFICIENT_BALANCE"] = "INSUFFICIENT_BALANCE";
5
+ ErrorCode["TOKEN_NOT_SUPPORTED"] = "TOKEN_NOT_SUPPORTED";
6
+ ErrorCode["ROUTE_NOT_FOUND"] = "ROUTE_NOT_FOUND";
7
+ ErrorCode["RPC_ERROR"] = "RPC_ERROR";
8
+ ErrorCode["INVALID_ADDRESS"] = "INVALID_ADDRESS";
9
+ ErrorCode["INVALID_AMOUNT"] = "INVALID_AMOUNT";
10
+ ErrorCode["PRIVY_ERROR"] = "PRIVY_ERROR";
11
+ ErrorCode["FIBROUS_ERROR"] = "FIBROUS_ERROR";
12
+ ErrorCode["SESSION_ERROR"] = "SESSION_ERROR";
13
+ })(ErrorCode || (ErrorCode = {}));
14
+ export class FibxError extends Error {
15
+ code;
16
+ constructor(code, message) {
17
+ super(message);
18
+ this.name = "FibxError";
19
+ this.code = code;
20
+ }
21
+ toJSON() {
22
+ return {
23
+ error: true,
24
+ code: this.code,
25
+ message: this.message,
26
+ };
27
+ }
28
+ }
29
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,SAWX;AAXD,WAAY,SAAS;IACpB,oDAAuC,CAAA;IACvC,0DAA6C,CAAA;IAC7C,wDAA2C,CAAA;IAC3C,gDAAmC,CAAA;IACnC,oCAAuB,CAAA;IACvB,gDAAmC,CAAA;IACnC,8CAAiC,CAAA;IACjC,wCAA2B,CAAA;IAC3B,4CAA+B,CAAA;IAC/B,4CAA+B,CAAA;AAChC,CAAC,EAXW,SAAS,KAAT,SAAS,QAWpB;AAED,MAAM,OAAO,SAAU,SAAQ,KAAK;IACnB,IAAI,CAAY;IAEhC,YAAY,IAAe,EAAE,OAAe;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,MAAM;QACL,OAAO;YACN,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;SACrB,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,8 @@
1
+ import { type Ora } from "ora";
2
+ export interface OutputOptions {
3
+ json: boolean;
4
+ }
5
+ export declare function outputResult(data: unknown, opts: OutputOptions): void;
6
+ export declare function outputError(error: unknown, opts: OutputOptions): void;
7
+ export declare function withSpinner<T>(label: string, fn: (spinner: Ora) => Promise<T>, opts: OutputOptions): Promise<T>;
8
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAGpC,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,OAAO,CAAC;CACd;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAQrE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAgBrE;AAED,wBAAsB,WAAW,CAAC,CAAC,EAClC,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,EAChC,IAAI,EAAE,aAAa,GACjB,OAAO,CAAC,CAAC,CAAC,CAYZ"}
@@ -0,0 +1,69 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { FibxError } from "./errors.js";
4
+ export function outputResult(data, opts) {
5
+ if (opts.json) {
6
+ process.stdout.write(JSON.stringify(data, null, 2) + "\n");
7
+ }
8
+ else if (typeof data === "object" && data !== null) {
9
+ formatTable(data);
10
+ }
11
+ else {
12
+ console.log(data);
13
+ }
14
+ }
15
+ export function outputError(error, opts) {
16
+ if (error instanceof FibxError) {
17
+ if (opts.json) {
18
+ process.stdout.write(JSON.stringify(error.toJSON(), null, 2) + "\n");
19
+ }
20
+ else {
21
+ console.error(chalk.red(`✗ [${error.code}] ${error.message}`));
22
+ }
23
+ }
24
+ else {
25
+ const msg = error instanceof Error ? error.message : String(error);
26
+ if (opts.json) {
27
+ process.stdout.write(JSON.stringify({ error: true, message: msg }, null, 2) + "\n");
28
+ }
29
+ else {
30
+ console.error(chalk.red(`✗ ${msg}`));
31
+ }
32
+ }
33
+ process.exitCode = 1;
34
+ }
35
+ export async function withSpinner(label, fn, opts) {
36
+ if (opts.json)
37
+ return fn(ora({ isSilent: true }));
38
+ const spinner = ora(label).start();
39
+ try {
40
+ const result = await fn(spinner);
41
+ spinner.succeed();
42
+ return result;
43
+ }
44
+ catch (error) {
45
+ spinner.fail();
46
+ throw error;
47
+ }
48
+ }
49
+ function formatTable(data) {
50
+ const maxKeyLen = Math.max(...Object.keys(data).map((k) => k.length));
51
+ for (const [key, value] of Object.entries(data)) {
52
+ console.log(` ${chalk.dim(key.padEnd(maxKeyLen))} ${formatValue(value)}`);
53
+ }
54
+ }
55
+ function formatValue(value) {
56
+ if (typeof value === "boolean")
57
+ return value ? chalk.green("✓") : chalk.red("✗");
58
+ if (typeof value === "number")
59
+ return chalk.cyan(value.toString());
60
+ if (typeof value === "string") {
61
+ if (/^0x[a-fA-F0-9]{40}$/.test(value))
62
+ return chalk.yellow(value);
63
+ return chalk.white(value);
64
+ }
65
+ if (typeof value === "object" && value !== null)
66
+ return chalk.dim(JSON.stringify(value));
67
+ return String(value);
68
+ }
69
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function parseAmount(amount: string, decimals: number): bigint;
2
+ export declare function formatAmount(amount: bigint, decimals: number): string;
3
+ //# sourceMappingURL=parseAmount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseAmount.d.ts","sourceRoot":"","sources":["../../src/lib/parseAmount.ts"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIpE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErE"}
@@ -0,0 +1,10 @@
1
+ import { parseUnits, formatUnits } from "viem";
2
+ export function parseAmount(amount, decimals) {
3
+ // Remove "$" and commas
4
+ const cleanAmount = amount.replace(/[$,]/g, "");
5
+ return parseUnits(cleanAmount, decimals);
6
+ }
7
+ export function formatAmount(amount, decimals) {
8
+ return formatUnits(amount, decimals);
9
+ }
10
+ //# sourceMappingURL=parseAmount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseAmount.js","sourceRoot":"","sources":["../../src/lib/parseAmount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAE/C,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,QAAgB;IAC3D,wBAAwB;IACxB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAChD,OAAO,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,QAAgB;IAC5D,OAAO,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { z } from "zod";
2
+ export declare const addressSchema: z.ZodString;
3
+ export declare const amountSchema: z.ZodString;
4
+ export declare function validateAddress(addr: string): string;
5
+ export declare function validateAmount(amount: string): string;
6
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,aAAa,aAAiE,CAAC;AAE5F,eAAO,MAAM,YAAY,aAQxB,CAAC;AAEF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMrD"}
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ import { ErrorCode, FibxError } from "./errors.js";
3
+ export const addressSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/, "Invalid EVM address");
4
+ export const amountSchema = z.string().refine((v) => {
5
+ const clean = v.replace(/[$,]/g, "");
6
+ return !isNaN(Number(clean)) && Number(clean) > 0;
7
+ }, {
8
+ message: "Amount must be a positive number",
9
+ });
10
+ export function validateAddress(addr) {
11
+ const result = addressSchema.safeParse(addr);
12
+ if (!result.success) {
13
+ throw new FibxError(ErrorCode.INVALID_ADDRESS, result.error.message);
14
+ }
15
+ return result.data;
16
+ }
17
+ export function validateAmount(amount) {
18
+ const result = amountSchema.safeParse(amount);
19
+ if (!result.success) {
20
+ throw new FibxError(ErrorCode.INVALID_AMOUNT, result.error.message);
21
+ }
22
+ return result.data;
23
+ }
24
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,EAAE,qBAAqB,CAAC,CAAC;AAE5F,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAC5C,CAAC,CAAC,EAAE,EAAE;IACL,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC,EACD;IACC,OAAO,EAAE,kCAAkC;CAC3C,CACD,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,IAAY;IAC3C,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,SAAS,CAAC,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC5C,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,IAAI,SAAS,CAAC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACpB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function createDefaultPolicy(): void;
2
+ //# sourceMappingURL=policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../../src/services/auth/policy.ts"],"names":[],"mappings":"AACA,wBAAgB,mBAAmB,IAAI,IAAI,CAAG"}
@@ -0,0 +1,3 @@
1
+ // V1 stub — future: spending limits, whitelists.
2
+ export function createDefaultPolicy() { }
3
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/services/auth/policy.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,MAAM,UAAU,mBAAmB,KAAU,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+ declare const sessionSchema: z.ZodObject<{
3
+ userId: z.ZodOptional<z.ZodString>;
4
+ walletId: z.ZodString;
5
+ walletAddress: z.ZodString;
6
+ userJwt: z.ZodOptional<z.ZodString>;
7
+ createdAt: z.ZodString;
8
+ }, z.core.$strip>;
9
+ export type Session = z.infer<typeof sessionSchema>;
10
+ export declare function loadSession(): Session | null;
11
+ export declare function requireSession(): Session;
12
+ export declare function saveSession(session: Session): void;
13
+ export declare function clearSession(): void;
14
+ export {};
15
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/services/auth/session.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,QAAA,MAAM,aAAa;;;;;;iBAMjB,CAAC;AAEH,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAMpD,wBAAgB,WAAW,IAAI,OAAO,GAAG,IAAI,CAQ5C;AAED,wBAAgB,cAAc,IAAI,OAAO,CASxC;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAKlD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAMnC"}