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
@@ -0,0 +1,31 @@
1
+ import { loadSession } from "../wallet/session.js";
2
+ import { checkHealth } from "../fibrous/health.js";
3
+ import { getChainConfig } from "../chain/chains.js";
4
+ import { ACTIVE_NETWORK } from "../utils/config.js";
5
+ import { outputResult, outputError, withSpinner } from "../format/output.js";
6
+ export async function statusCommand(opts) {
7
+ try {
8
+ const chain = getChainConfig(ACTIVE_NETWORK);
9
+ const session = loadSession();
10
+ const fibrousHealth = await withSpinner("Checking Fibrous API...", async () => {
11
+ try {
12
+ const health = await checkHealth();
13
+ return { ok: true, message: health.message };
14
+ }
15
+ catch {
16
+ return { ok: false, message: "unreachable" };
17
+ }
18
+ }, opts);
19
+ outputResult({
20
+ chain: chain.name,
21
+ chainId: chain.id,
22
+ authenticated: !!session,
23
+ wallet: session?.walletAddress ?? null,
24
+ fibrous: fibrousHealth,
25
+ }, opts);
26
+ }
27
+ catch (error) {
28
+ outputError(error, opts);
29
+ }
30
+ }
31
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAsB,MAAM,qBAAqB,CAAC;AAEjG,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAmB;IACtD,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;QAE9B,MAAM,aAAa,GAAG,MAAM,WAAW,CACtC,yBAAyB,EACzB,KAAK,IAAI,EAAE;YACV,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;gBACnC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9C,CAAC;YAAC,MAAM,CAAC;gBACR,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;YAC9C,CAAC;QACF,CAAC,EACD,IAAI,CACJ,CAAC;QAEF,YAAY,CACX;YACC,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,aAAa,EAAE,CAAC,CAAC,OAAO;YACxB,MAAM,EAAE,OAAO,EAAE,aAAa,IAAI,IAAI;YACtC,OAAO,EAAE,aAAa;SACtB,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,7 @@
1
+ import { type OutputOptions } from "../format/output.js";
2
+ interface TradeOptions extends OutputOptions {
3
+ slippage: number;
4
+ }
5
+ export declare function tradeCommand(amount: string, from: string, to: string, opts: TradeOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=trade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trade.d.ts","sourceRoot":"","sources":["../../src/commands/trade.ts"],"names":[],"mappings":"AAWA,OAAO,EAA0C,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEjG,UAAU,YAAa,SAAQ,aAAa;IAC3C,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,YAAY,CACjC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC,CAyFf"}
@@ -0,0 +1,69 @@
1
+ import { requireSession } from "../wallet/session.js";
2
+ import { getPrivyClient } from "../wallet/privy.js";
3
+ import { getWalletClient } from "../chain/viem.js";
4
+ import { getChainConfig } from "../chain/chains.js";
5
+ import { getAllowance, encodeApprove } from "../chain/erc20.js";
6
+ import { resolveToken } from "../fibrous/tokens.js";
7
+ import { getRouteAndCallData, encodeSwapCalldata } from "../fibrous/route.js";
8
+ import { ACTIVE_NETWORK, DEFAULT_SLIPPAGE } from "../utils/config.js";
9
+ import { validateAmount } from "../utils/validation.js";
10
+ import { parseAmount, formatAmount } from "../utils/parseAmount.js";
11
+ import { outputResult, outputError, withSpinner } from "../format/output.js";
12
+ export async function tradeCommand(amount, from, to, opts) {
13
+ try {
14
+ validateAmount(amount);
15
+ const chain = getChainConfig(ACTIVE_NETWORK);
16
+ const session = requireSession();
17
+ const privy = getPrivyClient();
18
+ const wallet = session.walletAddress;
19
+ const [tokenIn, tokenOut] = await withSpinner("Resolving tokens...", async () => Promise.all([resolveToken(from), resolveToken(to)]), opts);
20
+ const amountBaseUnits = parseAmount(amount, tokenIn.decimals);
21
+ const isNativeInput = tokenIn.address.toLowerCase() === chain.nativeTokenAddress.toLowerCase();
22
+ const routeData = await withSpinner("Finding best route...", async () => {
23
+ return getRouteAndCallData({
24
+ amount: amountBaseUnits.toString(),
25
+ tokenInAddress: tokenIn.address,
26
+ tokenOutAddress: tokenOut.address,
27
+ slippage: opts.slippage ?? DEFAULT_SLIPPAGE,
28
+ destination: wallet,
29
+ });
30
+ }, opts);
31
+ const routerAddress = routeData.router_address;
32
+ const walletClient = getWalletClient(privy, session);
33
+ if (!isNativeInput) {
34
+ const currentAllowance = await getAllowance(tokenIn.address, wallet, routerAddress);
35
+ if (currentAllowance < amountBaseUnits) {
36
+ await withSpinner("Approving token spend...", async () => {
37
+ const approveData = encodeApprove(routerAddress, amountBaseUnits);
38
+ return walletClient.sendTransaction({
39
+ to: tokenIn.address,
40
+ data: approveData,
41
+ value: 0n,
42
+ });
43
+ }, opts);
44
+ }
45
+ }
46
+ const hash = await withSpinner(`Swapping ${amount} ${tokenIn.symbol} → ${tokenOut.symbol}...`, async () => {
47
+ const swapData = encodeSwapCalldata(routeData.calldata);
48
+ return walletClient.sendTransaction({
49
+ to: routerAddress,
50
+ data: swapData,
51
+ value: isNativeInput ? amountBaseUnits : 0n,
52
+ });
53
+ }, opts);
54
+ const outputAmount = formatAmount(BigInt(routeData.route.outputAmount), tokenOut.decimals);
55
+ outputResult({
56
+ txHash: hash,
57
+ amountIn: amount,
58
+ amountOut: outputAmount,
59
+ tokenIn: tokenIn.symbol,
60
+ tokenOut: tokenOut.symbol,
61
+ router: routerAddress,
62
+ chain: chain.name,
63
+ }, opts);
64
+ }
65
+ catch (error) {
66
+ outputError(error, opts);
67
+ }
68
+ }
69
+ //# sourceMappingURL=trade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trade.js","sourceRoot":"","sources":["../../src/commands/trade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type OutputOptions } from "../format/output.js";
2
+ export declare function walletsCommand(email: string, opts: OutputOptions): Promise<void>;
3
+ //# sourceMappingURL=wallets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallets.d.ts","sourceRoot":"","sources":["../../src/commands/wallets.ts"],"names":[],"mappings":"AACA,OAAO,EAA0C,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAUjG,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CtF"}
@@ -0,0 +1,39 @@
1
+ import { getPrivyClient } from "../wallet/privy.js";
2
+ import { outputResult, outputError, withSpinner } from "../format/output.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=wallets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallets.js","sourceRoot":"","sources":["../../src/commands/wallets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,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"}