neozip-blockchain 0.7.1 → 0.8.0
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 +15 -8
- package/dist/token-service/TokenServiceAccountAuth.d.ts +97 -0
- package/dist/token-service/TokenServiceAccountAuth.d.ts.map +1 -0
- package/dist/token-service/TokenServiceAccountAuth.js +286 -0
- package/dist/token-service/TokenServiceAccountAuth.js.map +1 -0
- package/dist/token-service/TokenServiceFunding.d.ts +87 -0
- package/dist/token-service/TokenServiceFunding.d.ts.map +1 -0
- package/dist/token-service/TokenServiceFunding.js +143 -0
- package/dist/token-service/TokenServiceFunding.js.map +1 -0
- package/dist/token-service/TokenServiceIdentity.d.ts +96 -0
- package/dist/token-service/TokenServiceIdentity.d.ts.map +1 -0
- package/dist/token-service/TokenServiceIdentity.js +240 -0
- package/dist/token-service/TokenServiceIdentity.js.map +1 -0
- package/dist/token-service/http.d.ts +46 -0
- package/dist/token-service/http.d.ts.map +1 -0
- package/dist/token-service/http.js +119 -0
- package/dist/token-service/http.js.map +1 -0
- package/dist/token-service/index.d.ts +4 -0
- package/dist/token-service/index.d.ts.map +1 -1
- package/dist/token-service/index.js +42 -1
- package/dist/token-service/index.js.map +1 -1
- package/package.json +9 -8
package/README.md
CHANGED
|
@@ -2,7 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
Blockchain functionality for NeoZip: **NeoZip Token Service timestamping** (stamp, upgrade, mint, verify), NFT minting, verification, and wallet management. Part of the [neozipkit monorepo](../../README.md).
|
|
4
4
|
|
|
5
|
-
>
|
|
5
|
+
> **⚠️ Beta Version Warning**: This package is currently in **beta** status. This means:
|
|
6
|
+
> - The API may change before the stable 1.0 release
|
|
7
|
+
> - Some features may still be evolving
|
|
8
|
+
> - Use in production with caution and thorough testing
|
|
9
|
+
>
|
|
10
|
+
> We welcome feedback on [GitHub](https://github.com/NeoWareInc/neozipkit/issues). This package is part of the [neozipkit monorepo](../../README.md).
|
|
6
11
|
|
|
7
12
|
This package provides the client-side API and utilities that work with the sibling **[neozipkit](../neozipkit/)** package for full NZIP (NeoZip) workflows. The **NeoZip Token Service** is a **separate application**; this library contains the **NeoZip Token Service API client and helpers** used to communicate with that server (submit digests, poll for confirmations, fetch proofs, etc.). Run the NeoZip Token Service separately when using timestamping features.
|
|
8
13
|
|
|
@@ -20,7 +25,7 @@ This package provides the client-side API and utilities that work with the sibli
|
|
|
20
25
|
```bash
|
|
21
26
|
npm install neozip-blockchain
|
|
22
27
|
# or
|
|
23
|
-
|
|
28
|
+
pnpm add neozip-blockchain
|
|
24
29
|
```
|
|
25
30
|
|
|
26
31
|
For full NZIP creation and verification you typically use **neozipkit** together with this package:
|
|
@@ -29,6 +34,8 @@ For full NZIP creation and verification you typically use **neozipkit** together
|
|
|
29
34
|
npm install neozipkit neozip-blockchain
|
|
30
35
|
```
|
|
31
36
|
|
|
37
|
+
`neozipkit` is a **peer dependency** (not bundled). Install both packages in your app; Yarn/npm will not resolve `workspace:*` from the registry.
|
|
38
|
+
|
|
32
39
|
## NeoZip Token Service (separate application)
|
|
33
40
|
|
|
34
41
|
The **NeoZip Token Service** is a **separate application** (not part of this repo). It runs the backend that batches digest submissions and writes timestamps to the blockchain. This library provides the **NeoZip Token Service API client and helpers** (`src/token-service/`) used by your app to:
|
|
@@ -178,24 +185,24 @@ MIT License - see [LICENSE](LICENSE) for details.
|
|
|
178
185
|
|
|
179
186
|
The npm tarball is intentionally minimal: compiled **`dist/`**, the **package root [`README.md`](README.md)**, and **[`LICENSE`](LICENSE)** only (`package.json` `"files"`). **`examples/`**, **`contracts/`**, and other repo docs are **not** on npm; use this repository for those.
|
|
180
187
|
|
|
181
|
-
Preview what will ship: run **`
|
|
188
|
+
Preview what will ship: run **`pnpm publish:dry-run`** (it uses **`npm publish --dry-run`**, which matches npm’s file list).
|
|
182
189
|
|
|
183
190
|
## Development
|
|
184
191
|
|
|
185
192
|
This package is part of the [neozipkit monorepo](../../README.md). From the **repository root**:
|
|
186
193
|
|
|
187
194
|
```bash
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
195
|
+
pnpm install
|
|
196
|
+
pnpm build # builds neozipkit first, then neozip-blockchain
|
|
197
|
+
pnpm test:unit
|
|
191
198
|
```
|
|
192
199
|
|
|
193
200
|
To work on this package alone:
|
|
194
201
|
|
|
195
202
|
```bash
|
|
196
203
|
cd packages/neozip-blockchain
|
|
197
|
-
|
|
198
|
-
|
|
204
|
+
pnpm build
|
|
205
|
+
pnpm test
|
|
199
206
|
```
|
|
200
207
|
|
|
201
208
|
See the [monorepo README](../../README.md) for version management and release workflow.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NeoZip Token Service account authentication HTTP client.
|
|
3
|
+
*
|
|
4
|
+
* Stateless functions for obtaining and renewing Token Service access tokens:
|
|
5
|
+
*
|
|
6
|
+
* POST /auth/register email verification (delivery: app|cli|browser)
|
|
7
|
+
* POST /auth/verify-email-code exchange a 6-digit code for an access token
|
|
8
|
+
* POST /auth/exchange-token exchange a magic-link token for an access token
|
|
9
|
+
* POST /auth/wallet-login/... silent SIWE-style renewal via wallet signature
|
|
10
|
+
* POST /auth/phone/request-otp Bearer; start phone verification
|
|
11
|
+
* POST /auth/phone/verify Bearer; complete phone verification
|
|
12
|
+
*
|
|
13
|
+
* These functions never persist credentials. Callers receive the access token
|
|
14
|
+
* (and parsed expiry) and are responsible for storing it.
|
|
15
|
+
*/
|
|
16
|
+
/** How the Token Service formats the verification email for `/auth/register`. */
|
|
17
|
+
export type AccountVerificationDelivery = 'app' | 'cli' | 'browser';
|
|
18
|
+
export interface RegisterEmailResult {
|
|
19
|
+
success: boolean;
|
|
20
|
+
message?: string;
|
|
21
|
+
error?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface AccessTokenResult {
|
|
24
|
+
accessToken: string;
|
|
25
|
+
email: string;
|
|
26
|
+
expiresAt: number | null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Register an email for verification with a chosen delivery format.
|
|
30
|
+
*
|
|
31
|
+
* `app` sends a NeoZip deep link, `cli`/`browser` send a 6-digit code. The
|
|
32
|
+
* email is normalized (trimmed + lowercased) before sending.
|
|
33
|
+
*/
|
|
34
|
+
export declare function registerEmailWithDelivery(baseUrl: string, email: string, verificationDelivery: AccountVerificationDelivery): Promise<RegisterEmailResult>;
|
|
35
|
+
/** Desktop-style registration (deep link email). */
|
|
36
|
+
export declare function registerEmailApp(baseUrl: string, email: string): Promise<RegisterEmailResult>;
|
|
37
|
+
/** Terminal / CLI registration (6-digit code only). */
|
|
38
|
+
export declare function registerEmailCli(baseUrl: string, email: string): Promise<RegisterEmailResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Verify an emailed 6-digit code and return the issued access token.
|
|
41
|
+
*
|
|
42
|
+
* @throws {Error} when the code is invalid, the request fails, or the response
|
|
43
|
+
* contains no access token.
|
|
44
|
+
*/
|
|
45
|
+
export declare function verifyEmailAndExtractToken(baseUrl: string, email: string, code: string): Promise<AccessTokenResult>;
|
|
46
|
+
/**
|
|
47
|
+
* Exchange a magic-link token for an access token.
|
|
48
|
+
*
|
|
49
|
+
* @throws {Error} when the token is invalid, the request fails, or the response
|
|
50
|
+
* is missing an access token or email.
|
|
51
|
+
*/
|
|
52
|
+
export declare function exchangeMagicLinkToken(baseUrl: string, token: string): Promise<AccessTokenResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Thrown when the Token Service does not expose the wallet-login endpoints
|
|
55
|
+
* (older deployment). Callers should fall back to interactive email re-auth.
|
|
56
|
+
*/
|
|
57
|
+
export declare class WalletLoginUnavailableError extends Error {
|
|
58
|
+
constructor(message?: string);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Request a wallet-login challenge (first leg of silent, SIWE-style renewal).
|
|
62
|
+
*
|
|
63
|
+
* @throws {WalletLoginUnavailableError} when the endpoint returns 404.
|
|
64
|
+
* @throws {Error} on other failures or malformed responses.
|
|
65
|
+
*/
|
|
66
|
+
export declare function requestWalletLoginChallenge(baseUrl: string, evmAddress: string): Promise<{
|
|
67
|
+
challengeId: string;
|
|
68
|
+
message: string;
|
|
69
|
+
evmAddress: string;
|
|
70
|
+
}>;
|
|
71
|
+
/**
|
|
72
|
+
* Complete a wallet-login challenge with a signature and receive an access
|
|
73
|
+
* token (second leg of silent renewal).
|
|
74
|
+
*
|
|
75
|
+
* @throws {WalletLoginUnavailableError} when the endpoint returns 404.
|
|
76
|
+
* @throws {Error} on other failures or when no access token is returned.
|
|
77
|
+
*/
|
|
78
|
+
export declare function walletLogin(baseUrl: string, input: {
|
|
79
|
+
evmAddress: string;
|
|
80
|
+
challengeId: string;
|
|
81
|
+
evmSignature: string;
|
|
82
|
+
}): Promise<{
|
|
83
|
+
accessToken: string;
|
|
84
|
+
email: string | null;
|
|
85
|
+
expiresAt: number | null;
|
|
86
|
+
}>;
|
|
87
|
+
/** Start phone verification for the authenticated account (Bearer). */
|
|
88
|
+
export declare function requestPhoneOtp(baseUrl: string, accessToken: string, phoneE164: string): Promise<{
|
|
89
|
+
success: boolean;
|
|
90
|
+
error?: string;
|
|
91
|
+
}>;
|
|
92
|
+
/** Complete phone verification with the emailed/texted code (Bearer). */
|
|
93
|
+
export declare function verifyPhoneOtp(baseUrl: string, accessToken: string, phoneE164: string, code: string): Promise<{
|
|
94
|
+
success: boolean;
|
|
95
|
+
error?: string;
|
|
96
|
+
}>;
|
|
97
|
+
//# sourceMappingURL=TokenServiceAccountAuth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenServiceAccountAuth.d.ts","sourceRoot":"","sources":["../../src/token-service/TokenServiceAccountAuth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAYH,iFAAiF;AACjF,MAAM,MAAM,2BAA2B,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;AAEpE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,oBAAoB,EAAE,2BAA2B,GAChD,OAAO,CAAC,mBAAmB,CAAC,CAwB9B;AAED,oDAAoD;AACpD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,mBAAmB,CAAC,CAE9B;AAED,uDAAuD;AACvD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,mBAAmB,CAAC,CAE9B;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,CAAC,CA+B5B;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,iBAAiB,CAAC,CAiC5B;AAED;;;GAGG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,OAAO,SAAgD;CAIpE;AAED;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA2BvE;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACvE,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAkClF;AAED,uEAAuE;AACvE,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB/C;AAED,yEAAyE;AACzE,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB/C"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* NeoZip Token Service account authentication HTTP client.
|
|
4
|
+
*
|
|
5
|
+
* Stateless functions for obtaining and renewing Token Service access tokens:
|
|
6
|
+
*
|
|
7
|
+
* POST /auth/register email verification (delivery: app|cli|browser)
|
|
8
|
+
* POST /auth/verify-email-code exchange a 6-digit code for an access token
|
|
9
|
+
* POST /auth/exchange-token exchange a magic-link token for an access token
|
|
10
|
+
* POST /auth/wallet-login/... silent SIWE-style renewal via wallet signature
|
|
11
|
+
* POST /auth/phone/request-otp Bearer; start phone verification
|
|
12
|
+
* POST /auth/phone/verify Bearer; complete phone verification
|
|
13
|
+
*
|
|
14
|
+
* These functions never persist credentials. Callers receive the access token
|
|
15
|
+
* (and parsed expiry) and are responsible for storing it.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.WalletLoginUnavailableError = void 0;
|
|
19
|
+
exports.registerEmailWithDelivery = registerEmailWithDelivery;
|
|
20
|
+
exports.registerEmailApp = registerEmailApp;
|
|
21
|
+
exports.registerEmailCli = registerEmailCli;
|
|
22
|
+
exports.verifyEmailAndExtractToken = verifyEmailAndExtractToken;
|
|
23
|
+
exports.exchangeMagicLinkToken = exchangeMagicLinkToken;
|
|
24
|
+
exports.requestWalletLoginChallenge = requestWalletLoginChallenge;
|
|
25
|
+
exports.walletLogin = walletLogin;
|
|
26
|
+
exports.requestPhoneOtp = requestPhoneOtp;
|
|
27
|
+
exports.verifyPhoneOtp = verifyPhoneOtp;
|
|
28
|
+
const ethers_1 = require("ethers");
|
|
29
|
+
const http_1 = require("./http");
|
|
30
|
+
/**
|
|
31
|
+
* Register an email for verification with a chosen delivery format.
|
|
32
|
+
*
|
|
33
|
+
* `app` sends a NeoZip deep link, `cli`/`browser` send a 6-digit code. The
|
|
34
|
+
* email is normalized (trimmed + lowercased) before sending.
|
|
35
|
+
*/
|
|
36
|
+
async function registerEmailWithDelivery(baseUrl, email, verificationDelivery) {
|
|
37
|
+
const url = (0, http_1.normalizeServerUrl)(baseUrl);
|
|
38
|
+
let res;
|
|
39
|
+
try {
|
|
40
|
+
res = await fetch(`${url}/auth/register`, {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers: { 'content-type': 'application/json' },
|
|
43
|
+
body: JSON.stringify({
|
|
44
|
+
email: email.trim().toLowerCase(),
|
|
45
|
+
verificationDelivery,
|
|
46
|
+
}),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
return { success: false, error: (0, http_1.formatTokenServiceFetchError)(url, err) };
|
|
51
|
+
}
|
|
52
|
+
const parsed = await (0, http_1.safeJson)(res);
|
|
53
|
+
if (!res.ok || !parsed || parsed.success !== true) {
|
|
54
|
+
return { success: false, error: (0, http_1.extractError)(parsed, `HTTP ${res.status}`) };
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
success: true,
|
|
58
|
+
message: typeof parsed.message === 'string' ? parsed.message : 'Verification email sent.',
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** Desktop-style registration (deep link email). */
|
|
62
|
+
async function registerEmailApp(baseUrl, email) {
|
|
63
|
+
return registerEmailWithDelivery(baseUrl, email, 'app');
|
|
64
|
+
}
|
|
65
|
+
/** Terminal / CLI registration (6-digit code only). */
|
|
66
|
+
async function registerEmailCli(baseUrl, email) {
|
|
67
|
+
return registerEmailWithDelivery(baseUrl, email, 'cli');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Verify an emailed 6-digit code and return the issued access token.
|
|
71
|
+
*
|
|
72
|
+
* @throws {Error} when the code is invalid, the request fails, or the response
|
|
73
|
+
* contains no access token.
|
|
74
|
+
*/
|
|
75
|
+
async function verifyEmailAndExtractToken(baseUrl, email, code) {
|
|
76
|
+
const url = (0, http_1.normalizeServerUrl)(baseUrl);
|
|
77
|
+
let res;
|
|
78
|
+
try {
|
|
79
|
+
res = await fetch(`${url}/auth/verify-email-code`, {
|
|
80
|
+
method: 'POST',
|
|
81
|
+
headers: { 'content-type': 'application/json' },
|
|
82
|
+
body: JSON.stringify({ email: email.trim().toLowerCase(), code: code.trim() }),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
throw new Error((0, http_1.formatTokenServiceFetchError)(url, err));
|
|
87
|
+
}
|
|
88
|
+
const parsed = await (0, http_1.safeJson)(res);
|
|
89
|
+
if (!res.ok || !parsed || parsed.success !== true) {
|
|
90
|
+
throw new Error((0, http_1.extractError)(parsed, `Verification failed (HTTP ${res.status})`, {
|
|
91
|
+
status: res.status,
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
const accessToken = (0, http_1.pickString)(parsed, 'accessToken', 'token', 'bearerToken');
|
|
95
|
+
if (!accessToken) {
|
|
96
|
+
throw new Error('Verification succeeded but no accessToken in response. Set NEOZIP_TOKEN_SERVICE_ACCESS_TOKEN manually or update the Token Service deployment.');
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
accessToken,
|
|
100
|
+
email: (0, http_1.pickString)(parsed, 'email') ?? email.trim().toLowerCase(),
|
|
101
|
+
expiresAt: (0, http_1.parseAccessTokenExpiry)(parsed),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Exchange a magic-link token for an access token.
|
|
106
|
+
*
|
|
107
|
+
* @throws {Error} when the token is invalid, the request fails, or the response
|
|
108
|
+
* is missing an access token or email.
|
|
109
|
+
*/
|
|
110
|
+
async function exchangeMagicLinkToken(baseUrl, token) {
|
|
111
|
+
const url = (0, http_1.normalizeServerUrl)(baseUrl);
|
|
112
|
+
let res;
|
|
113
|
+
try {
|
|
114
|
+
res = await fetch(`${url}/auth/exchange-token`, {
|
|
115
|
+
method: 'POST',
|
|
116
|
+
headers: { 'content-type': 'application/json' },
|
|
117
|
+
body: JSON.stringify({ token: token.trim() }),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
throw new Error((0, http_1.formatTokenServiceFetchError)(url, err));
|
|
122
|
+
}
|
|
123
|
+
const parsed = await (0, http_1.safeJson)(res);
|
|
124
|
+
if (!res.ok || !parsed || parsed.success !== true) {
|
|
125
|
+
throw new Error((0, http_1.extractError)(parsed, `Magic link exchange failed (HTTP ${res.status})`, {
|
|
126
|
+
status: res.status,
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
const accessToken = (0, http_1.pickString)(parsed, 'accessToken', 'token', 'bearerToken');
|
|
130
|
+
if (!accessToken) {
|
|
131
|
+
throw new Error('Magic link exchange succeeded but no accessToken in response.');
|
|
132
|
+
}
|
|
133
|
+
const verifiedEmail = (0, http_1.pickString)(parsed, 'email');
|
|
134
|
+
if (!verifiedEmail) {
|
|
135
|
+
throw new Error('Magic link exchange succeeded but no email in response.');
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
accessToken,
|
|
139
|
+
email: verifiedEmail,
|
|
140
|
+
expiresAt: (0, http_1.parseAccessTokenExpiry)(parsed),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Thrown when the Token Service does not expose the wallet-login endpoints
|
|
145
|
+
* (older deployment). Callers should fall back to interactive email re-auth.
|
|
146
|
+
*/
|
|
147
|
+
class WalletLoginUnavailableError extends Error {
|
|
148
|
+
constructor(message = 'Token Service does not support wallet login') {
|
|
149
|
+
super(message);
|
|
150
|
+
this.name = 'WalletLoginUnavailableError';
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
exports.WalletLoginUnavailableError = WalletLoginUnavailableError;
|
|
154
|
+
/**
|
|
155
|
+
* Request a wallet-login challenge (first leg of silent, SIWE-style renewal).
|
|
156
|
+
*
|
|
157
|
+
* @throws {WalletLoginUnavailableError} when the endpoint returns 404.
|
|
158
|
+
* @throws {Error} on other failures or malformed responses.
|
|
159
|
+
*/
|
|
160
|
+
async function requestWalletLoginChallenge(baseUrl, evmAddress) {
|
|
161
|
+
const url = (0, http_1.normalizeServerUrl)(baseUrl);
|
|
162
|
+
const checksummed = (0, ethers_1.getAddress)(evmAddress.trim());
|
|
163
|
+
let res;
|
|
164
|
+
try {
|
|
165
|
+
res = await fetch(`${url}/auth/wallet-login/challenge`, {
|
|
166
|
+
method: 'POST',
|
|
167
|
+
headers: { 'content-type': 'application/json' },
|
|
168
|
+
body: JSON.stringify({ evmAddress: checksummed }),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
throw new Error((0, http_1.formatTokenServiceFetchError)(url, err));
|
|
173
|
+
}
|
|
174
|
+
if (res.status === 404) {
|
|
175
|
+
throw new WalletLoginUnavailableError();
|
|
176
|
+
}
|
|
177
|
+
const parsed = await (0, http_1.safeJson)(res);
|
|
178
|
+
if (!res.ok || !parsed || parsed.success !== true) {
|
|
179
|
+
throw new Error((0, http_1.extractError)(parsed, `Wallet login challenge failed (HTTP ${res.status})`));
|
|
180
|
+
}
|
|
181
|
+
const challengeId = (0, http_1.pickString)(parsed, 'challengeId');
|
|
182
|
+
const message = (0, http_1.pickString)(parsed, 'message');
|
|
183
|
+
const addr = (0, http_1.pickString)(parsed, 'evmAddress');
|
|
184
|
+
if (!challengeId || !message || !addr) {
|
|
185
|
+
throw new Error('Wallet login challenge response missing fields');
|
|
186
|
+
}
|
|
187
|
+
return { challengeId, message, evmAddress: addr };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Complete a wallet-login challenge with a signature and receive an access
|
|
191
|
+
* token (second leg of silent renewal).
|
|
192
|
+
*
|
|
193
|
+
* @throws {WalletLoginUnavailableError} when the endpoint returns 404.
|
|
194
|
+
* @throws {Error} on other failures or when no access token is returned.
|
|
195
|
+
*/
|
|
196
|
+
async function walletLogin(baseUrl, input) {
|
|
197
|
+
const url = (0, http_1.normalizeServerUrl)(baseUrl);
|
|
198
|
+
let res;
|
|
199
|
+
try {
|
|
200
|
+
res = await fetch(`${url}/auth/wallet-login`, {
|
|
201
|
+
method: 'POST',
|
|
202
|
+
headers: { 'content-type': 'application/json' },
|
|
203
|
+
body: JSON.stringify({
|
|
204
|
+
evmAddress: (0, ethers_1.getAddress)(input.evmAddress.trim()),
|
|
205
|
+
challengeId: input.challengeId,
|
|
206
|
+
evmSignature: input.evmSignature,
|
|
207
|
+
}),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
throw new Error((0, http_1.formatTokenServiceFetchError)(url, err));
|
|
212
|
+
}
|
|
213
|
+
if (res.status === 404) {
|
|
214
|
+
throw new WalletLoginUnavailableError();
|
|
215
|
+
}
|
|
216
|
+
const parsed = await (0, http_1.safeJson)(res);
|
|
217
|
+
if (!res.ok || !parsed || parsed.success !== true) {
|
|
218
|
+
throw new Error((0, http_1.extractError)(parsed, `Wallet login failed (HTTP ${res.status})`, { status: res.status }));
|
|
219
|
+
}
|
|
220
|
+
const accessToken = (0, http_1.pickString)(parsed, 'accessToken', 'token', 'bearerToken');
|
|
221
|
+
if (!accessToken) {
|
|
222
|
+
throw new Error('Wallet login succeeded but no accessToken in response.');
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
accessToken,
|
|
226
|
+
email: (0, http_1.pickString)(parsed, 'email'),
|
|
227
|
+
expiresAt: (0, http_1.parseAccessTokenExpiry)(parsed),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/** Start phone verification for the authenticated account (Bearer). */
|
|
231
|
+
async function requestPhoneOtp(baseUrl, accessToken, phoneE164) {
|
|
232
|
+
const url = (0, http_1.normalizeServerUrl)(baseUrl);
|
|
233
|
+
let res;
|
|
234
|
+
try {
|
|
235
|
+
res = await fetch(`${url}/auth/phone/request-otp`, {
|
|
236
|
+
method: 'POST',
|
|
237
|
+
headers: {
|
|
238
|
+
Authorization: `Bearer ${accessToken}`,
|
|
239
|
+
'content-type': 'application/json',
|
|
240
|
+
},
|
|
241
|
+
body: JSON.stringify({ phoneE164: phoneE164.trim() }),
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
return { success: false, error: (0, http_1.formatTokenServiceFetchError)(url, err) };
|
|
246
|
+
}
|
|
247
|
+
const parsed = await (0, http_1.safeJson)(res);
|
|
248
|
+
if (!res.ok || !parsed || parsed.success !== true) {
|
|
249
|
+
return {
|
|
250
|
+
success: false,
|
|
251
|
+
error: (0, http_1.extractError)(parsed, `Phone OTP request failed (HTTP ${res.status})`, {
|
|
252
|
+
status: res.status,
|
|
253
|
+
}),
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
return { success: true };
|
|
257
|
+
}
|
|
258
|
+
/** Complete phone verification with the emailed/texted code (Bearer). */
|
|
259
|
+
async function verifyPhoneOtp(baseUrl, accessToken, phoneE164, code) {
|
|
260
|
+
const url = (0, http_1.normalizeServerUrl)(baseUrl);
|
|
261
|
+
let res;
|
|
262
|
+
try {
|
|
263
|
+
res = await fetch(`${url}/auth/phone/verify`, {
|
|
264
|
+
method: 'POST',
|
|
265
|
+
headers: {
|
|
266
|
+
Authorization: `Bearer ${accessToken}`,
|
|
267
|
+
'content-type': 'application/json',
|
|
268
|
+
},
|
|
269
|
+
body: JSON.stringify({ phoneE164: phoneE164.trim(), code: code.trim() }),
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
return { success: false, error: (0, http_1.formatTokenServiceFetchError)(url, err) };
|
|
274
|
+
}
|
|
275
|
+
const parsed = await (0, http_1.safeJson)(res);
|
|
276
|
+
if (!res.ok || !parsed || parsed.success !== true) {
|
|
277
|
+
return {
|
|
278
|
+
success: false,
|
|
279
|
+
error: (0, http_1.extractError)(parsed, `Phone verification failed (HTTP ${res.status})`, {
|
|
280
|
+
status: res.status,
|
|
281
|
+
}),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
return { success: true };
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=TokenServiceAccountAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenServiceAccountAuth.js","sourceRoot":"","sources":["../../src/token-service/TokenServiceAccountAuth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NeoZip Token Service funding API client.
|
|
3
|
+
*
|
|
4
|
+
* The Token Service can disburse small native-gas grants to the user's primary
|
|
5
|
+
* linked Data Wallet so on-chain operations (tokenization, timestamping) can pay
|
|
6
|
+
* for gas. The recipient is server-authoritative — a client may only request a
|
|
7
|
+
* grant, never redirect it.
|
|
8
|
+
*
|
|
9
|
+
* GET /funding/policy?chainId=<id> (no auth)
|
|
10
|
+
* GET /funding/status?chainId=<id> (Bearer)
|
|
11
|
+
* POST /funding/request (Bearer, optional Idempotency-Key)
|
|
12
|
+
*/
|
|
13
|
+
export interface FundingPolicy {
|
|
14
|
+
enabled: boolean;
|
|
15
|
+
grantWei: string;
|
|
16
|
+
grantEth: string;
|
|
17
|
+
cooldownHours: number;
|
|
18
|
+
lowBalanceWei?: string;
|
|
19
|
+
lowBalanceEth?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface FundingPolicyResult {
|
|
22
|
+
chainId: number;
|
|
23
|
+
network: string;
|
|
24
|
+
policy: FundingPolicy;
|
|
25
|
+
}
|
|
26
|
+
export interface FundingGrantSummary {
|
|
27
|
+
id: number;
|
|
28
|
+
status: string;
|
|
29
|
+
amountWei: string;
|
|
30
|
+
amountEth: string;
|
|
31
|
+
transactionHash: string | null;
|
|
32
|
+
requestedAt: string;
|
|
33
|
+
confirmedAt: string | null;
|
|
34
|
+
}
|
|
35
|
+
export interface FundingStatusResult {
|
|
36
|
+
chainId: number;
|
|
37
|
+
recipientAddress: string | null;
|
|
38
|
+
enabled: boolean;
|
|
39
|
+
requiresPayment: boolean;
|
|
40
|
+
lastGrantAt: string | null;
|
|
41
|
+
nextEligibleAt: string | null;
|
|
42
|
+
recentGrants: FundingGrantSummary[];
|
|
43
|
+
}
|
|
44
|
+
export interface FundingRequestResult {
|
|
45
|
+
success: boolean;
|
|
46
|
+
status: string;
|
|
47
|
+
grantId: number;
|
|
48
|
+
amountWei: string;
|
|
49
|
+
amountEth: string;
|
|
50
|
+
recipientAddress: string;
|
|
51
|
+
transactionHash?: string | null;
|
|
52
|
+
paymentRequired?: boolean;
|
|
53
|
+
error?: string;
|
|
54
|
+
errorCode?: string;
|
|
55
|
+
}
|
|
56
|
+
/** Thrown when the Token Service does not expose the funding endpoints (older deployment). */
|
|
57
|
+
export declare class FundingUnavailableError extends Error {
|
|
58
|
+
constructor(message?: string);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Fetch the public funding policy for a chain (grant size, cooldown, low-balance
|
|
62
|
+
* threshold). No authentication required.
|
|
63
|
+
*
|
|
64
|
+
* @throws {FundingUnavailableError} when the endpoint returns 404.
|
|
65
|
+
* @throws {Error} on other failures or a malformed response.
|
|
66
|
+
*/
|
|
67
|
+
export declare function getFundingPolicy(baseUrl: string, chainId: number): Promise<FundingPolicyResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Fetch the caller's funding status for a chain (recipient address, eligibility,
|
|
70
|
+
* recent grants). Requires a Bearer access token.
|
|
71
|
+
*
|
|
72
|
+
* @throws {FundingUnavailableError} when the endpoint returns 404.
|
|
73
|
+
* @throws {Error} on other failures (including 401/403) or a malformed response.
|
|
74
|
+
*/
|
|
75
|
+
export declare function getFundingStatus(baseUrl: string, accessToken: string, chainId: number): Promise<FundingStatusResult>;
|
|
76
|
+
/**
|
|
77
|
+
* Request a native-gas grant to the caller's primary Data Wallet. Requires a
|
|
78
|
+
* Bearer access token; an optional `idempotencyKey` makes retries safe.
|
|
79
|
+
*
|
|
80
|
+
* Returns the parsed result (which may itself report `success: false` with an
|
|
81
|
+
* `errorCode` such as a cooldown).
|
|
82
|
+
*
|
|
83
|
+
* @throws {FundingUnavailableError} when the endpoint returns 404.
|
|
84
|
+
* @throws {Error} when the response is non-JSON (e.g. auth failures).
|
|
85
|
+
*/
|
|
86
|
+
export declare function requestFundingGrant(baseUrl: string, accessToken: string, chainId: number, idempotencyKey?: string): Promise<FundingRequestResult>;
|
|
87
|
+
//# sourceMappingURL=TokenServiceFunding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenServiceFunding.d.ts","sourceRoot":"","sources":["../../src/token-service/TokenServiceFunding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,mBAAmB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,8FAA8F;AAC9F,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,SAA2C;CAI/D;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,mBAAmB,CAAC,CA0B9B;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,mBAAmB,CAAC,CAkC9B;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,oBAAoB,CAAC,CA8B/B"}
|