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.
- package/README.md +40 -20
- package/dist/api.d.ts +2 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +130 -0
- package/dist/api.js.map +1 -0
- package/dist/controllers/baseController.d.ts +8 -0
- package/dist/controllers/baseController.d.ts.map +1 -0
- package/dist/controllers/baseController.js +25 -0
- package/dist/controllers/baseController.js.map +1 -0
- package/dist/controllers/create/CreateController.d.ts +6 -0
- package/dist/controllers/create/CreateController.d.ts.map +1 -0
- package/dist/controllers/create/CreateController.js +17 -0
- package/dist/controllers/create/CreateController.js.map +1 -0
- package/dist/controllers/ssl/SSLController.d.ts +17 -0
- package/dist/controllers/ssl/SSLController.d.ts.map +1 -0
- package/dist/controllers/ssl/SSLController.js +129 -0
- package/dist/controllers/ssl/SSLController.js.map +1 -0
- package/dist/controllers/status/StatusController.d.ts +6 -0
- package/dist/controllers/status/StatusController.d.ts.map +1 -0
- package/dist/controllers/status/StatusController.js +29 -0
- package/dist/controllers/status/StatusController.js.map +1 -0
- package/dist/controllers/write/WriteController.d.ts +7 -0
- package/dist/controllers/write/WriteController.d.ts.map +1 -0
- package/dist/controllers/write/WriteController.js +50 -0
- package/dist/controllers/write/WriteController.js.map +1 -0
- package/dist/epistery.js +1 -1
- package/dist/epistery.js.map +1 -1
- package/docs/EpisteryModuleConfig.md +1 -1
- package/index.mjs +3 -3
- package/package.json +1 -1
- 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
|
|
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
|
|
12
|
-
- **Data Wallets**: Blockchain
|
|
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
|
|
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
|
|
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
|
|
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
|
-
#
|
|
149
|
-
epistery curl -X
|
|
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
|
|
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 #
|
|
184
|
+
├── config.ini # Root config (profile, IPFS, defaults)
|
|
170
185
|
├── mydomain.com/
|
|
171
|
-
│
|
|
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
|
|
299
|
-
- Each domain has isolated wallet
|
|
300
|
-
-
|
|
301
|
-
- Key
|
|
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 @@
|
|
|
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
|
package/dist/api.js.map
ADDED
|
@@ -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 @@
|
|
|
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":"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"}
|
|
@@ -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 = {
|
package/dist/epistery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epistery.js","sourceRoot":"","sources":["../src/epistery.ts"],"names":[],"mappings":";;;AAAA,+CAA+J;AAC/J,mCAAwC;AAExC,6CAAyC;AAGzC,MAAa,QAAQ;IAKnB,gBAAgB,CAAC;IAEV,MAAM,CAAC,KAAK,CAAC,UAAU;QAC5B,IAAI,QAAQ,CAAC,aAAa;YACxB,OAAO;QAET,MAAM,MAAM,GAAG,gBAAK,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,QAAkB,IAAI,8BAA8B,CAAC;QAC/G,QAAQ,CAAC,cAAc,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,IAAI,uBAAuB,CAAC;QAC9E,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAE1B,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;IAChC,CAAC;IAEM,MAAM,CAAC,YAAY;QACxB,MAAM,MAAM,GAAG,eAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAC5C,MAAM,gBAAgB,GAAqB;YACzC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE;YACvC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;QAEF,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAEM,MAAM,CAAC,SAAS,CAAC,MAAwB,EAAE,MAAoB;QACpE,sEAAsE;QACtE,IAAI,cAAc,GAAG,SAAS,CAAC;QAC/B,IAAI,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC;YAC3C,cAAc,GAAG;gBACf,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,oBAAoB;gBAC5C,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,IAAI,MAAM,CAAC,QAAQ,CAAC,oBAAoB;gBAChF,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,sBAAsB,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"epistery.js","sourceRoot":"","sources":["../src/epistery.ts"],"names":[],"mappings":"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"}
|
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.
|
|
316
|
-
console.log(`[debug] Validation failed: provider=${!!provider}, name=${!!provider?.name}, chainId=${!!provider?.chainId},
|
|
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.
|
|
330
|
+
rpc: provider.rpc
|
|
331
331
|
}
|
|
332
332
|
|
|
333
333
|
// Save domain config with custom provider (marked as pending)
|
package/package.json
CHANGED
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
|
|