Skip to content

Commit ec3bd04

Browse files
committed
Update README, add addressAssets helper
* Refactor other helpers * Update examples
1 parent 2fcc478 commit ec3bd04

17 files changed

+231
-57
lines changed

README.md

+65
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,71 @@ import { client } from "defi-sdk";
2323
client.configure({ url: endpoint, apiToken: API_TOKEN });
2424
```
2525

26+
## API
27+
28+
### General usage
29+
30+
### client.subscribe(options)
31+
32+
```js
33+
import { client } from "defi-sdk";
34+
35+
client.subscribe({
36+
namespace: "assets",
37+
body: {
38+
scope: ["prices"],
39+
payload: { asset_codes: ["eth"], currency: "usd" }
40+
},
41+
onMessage: (event: Event, data: Response) => {
42+
/* handle data */
43+
}
44+
});
45+
```
46+
47+
- `namespace`: a [`Namespace`](https://docs.zerion.io/websockets/namespaces) string
48+
- `event`: one of `received | changed | appended | removed`, see [Zerion Docs](https://docs.zerion.io/websockets/websocket-api-overview)
49+
- `body`: a [`Request`](#Request) object
50+
- `data`: a [`Response`](#Response) object
51+
52+
## Domain Helpers
53+
54+
Instead of calling `client.subscribe` and passing type information manually, the SDK provides helpers for most of the existing request [scopes](https://docs.zerion.io/websockets/websocket-api-overview#request)
55+
56+
### `addressAssets`
57+
58+
```js
59+
import { client } from "defi-sdk";
60+
61+
client.addressAssets({
62+
payload: { asset_codes: ["eth"], currency: "usd" },
63+
onData: data => {
64+
/* handle data */
65+
}
66+
});
67+
```
68+
69+
## Types
70+
71+
### Request
72+
73+
```ts
74+
interface Request<T, ScopeName extends string> {
75+
scope: ScopeName[];
76+
payload: T;
77+
}
78+
```
79+
80+
### Response
81+
82+
```ts
83+
interface Response<T> {
84+
meta: any;
85+
payload: T;
86+
}
87+
```
88+
89+
See `Response` in [Zerion Docs](https://docs.zerion.io/websockets/websocket-api-overview#response)
90+
2691
## License
2792

2893
MIT License, see the included [LICENSE](LICENSE) file.

examples/Helpers.tsx

+30-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { useAddressLoans } from "../src/react";
55
import { EntryInfo } from "./EntryInfo";
66
import { VStack } from "./VStack";
77
import { TEST_ADDRESS } from "./config";
8-
import { client } from "../src";
8+
import { client, useAddressAssets } from "../src";
99

1010
const USDC = "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48";
1111
const UNI = "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984";
@@ -156,6 +156,35 @@ export function Helpers({
156156
return <VStack gap={4}>full info: {entity.title}</VStack>;
157157
}}
158158
/>
159+
<EntryInfo
160+
title="useAddressAssets"
161+
entry={useAddressAssets({
162+
payload: useMemo(
163+
() => ({
164+
currency,
165+
address: TEST_ADDRESS,
166+
}),
167+
[currency]
168+
),
169+
})}
170+
render={entry => {
171+
if (!entry.data) {
172+
return null;
173+
}
174+
const { assets } = entry.data;
175+
if (!assets) {
176+
return <span>Entity not found</span>;
177+
}
178+
return Object.values(assets)
179+
.slice(0, 5)
180+
.map(addressAsset => (
181+
<div key={addressAsset.asset.asset_code}>
182+
{addressAsset.asset.name}{' '}
183+
{addressAsset.quantity}
184+
</div>
185+
));
186+
}}
187+
/>
159188
<ImperativeAssetsPrices currency={currency} />
160189
</VStack>
161190
);

src/client.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import { createSocketNamespace } from "./socket/createSocketNamespace";
1818
import { assetsPrices } from "./domains/assetsPrices";
1919
import { assetsInfo } from "./domains/assetsInfo";
2020
import { addressLoans } from "./domains/addressLoans";
21+
import { addressAssets } from "./domains/addressAssets";
22+
import { assetsFullInfo } from "./domains/assetsFullInfo";
2123

2224
const subsciptionEvents: SubscriptionEvent[] = [
2325
"received",
@@ -337,9 +339,11 @@ export class BareClient {
337339
}
338340

339341
export class Client extends BareClient {
342+
addressAssets = addressAssets;
343+
addressLoans = addressLoans;
340344
assetsPrices = assetsPrices;
345+
assetsFullInfo = assetsFullInfo;
341346
assetsInfo = assetsInfo;
342-
addressLoans = addressLoans;
343347
}
344348

345349
export const client = new Client(null);

src/domains/addressAssets.ts

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import type { AddressAsset } from "../entities/AddressAsset";
2+
import type { AddressParams } from "./AddressParams";
3+
import { createDomainRequest } from "./createDomainRequest";
4+
5+
export type RequestPayload = AddressParams & {
6+
currency: string;
7+
asset_codes?: string[];
8+
};
9+
10+
export interface ResponseData {
11+
[key: string]: AddressAsset;
12+
}
13+
export const namespace = "address";
14+
export const scope = "assets";
15+
export const getId = (item: AddressAsset): string => item.asset.asset_code;
16+
17+
export const addressAssets = createDomainRequest<
18+
RequestPayload,
19+
ResponseData,
20+
typeof namespace,
21+
typeof scope
22+
>({
23+
namespace,
24+
scope,
25+
getId,
26+
});

src/domains/addressLoans.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,17 @@ export type RequestPayload = AddressParams & {
88
};
99
export type ResponseData = Loan[];
1010

11+
export const namespace = "address";
12+
export const scope = "loans";
13+
export const mergeStrategy = mergeList;
14+
1115
export const addressLoans = createDomainRequest<
1216
RequestPayload,
1317
ResponseData,
14-
"address",
15-
"loans"
18+
typeof namespace,
19+
typeof scope
1620
>({
17-
namespace: "address",
18-
scopeName: "loans",
19-
mergeStrategy: mergeList,
21+
namespace,
22+
scope,
23+
mergeStrategy,
2024
});

src/domains/assetsFullInfo.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,17 @@ export interface RequestPayload {
99

1010
export type ResponseData = null | AssetFullInfo;
1111

12+
export const namespace = "assets";
13+
export const scope = "full-info";
14+
export const mergeStrategy = mergeSingleEntity;
15+
1216
export const assetsFullInfo = createDomainRequest<
1317
RequestPayload,
1418
ResponseData,
15-
"assets",
16-
"full-info"
19+
typeof namespace,
20+
typeof scope
1721
>({
18-
namespace: "assets",
19-
scopeName: "full-info",
20-
mergeStrategy: mergeSingleEntity,
22+
namespace,
23+
scope,
24+
mergeStrategy,
2125
});

src/domains/assetsInfo.ts

+11-6
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,19 @@ export interface RequestPayload {
1414

1515
export type ResponseData = AssetInfo[];
1616

17+
export const namespace = "assets";
18+
export const scope = "info";
19+
export const getId = (item: AssetInfo): string => item.asset.asset_code;
20+
export const mergeStrategy = mergeList;
21+
1722
export const assetsInfo = createDomainRequest<
1823
RequestPayload,
1924
ResponseData,
20-
"assets",
21-
"info"
25+
typeof namespace,
26+
typeof scope
2227
>({
23-
namespace: "assets",
24-
scopeName: "info",
25-
getId: (item: AssetInfo) => item.asset.asset_code,
26-
mergeStrategy: mergeList,
28+
namespace,
29+
scope,
30+
getId,
31+
mergeStrategy,
2732
});

src/domains/assetsPrices.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@ export interface ResponseData {
1010
[key: string]: Asset;
1111
}
1212

13+
export const namespace = "assets";
14+
export const scope = "prices";
15+
export const getId = (item: Asset): string => item.asset_code;
16+
1317
export const assetsPrices = createDomainRequest<
1418
RequestPayload,
1519
ResponseData,
16-
"assets",
17-
"prices"
20+
typeof namespace,
21+
typeof scope
1822
>({
19-
namespace: "assets",
20-
scopeName: "prices",
21-
getId: (item: Asset) => item.asset_code,
23+
namespace,
24+
scope,
25+
getId,
2226
});

src/domains/createDomainRequest.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ export function createDomainRequest<
2525
ScopeName extends string
2626
>({
2727
namespace,
28-
scopeName,
28+
scope,
2929
getId,
3030
mergeStrategy,
3131
}: {
3232
namespace: Namespace;
33-
scopeName: ScopeName;
33+
scope: ScopeName;
3434
getId?: (x: any) => string | number;
3535
mergeStrategy?: MergeStrategy;
3636
client?: Client;
@@ -64,7 +64,7 @@ export function createDomainRequest<
6464
getId: getId || options.getId,
6565
mergeStrategy: mergeStrategy || options.mergeStrategy,
6666
body: {
67-
scope: [scopeName],
67+
scope: [scope],
6868
payload,
6969
},
7070
});

src/entities/AddressAsset.ts

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import type { Asset } from "./Asset";
2+
3+
export interface AddressAsset {
4+
asset: Asset;
5+
quantity: string;
6+
}

src/index.ts

+9
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,17 @@ export type { CachePolicy } from "./cache/CachePolicy";
99
export type { Entry } from "./cache/Entry";
1010
export { DataStatus } from "./cache/DataStatus";
1111

12+
// domain helpers
13+
export { addressLoans } from "./domains/addressLoans";
14+
export { addressAssets } from "./domains/addressAssets";
15+
export { assetsFullInfo } from "./domains/assetsFullInfo";
16+
export { assetsInfo } from "./domains/assetsInfo";
17+
export { assetsPrices } from "./domains/assetsPrices";
18+
1219
// react bindings
1320
export { useSubscription } from "./react/useSubscription";
21+
export { useAddressAssets } from "./react/domains/useAddressAssets";
1422
export { useAddressLoans } from "./react/domains/useAddressLoans";
23+
export { useAssetsFullInfo } from "./react/domains/useAssetsFullInfo";
1524
export { useAssetsInfo } from "./react/domains/useAssetsInfo";
1625
export { useAssetsPrices } from "./react/domains/useAssetsPrices";

src/react/domains/createDomainHook.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ export function createDomainHook<
1919
ScopeName extends string
2020
>({
2121
namespace,
22-
scopeName,
22+
scope,
2323
getId,
2424
mergeStrategy,
2525
}: {
2626
namespace: Namespace;
27-
scopeName: ScopeName;
27+
scope: ScopeName;
2828
getId?: (x: any) => string | number;
2929
mergeStrategy?: MergeStrategy;
3030
}) {
@@ -41,7 +41,7 @@ export function createDomainHook<
4141
mergeStrategy: mergeStrategy || options.mergeStrategy,
4242
body: useMemo(
4343
() => ({
44-
scope: [scopeName],
44+
scope: [scope],
4545
payload,
4646
}),
4747
[payload]

src/react/domains/useAddressAssets.ts

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import type { RequestPayload, ResponseData } from "../../domains/addressAssets";
2+
import { namespace, scope, getId } from "../../domains/addressAssets";
3+
import { createDomainHook } from "./createDomainHook";
4+
5+
export const useAddressAssets = createDomainHook<
6+
RequestPayload,
7+
ResponseData,
8+
typeof namespace,
9+
typeof scope
10+
>({
11+
namespace,
12+
scope,
13+
getId,
14+
});

src/react/domains/useAddressLoans.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import { RequestPayload, ResponseData } from "../../domains/addressLoans";
2-
import { mergeList } from "../../shared/mergeStrategies";
1+
import type { RequestPayload, ResponseData } from "../../domains/addressLoans";
2+
import { namespace, scope, mergeStrategy } from "../../domains/addressLoans";
33
import { createDomainHook } from "./createDomainHook";
44

55
export const useAddressLoans = createDomainHook<
66
RequestPayload,
77
ResponseData,
8-
"address",
9-
"loans"
8+
typeof namespace,
9+
typeof scope
1010
>({
11-
namespace: "address",
12-
scopeName: "loans",
13-
mergeStrategy: mergeList,
11+
namespace,
12+
scope,
13+
mergeStrategy,
1414
});

src/react/domains/useAssetsFullInfo.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ import type {
22
RequestPayload,
33
ResponseData,
44
} from "../../domains/assetsFullInfo";
5-
import { mergeSingleEntity } from "../../shared/mergeStrategies";
5+
import { namespace, scope, mergeStrategy } from "../../domains/assetsFullInfo";
66
import { createDomainHook } from "./createDomainHook";
77

88
export const useAssetsFullInfo = createDomainHook<
99
RequestPayload,
10-
ResponseData | null,
11-
"assets",
12-
"full-info"
10+
ResponseData,
11+
typeof namespace,
12+
typeof scope
1313
>({
14-
namespace: "assets",
15-
scopeName: "full-info",
16-
mergeStrategy: mergeSingleEntity,
14+
namespace,
15+
scope,
16+
mergeStrategy,
1717
});

0 commit comments

Comments
 (0)