@totemsdk/chain-provider 0.1.4 → 0.1.6
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 +4 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -3
- package/dist/providers/hosted.js +22 -3
- package/dist/providers/{pureminima.d.ts → minima-rpc.d.ts} +4 -4
- package/dist/providers/{pureminima.js → minima-rpc.js} +5 -5
- package/package.json +12 -14
- package/dist/providers/lookup.d.ts +0 -20
- package/dist/providers/lookup.js +0 -45
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ interface ChainStateProvider {
|
|
|
32
32
|
| Class | Connects to |
|
|
33
33
|
|-------|------------|
|
|
34
34
|
| `HostedProvider` | Axia / MEG hosted API (requires project credentials) |
|
|
35
|
-
| `
|
|
35
|
+
| `MinimaRpcProvider` | A local or self-hosted Totem/Minima node directly |
|
|
36
36
|
| `LookupClientProvider` | A personal lookup node over Hyperswarm DHT (via `@totemsdk/lookup-client`) |
|
|
37
37
|
| `CompositeProvider` | Fans out across multiple providers with fallback logic |
|
|
38
38
|
|
|
@@ -58,9 +58,9 @@ const coins = await provider.getCoins({ address: 'Mx...' });
|
|
|
58
58
|
### Self-hosted node
|
|
59
59
|
|
|
60
60
|
```typescript
|
|
61
|
-
import {
|
|
61
|
+
import { MinimaRpcProvider } from '@totemsdk/chain-provider';
|
|
62
62
|
|
|
63
|
-
const provider = new
|
|
63
|
+
const provider = new MinimaRpcProvider({
|
|
64
64
|
nodeUrl: 'http://localhost:9005',
|
|
65
65
|
});
|
|
66
66
|
```
|
|
@@ -130,7 +130,7 @@ const provider = new LookupClientProvider(mockClient);
|
|
|
130
130
|
|
|
131
131
|
## See also
|
|
132
132
|
|
|
133
|
-
- [`@totemsdk/
|
|
133
|
+
- [`@totemsdk/minima-rpc`](https://www.npmjs.com/package/@totemsdk/minima-rpc) — the RPC client used by `MinimaRpcProvider`
|
|
134
134
|
- [`@totemsdk/lookup-client`](https://www.npmjs.com/package/@totemsdk/lookup-client) — connect to a personal lookup node over Hyperswarm DHT
|
|
135
135
|
- [`@totemsdk/node`](https://www.npmjs.com/package/@totemsdk/node) — Node.js `MinimaProvider`
|
|
136
136
|
- [`@totemsdk/omnia`](https://www.npmjs.com/package/@totemsdk/omnia) — uses `ChainStateProvider` for coin queries
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export type { ChainStateProvider, CoinsQuery, Coin, MMRProof, ChainTip, TokenInfo, TokenSearchQuery, BroadcastResult, } from './types.js';
|
|
2
2
|
export { HostedProvider } from './providers/hosted.js';
|
|
3
3
|
export type { HostedProviderConfig } from './providers/hosted.js';
|
|
4
|
-
export {
|
|
4
|
+
export { MinimaRpcProvider } from './providers/minima-rpc.js';
|
|
5
5
|
export { LookupClientProvider } from './providers/lookup-client.js';
|
|
6
6
|
export type { LookupClientLike } from './providers/lookup-client.js';
|
|
7
7
|
export { CompositeProvider } from './providers/composite.js';
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CompositeProvider = exports.LookupClientProvider = exports.
|
|
3
|
+
exports.CompositeProvider = exports.LookupClientProvider = exports.MinimaRpcProvider = exports.HostedProvider = void 0;
|
|
4
4
|
var hosted_js_1 = require("./providers/hosted.js");
|
|
5
5
|
Object.defineProperty(exports, "HostedProvider", { enumerable: true, get: function () { return hosted_js_1.HostedProvider; } });
|
|
6
|
-
var
|
|
7
|
-
Object.defineProperty(exports, "
|
|
6
|
+
var minima_rpc_js_1 = require("./providers/minima-rpc.js");
|
|
7
|
+
Object.defineProperty(exports, "MinimaRpcProvider", { enumerable: true, get: function () { return minima_rpc_js_1.MinimaRpcProvider; } });
|
|
8
8
|
var lookup_client_js_1 = require("./providers/lookup-client.js");
|
|
9
9
|
Object.defineProperty(exports, "LookupClientProvider", { enumerable: true, get: function () { return lookup_client_js_1.LookupClientProvider; } });
|
|
10
10
|
var composite_js_1 = require("./providers/composite.js");
|
package/dist/providers/hosted.js
CHANGED
|
@@ -12,9 +12,25 @@
|
|
|
12
12
|
*/
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
14
|
exports.HostedProvider = void 0;
|
|
15
|
+
function sanitizeRpcParam(value, name) {
|
|
16
|
+
if (value.length > 1024) {
|
|
17
|
+
throw new Error(`RPC parameter ${name} exceeds maximum length (1024)`);
|
|
18
|
+
}
|
|
19
|
+
if (/[\x00-\x1f\x7f]/.test(value)) {
|
|
20
|
+
throw new Error(`RPC parameter ${name} contains control characters`);
|
|
21
|
+
}
|
|
22
|
+
const trimmed = value.trim();
|
|
23
|
+
if (trimmed.length === 0) {
|
|
24
|
+
throw new Error(`RPC parameter ${name} is empty after trimming`);
|
|
25
|
+
}
|
|
26
|
+
return trimmed;
|
|
27
|
+
}
|
|
15
28
|
class HostedProvider {
|
|
16
29
|
constructor(config) {
|
|
17
30
|
this.baseUrl = config.baseUrl.replace(/\/$/, '');
|
|
31
|
+
if (!this.baseUrl.startsWith('https://')) {
|
|
32
|
+
throw new Error('HostedProvider requires HTTPS — credentials sent via x-api-key header');
|
|
33
|
+
}
|
|
18
34
|
this.apiKey = config.apiKey;
|
|
19
35
|
this.timeoutMs = config.timeoutMs ?? 30000;
|
|
20
36
|
}
|
|
@@ -105,7 +121,8 @@ class HostedProvider {
|
|
|
105
121
|
}
|
|
106
122
|
async getCoin(coinId) {
|
|
107
123
|
try {
|
|
108
|
-
const
|
|
124
|
+
const clean = sanitizeRpcParam(coinId, 'coinId');
|
|
125
|
+
const coins = await this.rpc(`coins coinid:${clean}`);
|
|
109
126
|
const u = Array.isArray(coins) ? coins[0] : null;
|
|
110
127
|
if (!u)
|
|
111
128
|
return null;
|
|
@@ -131,7 +148,8 @@ class HostedProvider {
|
|
|
131
148
|
* Get MMR proof for a coin via Minima `coinproof` RPC command.
|
|
132
149
|
*/
|
|
133
150
|
async getProof(coinId) {
|
|
134
|
-
const
|
|
151
|
+
const clean = sanitizeRpcParam(coinId, 'coinId');
|
|
152
|
+
const data = await this.rpc(`coinproof coinid:${clean}`);
|
|
135
153
|
return { coinid: coinId, data };
|
|
136
154
|
}
|
|
137
155
|
/**
|
|
@@ -150,7 +168,8 @@ class HostedProvider {
|
|
|
150
168
|
* Get token info via Minima `tokens tokenid:X` RPC command.
|
|
151
169
|
*/
|
|
152
170
|
async getToken(tokenId) {
|
|
153
|
-
const
|
|
171
|
+
const clean = sanitizeRpcParam(tokenId, 'tokenId');
|
|
172
|
+
const data = await this.rpc(`tokens tokenid:${clean}`);
|
|
154
173
|
const t = Array.isArray(data) ? data[0] : data;
|
|
155
174
|
if (!t)
|
|
156
175
|
throw new Error(`Token not found: ${tokenId}`);
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* MinimaRpcProvider — thin wrapper over @totemsdk/minima-rpc.
|
|
3
3
|
*/
|
|
4
|
-
import type {
|
|
4
|
+
import type { MinimaRpcClient } from '@totemsdk/minima-rpc';
|
|
5
5
|
import type { ChainStateProvider, CoinsQuery, Coin, MMRProof, ChainTip, TokenInfo, TokenSearchQuery, BroadcastResult } from '../types.js';
|
|
6
|
-
export declare class
|
|
6
|
+
export declare class MinimaRpcProvider implements ChainStateProvider {
|
|
7
7
|
private readonly client;
|
|
8
|
-
constructor(client:
|
|
8
|
+
constructor(client: MinimaRpcClient);
|
|
9
9
|
getCoins(query: CoinsQuery): Promise<Coin[]>;
|
|
10
10
|
getCoin(coinId: string): Promise<Coin | null>;
|
|
11
11
|
getProof(coinId: string): Promise<MMRProof>;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* MinimaRpcProvider — thin wrapper over @totemsdk/minima-rpc.
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
7
|
-
class
|
|
6
|
+
exports.MinimaRpcProvider = void 0;
|
|
7
|
+
class MinimaRpcProvider {
|
|
8
8
|
constructor(client) {
|
|
9
9
|
this.client = client;
|
|
10
10
|
}
|
|
@@ -73,7 +73,7 @@ class PureMinimaRpcProvider {
|
|
|
73
73
|
return {
|
|
74
74
|
success: true,
|
|
75
75
|
txpowid: result?.txpowid,
|
|
76
|
-
message: 'broadcast via
|
|
76
|
+
message: 'broadcast via MinimaRpc txnminepost',
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
79
|
catch (e) {
|
|
@@ -81,4 +81,4 @@ class PureMinimaRpcProvider {
|
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
-
exports.
|
|
84
|
+
exports.MinimaRpcProvider = MinimaRpcProvider;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@totemsdk/chain-provider",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Unified ChainStateProvider interface for Totem SDK — Hosted,
|
|
3
|
+
"version": "0.1.6",
|
|
4
|
+
"description": "Unified ChainStateProvider interface for Totem SDK — Hosted, Minima RPC, Composite",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"exports": {
|
|
@@ -17,16 +17,15 @@
|
|
|
17
17
|
"LICENSE"
|
|
18
18
|
],
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@totemsdk/core": "1.
|
|
21
|
-
"@totemsdk/
|
|
20
|
+
"@totemsdk/core": "^1.2.8",
|
|
21
|
+
"@totemsdk/minima-rpc": "^0.1.4"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@
|
|
25
|
-
"@types/jest": "^29.0.0",
|
|
24
|
+
"@types/jest": "^30.0.0",
|
|
26
25
|
"@types/node": "^20.0.0",
|
|
27
|
-
"jest": "^
|
|
26
|
+
"jest": "^30.4.2",
|
|
28
27
|
"ts-jest": "^29.0.0",
|
|
29
|
-
"typescript": "^
|
|
28
|
+
"typescript": "^7.0.2"
|
|
30
29
|
},
|
|
31
30
|
"engines": {
|
|
32
31
|
"node": ">=18.0.0"
|
|
@@ -36,14 +35,14 @@
|
|
|
36
35
|
},
|
|
37
36
|
"license": "MIT",
|
|
38
37
|
"author": "Totem SDK",
|
|
39
|
-
"homepage": "https://
|
|
38
|
+
"homepage": "https://totem.ing",
|
|
40
39
|
"bugs": {
|
|
41
|
-
"url": "https://github.com/
|
|
40
|
+
"url": "https://github.com/totem-sdk/totem-sdk/issues"
|
|
42
41
|
},
|
|
43
42
|
"repository": {
|
|
44
43
|
"type": "git",
|
|
45
|
-
"url": "git+https://github.com/
|
|
46
|
-
"directory": "packages/
|
|
44
|
+
"url": "git+https://github.com/totem-sdk/totem-sdk.git",
|
|
45
|
+
"directory": "packages/chain-provider"
|
|
47
46
|
},
|
|
48
47
|
"keywords": [
|
|
49
48
|
"totem",
|
|
@@ -52,7 +51,6 @@
|
|
|
52
51
|
"blockchain",
|
|
53
52
|
"quantum-resistant",
|
|
54
53
|
"wots",
|
|
55
|
-
"kissvm",
|
|
56
54
|
"utxo",
|
|
57
55
|
"chain-provider",
|
|
58
56
|
"rpc",
|
|
@@ -63,6 +61,6 @@
|
|
|
63
61
|
"scripts": {
|
|
64
62
|
"build": "tsc",
|
|
65
63
|
"clean": "rm -rf dist",
|
|
66
|
-
"test": "jest
|
|
64
|
+
"test": "jest"
|
|
67
65
|
}
|
|
68
66
|
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* LookupNodeProvider — stub.
|
|
3
|
-
*
|
|
4
|
-
* Full implementation lives in @totemsdk/lookup-client which replaces this
|
|
5
|
-
* stub once the lookup node package is available.
|
|
6
|
-
*/
|
|
7
|
-
import type { ChainStateProvider, CoinsQuery, Coin, MMRProof, ChainTip, TokenInfo, TokenSearchQuery, BroadcastResult } from '../types.js';
|
|
8
|
-
export declare class LookupNodeNotImplementedError extends Error {
|
|
9
|
-
constructor();
|
|
10
|
-
}
|
|
11
|
-
export declare class LookupNodeProvider implements ChainStateProvider {
|
|
12
|
-
getCoins(_query: CoinsQuery): Promise<Coin[]>;
|
|
13
|
-
getCoin(_coinId: string): Promise<Coin | null>;
|
|
14
|
-
getProof(_coinId: string): Promise<MMRProof>;
|
|
15
|
-
getTip(): Promise<ChainTip>;
|
|
16
|
-
getToken(_tokenId: string): Promise<TokenInfo>;
|
|
17
|
-
searchTokens(_query: TokenSearchQuery): Promise<TokenInfo[]>;
|
|
18
|
-
getTokensByCreator(_address: string): Promise<TokenInfo[]>;
|
|
19
|
-
broadcastTxPoW(_txpowHex: string): Promise<BroadcastResult>;
|
|
20
|
-
}
|
package/dist/providers/lookup.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* LookupNodeProvider — stub.
|
|
4
|
-
*
|
|
5
|
-
* Full implementation lives in @totemsdk/lookup-client which replaces this
|
|
6
|
-
* stub once the lookup node package is available.
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.LookupNodeProvider = exports.LookupNodeNotImplementedError = void 0;
|
|
10
|
-
class LookupNodeNotImplementedError extends Error {
|
|
11
|
-
constructor() {
|
|
12
|
-
super('LookupNodeProvider is not yet implemented. ' +
|
|
13
|
-
'Install @totemsdk/lookup-client and use LookupClientProvider instead. ' +
|
|
14
|
-
'See https://github.com/Totem/totem-sdk for setup instructions.');
|
|
15
|
-
this.name = 'LookupNodeNotImplementedError';
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
exports.LookupNodeNotImplementedError = LookupNodeNotImplementedError;
|
|
19
|
-
class LookupNodeProvider {
|
|
20
|
-
getCoins(_query) {
|
|
21
|
-
throw new LookupNodeNotImplementedError();
|
|
22
|
-
}
|
|
23
|
-
getCoin(_coinId) {
|
|
24
|
-
throw new LookupNodeNotImplementedError();
|
|
25
|
-
}
|
|
26
|
-
getProof(_coinId) {
|
|
27
|
-
throw new LookupNodeNotImplementedError();
|
|
28
|
-
}
|
|
29
|
-
getTip() {
|
|
30
|
-
throw new LookupNodeNotImplementedError();
|
|
31
|
-
}
|
|
32
|
-
getToken(_tokenId) {
|
|
33
|
-
throw new LookupNodeNotImplementedError();
|
|
34
|
-
}
|
|
35
|
-
searchTokens(_query) {
|
|
36
|
-
throw new LookupNodeNotImplementedError();
|
|
37
|
-
}
|
|
38
|
-
getTokensByCreator(_address) {
|
|
39
|
-
throw new LookupNodeNotImplementedError();
|
|
40
|
-
}
|
|
41
|
-
broadcastTxPoW(_txpowHex) {
|
|
42
|
-
throw new LookupNodeNotImplementedError();
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
exports.LookupNodeProvider = LookupNodeProvider;
|