@reppo/cli 0.6.0 → 0.7.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.
- package/README.md +1 -1
- package/dist/api/subnets.d.ts +45 -0
- package/dist/api/subnets.d.ts.map +1 -0
- package/dist/api/subnets.js +49 -0
- package/dist/api/subnets.js.map +1 -0
- package/dist/bin.js +1 -1
- package/dist/commands/list/datanets.d.ts.map +1 -1
- package/dist/commands/list/datanets.js +3 -20
- package/dist/commands/list/datanets.js.map +1 -1
- package/dist/commands/query/datanet.d.ts +10 -0
- package/dist/commands/query/datanet.d.ts.map +1 -1
- package/dist/commands/query/datanet.js +76 -1
- package/dist/commands/query/datanet.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -47,7 +47,7 @@ Errors **always** emit JSON on stderr regardless of mode, with a stable `code` f
|
|
|
47
47
|
- `reppo query balance [address]` — ETH + REPPO + veREPPO + USDC
|
|
48
48
|
- `reppo query voting-power [address]` — veREPPO voting power + lockup count
|
|
49
49
|
- `reppo query pod <podId>` — pod existence + owner address
|
|
50
|
-
- `reppo query datanet <datanetId> [--for <addr>]` — validity + REPPO access fee
|
|
50
|
+
- `reppo query datanet <datanetId> [--for <addr>]` — on-chain validity + REPPO access fee (optionally check access for an address), plus off-chain catalog metadata: name, description, native token (symbol/address/decimals), per-epoch emissions, vote volumes, publisher/voter onboarding guidance, and the platform `subnetUuid` (the `--subnet-uuid` for `mint-pod` publishing). Catalog enrichment is best-effort — a platform outage degrades `metadata` to `{ unavailable }` without affecting the on-chain answer.
|
|
51
51
|
- `reppo query emissions-due` — list unclaimed REPPO emissions across all pods owned by the configured wallet (uses platform API)
|
|
52
52
|
|
|
53
53
|
### List
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export declare const PUBLIC_SUBNETS_PATH = "/api/v1/public/subnets";
|
|
2
|
+
/** Raw subnet row as returned by /api/v1/public/subnets. */
|
|
3
|
+
export interface RawSubnet {
|
|
4
|
+
id?: string;
|
|
5
|
+
subnetName?: string;
|
|
6
|
+
subnetDescription?: string;
|
|
7
|
+
thumbnailUrl?: string;
|
|
8
|
+
nativeTokenAddress?: string;
|
|
9
|
+
nativeTokenSymbol?: string;
|
|
10
|
+
nativeTokenDecimals?: number;
|
|
11
|
+
tokenId?: string;
|
|
12
|
+
accessFeeREPPO?: number | string;
|
|
13
|
+
emissionsPerEpochREPPO?: number | string;
|
|
14
|
+
emissionsPerEpochPrimaryToken?: number | string;
|
|
15
|
+
status?: string;
|
|
16
|
+
upVoteVolume?: number | string;
|
|
17
|
+
downVoteVolume?: number | string;
|
|
18
|
+
onboardingPublishers?: string;
|
|
19
|
+
onboardingVoters?: string;
|
|
20
|
+
createdByUserId?: string;
|
|
21
|
+
deleteScheduledAt?: string | null;
|
|
22
|
+
isABTestingSubnet?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface PublicSubnetsResponse {
|
|
25
|
+
data?: {
|
|
26
|
+
subnets?: RawSubnet[];
|
|
27
|
+
};
|
|
28
|
+
subnets?: RawSubnet[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Convert a JSON number/string from the platform into a string suitable for
|
|
32
|
+
* downstream BigInt parsing. Non-numeric or missing values render as "0"
|
|
33
|
+
* rather than "NaN"/"undefined" so the output shape stays consistent.
|
|
34
|
+
*/
|
|
35
|
+
export declare function numericToString(v: number | string | undefined): string;
|
|
36
|
+
/** Fetch the full public catalog. Throws `PUBLIC_API_*` on transport/parse failure. */
|
|
37
|
+
export declare function fetchSubnets(baseUrl: string | undefined): Promise<RawSubnet[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Find a single catalog row by its on-chain datanet id (`tokenId`). Returns
|
|
40
|
+
* `null` when no row matches (e.g. a testnet datanet absent from the mainnet
|
|
41
|
+
* catalog). Throws `PUBLIC_API_*` only on transport/parse failure — the
|
|
42
|
+
* caller decides whether that's fatal.
|
|
43
|
+
*/
|
|
44
|
+
export declare function fetchSubnetByTokenId(baseUrl: string | undefined, tokenId: string): Promise<RawSubnet | null>;
|
|
45
|
+
//# sourceMappingURL=subnets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subnets.d.ts","sourceRoot":"","sources":["../../src/api/subnets.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,mBAAmB,2BAA2B,CAAC;AAE5D,4DAA4D;AAC5D,MAAM,WAAW,SAAS;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,sBAAsB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzC,6BAA6B,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,SAAS,EAAE,CAAA;KAAE,CAAC;IACjC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAQtE;AAED,uFAAuF;AACvF,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAGpF;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAG3B"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reppo public catalog of datanets ("subnets").
|
|
3
|
+
*
|
|
4
|
+
* The unauthenticated endpoint `GET reppo.ai/api/v1/public/subnets` returns
|
|
5
|
+
* the rich, off-chain metadata for every datanet — name, description,
|
|
6
|
+
* onboarding guidance, native token, emissions, vote volumes. This is the
|
|
7
|
+
* source `list datanets` summarizes and `query datanet` surfaces in full.
|
|
8
|
+
*
|
|
9
|
+
* "Datanet" is the user-facing name; the platform still uses the legacy
|
|
10
|
+
* "subnet" terminology in field names. A row carries BOTH ids:
|
|
11
|
+
* - `id` — platform cuid (e.g. cmnhuowns000bic04e16t6735), the
|
|
12
|
+
* `--subnet-uuid` used by mint-pod Phase-2 publishing.
|
|
13
|
+
* - `tokenId` — the on-chain datanet id (e.g. "9") the CLI takes as the
|
|
14
|
+
* `query datanet <id>` / `mint-pod --datanet` argument.
|
|
15
|
+
*/
|
|
16
|
+
import { publicGet } from './public.js';
|
|
17
|
+
export const PUBLIC_SUBNETS_PATH = '/api/v1/public/subnets';
|
|
18
|
+
/**
|
|
19
|
+
* Convert a JSON number/string from the platform into a string suitable for
|
|
20
|
+
* downstream BigInt parsing. Non-numeric or missing values render as "0"
|
|
21
|
+
* rather than "NaN"/"undefined" so the output shape stays consistent.
|
|
22
|
+
*/
|
|
23
|
+
export function numericToString(v) {
|
|
24
|
+
if (v === undefined || v === null)
|
|
25
|
+
return '0';
|
|
26
|
+
if (typeof v === 'number') {
|
|
27
|
+
if (!Number.isFinite(v))
|
|
28
|
+
return '0';
|
|
29
|
+
return Math.trunc(v).toString();
|
|
30
|
+
}
|
|
31
|
+
const s = v.trim();
|
|
32
|
+
return s === '' ? '0' : s;
|
|
33
|
+
}
|
|
34
|
+
/** Fetch the full public catalog. Throws `PUBLIC_API_*` on transport/parse failure. */
|
|
35
|
+
export async function fetchSubnets(baseUrl) {
|
|
36
|
+
const resp = await publicGet(baseUrl, PUBLIC_SUBNETS_PATH);
|
|
37
|
+
return resp.data?.subnets ?? resp.subnets ?? [];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Find a single catalog row by its on-chain datanet id (`tokenId`). Returns
|
|
41
|
+
* `null` when no row matches (e.g. a testnet datanet absent from the mainnet
|
|
42
|
+
* catalog). Throws `PUBLIC_API_*` only on transport/parse failure — the
|
|
43
|
+
* caller decides whether that's fatal.
|
|
44
|
+
*/
|
|
45
|
+
export async function fetchSubnetByTokenId(baseUrl, tokenId) {
|
|
46
|
+
const subnets = await fetchSubnets(baseUrl);
|
|
47
|
+
return subnets.find((s) => (s.tokenId ?? '') === tokenId) ?? null;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=subnets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subnets.js","sourceRoot":"","sources":["../../src/api/subnets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,CAAC,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AA8B5D;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,CAA8B;IAC5D,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;IAC9C,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClC,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA2B;IAC5D,MAAM,IAAI,GAAG,MAAM,SAAS,CAAwB,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAClF,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAA2B,EAC3B,OAAe;IAEf,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC;AACpE,CAAC"}
|
package/dist/bin.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datanets.d.ts","sourceRoot":"","sources":["../../../src/commands/list/datanets.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"datanets.d.ts","sourceRoot":"","sources":["../../../src/commands/list/datanets.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAuB1C,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,OAAgB,KAAK,aAA0B;IAE/C,OAAgB,KAAK,4BAclB;IAEH,MAAM,SAEH;IAEH,WAAW,qBAER;IAEH,KAAK,qBAEF;IAEG,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAmEjC"}
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
import { Option } from 'clipanion';
|
|
21
21
|
import { BaseCommand } from '../_base.js';
|
|
22
22
|
import { cliError, emit } from '../../output/format.js';
|
|
23
|
-
import {
|
|
23
|
+
import { DEFAULT_PUBLIC_API_URL } from '../../api/public.js';
|
|
24
|
+
import { fetchSubnets, numericToString } from '../../api/subnets.js';
|
|
24
25
|
const VALID_STATUSES = ['ACTIVE', 'ALL'];
|
|
25
26
|
export class ListDatanetsCommand extends BaseCommand {
|
|
26
27
|
static paths = [['list', 'datanets']];
|
|
@@ -66,8 +67,7 @@ export class ListDatanetsCommand extends BaseCommand {
|
|
|
66
67
|
}
|
|
67
68
|
// Resolve env override at call site (per spec — not in loadConfig).
|
|
68
69
|
const baseUrl = process.env.REPPO_PUBLIC_API_URL ?? DEFAULT_PUBLIC_API_URL;
|
|
69
|
-
const
|
|
70
|
-
const raw = resp.data?.subnets ?? resp.subnets ?? [];
|
|
70
|
+
const raw = await fetchSubnets(baseUrl);
|
|
71
71
|
// Filter: status, token-symbol.
|
|
72
72
|
const symbolNeedle = this.tokenSymbol?.toLowerCase();
|
|
73
73
|
const filtered = raw.filter((s) => {
|
|
@@ -108,23 +108,6 @@ export class ListDatanetsCommand extends BaseCommand {
|
|
|
108
108
|
function isStatusFilter(v) {
|
|
109
109
|
return VALID_STATUSES.includes(v);
|
|
110
110
|
}
|
|
111
|
-
/**
|
|
112
|
-
* Convert a JSON number/string from the platform into a string suitable
|
|
113
|
-
* for downstream BigInt parsing. Non-numeric or missing values render
|
|
114
|
-
* as "0" rather than "NaN" or "undefined" so the output shape stays
|
|
115
|
-
* consistent.
|
|
116
|
-
*/
|
|
117
|
-
function numericToString(v) {
|
|
118
|
-
if (v === undefined || v === null)
|
|
119
|
-
return '0';
|
|
120
|
-
if (typeof v === 'number') {
|
|
121
|
-
if (!Number.isFinite(v))
|
|
122
|
-
return '0';
|
|
123
|
-
return Math.trunc(v).toString();
|
|
124
|
-
}
|
|
125
|
-
const s = v.trim();
|
|
126
|
-
return s === '' ? '0' : s;
|
|
127
|
-
}
|
|
128
111
|
function toRow(s) {
|
|
129
112
|
return {
|
|
130
113
|
id: s.tokenId ?? '',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datanets.js","sourceRoot":"","sources":["../../../src/commands/list/datanets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"datanets.js","sourceRoot":"","sources":["../../../src/commands/list/datanets.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,5 +6,15 @@ export declare class QueryDatanetCommand extends BaseCommand {
|
|
|
6
6
|
for_: string | undefined;
|
|
7
7
|
execute(): Promise<number>;
|
|
8
8
|
private resolveCallerAddress;
|
|
9
|
+
/**
|
|
10
|
+
* Resolve the off-chain catalog row for this datanet by its on-chain id
|
|
11
|
+
* (`tokenId`). Best-effort: returns `{ unavailable }` on a catalog outage
|
|
12
|
+
* or a no-match, never throwing — the on-chain answer is authoritative and
|
|
13
|
+
* must survive a flaky platform API.
|
|
14
|
+
*/
|
|
15
|
+
private fetchMetadata;
|
|
16
|
+
private toMetadata;
|
|
17
|
+
/** Human-mode lines for the catalog metadata block. */
|
|
18
|
+
private metadataLines;
|
|
9
19
|
}
|
|
10
20
|
//# sourceMappingURL=datanet.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datanet.d.ts","sourceRoot":"","sources":["../../../src/commands/query/datanet.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"datanet.d.ts","sourceRoot":"","sources":["../../../src/commands/query/datanet.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgC1C,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,OAAgB,KAAK,aAA0B;IAE/C,OAAgB,KAAK,4BAUlB;IAEH,OAAO,SAAqC;IAC5C,IAAI,qBAA+H;IAE7H,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IA6FhC,OAAO,CAAC,oBAAoB;IAW5B;;;;;OAKG;YACW,aAAa;IAW3B,OAAO,CAAC,UAAU;IAsBlB,uDAAuD;IACvD,OAAO,CAAC,aAAa;CAyBtB"}
|
|
@@ -23,6 +23,8 @@ import { BaseCommand } from '../_base.js';
|
|
|
23
23
|
import { cliError, emit } from '../../output/format.js';
|
|
24
24
|
import { createReadClient } from '../../chain/clients.js';
|
|
25
25
|
import { trySubnetManager } from '../../chain/contracts.js';
|
|
26
|
+
import { DEFAULT_PUBLIC_API_URL } from '../../api/public.js';
|
|
27
|
+
import { fetchSubnetByTokenId, numericToString } from '../../api/subnets.js';
|
|
26
28
|
function unavailable(reason) {
|
|
27
29
|
return { unavailable: reason };
|
|
28
30
|
}
|
|
@@ -51,6 +53,10 @@ export class QueryDatanetCommand extends BaseCommand {
|
|
|
51
53
|
catch {
|
|
52
54
|
throw cliError('INVALID_DATANET_ID', `Datanet id must be a non-negative integer; got "${this.datanet}".`);
|
|
53
55
|
}
|
|
56
|
+
// Off-chain catalog metadata (name, description, token, emissions,
|
|
57
|
+
// onboarding). Best-effort: a catalog outage or a datanet absent from
|
|
58
|
+
// the public catalog must NOT break the authoritative on-chain answer.
|
|
59
|
+
const metadata = await this.fetchMetadata(datanetId.toString());
|
|
54
60
|
const client = createReadClient({ network: cfg.network, ...(cfg.rpcUrl ? { rpcUrl: cfg.rpcUrl } : {}) });
|
|
55
61
|
const sm = trySubnetManager(cfg.network);
|
|
56
62
|
if (!sm) {
|
|
@@ -60,10 +66,12 @@ export class QueryDatanetCommand extends BaseCommand {
|
|
|
60
66
|
network: cfg.network,
|
|
61
67
|
valid: unavailable(reason),
|
|
62
68
|
accessFeeREPPO: unavailable(reason),
|
|
69
|
+
metadata,
|
|
63
70
|
}, [
|
|
64
71
|
`Datanet: ${datanetId}`,
|
|
65
72
|
`Network: ${cfg.network}`,
|
|
66
|
-
`(unavailable: ${reason})`,
|
|
73
|
+
`(on-chain unavailable: ${reason})`,
|
|
74
|
+
...this.metadataLines(metadata),
|
|
67
75
|
]);
|
|
68
76
|
return 0;
|
|
69
77
|
}
|
|
@@ -92,6 +100,7 @@ export class QueryDatanetCommand extends BaseCommand {
|
|
|
92
100
|
valid,
|
|
93
101
|
accessFeeREPPO,
|
|
94
102
|
...(callerAccess ? { callerAccess } : {}),
|
|
103
|
+
metadata,
|
|
95
104
|
};
|
|
96
105
|
const feeFmt = 'unavailable' in accessFeeREPPO
|
|
97
106
|
? `(unavailable: ${accessFeeREPPO.unavailable})`
|
|
@@ -106,6 +115,7 @@ export class QueryDatanetCommand extends BaseCommand {
|
|
|
106
115
|
lines.push(`Caller: ${callerAccess.address}`);
|
|
107
116
|
lines.push(`Caller access: ${callerAccess.hasAccess}`);
|
|
108
117
|
}
|
|
118
|
+
lines.push(...this.metadataLines(metadata));
|
|
109
119
|
emit(result, lines);
|
|
110
120
|
return 0;
|
|
111
121
|
}
|
|
@@ -124,5 +134,70 @@ export class QueryDatanetCommand extends BaseCommand {
|
|
|
124
134
|
return privateKeyToAddress(pk);
|
|
125
135
|
return undefined;
|
|
126
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Resolve the off-chain catalog row for this datanet by its on-chain id
|
|
139
|
+
* (`tokenId`). Best-effort: returns `{ unavailable }` on a catalog outage
|
|
140
|
+
* or a no-match, never throwing — the on-chain answer is authoritative and
|
|
141
|
+
* must survive a flaky platform API.
|
|
142
|
+
*/
|
|
143
|
+
async fetchMetadata(tokenId) {
|
|
144
|
+
const baseUrl = process.env.REPPO_PUBLIC_API_URL ?? DEFAULT_PUBLIC_API_URL;
|
|
145
|
+
try {
|
|
146
|
+
const row = await fetchSubnetByTokenId(baseUrl, tokenId);
|
|
147
|
+
if (!row)
|
|
148
|
+
return unavailable('datanet not found in the public catalog');
|
|
149
|
+
return this.toMetadata(row);
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
return unavailable(`catalog fetch failed: ${e.message}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
toMetadata(s) {
|
|
156
|
+
return {
|
|
157
|
+
subnetUuid: s.id ?? '',
|
|
158
|
+
name: s.subnetName ?? '',
|
|
159
|
+
description: s.subnetDescription ?? '',
|
|
160
|
+
status: s.status ?? 'UNKNOWN',
|
|
161
|
+
nativeToken: {
|
|
162
|
+
address: s.nativeTokenAddress ?? '',
|
|
163
|
+
symbol: s.nativeTokenSymbol ?? '',
|
|
164
|
+
decimals: typeof s.nativeTokenDecimals === 'number' ? s.nativeTokenDecimals : 0,
|
|
165
|
+
},
|
|
166
|
+
emissionsPerEpochREPPO: numericToString(s.emissionsPerEpochREPPO),
|
|
167
|
+
emissionsPerEpochPrimaryToken: numericToString(s.emissionsPerEpochPrimaryToken),
|
|
168
|
+
upVoteVolume: numericToString(s.upVoteVolume),
|
|
169
|
+
downVoteVolume: numericToString(s.downVoteVolume),
|
|
170
|
+
onboardingPublishers: s.onboardingPublishers ?? '',
|
|
171
|
+
onboardingVoters: s.onboardingVoters ?? '',
|
|
172
|
+
thumbnailUrl: s.thumbnailUrl ?? '',
|
|
173
|
+
isABTestingSubnet: s.isABTestingSubnet ?? false,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/** Human-mode lines for the catalog metadata block. */
|
|
177
|
+
metadataLines(m) {
|
|
178
|
+
if ('unavailable' in m) {
|
|
179
|
+
return [`Metadata: (unavailable: ${m.unavailable})`];
|
|
180
|
+
}
|
|
181
|
+
const lines = [
|
|
182
|
+
``,
|
|
183
|
+
`Name: ${m.name}`,
|
|
184
|
+
`Status: ${m.status}`,
|
|
185
|
+
`Token: ${m.nativeToken.symbol} (${m.nativeToken.decimals} decimals) ${m.nativeToken.address}`,
|
|
186
|
+
`Emissions: ${m.emissionsPerEpochREPPO} REPPO/epoch` +
|
|
187
|
+
(m.emissionsPerEpochPrimaryToken !== '0' ? ` + ${m.emissionsPerEpochPrimaryToken} primary/epoch` : ''),
|
|
188
|
+
`Votes: ↑${m.upVoteVolume} / ↓${m.downVoteVolume}`,
|
|
189
|
+
`Subnet UUID: ${m.subnetUuid} (use as --subnet-uuid for mint-pod publishing)`,
|
|
190
|
+
];
|
|
191
|
+
if (m.description.trim()) {
|
|
192
|
+
lines.push(``, `Description:`, m.description.trim());
|
|
193
|
+
}
|
|
194
|
+
if (m.onboardingPublishers.trim()) {
|
|
195
|
+
lines.push(``, `Onboarding — publishers:`, m.onboardingPublishers.trim());
|
|
196
|
+
}
|
|
197
|
+
if (m.onboardingVoters.trim()) {
|
|
198
|
+
lines.push(``, `Onboarding — voters:`, m.onboardingVoters.trim());
|
|
199
|
+
}
|
|
200
|
+
return lines;
|
|
201
|
+
}
|
|
127
202
|
}
|
|
128
203
|
//# sourceMappingURL=datanet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datanet.js","sourceRoot":"","sources":["../../../src/commands/query/datanet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAgB,MAAM,MAAM,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"datanet.js","sourceRoot":"","sources":["../../../src/commands/query/datanet.ts"],"names":[],"mappings":"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"}
|