fibx 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.md +159 -0
  2. package/dist/chain/chains.d.ts +14 -0
  3. package/dist/chain/chains.d.ts.map +1 -0
  4. package/dist/chain/chains.js +21 -0
  5. package/dist/chain/chains.js.map +1 -0
  6. package/dist/chain/erc20.d.ts +6 -0
  7. package/dist/chain/erc20.d.ts.map +1 -0
  8. package/dist/chain/erc20.js +72 -0
  9. package/dist/chain/erc20.js.map +1 -0
  10. package/dist/chain/viem.d.ts +24029 -0
  11. package/dist/chain/viem.d.ts.map +1 -0
  12. package/dist/chain/viem.js +74 -0
  13. package/dist/chain/viem.js.map +1 -0
  14. package/dist/cli.d.ts +3 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +85 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/commands/address.d.ts +3 -0
  19. package/dist/commands/address.d.ts.map +1 -0
  20. package/dist/commands/address.js +15 -0
  21. package/dist/commands/address.js.map +1 -0
  22. package/dist/commands/auth-login.d.ts +3 -0
  23. package/dist/commands/auth-login.d.ts.map +1 -0
  24. package/dist/commands/auth-login.js +34 -0
  25. package/dist/commands/auth-login.js.map +1 -0
  26. package/dist/commands/auth-verify.d.ts +3 -0
  27. package/dist/commands/auth-verify.d.ts.map +1 -0
  28. package/dist/commands/auth-verify.js +64 -0
  29. package/dist/commands/auth-verify.js.map +1 -0
  30. package/dist/commands/balance.d.ts +3 -0
  31. package/dist/commands/balance.d.ts.map +1 -0
  32. package/dist/commands/balance.js +36 -0
  33. package/dist/commands/balance.js.map +1 -0
  34. package/dist/commands/send.d.ts +3 -0
  35. package/dist/commands/send.d.ts.map +1 -0
  36. package/dist/commands/send.js +58 -0
  37. package/dist/commands/send.js.map +1 -0
  38. package/dist/commands/status.d.ts +3 -0
  39. package/dist/commands/status.d.ts.map +1 -0
  40. package/dist/commands/status.js +31 -0
  41. package/dist/commands/status.js.map +1 -0
  42. package/dist/commands/trade.d.ts +7 -0
  43. package/dist/commands/trade.d.ts.map +1 -0
  44. package/dist/commands/trade.js +69 -0
  45. package/dist/commands/trade.js.map +1 -0
  46. package/dist/commands/wallets.d.ts +3 -0
  47. package/dist/commands/wallets.d.ts.map +1 -0
  48. package/dist/commands/wallets.js +39 -0
  49. package/dist/commands/wallets.js.map +1 -0
  50. package/dist/fibrous/abi/base.d.ts +768 -0
  51. package/dist/fibrous/abi/base.d.ts.map +1 -0
  52. package/dist/fibrous/abi/base.js +984 -0
  53. package/dist/fibrous/abi/base.js.map +1 -0
  54. package/dist/fibrous/health.d.ts +11 -0
  55. package/dist/fibrous/health.d.ts.map +1 -0
  56. package/dist/fibrous/health.js +18 -0
  57. package/dist/fibrous/health.js.map +1 -0
  58. package/dist/fibrous/route.d.ts +47 -0
  59. package/dist/fibrous/route.d.ts.map +1 -0
  60. package/dist/fibrous/route.js +60 -0
  61. package/dist/fibrous/route.js.map +1 -0
  62. package/dist/fibrous/tokens.d.ts +10 -0
  63. package/dist/fibrous/tokens.d.ts.map +1 -0
  64. package/dist/fibrous/tokens.js +37 -0
  65. package/dist/fibrous/tokens.js.map +1 -0
  66. package/dist/format/output.d.ts +8 -0
  67. package/dist/format/output.d.ts.map +1 -0
  68. package/dist/format/output.js +69 -0
  69. package/dist/format/output.js.map +1 -0
  70. package/dist/utils/cache.d.ts +3 -0
  71. package/dist/utils/cache.d.ts.map +1 -0
  72. package/dist/utils/cache.js +23 -0
  73. package/dist/utils/cache.js.map +1 -0
  74. package/dist/utils/config.d.ts +7 -0
  75. package/dist/utils/config.d.ts.map +1 -0
  76. package/dist/utils/config.js +8 -0
  77. package/dist/utils/config.js.map +1 -0
  78. package/dist/utils/errors.d.ts +22 -0
  79. package/dist/utils/errors.d.ts.map +1 -0
  80. package/dist/utils/errors.js +29 -0
  81. package/dist/utils/errors.js.map +1 -0
  82. package/dist/utils/parseAmount.d.ts +3 -0
  83. package/dist/utils/parseAmount.d.ts.map +1 -0
  84. package/dist/utils/parseAmount.js +10 -0
  85. package/dist/utils/parseAmount.js.map +1 -0
  86. package/dist/utils/validation.d.ts +6 -0
  87. package/dist/utils/validation.d.ts.map +1 -0
  88. package/dist/utils/validation.js +24 -0
  89. package/dist/utils/validation.js.map +1 -0
  90. package/dist/wallet/policy.d.ts +2 -0
  91. package/dist/wallet/policy.d.ts.map +1 -0
  92. package/dist/wallet/policy.js +3 -0
  93. package/dist/wallet/policy.js.map +1 -0
  94. package/dist/wallet/privy.d.ts +15 -0
  95. package/dist/wallet/privy.d.ts.map +1 -0
  96. package/dist/wallet/privy.js +63 -0
  97. package/dist/wallet/privy.js.map +1 -0
  98. package/dist/wallet/session.d.ts +15 -0
  99. package/dist/wallet/session.d.ts.map +1 -0
  100. package/dist/wallet/session.js +47 -0
  101. package/dist/wallet/session.js.map +1 -0
  102. package/package.json +57 -0
package/README.md ADDED
@@ -0,0 +1,159 @@
1
+ # fibx
2
+
3
+ A command-line tool for specialized DeFi operations on **Base**, powered by [Fibrous Finance](https://fibrous.finance) aggregation and [Privy](https://privy.io) Server Wallets.
4
+
5
+ ## Features
6
+
7
+ - **Privy Server Wallets**: Uses "Agentic" server-side wallets (ownerless) for seamless, automated signing without user interaction.
8
+ - **ETH & Token Transfers**: Send ETH or any ERC-20 token with a simple command.
9
+ - **Fibrous Aggregation**: Execute token swaps with optimal routing and auto-slippage protection.
10
+ - **Automated Auth Flow**: One-time email OTP login provisions a persistent server wallet linked to your user profile.
11
+ - **JSON Output**: All commands support `--json` for easy integration into scripts and pipelines.
12
+
13
+ ## Requirements
14
+
15
+ - Node.js ≥ 20
16
+ - pnpm
17
+ - Privy App ID and Secret (from [dashboard.privy.io](https://dashboard.privy.io))
18
+
19
+ ## Quick Start
20
+
21
+ ### 1. Install Dependencies
22
+
23
+ ```bash
24
+ pnpm install
25
+ ```
26
+
27
+ ### 2. Configure Environment
28
+
29
+ Copy the example environment file and add your Privy credentials:
30
+
31
+ ```bash
32
+ cp .env.example .env
33
+ ```
34
+
35
+ Edit `.env`:
36
+
37
+ ```env
38
+ PRIVY_APP_ID=your_app_id
39
+ PRIVY_APP_SECRET=your_app_secret
40
+ ```
41
+
42
+ ### 3. Authenticate & Provision Wallet
43
+
44
+ This two-step process links your email to a server-side wallet.
45
+
46
+ **Step 1: Request OTP**
47
+
48
+ ```bash
49
+ pnpm dev auth login <email>
50
+ # Example:
51
+ pnpm dev auth login user@example.com
52
+ ```
53
+
54
+ **Step 2: Verify & Create Session**
55
+
56
+ ```bash
57
+ pnpm dev auth verify <email> <code>
58
+ # Example:
59
+ pnpm dev auth verify user@example.com 123456
60
+ ```
61
+
62
+ _Successfully verifying will create a local session file and provision a Server Wallet if one doesn't exist._
63
+
64
+ ### 4. Check Status
65
+
66
+ Verify that you are authenticated and the API is healthy:
67
+
68
+ ```bash
69
+ pnpm dev status
70
+ ```
71
+
72
+ ## Usage
73
+
74
+ ### Check Balance
75
+
76
+ View your ETH and USDC balances on Base:
77
+
78
+ ```bash
79
+ pnpm dev balance
80
+ ```
81
+
82
+ ### Send Tokens
83
+
84
+ Transfer ETH or ERC-20 tokens to another address.
85
+
86
+ **Send ETH (Default):**
87
+
88
+ ```bash
89
+ pnpm dev send 0.001 0xRecipientAddress
90
+ ```
91
+
92
+ **Send ERC-20 (e.g., USDC):**
93
+
94
+ ```bash
95
+ pnpm dev send 10 0xRecipientAddress USDC
96
+ ```
97
+
98
+ ### Swap Tokens
99
+
100
+ Swap tokens using Fibrous Finance's aggregator.
101
+
102
+ ```bash
103
+ pnpm dev trade <amount> <from_token> <to_token>
104
+ ```
105
+
106
+ **Examples:**
107
+
108
+ ```bash
109
+ # Swap 0.0001 ETH to USDC
110
+ pnpm dev trade 0.0001 ETH USDC
111
+
112
+ # Swap 20 USDC to DAI
113
+ pnpm dev trade 20 USDC DAI
114
+ ```
115
+
116
+ **Options:**
117
+
118
+ - `--slippage <number>`: Set slippage tolerance (default: 0.5%)
119
+ - `--json`: Output result as JSON
120
+
121
+ ### View Wallet Address
122
+
123
+ Print your connected server wallet address:
124
+
125
+ ```bash
126
+ pnpm dev address
127
+ ```
128
+
129
+ # Architecture
130
+
131
+ This CLI uses a **Server Wallet** architecture:
132
+
133
+ 1. **Privy**: Manages the embedded wallets. We use "Ownerless" wallets (Agents) that are controlled via the Privy App Secret, allowing the CLI to sign transactions programmatically without requiring a user-side browser or JWT.
134
+ 2. **Viem**: Handles all blockchain interactions (RPC calls, transaction signing) using a custom Privy-backed account.
135
+ 3. **Fibrous**: Provides the routing and calldata for optimal token swaps on Base.
136
+
137
+ ## Project Structure
138
+
139
+ ```
140
+ src/
141
+ ├── cli.ts # Entry point & Command definitions
142
+ ├── commands/ # Command implementation logic
143
+ │ ├── auth-login.ts # Step 1: Request OTP
144
+ │ ├── auth-verify.ts # Step 2: Verify & Provision Wallet
145
+ │ ├── trade.ts # Swap logic via Fibrous
146
+ │ ├── send.ts # ETH/ERC20 transfer logic
147
+ │ └── ...
148
+ ├── chain/ # Blockchain layer
149
+ │ └── viem.ts # Viem client & Custom Privy Account
150
+ ├── wallet/ # Wallet management
151
+ │ ├── privy.ts # Privy SDK integration (Server Wallets)
152
+ │ └── session.ts # Local session management
153
+ ├── fibrous/ # Fibrous API integration
154
+ └── utils/ # Config, validation, and helpers
155
+ ```
156
+
157
+ ## License
158
+
159
+ MIT
@@ -0,0 +1,14 @@
1
+ import type { Abi } from "viem";
2
+ import { base } from "viem/chains";
3
+ export interface ChainConfig {
4
+ id: number;
5
+ name: string;
6
+ viemChain: typeof base;
7
+ rpcUrl: string;
8
+ nativeTokenAddress: string;
9
+ fibrousNetwork: string;
10
+ routerAbi: Abi;
11
+ }
12
+ export declare const SUPPORTED_CHAINS: Record<string, ChainConfig>;
13
+ export declare function getChainConfig(network: string): ChainConfig;
14
+ //# sourceMappingURL=chains.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chains.d.ts","sourceRoot":"","sources":["../../src/chain/chains.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGnC,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,GAAG,CAAC;CACf;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAUxD,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAQ3D"}
@@ -0,0 +1,21 @@
1
+ import { base } from "viem/chains";
2
+ import { baseRouterAbi } from "../fibrous/abi/base.js";
3
+ export const SUPPORTED_CHAINS = {
4
+ base: {
5
+ id: 8453,
6
+ name: "base",
7
+ viemChain: base,
8
+ rpcUrl: "https://mainnet.base.org",
9
+ nativeTokenAddress: "0x0000000000000000000000000000000000000000",
10
+ fibrousNetwork: "base",
11
+ routerAbi: baseRouterAbi,
12
+ },
13
+ };
14
+ export function getChainConfig(network) {
15
+ const config = SUPPORTED_CHAINS[network];
16
+ if (!config) {
17
+ throw new Error(`Unsupported chain: ${network}. Supported: ${Object.keys(SUPPORTED_CHAINS).join(", ")}`);
18
+ }
19
+ return config;
20
+ }
21
+ //# sourceMappingURL=chains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chains.js","sourceRoot":"","sources":["../../src/chain/chains.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAYvD,MAAM,CAAC,MAAM,gBAAgB,GAAgC;IAC5D,IAAI,EAAE;QACL,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,0BAA0B;QAClC,kBAAkB,EAAE,4CAA4C;QAChE,cAAc,EAAE,MAAM;QACtB,SAAS,EAAE,aAAoB;KAC/B;CACD,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,OAAe;IAC7C,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACd,sBAAsB,OAAO,gBAAgB,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvF,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type Address } from "viem";
2
+ export declare function getERC20Balance(tokenAddress: Address, walletAddress: Address): Promise<bigint>;
3
+ export declare function encodeTransfer(to: Address, amount: bigint): `0x${string}`;
4
+ export declare function encodeApprove(spender: Address, amount: bigint): `0x${string}`;
5
+ export declare function getAllowance(tokenAddress: Address, owner: Address, spender: Address): Promise<bigint>;
6
+ //# sourceMappingURL=erc20.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erc20.d.ts","sourceRoot":"","sources":["../../src/chain/erc20.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,OAAO,EAAE,MAAM,MAAM,CAAC;AA2CxD,wBAAsB,eAAe,CACpC,YAAY,EAAE,OAAO,EACrB,aAAa,EAAE,OAAO,GACpB,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAMzE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAM7E;AAED,wBAAsB,YAAY,CACjC,YAAY,EAAE,OAAO,EACrB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GACd,OAAO,CAAC,MAAM,CAAC,CAOjB"}
@@ -0,0 +1,72 @@
1
+ import { encodeFunctionData } from "viem";
2
+ import { publicClient } from "./viem.js";
3
+ const ERC20_ABI = [
4
+ {
5
+ name: "balanceOf",
6
+ type: "function",
7
+ stateMutability: "view",
8
+ inputs: [{ name: "account", type: "address" }],
9
+ outputs: [{ name: "", type: "uint256" }],
10
+ },
11
+ {
12
+ name: "transfer",
13
+ type: "function",
14
+ stateMutability: "nonpayable",
15
+ inputs: [
16
+ { name: "to", type: "address" },
17
+ { name: "amount", type: "uint256" },
18
+ ],
19
+ outputs: [{ name: "", type: "bool" }],
20
+ },
21
+ {
22
+ name: "approve",
23
+ type: "function",
24
+ stateMutability: "nonpayable",
25
+ inputs: [
26
+ { name: "spender", type: "address" },
27
+ { name: "amount", type: "uint256" },
28
+ ],
29
+ outputs: [{ name: "", type: "bool" }],
30
+ },
31
+ {
32
+ name: "allowance",
33
+ type: "function",
34
+ stateMutability: "view",
35
+ inputs: [
36
+ { name: "owner", type: "address" },
37
+ { name: "spender", type: "address" },
38
+ ],
39
+ outputs: [{ name: "", type: "uint256" }],
40
+ },
41
+ ];
42
+ export async function getERC20Balance(tokenAddress, walletAddress) {
43
+ return publicClient.readContract({
44
+ address: tokenAddress,
45
+ abi: ERC20_ABI,
46
+ functionName: "balanceOf",
47
+ args: [walletAddress],
48
+ });
49
+ }
50
+ export function encodeTransfer(to, amount) {
51
+ return encodeFunctionData({
52
+ abi: ERC20_ABI,
53
+ functionName: "transfer",
54
+ args: [to, amount],
55
+ });
56
+ }
57
+ export function encodeApprove(spender, amount) {
58
+ return encodeFunctionData({
59
+ abi: ERC20_ABI,
60
+ functionName: "approve",
61
+ args: [spender, amount],
62
+ });
63
+ }
64
+ export async function getAllowance(tokenAddress, owner, spender) {
65
+ return publicClient.readContract({
66
+ address: tokenAddress,
67
+ abi: ERC20_ABI,
68
+ functionName: "allowance",
69
+ args: [owner, spender],
70
+ });
71
+ }
72
+ //# sourceMappingURL=erc20.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"erc20.js","sourceRoot":"","sources":["../../src/chain/erc20.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAgB,MAAM,MAAM,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,SAAS,GAAG;IACjB;QACC,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACxC;IACD;QACC,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE;YACP,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;YAC/B,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;SACnC;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACrC;IACD;QACC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,YAAY;QAC7B,MAAM,EAAE;YACP,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;SACnC;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;KACrC;IACD;QACC,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,MAAM;QACvB,MAAM,EAAE;YACP,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;YAClC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;SACpC;QACD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KACxC;CACQ,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,YAAqB,EACrB,aAAsB;IAEtB,OAAO,YAAY,CAAC,YAAY,CAAC;QAChC,OAAO,EAAE,YAAY;QACrB,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,WAAW;QACzB,IAAI,EAAE,CAAC,aAAa,CAAC;KACrB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAW,EAAE,MAAc;IACzD,OAAO,kBAAkB,CAAC;QACzB,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,UAAU;QACxB,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,MAAc;IAC7D,OAAO,kBAAkB,CAAC;QACzB,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,SAAS;QACvB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,YAAqB,EACrB,KAAc,EACd,OAAgB;IAEhB,OAAO,YAAY,CAAC,YAAY,CAAC;QAChC,OAAO,EAAE,YAAY;QACrB,GAAG,EAAE,SAAS;QACd,YAAY,EAAE,WAAW;QACzB,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;KACtB,CAAC,CAAC;AACJ,CAAC"}