odin-connect 1.3.1 → 1.3.3

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 (70) hide show
  1. package/dist/index.d.ts +406 -10
  2. package/dist/index.js +2 -2
  3. package/package.json +20 -4
  4. package/readme.md +7 -0
  5. package/.github/workflows/pr.yml +0 -24
  6. package/demo/README.md +0 -69
  7. package/demo/eslint.config.js +0 -23
  8. package/demo/index.html +0 -13
  9. package/demo/package-lock.json +0 -3495
  10. package/demo/package.json +0 -32
  11. package/demo/public/icon.svg +0 -6
  12. package/demo/tsconfig.app.json +0 -27
  13. package/demo/tsconfig.node.json +0 -25
  14. package/demo/vite.config.ts +0 -7
  15. package/dist/index.d.ts.map +0 -1
  16. package/dist/models/achievement.d.ts +0 -20
  17. package/dist/models/achievement.d.ts.map +0 -1
  18. package/dist/models/achievement.js +0 -1
  19. package/dist/models/activity.d.ts +0 -11
  20. package/dist/models/activity.d.ts.map +0 -1
  21. package/dist/models/activity.js +0 -1
  22. package/dist/models/balance.d.ts +0 -6
  23. package/dist/models/balance.d.ts.map +0 -1
  24. package/dist/models/balance.js +0 -1
  25. package/dist/models/environment.d.ts +0 -8
  26. package/dist/models/environment.d.ts.map +0 -1
  27. package/dist/models/environment.js +0 -6
  28. package/dist/models/token.d.ts +0 -78
  29. package/dist/models/token.d.ts.map +0 -1
  30. package/dist/models/token.js +0 -1
  31. package/dist/models/transactions.d.ts +0 -13
  32. package/dist/models/transactions.d.ts.map +0 -1
  33. package/dist/models/transactions.js +0 -11
  34. package/dist/models/user.d.ts +0 -13
  35. package/dist/models/user.d.ts.map +0 -1
  36. package/dist/models/user.js +0 -1
  37. package/dist/services/api.d.ts +0 -65
  38. package/dist/services/api.d.ts.map +0 -1
  39. package/dist/services/api.js +0 -161
  40. package/dist/services/api.test.d.ts +0 -2
  41. package/dist/services/api.test.d.ts.map +0 -1
  42. package/dist/services/api.test.js +0 -68
  43. package/dist/services/canister.d.ts +0 -72
  44. package/dist/services/canister.d.ts.map +0 -1
  45. package/dist/services/canister.js +0 -208
  46. package/dist/services/connect.d.ts +0 -41
  47. package/dist/services/connect.d.ts.map +0 -1
  48. package/dist/services/connect.js +0 -105
  49. package/dist/services/connected-user.d.ts +0 -73
  50. package/dist/services/connected-user.d.ts.map +0 -1
  51. package/dist/services/connected-user.js +0 -97
  52. package/dist/services/http.d.ts +0 -10
  53. package/dist/services/http.d.ts.map +0 -1
  54. package/dist/services/http.js +0 -43
  55. package/dist/services/http.test.d.ts +0 -2
  56. package/dist/services/http.test.d.ts.map +0 -1
  57. package/dist/services/http.test.js +0 -37
  58. package/dist/services/window.d.ts +0 -12
  59. package/dist/services/window.d.ts.map +0 -1
  60. package/dist/services/window.js +0 -21
  61. package/dist/utils/conver-to-odin-amount.test.d.ts +0 -2
  62. package/dist/utils/conver-to-odin-amount.test.d.ts.map +0 -1
  63. package/dist/utils/conver-to-odin-amount.test.js +0 -36
  64. package/dist/utils/index.d.ts +0 -6
  65. package/dist/utils/index.d.ts.map +0 -1
  66. package/dist/utils/index.js +0 -134
  67. package/dist/utils/token-field-validators.test.d.ts +0 -2
  68. package/dist/utils/token-field-validators.test.d.ts.map +0 -1
  69. package/dist/utils/token-field-validators.test.js +0 -31
  70. package/vitest.config.ts +0 -7
package/demo/package.json DELETED
@@ -1,32 +0,0 @@
1
- {
2
- "name": "demo",
3
- "private": true,
4
- "version": "0.0.0",
5
- "type": "module",
6
- "scripts": {
7
- "dev": "vite",
8
- "build": "tsc -b && vite build",
9
- "lint": "eslint .",
10
- "preview": "vite preview"
11
- },
12
- "dependencies": {
13
- "@dfinity/identity": "^3.3.0",
14
- "odin-connect": "file:..",
15
- "react": "^19.1.1",
16
- "react-dom": "^19.1.1"
17
- },
18
- "devDependencies": {
19
- "@apimatic/json-bigint": "^1.2.0",
20
- "@eslint/js": "^9.33.0",
21
- "@types/react": "^19.1.10",
22
- "@types/react-dom": "^19.1.7",
23
- "@vitejs/plugin-react": "^5.0.0",
24
- "eslint": "^9.33.0",
25
- "eslint-plugin-react-hooks": "^5.2.0",
26
- "eslint-plugin-react-refresh": "^0.4.20",
27
- "globals": "^16.3.0",
28
- "typescript": "~5.8.3",
29
- "typescript-eslint": "^8.39.1",
30
- "vite": "^7.1.2"
31
- }
32
- }
@@ -1,6 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">
2
- <rect width="100" height="100" fill="#0b0b0b" />
3
- <line x1="40" y1="20" x2="40" y2="80" stroke="#e0e0e0" stroke-width="6" stroke-linecap="round" />
4
- <line x1="40" y1="40" x2="70" y2="20" stroke="#e0e0e0" stroke-width="6" stroke-linecap="round" />
5
- <line x1="40" y1="60" x2="70" y2="40" stroke="#e0e0e0" stroke-width="6" stroke-linecap="round" />
6
- </svg>
@@ -1,27 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
- "target": "ES2022",
5
- "useDefineForClassFields": true,
6
- "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
- "module": "ESNext",
8
- "skipLibCheck": true,
9
-
10
- /* Bundler mode */
11
- "moduleResolution": "bundler",
12
- "allowImportingTsExtensions": true,
13
- "verbatimModuleSyntax": true,
14
- "moduleDetection": "force",
15
- "noEmit": true,
16
- "jsx": "react-jsx",
17
-
18
- /* Linting */
19
- "strict": true,
20
- "noUnusedLocals": true,
21
- "noUnusedParameters": true,
22
- "erasableSyntaxOnly": true,
23
- "noFallthroughCasesInSwitch": true,
24
- "noUncheckedSideEffectImports": true
25
- },
26
- "include": ["src"]
27
- }
@@ -1,25 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
- "target": "ES2023",
5
- "lib": ["ES2023"],
6
- "module": "ESNext",
7
- "skipLibCheck": true,
8
-
9
- /* Bundler mode */
10
- "moduleResolution": "bundler",
11
- "allowImportingTsExtensions": true,
12
- "verbatimModuleSyntax": true,
13
- "moduleDetection": "force",
14
- "noEmit": true,
15
-
16
- /* Linting */
17
- "strict": true,
18
- "noUnusedLocals": true,
19
- "noUnusedParameters": true,
20
- "erasableSyntaxOnly": true,
21
- "noFallthroughCasesInSwitch": true,
22
- "noUncheckedSideEffectImports": true
23
- },
24
- "include": ["vite.config.ts"]
25
- }
@@ -1,7 +0,0 @@
1
- import { defineConfig } from 'vite'
2
- import react from '@vitejs/plugin-react'
3
-
4
- // https://vite.dev/config/
5
- export default defineConfig({
6
- plugins: [react()],
7
- })
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/D,YAAY,EACV,SAAS,IAAI,aAAa,EAC1B,KAAK,IAAI,SAAS,EAClB,gBAAgB,IAAI,oBAAoB,GACzC,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC5E,YAAY,EACV,WAAW,IAAI,eAAe,EAC9B,mBAAmB,IAAI,uBAAuB,GAC/C,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,SAAS,MAAM,SAAS,CAAC;AACrC,YAAY,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -1,20 +0,0 @@
1
- export interface Achievement {
2
- id: number;
3
- name: string | null;
4
- image: string | null;
5
- description: string | null;
6
- prereq_display: string | null;
7
- prereq_active: number[] | null;
8
- default: number;
9
- category: number;
10
- category_order: number | null;
11
- fn: string;
12
- status: number;
13
- status_text: "EARNED" | "VISIBLE_EARNABLE" | "VISIBLE_NOT_EARNABLE";
14
- }
15
- export interface AchievementCategory {
16
- category_id: number;
17
- category_name: string;
18
- achievements: ReadonlyArray<Achievement>;
19
- }
20
- //# sourceMappingURL=achievement.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"achievement.d.ts","sourceRoot":"","sources":["../../src/models/achievement.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,QAAQ,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;CACrE;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;CAC1C"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,11 +0,0 @@
1
- import { BaseToken } from "./token";
2
- export interface Activity {
3
- id: number;
4
- token: BaseToken;
5
- time: Date;
6
- action: string;
7
- amount_token?: bigint;
8
- amount_btc?: bigint;
9
- description?: string;
10
- }
11
- //# sourceMappingURL=activity.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/models/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,6 +0,0 @@
1
- import { Token } from "./token";
2
- export interface Balance extends Token {
3
- principal: string;
4
- balance: bigint;
5
- }
6
- //# sourceMappingURL=balance.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../../src/models/balance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,WAAW,OAAQ,SAAQ,KAAK;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,8 +0,0 @@
1
- export declare const ORIGINS: {
2
- local: string;
3
- prod: string;
4
- dev: string;
5
- _preview: string;
6
- };
7
- export type Environment = keyof typeof ORIGINS;
8
- //# sourceMappingURL=environment.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../src/models/environment.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO;;;;;CAKnB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,OAAO,CAAC"}
@@ -1,6 +0,0 @@
1
- export const ORIGINS = {
2
- local: "http://localhost:5173",
3
- prod: "https://odin.fun",
4
- dev: "https://dev.odin.fun",
5
- _preview: "https://deploy-preview-1368--dev-odin-toniq.netlify.app",
6
- };
@@ -1,78 +0,0 @@
1
- export interface BaseToken {
2
- id: string;
3
- name: string;
4
- ticker: string;
5
- divisibility: number;
6
- decimals: number;
7
- withdrawals: boolean;
8
- deposits: boolean;
9
- }
10
- export interface Token extends BaseToken {
11
- image: string | null;
12
- description: string | null;
13
- creator: string;
14
- created_time: Date;
15
- marketcap: bigint;
16
- volume: bigint;
17
- volume_24: number;
18
- holder_count: number;
19
- power_holder_count: number;
20
- sell_count: number;
21
- buy_count: number;
22
- comment_count: number;
23
- featured: boolean;
24
- bonded: boolean;
25
- external: boolean;
26
- trading: boolean;
27
- icrc_ledger: string | null;
28
- sold: bigint;
29
- total_supply: bigint;
30
- threshold: bigint;
31
- swap_volume: bigint | null;
32
- swap_volume_24: bigint | null;
33
- holding_value: number | null;
34
- price: number;
35
- twitter: string | null;
36
- twitter_verified: boolean | null;
37
- website: string | null;
38
- telegram: string | null;
39
- btc_liquidity: bigint;
40
- token_liquidity: bigint;
41
- liquidity_threshold: bigint;
42
- last_comment_time: string | null;
43
- last_action_time: Date | null;
44
- user_lp_tokens: bigint;
45
- user_btc_liquidity: bigint;
46
- user_token_liquidity: bigint;
47
- verified: boolean;
48
- progress: number | null;
49
- price_5m: number | null;
50
- price_1h: number | null;
51
- price_6h: number | null;
52
- price_1d: number | null;
53
- }
54
- export interface TokenWithBalance {
55
- token: Token;
56
- balance: bigint;
57
- }
58
- export type TokenFilterFields = {
59
- ascended: boolean;
60
- etched: boolean;
61
- /** External: true - Launched on BitCoin; false - Launched on Odin */
62
- external: boolean;
63
- verified: boolean;
64
- has_website: boolean;
65
- has_twitter: boolean;
66
- has_telegram: boolean;
67
- marketcap_max: bigint;
68
- marketcap_min: bigint;
69
- volume_max: bigint;
70
- volume_min: bigint;
71
- holders_max: number;
72
- holders_min: number;
73
- price_max: number;
74
- price_min: number;
75
- search: string;
76
- };
77
- export type TokenSortableFields = "created_time" | "marketcap" | "volume" | "power_holder_count" | "price" | "holders_count" | "price_delta_5m" | "price_delta_1h" | "price_delta_6h" | "price_delta_1d" | "volume_24" | "txn_count" | "ascension" | "last_action_time";
78
- //# sourceMappingURL=token.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/models/token.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,13 +0,0 @@
1
- declare const transactionStatuses: readonly ["pending", "processing", "complete", "too small", "error", "unsupported", "unknown", "delayed"];
2
- export interface Transaction {
3
- id: string;
4
- status: typeof transactionStatuses[number];
5
- address: string;
6
- index_time: Date;
7
- created_time: Date;
8
- canister: string;
9
- token: string;
10
- amount: bigint;
11
- }
12
- export {};
13
- //# sourceMappingURL=transactions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../../src/models/transactions.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,mBAAmB,2GASf,CAAC;AAGX,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC;IACjB,YAAY,EAAE,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAClB"}
@@ -1,11 +0,0 @@
1
- const transactionStatuses = [
2
- "pending",
3
- "processing",
4
- "complete",
5
- "too small",
6
- "error",
7
- "unsupported",
8
- "unknown",
9
- "delayed",
10
- ];
11
- export {};
@@ -1,13 +0,0 @@
1
- export interface User {
2
- principal: string;
3
- username: string;
4
- image: string;
5
- btc_wallet_address: string | null;
6
- created_at: Date;
7
- btc_deposit_address: string | null;
8
- rune_deposit_address: string | null;
9
- ref_code: string | null;
10
- referrer: string | null;
11
- admin: number;
12
- }
13
- //# sourceMappingURL=user.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/models/user.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,UAAU,EAAE,IAAI,CAAC;IACjB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,65 +0,0 @@
1
- import { Activity } from "../models/activity";
2
- import { Balance } from "../models/balance";
3
- import { Token, TokenFilterFields, TokenSortableFields } from "../models/token";
4
- import { User } from "../models/user";
5
- import { AchievementCategory } from "../models/achievement";
6
- import { Transaction } from "../models/transactions";
7
- export type Pagination = {
8
- page: number;
9
- limit: number;
10
- };
11
- export type Sort<T = string> = {
12
- field: T;
13
- direction: "asc" | "desc";
14
- };
15
- export type PaginatedResponse<T> = {
16
- data: ReadonlyArray<T>;
17
- count: number;
18
- page: number;
19
- limit: number;
20
- };
21
- export declare class OdinApiClient {
22
- private _apiKey;
23
- private _httpClient;
24
- readonly BASE_URL: string;
25
- constructor(env?: "prod" | "dev");
26
- getUser(id: string): Promise<User>;
27
- getBalances(principal: string, pagination: Pagination): Promise<readonly Balance[]>;
28
- getTokens(pagination: Pagination, sort?: Sort<TokenSortableFields>, filters?: Partial<TokenFilterFields>): Promise<PaginatedResponse<Token>>;
29
- getToken(id: string): Promise<Token>;
30
- uploadImage(image: File): Promise<string>;
31
- updateTokenImage(tokenId: string, image: File): Promise<{
32
- data: Token;
33
- }>;
34
- getUserActivity(principal: string, pagination: Pagination): Promise<PaginatedResponse<Activity>>;
35
- getUserTokens(principal: string, pagination: Pagination): Promise<{
36
- data: {
37
- balance: bigint;
38
- token: Token;
39
- unrealized_pnl?: number;
40
- unrealized_pnl_percent?: number;
41
- }[];
42
- count: number;
43
- page: number;
44
- limit: number;
45
- }>;
46
- getUserLiquidity(principal: string, pagination: Pagination): Promise<{
47
- data: {
48
- balance: bigint;
49
- token: Token;
50
- }[];
51
- count: number;
52
- page: number;
53
- limit: number;
54
- }>;
55
- getUserAchievements(principal: string, pagination: Pagination): Promise<readonly AchievementCategory[]>;
56
- getUserTransactions(principal: string, pagination: Pagination): Promise<PaginatedResponse<Transaction>>;
57
- getUserCreatedTokens(principal: string, pagination: Pagination): Promise<PaginatedResponse<Token>>;
58
- getUserStats(principal: string): Promise<{
59
- followers: number;
60
- following: number;
61
- }>;
62
- set apiKey(key: string);
63
- get apiKey(): string | null;
64
- }
65
- //# sourceMappingURL=api.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/services/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EACL,KAAK,EACL,iBAAiB,EACjB,mBAAmB,EAEpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAQrD,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI;IAC7B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,WAAW,CAAa;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,GAAG,GAAE,MAAM,GAAG,KAAc;IAKxC,OAAO,CAAC,EAAE,EAAE,MAAM;IAIZ,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;IAW3D,SAAS,CACP,UAAU,EAAE,UAAU,EACtB,IAAI,GAAE,IAAI,CAAC,mBAAmB,CAA6C,EAC3E,OAAO,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAc1C,QAAQ,CAAC,EAAE,EAAE,MAAM;IAIb,WAAW,CAAC,KAAK,EAAE,IAAI;IAqC7B,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI;cAKJ,KAAK;;IAsB9C,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;IAWnD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;;;mBAIhD,KAAK;6BACK,MAAM;qCACE,MAAM;;eApI9B,MAAM;cACP,MAAM;eACL,MAAM;;IAmJP,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;;;;;eArJzD,MAAM;cACP,MAAM;eACL,MAAM;;IAqKP,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;IAWnE,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;IAW7D,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;IAW9D,YAAY,CAAC,SAAS,EAAE,MAAM;mBACa,MAAM;mBAAa,MAAM;;IAKpE,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,EAErB;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;CACF"}
@@ -1,161 +0,0 @@
1
- import { HttpClient } from "./http";
2
- import { createTokenValidators } from "../utils";
3
- const BASE_URL_ENV = {
4
- dev: "https://api.odin.fun/dev",
5
- prod: "https://api.odin.fun/v1",
6
- local: "https://api.odin.fun/dev",
7
- };
8
- export class OdinApiClient {
9
- _apiKey = null;
10
- _httpClient;
11
- BASE_URL;
12
- constructor(env = "prod") {
13
- this._httpClient = new HttpClient();
14
- this.BASE_URL = BASE_URL_ENV[env];
15
- }
16
- getUser(id) {
17
- return this._httpClient.get(`${this.BASE_URL}/user/${id}`);
18
- }
19
- async getBalances(principal, pagination) {
20
- const response = await this._httpClient.get(`${this.BASE_URL}/user/${principal}/balances`, {
21
- params: {
22
- ...pagination,
23
- },
24
- });
25
- return response.data;
26
- }
27
- getTokens(pagination, sort = { field: "marketcap", direction: "desc" }, filters = {}) {
28
- return this._httpClient.get(`${this.BASE_URL}/tokens`, {
29
- params: {
30
- ...pagination,
31
- sort: `${sort.field}:${sort.direction}`,
32
- ...filters,
33
- },
34
- });
35
- }
36
- getToken(id) {
37
- return this._httpClient.get(`${this.BASE_URL}/token/${id}`);
38
- }
39
- async uploadImage(image) {
40
- if (!this._apiKey) {
41
- throw new Error("API key is not set");
42
- }
43
- try {
44
- const errors = createTokenValidators.image?.(image);
45
- if (errors) {
46
- throw new Error(errors);
47
- }
48
- const formData = new FormData();
49
- formData.append("file", image);
50
- const result = await this._httpClient.post(`${this.BASE_URL}/upload`, formData, {
51
- headers: {
52
- "Content-Type": "multipart/form-data",
53
- Authorization: `Bearer ${this._apiKey}`,
54
- },
55
- });
56
- return result.data.upload;
57
- }
58
- catch (error) {
59
- if (error instanceof Error) {
60
- if (error.name === "AxiosError") {
61
- const axiosError = error;
62
- throw new Error(axiosError.response?.data?.message || axiosError.message);
63
- }
64
- else {
65
- throw new Error(error.message);
66
- }
67
- }
68
- else {
69
- throw new Error("Image upload failed");
70
- }
71
- }
72
- }
73
- updateTokenImage(tokenId, image) {
74
- if (!this._apiKey) {
75
- throw new Error("API key is not set");
76
- }
77
- try {
78
- return this._httpClient.post(`${this.BASE_URL}/token/${tokenId}/image`, { image }, {
79
- headers: {
80
- "Content-Type": "multipart/form-data",
81
- Authorization: `Bearer ${this._apiKey}`,
82
- },
83
- });
84
- }
85
- catch (error) {
86
- if (error instanceof Error && error.name === "AxiosError") {
87
- const axiosError = error;
88
- throw new Error(axiosError.response?.data?.message || axiosError.message);
89
- }
90
- else {
91
- throw new Error("Image update failed");
92
- }
93
- }
94
- }
95
- getUserActivity(principal, pagination) {
96
- return this._httpClient.get(`${this.BASE_URL}/user/${principal}/activity`, {
97
- params: {
98
- ...pagination,
99
- },
100
- });
101
- }
102
- async getUserTokens(principal, pagination) {
103
- const response = await this._httpClient.get(`${this.BASE_URL}/user/${principal}/tokens`, {
104
- params: {
105
- ...pagination,
106
- },
107
- });
108
- return {
109
- ...response,
110
- data: response.data.map((item) => ({
111
- ...item,
112
- balance: BigInt(item.balance), // Cast balance to BigInt always
113
- })),
114
- };
115
- }
116
- async getUserLiquidity(principal, pagination) {
117
- const response = await this._httpClient.get(`${this.BASE_URL}/user/${principal}/liquidity`, {
118
- params: {
119
- ...pagination,
120
- },
121
- });
122
- return {
123
- ...response,
124
- data: response.data.map((item) => ({
125
- ...item,
126
- balance: BigInt(item.balance), // Cast balance to BigInt always
127
- })),
128
- };
129
- }
130
- async getUserAchievements(principal, pagination) {
131
- const response = await this._httpClient.get(`${this.BASE_URL}/user/${principal}/achievements`, {
132
- params: {
133
- ...pagination,
134
- },
135
- });
136
- return response.data;
137
- }
138
- getUserTransactions(principal, pagination) {
139
- return this._httpClient.get(`${this.BASE_URL}/user/${principal}/transactions`, {
140
- params: {
141
- ...pagination,
142
- },
143
- });
144
- }
145
- getUserCreatedTokens(principal, pagination) {
146
- return this._httpClient.get(`${this.BASE_URL}/user/${principal}/created`, {
147
- params: {
148
- ...pagination,
149
- },
150
- });
151
- }
152
- getUserStats(principal) {
153
- return this._httpClient.get(`${this.BASE_URL}/user/${principal}/stats`);
154
- }
155
- set apiKey(key) {
156
- this._apiKey = key;
157
- }
158
- get apiKey() {
159
- return this._apiKey;
160
- }
161
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=api.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../../src/services/api.test.ts"],"names":[],"mappings":""}
@@ -1,68 +0,0 @@
1
- import { beforeAll, describe, expect, it, vi } from "vitest";
2
- import { OdinApiClient } from "./api";
3
- describe("ApiClient", () => {
4
- let api;
5
- beforeAll(() => {
6
- api = new OdinApiClient("dev");
7
- });
8
- it("should create an instance of OdinApiClient", () => {
9
- expect(api).toBeInstanceOf(OdinApiClient);
10
- });
11
- it("it should have the correct base URL for dev environment", () => {
12
- expect(api.BASE_URL).toBe("https://api.odin.fun/dev");
13
- });
14
- it("it should have the correct base URL for prod environment", () => {
15
- const prodApi = new OdinApiClient("prod");
16
- expect(prodApi.BASE_URL).toBe("https://api.odin.fun/v1");
17
- });
18
- it("it should get user by ID", async () => {
19
- const getUserSpy = vi.spyOn(api["_httpClient"], "get").mockResolvedValue({
20
- id: "some-id",
21
- name: "Test User",
22
- });
23
- const user = await api.getUser("some-id");
24
- expect(getUserSpy).toHaveBeenCalledWith("https://api.odin.fun/dev/user/some-id");
25
- expect(user).toEqual({ id: "some-id", name: "Test User" });
26
- });
27
- it("it should get balances for a user", async () => {
28
- const getSpy = vi.spyOn(api["_httpClient"], "get").mockResolvedValue({
29
- data: [
30
- { token: "token1", balance: 100 },
31
- { token: "token2", balance: 200 },
32
- ],
33
- });
34
- const balances = await api.getBalances("some-principal", {
35
- page: 1,
36
- limit: 10,
37
- });
38
- expect(getSpy).toHaveBeenCalledWith("https://api.odin.fun/dev/user/some-principal/balances", { params: { page: 1, limit: 10 } });
39
- expect(balances).toEqual([
40
- { token: "token1", balance: 100 },
41
- { token: "token2", balance: 200 },
42
- ]);
43
- });
44
- it("it should get tokens with pagination and sorting", async () => {
45
- const getSpy = vi.spyOn(api["_httpClient"], "get").mockResolvedValue({
46
- data: [
47
- { id: "token1", marketcap: 1000 },
48
- { id: "token2", marketcap: 2000 },
49
- ],
50
- count: 2,
51
- page: 1,
52
- limit: 10,
53
- });
54
- const tokens = await api.getTokens({ page: 1, limit: 10 }, { field: "marketcap", direction: "asc" });
55
- expect(getSpy).toHaveBeenCalledWith("https://api.odin.fun/dev/tokens", {
56
- params: { page: 1, limit: 10, sort: "marketcap:asc" },
57
- });
58
- expect(tokens).toEqual({
59
- data: [
60
- { id: "token1", marketcap: 1000 },
61
- { id: "token2", marketcap: 2000 },
62
- ],
63
- count: 2,
64
- page: 1,
65
- limit: 10,
66
- });
67
- });
68
- });