epistery 1.0.4 → 1.0.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.
Files changed (31) hide show
  1. package/README.md +40 -20
  2. package/dist/api.d.ts +2 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +130 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/controllers/baseController.d.ts +8 -0
  7. package/dist/controllers/baseController.d.ts.map +1 -0
  8. package/dist/controllers/baseController.js +25 -0
  9. package/dist/controllers/baseController.js.map +1 -0
  10. package/dist/controllers/create/CreateController.d.ts +6 -0
  11. package/dist/controllers/create/CreateController.d.ts.map +1 -0
  12. package/dist/controllers/create/CreateController.js +17 -0
  13. package/dist/controllers/create/CreateController.js.map +1 -0
  14. package/dist/controllers/ssl/SSLController.d.ts +17 -0
  15. package/dist/controllers/ssl/SSLController.d.ts.map +1 -0
  16. package/dist/controllers/ssl/SSLController.js +129 -0
  17. package/dist/controllers/ssl/SSLController.js.map +1 -0
  18. package/dist/controllers/status/StatusController.d.ts +6 -0
  19. package/dist/controllers/status/StatusController.d.ts.map +1 -0
  20. package/dist/controllers/status/StatusController.js +29 -0
  21. package/dist/controllers/status/StatusController.js.map +1 -0
  22. package/dist/controllers/write/WriteController.d.ts +7 -0
  23. package/dist/controllers/write/WriteController.d.ts.map +1 -0
  24. package/dist/controllers/write/WriteController.js +50 -0
  25. package/dist/controllers/write/WriteController.js.map +1 -0
  26. package/dist/epistery.js +1 -1
  27. package/dist/epistery.js.map +1 -1
  28. package/docs/EpisteryModuleConfig.md +1 -1
  29. package/index.mjs +3 -3
  30. package/package.json +1 -1
  31. package/src/epistery.ts +1 -1
package/README.md CHANGED
@@ -6,13 +6,17 @@ _Epistemology is the study of knowledge. An Epistery, it follows, is a place to
6
6
 
7
7
  ## What Does Epistery Do?
8
8
 
9
- Epistery adds blockchain-backed identity and data wallet capabilities to any Express.js application through a simple plugin architecture. It provides:
9
+ Epistery establishes a transactional wallet for both browser and server along with the session handshake. This provides:
10
10
 
11
- - **Decentralized Authentication**: Wallet-based user authentication with automatic key exchange
12
- - **Data Wallets**: Blockchain-anchored data ownership and provenance tracking
11
+ - **Decentralized Authentication**: Wallet-based user authentication using cryptographic signatures
12
+ - **Data Wallets**: Blockchain smart contracts for data ownership, encryption, sharing, and transfer
13
13
  - **Whitelist Management**: On-chain access control for domains and users
14
- - **CLI Tools**: Command-line interface for authenticated API requests
14
+ - **CLI Tools**: Command-line interface for authenticated API requests using bot mode
15
15
  - **Client Libraries**: Browser-based wallet and authentication tools
16
+ - **Configuration Management**: Path-based filesystem-like API for secure configuration storage
17
+
18
+ >*NOTE:* The client wallet (signing key) is held in localStorage under strict domain rules unless the user presents
19
+ > a selected wallet from a web3 plugin
16
20
 
17
21
  ## Quick Start
18
22
 
@@ -100,7 +104,7 @@ app.get('/profile', (req, res) => {
100
104
 
101
105
  ### 2. Data Wallets
102
106
 
103
- Data wallets attach blockchain-based ownership and provenance to any data:
107
+ Data wallets are blockchain smart contracts that provide ownership, encryption, sharing, and transfer capabilities for any data. They combine on-chain ownership records with off-chain storage:
104
108
 
105
109
  ```javascript
106
110
  // Client creates data wallet
@@ -113,11 +117,17 @@ const dataWallet = await client.write({
113
117
  // Read data wallet
114
118
  const data = await client.read();
115
119
 
116
- // Transfer ownership
120
+ // Transfer ownership to another address
117
121
  await client.transferOwnership(newOwnerAddress);
118
122
  ```
119
123
 
120
- Data wallets use IPFS for storage by default, with only hashes and ownership records stored on-chain.
124
+ **Data Wallet Features:**
125
+ - **Blockchain Contracts**: Each data wallet is a smart contract on-chain
126
+ - **Encryption**: Data can be encrypted before storage
127
+ - **Sharing**: Grant read/write access to specific addresses
128
+ - **Transferable**: Ownership can be transferred to other wallets
129
+ - **IPFS Storage**: Content stored on IPFS by default, with hashes on-chain
130
+ - **Provenance Tracking**: Full ownership and modification history on-chain
121
131
 
122
132
  ### 3. Whitelist Management
123
133
 
@@ -135,7 +145,7 @@ Whitelist data is stored on the blockchain and managed through your domain's wal
135
145
 
136
146
  ### 4. CLI Tools
137
147
 
138
- The Epistery CLI enables authenticated API requests from the command line or automation scripts:
148
+ The Epistery CLI enables authenticated API requests from the command line using bot authentication (stateless, signs each request):
139
149
 
140
150
  ```bash
141
151
  # Initialize a CLI wallet
@@ -145,11 +155,14 @@ epistery set-default localhost
145
155
  # Make authenticated GET request
146
156
  epistery curl https://api.example.com/data
147
157
 
148
- # POST request with data
149
- epistery curl -X POST -d '{"title":"Test"}' https://api.example.com/wiki/Test
158
+ # PUT request with JSON data (note single quotes)
159
+ epistery curl -X PUT -d '{"title":"Test","body":"Content"}' https://api.example.com/wiki/Test
150
160
 
151
161
  # Use specific wallet
152
162
  epistery curl -w production.example.com https://api.example.com/data
163
+
164
+ # Verbose output for debugging
165
+ epistery curl -v https://api.example.com/data
153
166
  ```
154
167
 
155
168
  Perfect for:
@@ -158,20 +171,21 @@ Perfect for:
158
171
  - Creating bots and agents
159
172
  - CI/CD integration
160
173
 
174
+ **CLI uses bot authentication** - each request is independently signed with the wallet's private key, no session management required.
175
+
161
176
  See [CLI.md](CLI.md) for complete CLI documentation.
162
177
 
163
178
  ## Configuration
164
179
 
165
- Epistery uses a filesystem-based configuration system stored in `~/.epistery/`:
180
+ Epistery uses a path-based configuration system stored in `~/.epistery/` with a filesystem-like API:
166
181
 
167
182
  ```
168
183
  ~/.epistery/
169
- ├── config.ini # Global settings
184
+ ├── config.ini # Root config (profile, IPFS, defaults)
170
185
  ├── mydomain.com/
171
- ├── config.ini # Domain wallet & provider
172
- │ └── sessions/ # Session data
186
+ └── config.ini # Domain config (wallet, provider)
173
187
  └── .ssl/
174
- └── mydomain.com/ # SSL certificates
188
+ └── mydomain.com/ # SSL certificates (optional)
175
189
  ```
176
190
 
177
191
  ### Root Config (`~/.epistery/config.ini`)
@@ -188,6 +202,9 @@ url=https://rootz.digital/api/v0
188
202
  chainId=420420422
189
203
  name=polkadot-hub-testnet
190
204
  rpc=https://testnet-passet-hub-eth-rpc.polkadot.io
205
+
206
+ [cli]
207
+ default_domain=localhost
191
208
  ```
192
209
 
193
210
  ### Domain Config (`~/.epistery/mydomain.com/config.ini`)
@@ -208,6 +225,8 @@ name=polkadot-hub-testnet
208
225
  rpc=https://testnet-passet-hub-eth-rpc.polkadot.io
209
226
  ```
210
227
 
228
+ The Config class provides a path-based API that works like navigating a filesystem - set a path, load data, modify it, and save. This makes configuration management simple and predictable across all Epistery applications.
229
+
211
230
  ## Advanced Usage
212
231
 
213
232
  ### Custom Authentication
@@ -294,11 +313,12 @@ See [Architecture.md](Architecture.md) for detailed architecture documentation.
294
313
 
295
314
  ## Security
296
315
 
297
- - Domain configs stored with 0600 permissions (user-only access)
298
- - Private keys never transmitted (only signatures)
299
- - Each domain has isolated wallet
300
- - Session cookies saved securely per domain
301
- - Key exchange uses ECDH for secure shared secrets
316
+ - **Private Key Protection**: Domain configs stored with 0600 permissions (user-only access)
317
+ - **Signature-Only Transmission**: Private keys never transmitted, only cryptographic signatures
318
+ - **Wallet Isolation**: Each domain has its own isolated wallet
319
+ - **Bot Authentication**: Stateless authentication with per-request signing and timestamp-based replay protection
320
+ - **Encrypted Key Exchange**: Browser clients use ECDH for secure shared secret establishment
321
+ - **On-Chain Verification**: Whitelist and ownership data stored immutably on blockchain
302
322
 
303
323
  ## License
304
324
 
package/dist/api.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":""}
package/dist/api.js ADDED
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const dotenv = __importStar(require("dotenv"));
40
+ const express_1 = __importDefault(require("express"));
41
+ const cookie_parser_1 = __importDefault(require("cookie-parser"));
42
+ const path_1 = __importDefault(require("path"));
43
+ const fs_1 = __importDefault(require("fs"));
44
+ const index_js_1 = require("./utils/index.js");
45
+ const CreateController_js_1 = require("./controllers/create/CreateController.js");
46
+ const StatusController_js_1 = require("./controllers/status/StatusController.js");
47
+ const WriteController_js_1 = require("./controllers/write/WriteController.js");
48
+ const epistery_1 = require("epistery");
49
+ dotenv.config();
50
+ epistery_1.Epistery.initialize();
51
+ const app = (0, express_1.default)();
52
+ const PORT = process.env.PORT || 3000;
53
+ app.use(express_1.default.json());
54
+ app.use((0, cookie_parser_1.default)());
55
+ // attach to the active domain. The domain is declared by context not by the environment
56
+ app.use(async (req, res, next) => {
57
+ if (req.app.locals.episteryConfig?.domain?.name !== req.hostname) {
58
+ req.app.locals.episteryConfig = index_js_1.Utils.GetConfig();
59
+ index_js_1.Utils.InitServerWallet(req.hostname);
60
+ await app.locals.episteryConfig.loadDomain(req.hostname);
61
+ }
62
+ next();
63
+ });
64
+ const createController = new CreateController_js_1.CreateController();
65
+ const statusController = new StatusController_js_1.StatusController();
66
+ const writeController = new WriteController_js_1.WriteController();
67
+ // Client library routes
68
+ const library = {
69
+ "client.js": "client/client.js",
70
+ "witness.js": "client/witness.js",
71
+ "ethers.js": "client/ethers.js",
72
+ "ethers.min.js": "client/ethers.min.js"
73
+ };
74
+ // Serve client library files
75
+ app.get('/.epistery/lib/:module', (req, res) => {
76
+ const modulePath = library[req.params.module];
77
+ if (!modulePath)
78
+ return res.status(404).send('Library not found');
79
+ const fullPath = path_1.default.resolve(modulePath);
80
+ if (!fs_1.default.existsSync(fullPath))
81
+ return res.status(404).send('File not found');
82
+ const ext = fullPath.slice(fullPath.lastIndexOf('.') + 1);
83
+ const contentTypes = {
84
+ 'js': 'text/javascript',
85
+ 'mjs': 'text/javascript',
86
+ 'css': 'text/css',
87
+ 'html': 'text/html',
88
+ 'json': 'application/json'
89
+ };
90
+ if (contentTypes[ext]) {
91
+ res.set('Content-Type', contentTypes[ext]);
92
+ }
93
+ res.sendFile(fullPath);
94
+ });
95
+ // HTML status page
96
+ app.get('/.epistery/status.html', (req, res) => {
97
+ const config = index_js_1.Utils.GetConfig();
98
+ const domain = config.activeDomain.domain;
99
+ const serverDomain = index_js_1.Utils.GetDomainInfo(domain);
100
+ if (!serverDomain.wallet) {
101
+ return res.status(500).send('Server wallet not found');
102
+ }
103
+ const status = epistery_1.Epistery.getStatus({}, serverDomain);
104
+ const templatePath = path_1.default.resolve('client/status.html');
105
+ if (!fs_1.default.existsSync(templatePath)) {
106
+ return res.status(404).send('Status template not found');
107
+ }
108
+ let template = fs_1.default.readFileSync(templatePath, 'utf8');
109
+ // Simple template replacement
110
+ template = template.replace(/\{\{server\.domain\}\}/g, domain);
111
+ template = template.replace(/\{\{server\.walletAddress\}\}/g, status.server.walletAddress || '');
112
+ template = template.replace(/\{\{server\.provider\}\}/g, status.server.provider || '');
113
+ template = template.replace(/\{\{server\.chainId\}\}/g, status.server.chainId?.toString() || '');
114
+ template = template.replace(/\{\{timestamp\}\}/g, status.timestamp);
115
+ res.send(template);
116
+ });
117
+ // API routes
118
+ app.get('/.epistery/status', statusController.index.bind(statusController));
119
+ app.get('/.epistery/create', createController.index.bind(createController));
120
+ app.post('/.epistery/data/write', writeController.index.bind(writeController));
121
+ app.listen(PORT, () => {
122
+ console.log(`Server is running on http://localhost:${PORT}`);
123
+ console.log('Available routes:');
124
+ console.log(' GET /.epistery/status');
125
+ console.log(' GET /.epistery/status.html');
126
+ console.log(' GET /.epistery/create');
127
+ console.log(' GET /.epistery/lib/:module');
128
+ console.log(' POST /.epistery/data/write');
129
+ });
130
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Response, Request } from 'express';
2
+ export declare abstract class Controller {
3
+ protected sendResponse(res: Response, data: any, statusCode?: number): void;
4
+ protected setCookie(res: Response, name: string, data: any): void;
5
+ protected getCookie(req: Request, name: string): any;
6
+ protected sendError(res: Response, message: string, statusCode?: number): void;
7
+ }
8
+ //# sourceMappingURL=baseController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseController.d.ts","sourceRoot":"","sources":["../../src/controllers/baseController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC5C,8BAAsB,UAAU;IAC9B,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,GAAE,MAAY;IAIzE,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;IAI1D,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG;IAOpD,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAY;CAM7E"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Controller = void 0;
4
+ class Controller {
5
+ sendResponse(res, data, statusCode = 200) {
6
+ res.status(statusCode).json(data);
7
+ }
8
+ setCookie(res, name, data) {
9
+ res.cookie(name, JSON.stringify(data));
10
+ }
11
+ getCookie(req, name) {
12
+ try {
13
+ return req.cookies[name];
14
+ }
15
+ catch (e) { }
16
+ }
17
+ sendError(res, message, statusCode = 500) {
18
+ res.status(statusCode).json({
19
+ error: message,
20
+ timestamp: new Date().toISOString()
21
+ });
22
+ }
23
+ }
24
+ exports.Controller = Controller;
25
+ //# sourceMappingURL=baseController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseController.js","sourceRoot":"","sources":["../../src/controllers/baseController.ts"],"names":[],"mappings":";;;AACA,MAAsB,UAAU;IACpB,YAAY,CAAC,GAAa,EAAE,IAAS,EAAE,aAAqB,GAAG;QACvE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAES,SAAS,CAAC,GAAa,EAAE,IAAY,EAAE,IAAS;QACxD,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IAES,SAAS,CAAC,GAAY,EAAE,IAAY;QAC5C,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,OAAM,CAAC,EAAE,CAAC,CAAA,CAAC;IACb,CAAC;IAES,SAAS,CAAC,GAAa,EAAE,OAAe,EAAE,aAAqB,GAAG;QAC1E,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC;YAC1B,KAAK,EAAE,OAAO;YACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;CACF;AAtBD,gCAsBC"}
@@ -0,0 +1,6 @@
1
+ import { Request, Response } from 'express';
2
+ import { Controller } from '../baseController';
3
+ export declare class CreateController extends Controller {
4
+ index(req: Request, res: Response): void;
5
+ }
6
+ //# sourceMappingURL=CreateController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateController.d.ts","sourceRoot":"","sources":["../../../src/controllers/create/CreateController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI/C,qBAAa,gBAAiB,SAAQ,UAAU;IACvC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;CASzC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreateController = void 0;
4
+ const baseController_1 = require("../baseController");
5
+ const epistery_1 = require("epistery");
6
+ class CreateController extends baseController_1.Controller {
7
+ index(req, res) {
8
+ const walletInfo = epistery_1.Epistery.createWallet();
9
+ const clientCookie = {
10
+ wallet: walletInfo
11
+ };
12
+ this.setCookie(res, 'epistery-client', clientCookie);
13
+ this.sendResponse(res, clientCookie);
14
+ }
15
+ }
16
+ exports.CreateController = CreateController;
17
+ //# sourceMappingURL=CreateController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateController.js","sourceRoot":"","sources":["../../../src/controllers/create/CreateController.ts"],"names":[],"mappings":";;;AACA,sDAA+C;AAC/C,uCAAoC;AAGpC,MAAa,gBAAiB,SAAQ,2BAAU;IACvC,KAAK,CAAC,GAAY,EAAE,GAAa;QACtC,MAAM,UAAU,GAAoB,mBAAQ,CAAC,YAAY,EAAE,CAAC;QAC5D,MAAM,YAAY,GAAG;YACnB,MAAM,EAAE,UAAU;SACnB,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC;QACrD,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACvC,CAAC;CACF;AAVD,4CAUC"}
@@ -0,0 +1,17 @@
1
+ import { Request, Response } from 'express';
2
+ import { Controller } from '../baseController';
3
+ import tls from 'tls';
4
+ export declare class SSLController extends Controller {
5
+ private pending;
6
+ private challenges;
7
+ private acme?;
8
+ private epistery;
9
+ constructor();
10
+ index(req: Request, res: Response): void;
11
+ initialize(): Promise<void>;
12
+ static get SNI(): {
13
+ SNICallback: (hostname: string, cb: (err: Error | null, ctx?: tls.SecureContext) => void) => void;
14
+ };
15
+ getCert(servername: string, attempt?: number): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=SSLController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SSLController.d.ts","sourceRoot":"","sources":["../../../src/controllers/ssl/SSLController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,GAAG,MAAM,KAAK,CAAC;AActB,qBAAa,aAAc,SAAQ,UAAU;IACzC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAc;IAC3B,OAAO,CAAC,QAAQ,CAAY;;IAOrB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI;IAUzC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC,MAAM,KAAK,GAAG,IAAI;QAAE,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,aAAa,KAAK,IAAI,KAAK,IAAI,CAAA;KAAE,CAWtH;IACK,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CA6CxE"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.SSLController = void 0;
40
+ const baseController_1 = require("../baseController");
41
+ const tls_1 = __importDefault(require("tls"));
42
+ const acme = __importStar(require("acme-client"));
43
+ const index_js_1 = require("../../utils/index.js");
44
+ class SSLController extends baseController_1.Controller {
45
+ constructor() {
46
+ super();
47
+ this.pending = {};
48
+ this.challenges = {};
49
+ }
50
+ index(req, res) {
51
+ const token = req.params.token;
52
+ if (token in this.challenges) {
53
+ res.writeHead(200);
54
+ res.end(this.challenges[token]);
55
+ return;
56
+ }
57
+ res.writeHead(302, { Location: `https://${req.headers.host}${req.url}` });
58
+ res.end();
59
+ }
60
+ async initialize() {
61
+ if (!this.acme) {
62
+ this.acme = new acme.Client({
63
+ directoryUrl: acme.directory.letsencrypt[process.env.PROFILE === 'DEV' ? 'staging' : 'production'],
64
+ accountKey: await acme.crypto.createPrivateKey(),
65
+ });
66
+ }
67
+ }
68
+ static get SNI() {
69
+ return {
70
+ SNICallback: async (hostname, cb) => {
71
+ const domain = index_js_1.Utils.GetDomainInfo(hostname);
72
+ if (domain.ssl) {
73
+ cb(null, tls_1.default.createSecureContext({ key: domain.ssl.key, cert: domain.ssl.cert }));
74
+ }
75
+ else {
76
+ cb(new Error(`${hostname} is unknown`));
77
+ }
78
+ }
79
+ };
80
+ }
81
+ async getCert(servername, attempt = 0) {
82
+ const domain = index_js_1.Utils.GetDomainInfo(servername);
83
+ if (domain.ssl) {
84
+ return;
85
+ }
86
+ if (servername in this.pending) {
87
+ if (attempt >= 10) {
88
+ throw new Error(`Gave up waiting on certificate for ${servername}`);
89
+ }
90
+ await new Promise((resolve) => {
91
+ setTimeout(resolve, 1000);
92
+ });
93
+ await this.getCert(servername, (attempt + 1));
94
+ return;
95
+ }
96
+ this.pending[servername] = true;
97
+ const config = index_js_1.Utils.GetConfig();
98
+ await this.initialize();
99
+ //TODO: We need to restore the concept of profile in .epistery/config.ini
100
+ if (!config.data.profile?.email)
101
+ throw new Error(`cannot request certificate without "email" set in epistery/config.ini`);
102
+ // create CSR
103
+ const [key, csr] = await acme.crypto.createCsr({
104
+ altNames: [servername],
105
+ });
106
+ // order certificate
107
+ if (!this.acme) {
108
+ throw new Error('ACME client not initialized');
109
+ }
110
+ const cert = await this.acme.auto({
111
+ csr,
112
+ email: config.data.profile?.email,
113
+ termsOfServiceAgreed: true,
114
+ challengePriority: ['http-01'],
115
+ challengeCreateFn: async (authz, challenge, keyAuthorization) => {
116
+ this.challenges[challenge.token] = keyAuthorization;
117
+ },
118
+ challengeRemoveFn: async (authz, challenge) => {
119
+ delete this.challenges[challenge.token];
120
+ },
121
+ });
122
+ // save certificate
123
+ domain.ssl = { cert: cert, key: key, modified: new Date() };
124
+ config.saveDomain(servername, domain);
125
+ delete this.pending[servername];
126
+ }
127
+ }
128
+ exports.SSLController = SSLController;
129
+ //# sourceMappingURL=SSLController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SSLController.js","sourceRoot":"","sources":["../../../src/controllers/ssl/SSLController.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,sDAA+C;AAC/C,8CAAsB;AACtB,kDAAoC;AAEpC,mDAA6C;AAW7C,MAAa,aAAc,SAAQ,2BAAU;IAMzC;QACI,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;IACzB,CAAC;IACM,KAAK,CAAC,GAAY,EAAE,GAAa;QACpC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;QAC/B,IAAI,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;YAChC,OAAO;QACX,CAAC;QACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAC,QAAQ,EAAE,WAAW,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,EAAC,CAAC,CAAC;QACxE,GAAG,CAAC,GAAG,EAAE,CAAC;IACd,CAAC;IACD,KAAK,CAAC,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;gBACxB,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;gBAClG,UAAU,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;aACnD,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAG;QACV,OAAO;YACH,WAAW,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAwD,EAAE,EAAE;gBAC9F,MAAM,MAAM,GAAG,gBAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC7C,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;oBACb,EAAE,CAAC,IAAI,EAAE,aAAG,CAAC,mBAAmB,CAAC,EAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAC,CAAC,CAAC,CAAC;gBACpF,CAAC;qBAAM,CAAC;oBACJ,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,QAAQ,aAAa,CAAC,CAAC,CAAC;gBAC5C,CAAC;YACL,CAAC;SACJ,CAAA;IACL,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,UAAkB,CAAC;QACjD,MAAM,MAAM,GAAG,gBAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,OAAO;QACX,CAAC;QACD,IAAI,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,sCAAsC,UAAU,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC1B,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO;QACX,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QAChC,MAAM,MAAM,GAAG,gBAAK,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,yEAAyE;QACzE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAC1H,aAAa;QACb,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YAC3C,QAAQ,EAAE,CAAC,UAAU,CAAC;SACzB,CAAC,CAAC;QACH,oBAAoB;QACpB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAK,CAAC,IAAI,CAAC;YAC/B,GAAG;YACH,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK;YACjC,oBAAoB,EAAE,IAAI;YAC1B,iBAAiB,EAAE,CAAC,SAAS,CAAC;YAC9B,iBAAiB,EAAE,KAAK,EAAE,KAAU,EAAE,SAAc,EAAE,gBAAwB,EAAE,EAAE;gBAC9E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC;YACxD,CAAC;YACD,iBAAiB,EAAE,KAAK,EAAE,KAAU,EAAE,SAAc,EAAE,EAAE;gBACpD,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC5C,CAAC;SACJ,CAAC,CAAC;QACH,mBAAmB;QACnB,MAAM,CAAC,GAAG,GAAG,EAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAC,CAAC;QAC1D,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;CACJ;AAtFD,sCAsFC"}
@@ -0,0 +1,6 @@
1
+ import { Request, Response } from 'express';
2
+ import { Controller } from '../baseController.js';
3
+ export declare class StatusController extends Controller {
4
+ index(req: Request, res: Response): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=StatusController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusController.d.ts","sourceRoot":"","sources":["../../../src/controllers/status/StatusController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD,qBAAa,gBAAiB,SAAQ,UAAU;IACjC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;CAoB/C"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StatusController = void 0;
4
+ const baseController_js_1 = require("../baseController.js");
5
+ const index_js_1 = require("../../utils/index.js");
6
+ const epistery_1 = require("epistery");
7
+ class StatusController extends baseController_js_1.Controller {
8
+ async index(req, res) {
9
+ const config = index_js_1.Utils.GetConfig();
10
+ const domain = config.activeDomain.domain;
11
+ const rawClientCookie = this.getCookie(req, 'epistery-client');
12
+ const clientCookie = rawClientCookie ? JSON.parse(rawClientCookie) : null;
13
+ const clientWallet = {
14
+ address: clientCookie?.wallet?.address,
15
+ mnemonic: clientCookie?.wallet?.mnemonic,
16
+ publicKey: clientCookie?.wallet?.publicKey,
17
+ privateKey: clientCookie?.wallet?.privateKey,
18
+ };
19
+ const serverDomain = index_js_1.Utils.GetDomainInfo(domain);
20
+ if (!serverDomain.wallet) {
21
+ this.sendError(res, "Unable to load server wallet.", 400);
22
+ return;
23
+ }
24
+ const status = epistery_1.Epistery.getStatus(clientWallet, serverDomain);
25
+ this.sendResponse(res, status);
26
+ }
27
+ }
28
+ exports.StatusController = StatusController;
29
+ //# sourceMappingURL=StatusController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusController.js","sourceRoot":"","sources":["../../../src/controllers/status/StatusController.ts"],"names":[],"mappings":";;;AACA,4DAAkD;AAClD,mDAAqF;AACrF,uCAAoC;AAEpC,MAAa,gBAAiB,SAAQ,8BAAU;IACvC,KAAK,CAAC,KAAK,CAAC,GAAY,EAAE,GAAa;QAC5C,MAAM,MAAM,GAAU,gBAAK,CAAC,SAAS,EAAE,CAAC;QACxC,MAAM,MAAM,GAAW,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;QAClD,MAAM,eAAe,GAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACnE,MAAM,YAAY,GAAO,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,MAAM,YAAY,GAAoB;YACpC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO;YACtC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ;YACxC,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS;YAC1C,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU;SAC7C,CAAA;QACD,MAAM,YAAY,GAAgB,gBAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,+BAA+B,EAAE,GAAG,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,mBAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAC9D,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;CACF;AArBD,4CAqBC"}
@@ -0,0 +1,7 @@
1
+ import { Request, Response } from 'express';
2
+ import { Controller } from '../baseController.js';
3
+ export declare class WriteController extends Controller {
4
+ constructor();
5
+ index(req: Request, res: Response): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=WriteController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WriteController.d.ts","sourceRoot":"","sources":["../../../src/controllers/write/WriteController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAOlD,qBAAa,eAAgB,SAAQ,UAAU;;IAKhC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;CA0C/C"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WriteController = void 0;
4
+ const baseController_js_1 = require("../baseController.js");
5
+ const ethers_1 = require("ethers");
6
+ const epistery_1 = require("epistery");
7
+ class WriteController extends baseController_js_1.Controller {
8
+ constructor() {
9
+ super();
10
+ }
11
+ async index(req, res) {
12
+ try {
13
+ const data = req.body;
14
+ if (!data || Object.keys(data).length === 0) {
15
+ return this.sendError(res, 'Request body is empty. Please provide data to sign and store.', 400);
16
+ }
17
+ // Use either user-given wallet or a generated data-wallet
18
+ let clientWallet;
19
+ let clientWalletInfo;
20
+ if (data.wallet && data.wallet.privateKey) {
21
+ clientWalletInfo = data.wallet;
22
+ clientWallet = new ethers_1.ethers.Wallet(clientWalletInfo.privateKey);
23
+ console.log('Using provided wallet:', clientWallet.address);
24
+ }
25
+ else {
26
+ clientWallet = ethers_1.ethers.Wallet.createRandom();
27
+ clientWalletInfo = {
28
+ address: clientWallet.address,
29
+ mnemonic: clientWallet.mnemonic?.phrase || '',
30
+ publicKey: clientWallet.publicKey,
31
+ privateKey: clientWallet.privateKey,
32
+ };
33
+ console.log('Generated new wallet:', clientWallet.address);
34
+ }
35
+ const episteryResponse = await epistery_1.Epistery.write(clientWalletInfo, data);
36
+ if (!episteryResponse)
37
+ this.sendError(res, `Unable to create IPFS hash. Result: ${JSON.stringify(episteryResponse)}`, 500);
38
+ this.sendResponse(res, episteryResponse);
39
+ }
40
+ catch (error) {
41
+ console.error('Error in WriteController:', error);
42
+ if (error.message?.includes('ECONNREFUSED')) {
43
+ return this.sendError(res, 'IPFS node not running. Please start IPFS daemon.', 503);
44
+ }
45
+ this.sendError(res, `Failed to process and store data: ${error.message}`, 500);
46
+ }
47
+ }
48
+ }
49
+ exports.WriteController = WriteController;
50
+ //# sourceMappingURL=WriteController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WriteController.js","sourceRoot":"","sources":["../../../src/controllers/write/WriteController.ts"],"names":[],"mappings":";;;AACA,4DAAkD;AAClD,mCAAgC;AAIhC,uCAAoC;AAEpC,MAAa,eAAgB,SAAQ,8BAAU;IAC7C;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,GAAY,EAAE,GAAa;QAC5C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACtB,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,+DAA+D,EAAE,GAAG,CAAC,CAAC;YACnG,CAAC;YAED,2DAA2D;YAC3D,IAAI,YAA2B,CAAC;YAChC,IAAI,gBAAiC,CAAC;YAEtC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC1C,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC/B,YAAY,GAAG,IAAI,eAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBAC9D,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;YAC9D,CAAC;iBACI,CAAC;gBACJ,YAAY,GAAG,eAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;gBAC5C,gBAAgB,GAAG;oBACjB,OAAO,EAAE,YAAY,CAAC,OAAO;oBAC7B,QAAQ,EAAG,YAA8B,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE;oBAChE,SAAS,EAAE,YAAY,CAAC,SAAS;oBACjC,UAAU,EAAE,YAAY,CAAC,UAAU;iBACpC,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,gBAAgB,GAAwB,MAAM,mBAAQ,CAAC,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAC3F,IAAI,CAAC,gBAAgB;gBACnB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,uCAAuC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAEtG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,KAAU,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC5C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,kDAAkD,EAAE,GAAG,CAAC,CAAC;YACtF,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,qCAAqC,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;CACF;AA/CD,0CA+CC"}
package/dist/epistery.js CHANGED
@@ -33,7 +33,7 @@ class Epistery {
33
33
  nativeCurrency = {
34
34
  symbol: server.provider.nativeCurrencySymbol,
35
35
  name: server.provider.nativeCurrencyName || server.provider.nativeCurrencySymbol,
36
- decimals: server.provider.nativeCurrencyDecimals || 18
36
+ decimals: Number(server.provider.nativeCurrencyDecimals) || 18
37
37
  };
38
38
  }
39
39
  const status = {
@@ -1 +1 @@
1
- {"version":3,"file":"epistery.js","sourceRoot":"","sources":["../src/epistery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"epistery.js","sourceRoot":"","sources":["../src/epistery.ts"],"names":[],"mappings":"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"}
@@ -184,7 +184,7 @@ admin_address=0x00bf1d35fa5b3cca18e3900b9e0d46f35d2d5a5d
184
184
  [provider]
185
185
  name=Ethereum Mainnet
186
186
  chainId=1
187
- rpcUrl=https://eth.llamarpc.com
187
+ rpc=https://eth.llamarpc.com
188
188
 
189
189
  [wallet]
190
190
  address=0x...
package/index.mjs CHANGED
@@ -312,8 +312,8 @@ class EpisteryAttach {
312
312
  console.log(`[debug] Provider payload:`, JSON.stringify(provider, null, 2));
313
313
  console.log(`[debug] Full request body:`, JSON.stringify(req.body, null, 2));
314
314
 
315
- if (!provider || !provider.name || !provider.chainId || !provider.rpcUrl) {
316
- console.log(`[debug] Validation failed: provider=${!!provider}, name=${!!provider?.name}, chainId=${!!provider?.chainId}, rpcUrl=${!!provider?.rpcUrl}`);
315
+ if (!provider || !provider.name || !provider.chainId || !provider.rpc) {
316
+ console.log(`[debug] Validation failed: provider=${!!provider}, name=${!!provider?.name}, chainId=${!!provider?.chainId}, rpc=${!!provider?.rpc}`);
317
317
  return res.status(400).json({ error: 'Invalid provider configuration' });
318
318
  }
319
319
 
@@ -327,7 +327,7 @@ class EpisteryAttach {
327
327
  if (!domainConfig.provider) domainConfig.provider = {
328
328
  chainId: provider.chainId,
329
329
  name: provider.name,
330
- rpc: provider.rpcUrl
330
+ rpc: provider.rpc
331
331
  }
332
332
 
333
333
  // Save domain config with custom provider (marked as pending)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "epistery",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Epistery brings blockchain capabilities to mundane web tasks like engagement metrics, authentication and commerce of all sorts.",
5
5
  "author": "Rootz Corp.",
6
6
  "license": "MIT",
package/src/epistery.ts CHANGED
@@ -43,7 +43,7 @@ export class Epistery {
43
43
  nativeCurrency = {
44
44
  symbol: server.provider.nativeCurrencySymbol,
45
45
  name: server.provider.nativeCurrencyName || server.provider.nativeCurrencySymbol,
46
- decimals: server.provider.nativeCurrencyDecimals || 18
46
+ decimals: Number(server.provider.nativeCurrencyDecimals) || 18
47
47
  };
48
48
  }
49
49