web3-tools-mcp 2.0.2 → 3.1.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/CHANGELOG.md +182 -1
- package/README.md +76 -47
- package/dist/anvil.d.ts +17 -19
- package/dist/anvil.d.ts.map +1 -1
- package/dist/anvil.js +124 -228
- package/dist/anvil.js.map +1 -1
- package/dist/chain-meta.d.ts.map +1 -1
- package/dist/chain-meta.js +19 -8
- package/dist/chain-meta.js.map +1 -1
- package/dist/chains.d.ts +9 -1
- package/dist/chains.d.ts.map +1 -1
- package/dist/chains.js +11 -2
- package/dist/chains.js.map +1 -1
- package/dist/clear-signing.d.ts.map +1 -1
- package/dist/clear-signing.js +17 -6
- package/dist/clear-signing.js.map +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/context.d.ts +22 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +24 -0
- package/dist/context.js.map +1 -0
- package/dist/hosted.d.ts +12 -0
- package/dist/hosted.d.ts.map +1 -0
- package/dist/hosted.js +12 -0
- package/dist/hosted.js.map +1 -0
- package/dist/http-server.d.ts +13 -0
- package/dist/http-server.d.ts.map +1 -1
- package/dist/http-server.js +22 -7
- package/dist/http-server.js.map +1 -1
- package/dist/index.js +20 -12
- package/dist/index.js.map +1 -1
- package/dist/kv-storage.d.ts +2 -1
- package/dist/kv-storage.d.ts.map +1 -1
- package/dist/kv-storage.js +5 -2
- package/dist/kv-storage.js.map +1 -1
- package/dist/lib.d.ts +24 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +23 -0
- package/dist/lib.js.map +1 -0
- package/dist/mcp-server.d.ts +4 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +43 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/oauth.d.ts +57 -8
- package/dist/oauth.d.ts.map +1 -1
- package/dist/oauth.js +133 -63
- package/dist/oauth.js.map +1 -1
- package/dist/preview.d.ts +7 -0
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +21 -7
- package/dist/preview.js.map +1 -1
- package/dist/signing-requests.d.ts +81 -0
- package/dist/signing-requests.d.ts.map +1 -0
- package/dist/signing-requests.js +138 -0
- package/dist/signing-requests.js.map +1 -0
- package/dist/tools/index.d.ts +27 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +50 -15
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/{advanced.d.ts → read/advanced.d.ts} +39 -30
- package/dist/tools/read/advanced.d.ts.map +1 -0
- package/dist/tools/{advanced.js → read/advanced.js} +53 -41
- package/dist/tools/read/advanced.js.map +1 -0
- package/dist/tools/{balance.d.ts → read/balance.d.ts} +8 -7
- package/dist/tools/read/balance.d.ts.map +1 -0
- package/dist/tools/{balance.js → read/balance.js} +18 -33
- package/dist/tools/read/balance.js.map +1 -0
- package/dist/tools/{contract-info.d.ts → read/contract-info.d.ts} +20 -15
- package/dist/tools/read/contract-info.d.ts.map +1 -0
- package/dist/tools/{contract-info.js → read/contract-info.js} +54 -123
- package/dist/tools/read/contract-info.js.map +1 -0
- package/dist/tools/{contract.d.ts → read/contract.d.ts} +14 -12
- package/dist/tools/read/contract.d.ts.map +1 -0
- package/dist/tools/{contract.js → read/contract.js} +3 -2
- package/dist/tools/read/contract.js.map +1 -0
- package/dist/tools/read/ens.d.ts +104 -0
- package/dist/tools/read/ens.d.ts.map +1 -0
- package/dist/tools/{ens.js → read/ens.js} +25 -33
- package/dist/tools/read/ens.js.map +1 -0
- package/dist/tools/read/gas.d.ts +171 -0
- package/dist/tools/read/gas.d.ts.map +1 -0
- package/dist/tools/read/gas.js +333 -0
- package/dist/tools/read/gas.js.map +1 -0
- package/dist/tools/read/logs.d.ts +101 -0
- package/dist/tools/read/logs.d.ts.map +1 -0
- package/dist/tools/read/logs.js +211 -0
- package/dist/tools/read/logs.js.map +1 -0
- package/dist/tools/{signatures.d.ts → read/signatures.d.ts} +8 -4
- package/dist/tools/read/signatures.d.ts.map +1 -0
- package/dist/tools/{signatures.js → read/signatures.js} +4 -3
- package/dist/tools/read/signatures.js.map +1 -0
- package/dist/tools/read/signing.d.ts +27 -0
- package/dist/tools/read/signing.d.ts.map +1 -0
- package/dist/tools/read/signing.js +81 -0
- package/dist/tools/read/signing.js.map +1 -0
- package/dist/tools/sign/errors.d.ts +9 -0
- package/dist/tools/sign/errors.d.ts.map +1 -0
- package/dist/tools/sign/errors.js +29 -0
- package/dist/tools/sign/errors.js.map +1 -0
- package/dist/tools/sign/transactions.d.ts +141 -0
- package/dist/tools/sign/transactions.d.ts.map +1 -0
- package/dist/tools/sign/transactions.js +361 -0
- package/dist/tools/sign/transactions.js.map +1 -0
- package/dist/tools/sign/wallet.d.ts +50 -0
- package/dist/tools/sign/wallet.d.ts.map +1 -0
- package/dist/tools/sign/wallet.js +180 -0
- package/dist/tools/sign/wallet.js.map +1 -0
- package/dist/utils.d.ts +23 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +48 -3
- package/dist/utils.js.map +1 -1
- package/dist/wallet-client.d.ts +34 -4
- package/dist/wallet-client.d.ts.map +1 -1
- package/dist/wallet-client.js +106 -27
- package/dist/wallet-client.js.map +1 -1
- package/dist/walletconnect.d.ts +100 -13
- package/dist/walletconnect.d.ts.map +1 -1
- package/dist/walletconnect.js +215 -50
- package/dist/walletconnect.js.map +1 -1
- package/package.json +12 -9
- package/src/anvil.ts +150 -271
- package/src/chain-meta.ts +16 -7
- package/src/chains.ts +14 -2
- package/src/clear-signing.ts +15 -9
- package/src/client.ts +0 -1
- package/src/context.ts +27 -0
- package/src/hosted.ts +11 -0
- package/src/http-server.ts +38 -8
- package/src/index.ts +20 -13
- package/src/kv-storage.ts +6 -3
- package/src/lib.ts +24 -0
- package/src/mcp-server.ts +47 -0
- package/src/oauth.ts +181 -69
- package/src/preview.ts +28 -7
- package/src/signing-requests.ts +198 -0
- package/src/tools/index.ts +78 -16
- package/src/tools/{advanced.ts → read/advanced.ts} +74 -43
- package/src/tools/{balance.ts → read/balance.ts} +20 -35
- package/src/tools/{contract-info.ts → read/contract-info.ts} +66 -146
- package/src/tools/{contract.ts → read/contract.ts} +4 -3
- package/src/tools/{ens.ts → read/ens.ts} +27 -34
- package/src/tools/read/gas.ts +443 -0
- package/src/tools/read/logs.ts +281 -0
- package/src/tools/{signatures.ts → read/signatures.ts} +5 -5
- package/src/tools/read/signing.ts +92 -0
- package/src/tools/sign/errors.ts +28 -0
- package/src/tools/sign/transactions.ts +479 -0
- package/src/tools/sign/wallet.ts +216 -0
- package/src/utils.ts +52 -3
- package/src/wallet-client.ts +107 -24
- package/src/walletconnect.ts +250 -48
- package/dist/tools/advanced.d.ts.map +0 -1
- package/dist/tools/advanced.js.map +0 -1
- package/dist/tools/balance.d.ts.map +0 -1
- package/dist/tools/balance.js.map +0 -1
- package/dist/tools/contract-info.d.ts.map +0 -1
- package/dist/tools/contract-info.js.map +0 -1
- package/dist/tools/contract.d.ts.map +0 -1
- package/dist/tools/contract.js.map +0 -1
- package/dist/tools/ens.d.ts +0 -119
- package/dist/tools/ens.d.ts.map +0 -1
- package/dist/tools/ens.js.map +0 -1
- package/dist/tools/gas.d.ts +0 -99
- package/dist/tools/gas.d.ts.map +0 -1
- package/dist/tools/gas.js +0 -181
- package/dist/tools/gas.js.map +0 -1
- package/dist/tools/logs.d.ts +0 -39
- package/dist/tools/logs.d.ts.map +0 -1
- package/dist/tools/logs.js +0 -230
- package/dist/tools/logs.js.map +0 -1
- package/dist/tools/signatures.d.ts.map +0 -1
- package/dist/tools/signatures.js.map +0 -1
- package/dist/tools/transactions.d.ts +0 -155
- package/dist/tools/transactions.d.ts.map +0 -1
- package/dist/tools/transactions.js +0 -365
- package/dist/tools/transactions.js.map +0 -1
- package/src/tools/gas.ts +0 -219
- package/src/tools/logs.ts +0 -293
- package/src/tools/transactions.ts +0 -456
package/dist/oauth.d.ts
CHANGED
|
@@ -3,26 +3,75 @@ import type { AuthorizationParams, OAuthServerProvider } from '@modelcontextprot
|
|
|
3
3
|
import type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';
|
|
4
4
|
import type { OAuthClientInformationFull, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js';
|
|
5
5
|
import type { Response } from 'express';
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
/**
|
|
7
|
+
* How a deployment decides who is at the authorize screen.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately free of any type from the MCP SDK, a chain library, or this package: an
|
|
10
|
+
* implementation renders a page and reads back a form, and everything about *how* somebody
|
|
11
|
+
* proves who they are — a shared token, a wallet signature, a company SSO — stays outside.
|
|
12
|
+
* Returning an address makes the issued token that person's; returning none authenticates
|
|
13
|
+
* the deployment rather than anybody in particular.
|
|
14
|
+
*/
|
|
15
|
+
export interface Login {
|
|
16
|
+
/**
|
|
17
|
+
* The page served at GET /authorize. `hidden` must be placed inside its form. `request`
|
|
18
|
+
* names who is asking and where the code will be sent, so a person can tell a phishing
|
|
19
|
+
* client from their own; like `error`, its values arrive HTML-escaped.
|
|
20
|
+
*/
|
|
21
|
+
page(hidden: string, error?: string, request?: {
|
|
22
|
+
client: string;
|
|
23
|
+
redirectHost: string;
|
|
24
|
+
}): string | Promise<string>;
|
|
25
|
+
/** Reads the posted form. An `error` re-renders the page; an `address` names the person. */
|
|
26
|
+
identify(form: Record<string, string>): Promise<{
|
|
27
|
+
address?: string;
|
|
28
|
+
error?: string;
|
|
29
|
+
}>;
|
|
30
|
+
/**
|
|
31
|
+
* Form fields this login owns. They are kept out of the hidden inputs replayed into the
|
|
32
|
+
* page, so a credential can never be echoed back into the HTML.
|
|
33
|
+
*/
|
|
34
|
+
owns?: string[];
|
|
35
|
+
/**
|
|
36
|
+
* A shared secret this login checks against, if it has one. Everything issued is bound to
|
|
37
|
+
* it, so rotating the secret revokes every code and token handed out under the old one.
|
|
38
|
+
*/
|
|
39
|
+
credential?: string;
|
|
40
|
+
}
|
|
41
|
+
/** The default: one shared credential, so a self-hoster needs no identity provider. */
|
|
42
|
+
export declare function tokenLogin(accessToken: string): Login;
|
|
43
|
+
export declare class OAuthProvider implements OAuthServerProvider {
|
|
44
|
+
private login;
|
|
45
|
+
private staticToken?;
|
|
8
46
|
private store;
|
|
9
|
-
|
|
47
|
+
private credential;
|
|
48
|
+
/**
|
|
49
|
+
* `staticToken` is accepted verbatim in an Authorization header, for clients that can send
|
|
50
|
+
* one and skip the flow entirely. It names no person, so it carries no identity.
|
|
51
|
+
*/
|
|
52
|
+
constructor(login: Login, staticToken?: string | undefined);
|
|
10
53
|
get clientsStore(): OAuthRegisteredClientsStore;
|
|
11
54
|
/**
|
|
12
|
-
* GET renders the
|
|
13
|
-
* both here keeps the whole login inside the SDK's authorize
|
|
55
|
+
* GET renders the login; POST hands the form to it and, if it names somebody, redirects
|
|
56
|
+
* back with a code. Handling both here keeps the whole login inside the SDK's authorize
|
|
57
|
+
* route, which is the only place the client will follow a redirect from.
|
|
14
58
|
*/
|
|
15
59
|
authorize(client: OAuthClientInformationFull, params: AuthorizationParams, res: Response): Promise<void>;
|
|
16
|
-
|
|
17
|
-
|
|
60
|
+
private validCode;
|
|
61
|
+
challengeForAuthorizationCode(client: OAuthClientInformationFull, authorizationCode: string): Promise<string>;
|
|
62
|
+
exchangeAuthorizationCode(client: OAuthClientInformationFull, authorizationCode: string, _codeVerifier?: string, redirectUri?: string): Promise<OAuthTokens>;
|
|
18
63
|
exchangeRefreshToken(client: OAuthClientInformationFull, refreshToken: string, scopes?: string[]): Promise<OAuthTokens>;
|
|
19
64
|
private issue;
|
|
20
|
-
/** Accepts an issued token, or
|
|
65
|
+
/** Accepts an issued token, or the static one so a client that can send a header still works. */
|
|
21
66
|
verifyAccessToken(token: string): Promise<AuthInfo>;
|
|
22
67
|
revokeToken(_client: OAuthClientInformationFull, request: {
|
|
23
68
|
token: string;
|
|
24
69
|
}): Promise<void>;
|
|
25
70
|
}
|
|
71
|
+
/** One shared credential, which is all a self-hosted server needs. */
|
|
72
|
+
export declare class SingleUserOAuthProvider extends OAuthProvider {
|
|
73
|
+
constructor(accessToken: string);
|
|
74
|
+
}
|
|
26
75
|
/** PKCE helper, used by the tests to drive the flow the way a real client would. */
|
|
27
76
|
export declare function pkce(): {
|
|
28
77
|
verifier: string;
|
package/dist/oauth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAA;AAEnG,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAA;AACjH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAA;AAC9E,OAAO,KAAK,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAA;AACvG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kDAAkD,CAAA;AAEnG,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAA;AACjH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAA;AAC9E,OAAO,KAAK,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAA;AACvG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAkGvC;;;;;;;;GAQG;AACH,MAAM,WAAW,KAAK;IACpB;;;;OAIG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAClH,4FAA4F;IAC5F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACrF;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAcD,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAyBrD;AAED,qBAAa,aAAc,YAAW,mBAAmB;IAUrD,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,WAAW,CAAC;IAVtB,OAAO,CAAC,KAAK,CAAc;IAE3B,OAAO,CAAC,UAAU,CAAoB;IAEtC;;;OAGG;gBAEO,KAAK,EAAE,KAAK,EACZ,WAAW,CAAC,EAAE,MAAM,YAAA;IAK9B,IAAI,YAAY,IAAI,2BAA2B,CAkB9C;IAED;;;;OAIG;IACG,SAAS,CAAC,MAAM,EAAE,0BAA0B,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;YA0DhG,SAAS;IASjB,6BAA6B,CAAC,MAAM,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7G,yBAAyB,CAC7B,MAAM,EAAE,0BAA0B,EAClC,iBAAiB,EAAE,MAAM,EACzB,aAAa,CAAC,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,CAAC;IAajB,oBAAoB,CAAC,MAAM,EAAE,0BAA0B,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;YAW/G,KAAK;IAkBnB,iGAAiG;IAC3F,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IA0BnD,WAAW,CAAC,OAAO,EAAE,0BAA0B,EAAE,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAIlG;AAED,sEAAsE;AACtE,qBAAa,uBAAwB,SAAQ,aAAa;gBAC5C,WAAW,EAAE,MAAM;CAGhC;AAED,oFAAoF;AACpF,wBAAgB,IAAI,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAI9D"}
|
package/dist/oauth.js
CHANGED
|
@@ -2,7 +2,7 @@ import { createHash, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
|
2
2
|
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
-
import { InvalidTokenError } from '@modelcontextprotocol/sdk/server/auth/errors.js';
|
|
5
|
+
import { InvalidGrantError, InvalidTokenError } from '@modelcontextprotocol/sdk/server/auth/errors.js';
|
|
6
6
|
import { getKeyValueStorage } from './kv-storage.js';
|
|
7
7
|
/**
|
|
8
8
|
* OAuth for clients that will not send a static bearer token — claude.ai connectors, and
|
|
@@ -15,6 +15,13 @@ import { getKeyValueStorage } from './kv-storage.js';
|
|
|
15
15
|
*/
|
|
16
16
|
const CODE_TTL = 10 * 60 * 1000;
|
|
17
17
|
const TOKEN_TTL = 30 * 24 * 60 * 60;
|
|
18
|
+
/** Codes expire in milliseconds, tokens in seconds — the unit OAuth reports them in. */
|
|
19
|
+
function expired(key, value) {
|
|
20
|
+
const expiresAt = value?.expiresAt;
|
|
21
|
+
if (expiresAt === undefined)
|
|
22
|
+
return false;
|
|
23
|
+
return (key.startsWith('code:') ? expiresAt : expiresAt * 1000) < Date.now();
|
|
24
|
+
}
|
|
18
25
|
/** Redis where configured, a JSON file otherwise — issued tokens must outlive a restart. */
|
|
19
26
|
class Store {
|
|
20
27
|
redis;
|
|
@@ -42,11 +49,15 @@ class Store {
|
|
|
42
49
|
return this.redis.getItem(`oauth:${key}`);
|
|
43
50
|
return this.read()[key];
|
|
44
51
|
}
|
|
45
|
-
|
|
52
|
+
/** `ttl` in seconds lets Redis drop the entry itself; the file is pruned on every write. */
|
|
53
|
+
async set(key, value, ttl) {
|
|
46
54
|
if (this.redis)
|
|
47
|
-
return this.redis.setItem(`oauth:${key}`, value);
|
|
55
|
+
return this.redis.setItem(`oauth:${key}`, value, ttl);
|
|
48
56
|
const data = this.read();
|
|
49
57
|
data[key] = value;
|
|
58
|
+
for (const [name, stored] of Object.entries(data))
|
|
59
|
+
if (expired(name, stored))
|
|
60
|
+
delete data[name];
|
|
50
61
|
writeFileSync(this.file, JSON.stringify(data), { mode: 0o600 });
|
|
51
62
|
}
|
|
52
63
|
async remove(key) {
|
|
@@ -65,17 +76,7 @@ function constantTimeEquals(a, b) {
|
|
|
65
76
|
const right = Buffer.from(b);
|
|
66
77
|
return left.length === right.length && timingSafeEqual(left, right);
|
|
67
78
|
}
|
|
68
|
-
|
|
69
|
-
// The SDK's authorize handler reads its parameters from the body on POST, so the form
|
|
70
|
-
// has to carry the whole authorization request back, not just the token.
|
|
71
|
-
const hidden = Object.entries(params.fields)
|
|
72
|
-
.map(([name, value]) => `<input type="hidden" name="${escapeHtml(name)}" value="${escapeHtml(value)}">`)
|
|
73
|
-
.join('\n ');
|
|
74
|
-
return `<!doctype html>
|
|
75
|
-
<meta charset="utf-8">
|
|
76
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
77
|
-
<title>Connect to web3-tools-mcp</title>
|
|
78
|
-
<style>
|
|
79
|
+
const PAGE_STYLE = `
|
|
79
80
|
:root { color-scheme: light dark; }
|
|
80
81
|
body { font: 15px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; max-width: 26rem;
|
|
81
82
|
margin: 12vh auto; padding: 0 1.25rem; }
|
|
@@ -85,22 +86,49 @@ function loginPage(params) {
|
|
|
85
86
|
box-sizing: border-box; }
|
|
86
87
|
input { border: 1px solid #ccd; font-family: ui-monospace, monospace; }
|
|
87
88
|
button { margin-top: .75rem; border: 0; background: #3856d6; color: #fff; font-weight: 600; }
|
|
88
|
-
.error { color: #b3251d; font-weight: 600; }
|
|
89
|
+
.error { color: #b3251d; font-weight: 600; }`;
|
|
90
|
+
/** The default: one shared credential, so a self-hoster needs no identity provider. */
|
|
91
|
+
export function tokenLogin(accessToken) {
|
|
92
|
+
return {
|
|
93
|
+
owns: ['token'],
|
|
94
|
+
credential: accessToken,
|
|
95
|
+
page: (hidden, error, request) => `<!doctype html>
|
|
96
|
+
<meta charset="utf-8">
|
|
97
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
98
|
+
<title>Connect to web3-tools-mcp</title>
|
|
99
|
+
<style>${PAGE_STYLE}
|
|
89
100
|
</style>
|
|
90
101
|
<h1>Connect to web3-tools-mcp</h1>
|
|
102
|
+
${request ? `<p><strong>${request.client}</strong> is asking for access, and will be sent back to <strong>${request.redirectHost}</strong>.</p>` : ''}
|
|
91
103
|
<p>Paste this server's access token to authorise the client.</p>
|
|
92
|
-
${
|
|
104
|
+
${error ? `<p class="error">${error}</p>` : ''}
|
|
93
105
|
<form method="post">
|
|
94
106
|
${hidden}
|
|
95
107
|
<input name="token" type="password" placeholder="MCP_TOKEN" autocomplete="off" autofocus>
|
|
96
108
|
<button type="submit">Authorise</button>
|
|
97
|
-
</form
|
|
109
|
+
</form>`,
|
|
110
|
+
async identify(form) {
|
|
111
|
+
if (!constantTimeEquals(form.token ?? '', accessToken))
|
|
112
|
+
return { error: 'That token was not accepted.' };
|
|
113
|
+
// No address: this authenticates the deployment, not a person.
|
|
114
|
+
return {};
|
|
115
|
+
}
|
|
116
|
+
};
|
|
98
117
|
}
|
|
99
|
-
export class
|
|
100
|
-
|
|
118
|
+
export class OAuthProvider {
|
|
119
|
+
login;
|
|
120
|
+
staticToken;
|
|
101
121
|
store = new Store();
|
|
102
|
-
|
|
103
|
-
|
|
122
|
+
// A hash, so the secret itself never lands in the store.
|
|
123
|
+
credential;
|
|
124
|
+
/**
|
|
125
|
+
* `staticToken` is accepted verbatim in an Authorization header, for clients that can send
|
|
126
|
+
* one and skip the flow entirely. It names no person, so it carries no identity.
|
|
127
|
+
*/
|
|
128
|
+
constructor(login, staticToken) {
|
|
129
|
+
this.login = login;
|
|
130
|
+
this.staticToken = staticToken;
|
|
131
|
+
this.credential = login.credential && createHash('sha256').update(login.credential).digest('hex').slice(0, 16);
|
|
104
132
|
}
|
|
105
133
|
get clientsStore() {
|
|
106
134
|
const store = this.store;
|
|
@@ -122,26 +150,40 @@ export class SingleUserOAuthProvider {
|
|
|
122
150
|
};
|
|
123
151
|
}
|
|
124
152
|
/**
|
|
125
|
-
* GET renders the
|
|
126
|
-
* both here keeps the whole login inside the SDK's authorize
|
|
153
|
+
* GET renders the login; POST hands the form to it and, if it names somebody, redirects
|
|
154
|
+
* back with a code. Handling both here keeps the whole login inside the SDK's authorize
|
|
155
|
+
* route, which is the only place the client will follow a redirect from.
|
|
127
156
|
*/
|
|
128
157
|
async authorize(client, params, res) {
|
|
129
158
|
const request = res.req;
|
|
130
|
-
const
|
|
131
|
-
//
|
|
132
|
-
//
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
159
|
+
const form = { ...request.query, ...request.body };
|
|
160
|
+
// The SDK's authorize handler reads its parameters from the body on POST, so the form
|
|
161
|
+
// has to carry the whole authorization request back — minus whatever the login owns,
|
|
162
|
+
// which would mean echoing a credential into the HTML.
|
|
163
|
+
const owned = new Set(this.login.owns ?? []);
|
|
164
|
+
const hidden = Object.entries(form)
|
|
165
|
+
.filter(([name, value]) => !owned.has(name) && typeof value === 'string')
|
|
166
|
+
.map(([name, value]) => `<input type="hidden" name="${escapeHtml(name)}" value="${escapeHtml(value)}">`)
|
|
167
|
+
.join('\n ');
|
|
168
|
+
const redirectTo = new URL(params.redirectUri);
|
|
169
|
+
const shown = {
|
|
170
|
+
client: escapeHtml(client.client_name || 'An unnamed client'),
|
|
171
|
+
redirectHost: escapeHtml(redirectTo.host || redirectTo.href)
|
|
172
|
+
};
|
|
173
|
+
// A login page that can be framed can be clickjacked into authorising somebody else.
|
|
174
|
+
res.setHeader('X-Frame-Options', 'DENY');
|
|
175
|
+
res.setHeader('Content-Security-Policy', "frame-ancestors 'none'");
|
|
176
|
+
const render = async (status, error) => {
|
|
139
177
|
res
|
|
140
|
-
.status(
|
|
178
|
+
.status(status)
|
|
141
179
|
.setHeader('content-type', 'text/html; charset=utf-8')
|
|
142
|
-
.send(
|
|
143
|
-
|
|
144
|
-
|
|
180
|
+
.send(await this.login.page(hidden, error ? escapeHtml(error) : undefined, shown));
|
|
181
|
+
};
|
|
182
|
+
if (request.method !== 'POST')
|
|
183
|
+
return render(200);
|
|
184
|
+
const identified = await this.login.identify(form);
|
|
185
|
+
if (identified.error)
|
|
186
|
+
return render(401, identified.error);
|
|
145
187
|
const code = randomBytes(24).toString('hex');
|
|
146
188
|
await this.store.set(`code:${code}`, {
|
|
147
189
|
clientId: client.client_id,
|
|
@@ -149,45 +191,59 @@ export class SingleUserOAuthProvider {
|
|
|
149
191
|
redirectUri: params.redirectUri,
|
|
150
192
|
resource: params.resource?.href,
|
|
151
193
|
scopes: params.scopes ?? [],
|
|
194
|
+
address: identified.address,
|
|
195
|
+
credential: this.credential,
|
|
152
196
|
expiresAt: Date.now() + CODE_TTL
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
redirect.searchParams.set('code', code);
|
|
197
|
+
}, CODE_TTL / 1000);
|
|
198
|
+
redirectTo.searchParams.set('code', code);
|
|
156
199
|
if (params.state)
|
|
157
|
-
|
|
158
|
-
res.redirect(
|
|
159
|
-
}
|
|
160
|
-
async challengeForAuthorizationCode(_client, authorizationCode) {
|
|
161
|
-
const stored = await this.store.get(`code:${authorizationCode}`);
|
|
162
|
-
if (!stored || stored.expiresAt < Date.now())
|
|
163
|
-
throw new Error('Authorization code is invalid or expired');
|
|
164
|
-
return stored.codeChallenge;
|
|
200
|
+
redirectTo.searchParams.set('state', params.state);
|
|
201
|
+
res.redirect(redirectTo.href);
|
|
165
202
|
}
|
|
166
|
-
|
|
203
|
+
// Refusals here must be InvalidGrantError: the SDK answers anything else with a 500,
|
|
204
|
+
// where a client needs the 400 invalid_grant to know it should start the flow again.
|
|
205
|
+
async validCode(client, authorizationCode) {
|
|
167
206
|
const stored = await this.store.get(`code:${authorizationCode}`);
|
|
168
|
-
if (!stored || stored.expiresAt < Date.now())
|
|
169
|
-
throw new
|
|
207
|
+
if (!stored || stored.expiresAt < Date.now() || stored.credential !== this.credential) {
|
|
208
|
+
throw new InvalidGrantError('Authorization code is invalid or expired');
|
|
209
|
+
}
|
|
170
210
|
if (stored.clientId !== client.client_id)
|
|
171
|
-
throw new
|
|
211
|
+
throw new InvalidGrantError('Authorization code was issued to a different client');
|
|
212
|
+
return stored;
|
|
213
|
+
}
|
|
214
|
+
async challengeForAuthorizationCode(client, authorizationCode) {
|
|
215
|
+
return (await this.validCode(client, authorizationCode)).codeChallenge;
|
|
216
|
+
}
|
|
217
|
+
async exchangeAuthorizationCode(client, authorizationCode, _codeVerifier, redirectUri) {
|
|
218
|
+
const stored = await this.validCode(client, authorizationCode);
|
|
219
|
+
// Optional at the token endpoint because the SDK lets a single-URI client omit it at
|
|
220
|
+
// /authorize too; when sent, it must be the one the code was issued for.
|
|
221
|
+
if (redirectUri !== undefined && redirectUri !== stored.redirectUri) {
|
|
222
|
+
throw new InvalidGrantError('redirect_uri does not match the authorization request');
|
|
223
|
+
}
|
|
172
224
|
// One use only: a replayed code must not mint a second token.
|
|
173
225
|
await this.store.remove(`code:${authorizationCode}`);
|
|
174
|
-
return this.issue(client.client_id, stored.scopes);
|
|
226
|
+
return this.issue(client.client_id, stored.scopes, stored.address);
|
|
175
227
|
}
|
|
176
228
|
async exchangeRefreshToken(client, refreshToken, scopes) {
|
|
177
229
|
const stored = await this.store.get(`refresh:${refreshToken}`);
|
|
178
|
-
if (!stored)
|
|
179
|
-
throw new
|
|
230
|
+
if (!stored || stored.credential !== this.credential)
|
|
231
|
+
throw new InvalidGrantError('Refresh token is invalid');
|
|
180
232
|
if (stored.clientId !== client.client_id)
|
|
181
|
-
throw new
|
|
233
|
+
throw new InvalidGrantError('Refresh token was issued to a different client');
|
|
182
234
|
await this.store.remove(`refresh:${refreshToken}`);
|
|
183
|
-
|
|
235
|
+
if (stored.expiresAt * 1000 < Date.now())
|
|
236
|
+
throw new InvalidGrantError('Refresh token has expired');
|
|
237
|
+
// The refreshed token stays the same person's: a refresh proves possession, not identity.
|
|
238
|
+
return this.issue(client.client_id, scopes ?? stored.scopes, stored.address);
|
|
184
239
|
}
|
|
185
|
-
async issue(clientId, scopes) {
|
|
240
|
+
async issue(clientId, scopes, address) {
|
|
186
241
|
const accessToken = randomBytes(32).toString('hex');
|
|
187
242
|
const refreshToken = randomBytes(32).toString('hex');
|
|
188
243
|
const expiresAt = Math.floor(Date.now() / 1000) + TOKEN_TTL;
|
|
189
|
-
|
|
190
|
-
await this.store.set(`
|
|
244
|
+
const stored = { clientId, scopes, address, credential: this.credential, expiresAt };
|
|
245
|
+
await this.store.set(`token:${accessToken}`, stored, TOKEN_TTL);
|
|
246
|
+
await this.store.set(`refresh:${refreshToken}`, stored, TOKEN_TTL);
|
|
191
247
|
return {
|
|
192
248
|
access_token: accessToken,
|
|
193
249
|
token_type: 'Bearer',
|
|
@@ -196,28 +252,42 @@ export class SingleUserOAuthProvider {
|
|
|
196
252
|
scope: scopes.join(' ')
|
|
197
253
|
};
|
|
198
254
|
}
|
|
199
|
-
/** Accepts an issued token, or
|
|
255
|
+
/** Accepts an issued token, or the static one so a client that can send a header still works. */
|
|
200
256
|
async verifyAccessToken(token) {
|
|
201
|
-
if (constantTimeEquals(token, this.
|
|
257
|
+
if (this.staticToken && constantTimeEquals(token, this.staticToken)) {
|
|
202
258
|
// requireBearerAuth refuses a token with no expiry, and this one never expires.
|
|
203
259
|
return { token, clientId: 'static', scopes: [], expiresAt: Math.floor(Date.now() / 1000) + TOKEN_TTL };
|
|
204
260
|
}
|
|
205
261
|
// Must be InvalidTokenError specifically: the SDK turns anything else into a 500, and
|
|
206
262
|
// a client needs the 401 to know it should authenticate again.
|
|
207
263
|
const stored = await this.store.get(`token:${token}`);
|
|
208
|
-
if (!stored)
|
|
264
|
+
if (!stored || stored.credential !== this.credential)
|
|
209
265
|
throw new InvalidTokenError('Invalid access token');
|
|
210
266
|
if (stored.expiresAt * 1000 < Date.now()) {
|
|
211
267
|
await this.store.remove(`token:${token}`);
|
|
212
268
|
throw new InvalidTokenError('Access token has expired');
|
|
213
269
|
}
|
|
214
|
-
|
|
270
|
+
// `extra.address` is where the tools read the caller's identity from; a token that names
|
|
271
|
+
// nobody leaves it unset, and everything falls back to the shared identity.
|
|
272
|
+
return {
|
|
273
|
+
token,
|
|
274
|
+
clientId: stored.clientId,
|
|
275
|
+
scopes: stored.scopes,
|
|
276
|
+
expiresAt: stored.expiresAt,
|
|
277
|
+
...(stored.address ? { extra: { address: stored.address } } : {})
|
|
278
|
+
};
|
|
215
279
|
}
|
|
216
280
|
async revokeToken(_client, request) {
|
|
217
281
|
await this.store.remove(`token:${request.token}`);
|
|
218
282
|
await this.store.remove(`refresh:${request.token}`);
|
|
219
283
|
}
|
|
220
284
|
}
|
|
285
|
+
/** One shared credential, which is all a self-hosted server needs. */
|
|
286
|
+
export class SingleUserOAuthProvider extends OAuthProvider {
|
|
287
|
+
constructor(accessToken) {
|
|
288
|
+
super(tokenLogin(accessToken), accessToken);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
221
291
|
/** PKCE helper, used by the tests to drive the flow the way a real client would. */
|
|
222
292
|
export function pkce() {
|
|
223
293
|
const verifier = randomBytes(32).toString('base64url');
|
package/dist/oauth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
package/dist/preview.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export interface AssetChange {
|
|
|
16
16
|
to: string;
|
|
17
17
|
amount: string;
|
|
18
18
|
humanAmount?: string;
|
|
19
|
+
/** Set for an ERC-721 transfer, which moves this one token rather than an amount. */
|
|
20
|
+
tokenId?: string;
|
|
19
21
|
}
|
|
20
22
|
export interface TxPreview {
|
|
21
23
|
chain: string;
|
|
@@ -49,6 +51,11 @@ export interface RawTx {
|
|
|
49
51
|
data?: string;
|
|
50
52
|
value?: string;
|
|
51
53
|
}
|
|
54
|
+
export declare function enrichTransfers(chain: ChainName, logs: readonly {
|
|
55
|
+
address: string;
|
|
56
|
+
topics: readonly string[];
|
|
57
|
+
data: string;
|
|
58
|
+
}[]): Promise<AssetChange[]>;
|
|
52
59
|
/**
|
|
53
60
|
* Build the human-readable preview shown in the wallet before signing: decoded calldata
|
|
54
61
|
* plus a simulation of the outcome. Never throws — a preview that cannot be built is
|
package/dist/preview.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,MAAM,CAAA;IACV,gFAAgF;IAChF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE;QACR,YAAY,EAAE,MAAM,CAAA;QACpB,SAAS,EAAE,MAAM,CAAA;QACjB,MAAM,EAAE,YAAY,EAAE,CAAA;QACtB,kFAAkF;QAClF,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,wFAAwF;QACxF,MAAM,EAAE,UAAU,GAAG,SAAS,CAAA;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,UAAU,CAAC,EAAE;QACX,OAAO,EAAE,OAAO,CAAA;QAChB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,YAAY,EAAE,WAAW,EAAE,CAAA;KAC5B,CAAA;CACF;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AA2GD,wBAAsB,eAAe,CACnC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,SAAS;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,0BAiC9E;AA8CD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAgCnG"}
|
package/dist/preview.js
CHANGED
|
@@ -26,14 +26,16 @@ function stringify(value) {
|
|
|
26
26
|
* Decode calldata into labelled fields (clear signing). Token amounts on the standard
|
|
27
27
|
* ERC20 selectors are formatted with on-chain decimals and unlimited approvals flagged.
|
|
28
28
|
*/
|
|
29
|
-
async function decodeCalldata(chain, tx) {
|
|
29
|
+
async function decodeCalldata(chain, tx, from) {
|
|
30
30
|
if (!tx.data || tx.data === '0x')
|
|
31
31
|
return undefined;
|
|
32
32
|
const { abi, source, proxy } = await loadAbi(chain, tx.to);
|
|
33
33
|
const { functionName, args } = decodeFunctionData({ abi, data: tx.data });
|
|
34
|
-
|
|
34
|
+
// By selector, not name: an overloaded name would otherwise pick the wrong inputs.
|
|
35
|
+
const selector = tx.data.slice(0, 10).toLowerCase();
|
|
36
|
+
const abiItem = abi.find((item) => item.type === 'function' && toFunctionSelector(item) === selector);
|
|
35
37
|
const inputs = abiItem?.inputs ?? [];
|
|
36
|
-
const erc20 = ERC20_AMOUNT_ARGS[
|
|
38
|
+
const erc20 = ERC20_AMOUNT_ARGS[selector];
|
|
37
39
|
const meta = erc20 ? await tokenMeta(chain, tx.to).catch(() => ({ symbol: undefined, decimals: undefined })) : undefined;
|
|
38
40
|
const fields = (args ?? []).map((value, i) => {
|
|
39
41
|
const input = inputs[i];
|
|
@@ -70,7 +72,7 @@ async function decodeCalldata(chain, tx) {
|
|
|
70
72
|
});
|
|
71
73
|
// A registry descriptor says what the call means and how the protocol wants each field
|
|
72
74
|
// labelled, which beats raw ABI argument names. Fall back to those when it has none.
|
|
73
|
-
const clearSigning = await resolveClearSigning(chain, tx, named).catch(() => null);
|
|
75
|
+
const clearSigning = await resolveClearSigning(chain, { ...tx, from }, named).catch(() => null);
|
|
74
76
|
if (clearSigning) {
|
|
75
77
|
return {
|
|
76
78
|
functionName,
|
|
@@ -94,11 +96,23 @@ async function decodeCalldata(chain, tx) {
|
|
|
94
96
|
function topicToAddress(topic) {
|
|
95
97
|
return `0x${topic.slice(-40)}`;
|
|
96
98
|
}
|
|
97
|
-
async function enrichTransfers(chain, logs) {
|
|
99
|
+
export async function enrichTransfers(chain, logs) {
|
|
98
100
|
const transfers = logs.filter((log) => log.topics[0]?.toLowerCase() === TRANSFER_TOPIC && log.topics.length >= 3);
|
|
99
101
|
return Promise.all(transfers.map(async (log) => {
|
|
100
|
-
const amount = log.data && log.data !== '0x' ? BigInt(log.data).toString() : '0';
|
|
101
102
|
const meta = await tokenMeta(chain, log.address).catch(() => ({ symbol: undefined, decimals: undefined }));
|
|
103
|
+
// ERC-721 shares ERC-20's Transfer topic but indexes the token id as a fourth topic,
|
|
104
|
+
// leaving the data empty — read as ERC-20, a mint looks like a transfer of nothing.
|
|
105
|
+
if (log.topics.length === 4) {
|
|
106
|
+
return {
|
|
107
|
+
token: log.address,
|
|
108
|
+
symbol: meta.symbol,
|
|
109
|
+
from: topicToAddress(log.topics[1]),
|
|
110
|
+
to: topicToAddress(log.topics[2]),
|
|
111
|
+
amount: '1',
|
|
112
|
+
tokenId: BigInt(log.topics[3]).toString()
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const amount = log.data && log.data !== '0x' ? BigInt(log.data).toString() : '0';
|
|
102
116
|
return {
|
|
103
117
|
token: log.address,
|
|
104
118
|
symbol: meta.symbol,
|
|
@@ -163,7 +177,7 @@ export async function buildTxPreview(chain, tx, from) {
|
|
|
163
177
|
const [decoded, simulation, toLabel] = await Promise.all([
|
|
164
178
|
// A preview that cannot be built must not block the transaction, but swallowing the
|
|
165
179
|
// reason makes "no details shown" impossible to diagnose.
|
|
166
|
-
decodeCalldata(chain, tx).catch((error) => {
|
|
180
|
+
decodeCalldata(chain, tx, from).catch((error) => {
|
|
167
181
|
console.error('[Preview] Could not decode calldata:', error instanceof Error ? error.message : error);
|
|
168
182
|
return undefined;
|
|
169
183
|
}),
|
package/dist/preview.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,kBAAkB,EAAE,WAAW,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAA;AACvH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACvF,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"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"}
|