prividium 0.1.1 → 0.1.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.
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # Prividium SDK & CLI
1
+ # Prividium SDK & CLI
2
2
 
3
- A TypeScript SDK and CLI for integrating with the Prividium authorization system. The SDK provides popup OAuth, token
4
- management, and a viem transport for secure RPC; the CLI runs a local authenticated JSON-RPC proxy to your Prividium RPC
5
- and manages basic configuration.
3
+ A TypeScript SDK and CLI for integrating with the Prividium authorization system. The SDK provides popup OAuth, token
4
+ management, and a viem transport for secure RPC; the CLI runs a local authenticated JSON-RPC proxy to your Prividium
5
+ RPC and manages basic configuration.
6
6
 
7
7
  ## Features
8
8
 
@@ -31,7 +31,7 @@ npx prividium proxy
31
31
 
32
32
  ## Quick Start
33
33
 
34
- ### 1. Create a Prividium Chain
34
+ ### 1. Create a Prividium Chain
35
35
 
36
36
  ```typescript
37
37
  import { createPrividiumChain } from 'prividium';
@@ -40,7 +40,7 @@ import { defineChain, createPublicClient, http } from 'viem';
40
40
  // Define your chain
41
41
  const prividiumChain = defineChain({
42
42
  id: 7777,
43
- name: 'Prividium Chain',
43
+ name: 'Prividium Chain',
44
44
  nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
45
45
  rpcUrls: { default: { http: [] } },
46
46
  blockExplorers: { default: { name: 'Explorer', url: 'https://explorer.prividium.io' } }
@@ -48,12 +48,13 @@ const prividiumChain = defineChain({
48
48
 
49
49
  // Create SDK instance
50
50
  // Note: replace the URLs and clientId with your actual values
51
- // Make sure clientId is registered in User Panel (OAUTH_CLIENTS)
51
+ // Make sure clientId & redirectUrl are from a registered Application in the Admin Panel
52
52
  const prividium = createPrividiumChain({
53
53
  clientId: 'your-client-id',
54
54
  chain: prividiumChain,
55
55
  rpcUrl: 'https://rpc.prividium.io',
56
56
  authBaseUrl: 'https://auth.prividium.io',
57
+ permissionsApiBaseUrl: 'https://permissions.prividium.io/api',
57
58
  redirectUrl: window.location.origin + '/auth/callback',
58
59
  onAuthExpiry: () => {
59
60
  console.log('Authentication expired - please reconnect');
@@ -88,13 +89,13 @@ const balance = await client.getBalance({
88
89
 
89
90
  ### 4. Sending Transactions with Injected Wallets (MetaMask)
90
91
 
91
- Before sending transactions through injected wallets, you need to add the Prividium network and enable wallet RPC for
92
+ Before sending transactions through injected wallets, you need to add the Prividium network and enable wallet RPC for
92
93
  each transaction.
93
94
 
94
95
  ```typescript
95
96
  import { createWalletClient, custom, encodeFunctionData } from 'viem';
96
97
 
97
- // Add Prividium network to MetaMask
98
+ // Add Prividium network to MetaMask
98
99
  await prividium.addNetworkToWallet();
99
100
 
100
101
  // Create wallet client for MetaMask
@@ -172,7 +173,7 @@ page at the `redirectUrl` you configured:
172
173
 
173
174
  **How it works:**
174
175
 
175
- 1. User clicks "Login" → SDK opens popup to Prividium user panel
176
+ 1. User clicks "Login" → SDK opens popup to Prividium user panel
176
177
  2. User authenticates → user panel redirects popup to your callback page
177
178
  3. Callback page calls `handleAuthCallback()` → token is posted back to parent via `postMessage`
178
179
  4. SDK receives token, validates state parameter (CSRF protection), and closes popup
@@ -194,12 +195,16 @@ const prividium = createPrividiumChain({
194
195
  chain: prividiumChain,
195
196
  rpcUrl: 'https://rpc.prividium.io',
196
197
  authBaseUrl: 'https://auth.prividium.io',
198
+ permissionsApiBaseUrl: 'https://permissions.prividium.io/api',
197
199
  redirectUrl: window.location.origin + '/auth/callback',
198
- scope: ['wallet:required', 'network:required'], // Request specific scopes
199
200
  onAuthExpiry: () => {
200
201
  console.log('Authentication expired');
201
202
  }
202
203
  });
204
+
205
+ await prividium.authorize({
206
+ scope: ['wallet:required', 'network:required'] // Request specific scopes
207
+ });
203
208
  ```
204
209
 
205
210
  ### Available Scopes
@@ -214,7 +219,7 @@ are not met, the user panel will guide them through the necessary setup steps be
214
219
 
215
220
  ### `createPrividiumChain(config)`
216
221
 
217
- Creates a new Prividium SDK instance.
222
+ Creates a new Prividium SDK instance.
218
223
 
219
224
  **Parameters:**
220
225
 
@@ -224,8 +229,8 @@ interface PrividiumConfig {
224
229
  chain: Chain; // Viem chain configuration (without rpcUrls)
225
230
  rpcUrl: string; // Private RPC endpoint URL
226
231
  authBaseUrl: string; // Authorization service base URL
232
+ permissionsApiBaseUrl: string; // Permissions API service base URL
227
233
  redirectUrl: string; // OAuth redirect URL
228
- scope?: OauthScope[]; // Optional OAuth scopes to request (optional)
229
234
  storage?: Storage; // Custom storage implementation (optional)
230
235
  onAuthExpiry?: () => void; // Called when authentication expires (optional)
231
236
  }
@@ -242,6 +247,7 @@ Opens authentication popup and handles OAuth flow.
242
247
  ```typescript
243
248
  await prividium.authorize({
244
249
  popupSize: { w: 600, h: 700 } // Optional custom popup dimensions
250
+ scopes: ['wallet:required', 'network:required'], // Optional scope requests
245
251
  });
246
252
  ```
247
253
 
@@ -330,7 +336,7 @@ const prividium = createPrividiumChain({
330
336
 
331
337
  ### Multiple Chains
332
338
 
333
- Support multiple Prividium chains:
339
+ Support multiple Prividium chains:
334
340
 
335
341
  ```typescript
336
342
  const testnetPrividium = createPrividiumChain({
@@ -338,6 +344,7 @@ const testnetPrividium = createPrividiumChain({
338
344
  chain: testnetChain,
339
345
  rpcUrl: 'https://testnet-rpc.prividium.io',
340
346
  authBaseUrl: 'https://testnet-auth.prividium.io',
347
+ permissionsApiBaseUrl: 'https://testnet-permissions.prividium.io/api',
341
348
  redirectUrl: window.location.origin + '/auth/callback'
342
349
  });
343
350
 
@@ -346,6 +353,7 @@ const mainnetPrividium = createPrividiumChain({
346
353
  chain: mainnetChain,
347
354
  rpcUrl: 'https://mainnet-rpc.prividium.io',
348
355
  authBaseUrl: 'https://mainnet-auth.prividium.io',
356
+ permissionsApiBaseUrl: 'https://mainnet-permissions.prividium.io/api',
349
357
  redirectUrl: window.location.origin + '/auth/callback'
350
358
  });
351
359
  ```
@@ -401,9 +409,13 @@ The SDK uses the following localStorage keys:
401
409
 
402
410
  ## CLI
403
411
 
404
- Run a local, authenticated RPC proxy that forwards JSON-RPC requests to your Prividium RPC while injecting the OAuth
412
+ Run a local, authenticated RPC proxy that forwards JSON-RPC requests to your Prividium RPC while injecting the OAuth
405
413
  token obtained via a quick browser sign-in.
406
414
 
415
+ The proxy CLI is particularly useful for deploying contracts with standard Ethereum tools (like Foundry or Hardhat)
416
+ without having to manage authentication manually. The proxy automatically handles authentication headers, allowing you
417
+ to use your existing deployment workflows.
418
+
407
419
  ### Install & Run
408
420
 
409
421
  - Use without installing: `npx prividium proxy`
@@ -427,8 +439,8 @@ What happens:
427
439
 
428
440
  Flags:
429
441
 
430
- - `--rpc-url, -r` (string): Target Prividium RPC URL.
431
- - `--user-panel-url, -u` (string): URL used to log in to Prividium.
442
+ - `--rpc-url, -r` (string): Target Prividium RPC URL.
443
+ - `--user-panel-url, -u` (string): URL used to log in to Prividium™.
432
444
  - `--port, -p` (number, default `24101`): Local proxy port. This has to match with the port configured in the admin
433
445
  panel, which by default uses this same port.
434
446
  - `--host, -h` (string, default `127.0.0.1`): host binded to server. By default only connections comming from local
@@ -23,13 +23,13 @@ export const addConfig = (cli) => {
23
23
  .command('set', 'Updates config', (yargs) => yargs
24
24
  .option('rpcUrl', {
25
25
  alias: ['rpc-url', 'r'],
26
- description: 'Specifies target Prividium rpc url. These takes precedence over config file and env variable.',
26
+ description: 'Specifies target Prividium rpc url. These takes precedence over config file and env variable.',
27
27
  demandOption: true,
28
28
  type: 'string'
29
29
  })
30
30
  .option('userPanelUrl', {
31
31
  alias: ['user-panel-url', 'u'],
32
- description: 'Specifies url used to log in into the Prividium network. Takes precedence over config file and env variable',
32
+ description: 'Specifies url used to log in into the Prividium network. Takes precedence over config file and env variable',
33
33
  type: 'string',
34
34
  demandOption: true
35
35
  }), (args) => updateConfig({
@@ -35,13 +35,13 @@ export const addProxy = (cli) => {
35
35
  return cli.command('proxy', 'Starts authenticated rpc proxy server', (yargs) => yargs
36
36
  .option('rpcUrl', {
37
37
  alias: ['rpc-url', 'r'],
38
- description: 'Specifies target Prividium rpc url. These takes precedence over config file and env variable.',
38
+ description: 'Specifies target Prividium rpc url. These takes precedence over config file and env variable.',
39
39
  demandOption: false,
40
40
  type: 'string'
41
41
  })
42
42
  .option('userPanelUrl', {
43
43
  alias: ['user-panel-url', 'u'],
44
- description: 'Specifies url used to log in into the Prividium network. Takes precedence over config file and env variable',
44
+ description: 'Specifies url used to log in into the Prividium network. Takes precedence over config file and env variable',
45
45
  type: 'string'
46
46
  })
47
47
  .option('configPath', {
@@ -52,7 +52,7 @@ export const addProxy = (cli) => {
52
52
  })
53
53
  .option('port', {
54
54
  alias: ['p'],
55
- description: 'Port used for local proxy. This has to match with the port configured in your Prividium network.',
55
+ description: 'Port used for local proxy. This has to match with the port configured in your Prividium network.',
56
56
  default: 24101,
57
57
  type: 'number'
58
58
  })
@@ -49,7 +49,7 @@ export class ConfigFile {
49
49
  }
50
50
  print() {
51
51
  const { prividiumRpcUrl, userPanelUrl } = this.read();
52
- console.log(`${color.bold('Prividium rpc url')}: ${prividiumRpcUrl}`);
52
+ console.log(`${color.bold('Prividium rpc url')}: ${prividiumRpcUrl}`);
53
53
  console.log(`${color.bold('Log in url')}: ${userPanelUrl}`);
54
54
  }
55
55
  printPath() {
@@ -19,7 +19,7 @@ export class CreationWorkflow {
19
19
  start() {
20
20
  console.log(color.blue(HEADER));
21
21
  console.log('');
22
- intro('Starting prividium proxy');
22
+ intro('Starting Prividium™ proxy');
23
23
  }
24
24
  async gatherData(maybePrividiumRpcUrl, maybeUserPanelUrl) {
25
25
  const { url: prividiumRpcUrl, prompted: prompted1 } = await this.askForUrl(maybePrividiumRpcUrl, 'prividium rpc');
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>Prividium</title>
6
+ <title>Prividium™</title>
7
7
  <script src="https://cdn.tailwindcss.com"></script>
8
8
  </head>
9
9
  <body
@@ -16,7 +16,7 @@
16
16
  id="main-title"
17
17
  class="text-2xl md:text-3xl font-bold bg-gradient-to-r from-blue-700 to-blue-900 bg-clip-text text-transparent"
18
18
  >
19
- Finalizing Prividium sign-in...
19
+ Finalizing Prividium sign-in...
20
20
  </h1>
21
21
  <div class="mt-4">
22
22
  <svg
@@ -35,7 +35,7 @@
35
35
  </div>
36
36
  <div id="proxy-url" style="display: none" class="mt-6 text-blue-700 text-center">
37
37
  <img src="https://www.zksync.io/faq/faq-brackets.svg" alt="Success" class="h-12 w-auto mx-auto mb-3" />
38
- <span>You can now access your Prividium RPC proxy at: </span>
38
+ <span>You can now access your Prividium RPC proxy at: </span>
39
39
  <span class="font-bold">http://127.0.0.1:24101/rpc</span>
40
40
  </div>
41
41
  </div>
@@ -2,5 +2,5 @@ export { createPrividiumChain } from './prividium-chain.js';
2
2
  export type { PrividiumConfig, PrividiumChain, PopupOptions, Storage, TokenData, UserProfile, UserRole, AddNetworkParams } from './types.js';
3
3
  export { AUTH_ERRORS, STORAGE_KEYS } from './types.js';
4
4
  export { LocalStorage, TokenManager } from './storage.js';
5
- export { parseToken, isTokenExpired, generateRandomState } from './token-utils.js';
5
+ export { generateRandomState } from './token-utils.js';
6
6
  export { PopupAuth, handleAuthCallback, type AuthCallbackMessage, type OauthScope } from './popup-auth.js';
package/dist/sdk/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { createPrividiumChain } from './prividium-chain.js';
2
2
  export { AUTH_ERRORS, STORAGE_KEYS } from './types.js';
3
3
  export { LocalStorage, TokenManager } from './storage.js';
4
- export { parseToken, isTokenExpired, generateRandomState } from './token-utils.js';
4
+ export { generateRandomState } from './token-utils.js';
5
5
  export { PopupAuth, handleAuthCallback } from './popup-auth.js';
@@ -1,5 +1,5 @@
1
1
  import { http } from 'viem';
2
- import { chainConfig } from 'viem/zksync';
2
+ import { mainnet } from 'viem/chains';
3
3
  import { LocalStorage, TokenManager } from './storage.js';
4
4
  import { PopupAuth } from './popup-auth.js';
5
5
  export function createPrividiumChain(config) {
@@ -43,14 +43,15 @@ export function createPrividiumChain(config) {
43
43
  });
44
44
  return {
45
45
  chain: {
46
- ...chainConfig,
46
+ ...mainnet,
47
47
  ...config.chain,
48
+ id: config.chain.id,
48
49
  contracts: {
49
- ...chainConfig.contracts,
50
50
  ...config.chain.contracts,
51
- multicall3: undefined // Prividium doesn't support multicall yet
51
+ multicall3: undefined // Prividium doesn't support multicall yet
52
52
  },
53
- rpcUrls: { default: { http: [config.rpcUrl] } }
53
+ rpcUrls: { default: { http: [config.rpcUrl] } },
54
+ blockExplorers: config.chain.blockExplorers
54
55
  },
55
56
  transport,
56
57
  async authorize(options) {
@@ -1,5 +1,4 @@
1
1
  import { STORAGE_KEYS } from './types.js';
2
- import { parseToken, isTokenExpired } from './token-utils.js';
3
2
  export class LocalStorage {
4
3
  getItem(key) {
5
4
  if (typeof localStorage === 'undefined') {
@@ -33,26 +32,22 @@ export class TokenManager {
33
32
  return `${STORAGE_KEYS.STATE_PREFIX}${this.chainId}`;
34
33
  }
35
34
  getToken() {
36
- if (this.tokenCache && !isTokenExpired(this.tokenCache)) {
35
+ if (this.tokenCache) {
37
36
  return this.tokenCache;
38
37
  }
39
38
  const rawToken = this.storage.getItem(this.tokenKey);
40
39
  if (!rawToken) {
41
- this.tokenCache = null;
42
- return null;
43
- }
44
- try {
45
- this.tokenCache = parseToken(rawToken);
46
- return this.tokenCache;
47
- }
48
- catch {
49
- this.clearToken();
50
40
  return null;
51
41
  }
42
+ const tokenData = {
43
+ rawToken
44
+ };
45
+ this.tokenCache = tokenData;
46
+ return tokenData;
52
47
  }
53
48
  setToken(rawToken) {
54
49
  try {
55
- const tokenData = parseToken(rawToken);
50
+ const tokenData = { rawToken };
56
51
  this.storage.setItem(this.tokenKey, rawToken);
57
52
  this.tokenCache = tokenData;
58
53
  return tokenData;
@@ -63,12 +58,12 @@ export class TokenManager {
63
58
  }
64
59
  }
65
60
  clearToken() {
66
- this.storage.removeItem(this.tokenKey);
67
61
  this.tokenCache = null;
62
+ this.storage.removeItem(this.tokenKey);
68
63
  }
69
64
  isAuthorized() {
70
65
  const token = this.getToken();
71
- return token !== null && !isTokenExpired(token);
66
+ return token !== null;
72
67
  }
73
68
  setState(state) {
74
69
  this.storage.setItem(this.stateKey, state);
@@ -1,4 +1 @@
1
- import { type TokenData } from './types.js';
2
- export declare function parseToken(rawToken: string): TokenData;
3
- export declare function isTokenExpired(tokenData: TokenData): boolean;
4
1
  export declare function generateRandomState(): string;
@@ -1,53 +1,3 @@
1
- import { z } from 'zod';
2
- import { AUTH_ERRORS } from './types.js';
3
- const tokenSchema = z.object({
4
- exp: z.coerce.number().int(),
5
- sub: z.string().min(1),
6
- preferred_username: z.string().optional()
7
- });
8
- function base64UrlDecode(str) {
9
- const base64Encoded = str.replace(/-/g, '+').replace(/_/g, '/');
10
- const padding = str.length % 4 === 0 ? '' : '='.repeat(4 - (str.length % 4));
11
- const base64WithPadding = base64Encoded + padding;
12
- return atob(base64WithPadding)
13
- .split('')
14
- .map((char) => String.fromCharCode(char.charCodeAt(0)))
15
- .join('');
16
- }
17
- export function parseToken(rawToken) {
18
- const parts = rawToken.split('.');
19
- if (parts.length < 3) {
20
- throw new Error(AUTH_ERRORS.INVALID_JWT);
21
- }
22
- let parsed;
23
- try {
24
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
25
- parsed = JSON.parse(base64UrlDecode(parts[1]));
26
- }
27
- catch (e) {
28
- if (!(e instanceof SyntaxError)) {
29
- console.error(e);
30
- }
31
- throw new Error(AUTH_ERRORS.INVALID_JWT);
32
- }
33
- const validated = tokenSchema.safeParse(parsed);
34
- if (!validated.success) {
35
- throw new Error(`Invalid JWT body format: ${validated.error.message}`);
36
- }
37
- const expirationDate = new Date(validated.data.exp * 1000);
38
- if (expirationDate <= new Date()) {
39
- throw new Error(AUTH_ERRORS.EXPIRED_TOKEN);
40
- }
41
- return {
42
- rawToken,
43
- expirationDate,
44
- sub: validated.data.sub,
45
- preferred_username: validated.data.preferred_username
46
- };
47
- }
48
- export function isTokenExpired(tokenData) {
49
- return tokenData.expirationDate <= new Date();
50
- }
51
1
  export function generateRandomState() {
52
2
  const array = new Uint8Array(32);
53
3
  crypto.getRandomValues(array);
@@ -62,9 +62,6 @@ export interface PrividiumChain {
62
62
  }
63
63
  export interface TokenData {
64
64
  rawToken: string;
65
- expirationDate: Date;
66
- sub: string;
67
- preferred_username?: string;
68
65
  }
69
66
  export interface PopupOptions {
70
67
  popupSize?: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prividium",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "bin": {
5
5
  "prividium": "./bin/cli.js"
6
6
  },