@totemsdk/chain-provider 0.1.4 → 0.1.5

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.
@@ -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 coins = await this.rpc(`coins coinid:${coinId}`);
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 data = await this.rpc(`coinproof coinid:${coinId}`);
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 data = await this.rpc(`tokens tokenid:${tokenId}`);
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}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@totemsdk/chain-provider",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Unified ChainStateProvider interface for Totem SDK — Hosted, PureMinima, Composite",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -11,22 +11,27 @@
11
11
  "import": "./dist/index.js"
12
12
  }
13
13
  },
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "prepare": "tsc",
17
+ "clean": "rm -rf dist",
18
+ "test": "jest --passWithNoTests"
19
+ },
14
20
  "files": [
15
21
  "dist",
16
22
  "README.md",
17
23
  "LICENSE"
18
24
  ],
19
25
  "dependencies": {
20
- "@totemsdk/core": "1.1.0",
21
- "@totemsdk/pureminima-rpc": "0.1.3"
26
+ "@totemsdk/core": "^1.1.0",
27
+ "@totemsdk/pureminima-rpc": "^0.1.3"
22
28
  },
23
29
  "devDependencies": {
24
- "@noble/hashes": "^2.2.0",
25
- "@types/jest": "^29.0.0",
30
+ "@types/jest": "^30.0.0",
26
31
  "@types/node": "^20.0.0",
27
- "jest": "^29.0.0",
32
+ "jest": "^30.4.2",
28
33
  "ts-jest": "^29.0.0",
29
- "typescript": "^5.0.0"
34
+ "typescript": "^7.0.2"
30
35
  },
31
36
  "engines": {
32
37
  "node": ">=18.0.0"
@@ -36,13 +41,13 @@
36
41
  },
37
42
  "license": "MIT",
38
43
  "author": "Totem SDK",
39
- "homepage": "https://totemsdk.com",
44
+ "homepage": "https://totem.ing",
40
45
  "bugs": {
41
- "url": "https://github.com/MrGheek/axia-totem/issues"
46
+ "url": "https://github.com/totem-sdk/totem-sdk/issues"
42
47
  },
43
48
  "repository": {
44
49
  "type": "git",
45
- "url": "git+https://github.com/MrGheek/axia-totem.git",
50
+ "url": "git+https://github.com/totem-sdk/totem-sdk.git",
46
51
  "directory": "packages/totem-sdk/packages/chain-provider"
47
52
  },
48
53
  "keywords": [
@@ -59,10 +64,5 @@
59
64
  "provider",
60
65
  "chain-data",
61
66
  "strategy-pattern"
62
- ],
63
- "scripts": {
64
- "build": "tsc",
65
- "clean": "rm -rf dist",
66
- "test": "jest --passWithNoTests"
67
- }
68
- }
67
+ ]
68
+ }
@@ -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
- }
@@ -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;