@metamask-previews/eip-7702-internal-rpc-middleware 0.1.0-preview-5c1b2b1 → 0.1.0-preview-7cfbb337
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/dist/wallet_getAccountUpgradeStatus.cjs.map +1 -1
- package/dist/wallet_getAccountUpgradeStatus.d.cts +1 -1
- package/dist/wallet_getAccountUpgradeStatus.d.cts.map +1 -1
- package/dist/wallet_getAccountUpgradeStatus.d.mts +1 -1
- package/dist/wallet_getAccountUpgradeStatus.d.mts.map +1 -1
- package/dist/wallet_getAccountUpgradeStatus.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet_getAccountUpgradeStatus.cjs","sourceRoot":"","sources":["../src/wallet_getAccountUpgradeStatus.ts"],"names":[],"mappings":";;;AAAA,qDAA+D;AAC/D,
|
|
1
|
+
{"version":3,"file":"wallet_getAccountUpgradeStatus.cjs","sourceRoot":"","sources":["../src/wallet_getAccountUpgradeStatus.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcError, rpcErrors } from '@metamask/rpc-errors';\nimport {\n type JsonRpcRequest,\n type PendingJsonRpcResponse,\n type Hex,\n getErrorMessage,\n} from '@metamask/utils';\n\nimport { DELEGATION_INDICATOR_PREFIX } from './constants';\nimport type { GetAccountUpgradeStatusParams } from './types';\nimport { GetAccountUpgradeStatusParamsStruct } from './types';\nimport { validateParams, validateAndNormalizeAddress } from './utils';\n\nexport type WalletGetAccountUpgradeStatusHooks = {\n getCurrentChainIdForDomain: (origin: string) => Hex | null;\n getCode: (address: string, networkClientId: string) => Promise<string | null>;\n getSelectedNetworkClientIdForChain: (chainId: string) => string | null;\n getPermittedAccountsForOrigin: (origin: string) => Promise<string[]>;\n isEip7702Supported: (request: { address: string; chainId: Hex }) => Promise<{\n isSupported: boolean;\n upgradeContractAddress?: string;\n }>;\n};\n\nconst isAccountUpgraded = async (\n address: string,\n networkClientId: string,\n getCode: (address: string, networkClientId: string) => Promise<string | null>,\n): Promise<{ isUpgraded: boolean; upgradedAddress: Hex | null }> => {\n const code = await getCode(address, networkClientId);\n if (!code || code === '0x' || code.length <= 2) {\n return { isUpgraded: false, upgradedAddress: null };\n }\n\n if (!code.startsWith(DELEGATION_INDICATOR_PREFIX)) {\n return { isUpgraded: false, upgradedAddress: null };\n }\n\n const expectedLength = DELEGATION_INDICATOR_PREFIX.length + 40; // 0xef0100 + 40 hex chars\n if (code.length !== expectedLength) {\n return { isUpgraded: false, upgradedAddress: null };\n }\n\n // Extract the 20-byte address (40 hex characters after the prefix)\n const upgradedAddress = `0x${code.slice(8, 48)}` as const;\n\n return { isUpgraded: true, upgradedAddress };\n};\n\n/**\n * The RPC method handler middleware for `wallet_getAccountUpgradeStatus`\n *\n * @param req - The JSON RPC request's end callback.\n * @param res - The JSON RPC request's pending response object.\n * @param hooks - The hooks required for account upgrade status checking.\n */\nexport async function walletGetAccountUpgradeStatus(\n req: JsonRpcRequest<GetAccountUpgradeStatusParams> & { origin: string },\n res: PendingJsonRpcResponse,\n hooks: WalletGetAccountUpgradeStatusHooks,\n): Promise<void> {\n const { params, origin } = req;\n\n // Validate parameters using Superstruct\n validateParams(params, GetAccountUpgradeStatusParamsStruct);\n\n const { account, chainId } = params;\n\n // Validate and normalize the account address with authorization check\n const normalizedAccount = await validateAndNormalizeAddress(\n account,\n origin,\n hooks.getPermittedAccountsForOrigin,\n );\n\n // Use current chain ID if not provided\n let targetChainId: Hex;\n if (chainId !== undefined) {\n targetChainId = chainId;\n } else {\n const currentChainIdForDomain = hooks.getCurrentChainIdForDomain(origin);\n if (!currentChainIdForDomain) {\n throw rpcErrors.invalidParams({\n message: `Could not determine current chain ID for origin: ${origin}`,\n });\n }\n targetChainId = currentChainIdForDomain;\n }\n\n const { isSupported } = await hooks.isEip7702Supported({\n address: normalizedAccount,\n chainId: targetChainId,\n });\n\n if (!isSupported) {\n res.result = {\n isSupported,\n account: normalizedAccount,\n isUpgraded: false,\n upgradedAddress: null,\n chainId: targetChainId,\n };\n return;\n }\n\n try {\n // Get the network configuration for the target chain\n const hexChainId = targetChainId;\n const networkClientId =\n hooks.getSelectedNetworkClientIdForChain(hexChainId);\n\n if (!networkClientId) {\n throw rpcErrors.invalidParams({\n message: `Network client ID not found for chain ID ${targetChainId}`,\n });\n }\n\n // Check if the account is upgraded using the EIP7702 utils\n const { isUpgraded, upgradedAddress } = await isAccountUpgraded(\n normalizedAccount,\n networkClientId,\n hooks.getCode,\n );\n\n res.result = {\n isSupported,\n account: normalizedAccount,\n isUpgraded,\n upgradedAddress,\n chainId: targetChainId,\n };\n } catch (error) {\n // Re-throw RPC errors as-is\n if (error instanceof JsonRpcError) {\n throw error;\n }\n throw rpcErrors.internal({\n message: `Failed to get account upgrade status: ${getErrorMessage(error)}`,\n });\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type JsonRpcRequest, type PendingJsonRpcResponse, type Hex } from "@metamask/utils";
|
|
2
2
|
import type { GetAccountUpgradeStatusParams } from "./types.cjs";
|
|
3
3
|
export type WalletGetAccountUpgradeStatusHooks = {
|
|
4
4
|
getCurrentChainIdForDomain: (origin: string) => Hex | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet_getAccountUpgradeStatus.d.cts","sourceRoot":"","sources":["../src/wallet_getAccountUpgradeStatus.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wallet_getAccountUpgradeStatus.d.cts","sourceRoot":"","sources":["../src/wallet_getAccountUpgradeStatus.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,GAAG,EAET,wBAAwB;AAGzB,OAAO,KAAK,EAAE,6BAA6B,EAAE,oBAAgB;AAI7D,MAAM,MAAM,kCAAkC,GAAG;IAC/C,0BAA0B,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC;IAC3D,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9E,kCAAkC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACvE,6BAA6B,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,kBAAkB,EAAE,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,KAAK,OAAO,CAAC;QAC1E,WAAW,EAAE,OAAO,CAAC;QACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC,CAAC;CACJ,CAAC;AA2BF;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,cAAc,CAAC,6BAA6B,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EACvE,GAAG,EAAE,sBAAsB,EAC3B,KAAK,EAAE,kCAAkC,GACxC,OAAO,CAAC,IAAI,CAAC,CAgFf"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type JsonRpcRequest, type PendingJsonRpcResponse, type Hex } from "@metamask/utils";
|
|
2
2
|
import type { GetAccountUpgradeStatusParams } from "./types.mjs";
|
|
3
3
|
export type WalletGetAccountUpgradeStatusHooks = {
|
|
4
4
|
getCurrentChainIdForDomain: (origin: string) => Hex | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet_getAccountUpgradeStatus.d.mts","sourceRoot":"","sources":["../src/wallet_getAccountUpgradeStatus.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wallet_getAccountUpgradeStatus.d.mts","sourceRoot":"","sources":["../src/wallet_getAccountUpgradeStatus.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,GAAG,EAET,wBAAwB;AAGzB,OAAO,KAAK,EAAE,6BAA6B,EAAE,oBAAgB;AAI7D,MAAM,MAAM,kCAAkC,GAAG;IAC/C,0BAA0B,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC;IAC3D,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9E,kCAAkC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACvE,6BAA6B,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,kBAAkB,EAAE,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,KAAK,OAAO,CAAC;QAC1E,WAAW,EAAE,OAAO,CAAC;QACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;KACjC,CAAC,CAAC;CACJ,CAAC;AA2BF;;;;;;GAMG;AACH,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,cAAc,CAAC,6BAA6B,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EACvE,GAAG,EAAE,sBAAsB,EAC3B,KAAK,EAAE,kCAAkC,GACxC,OAAO,CAAC,IAAI,CAAC,CAgFf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet_getAccountUpgradeStatus.mjs","sourceRoot":"","sources":["../src/wallet_getAccountUpgradeStatus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,6BAA6B;AAC/D,OAAO,
|
|
1
|
+
{"version":3,"file":"wallet_getAccountUpgradeStatus.mjs","sourceRoot":"","sources":["../src/wallet_getAccountUpgradeStatus.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcError, rpcErrors } from '@metamask/rpc-errors';\nimport {\n type JsonRpcRequest,\n type PendingJsonRpcResponse,\n type Hex,\n getErrorMessage,\n} from '@metamask/utils';\n\nimport { DELEGATION_INDICATOR_PREFIX } from './constants';\nimport type { GetAccountUpgradeStatusParams } from './types';\nimport { GetAccountUpgradeStatusParamsStruct } from './types';\nimport { validateParams, validateAndNormalizeAddress } from './utils';\n\nexport type WalletGetAccountUpgradeStatusHooks = {\n getCurrentChainIdForDomain: (origin: string) => Hex | null;\n getCode: (address: string, networkClientId: string) => Promise<string | null>;\n getSelectedNetworkClientIdForChain: (chainId: string) => string | null;\n getPermittedAccountsForOrigin: (origin: string) => Promise<string[]>;\n isEip7702Supported: (request: { address: string; chainId: Hex }) => Promise<{\n isSupported: boolean;\n upgradeContractAddress?: string;\n }>;\n};\n\nconst isAccountUpgraded = async (\n address: string,\n networkClientId: string,\n getCode: (address: string, networkClientId: string) => Promise<string | null>,\n): Promise<{ isUpgraded: boolean; upgradedAddress: Hex | null }> => {\n const code = await getCode(address, networkClientId);\n if (!code || code === '0x' || code.length <= 2) {\n return { isUpgraded: false, upgradedAddress: null };\n }\n\n if (!code.startsWith(DELEGATION_INDICATOR_PREFIX)) {\n return { isUpgraded: false, upgradedAddress: null };\n }\n\n const expectedLength = DELEGATION_INDICATOR_PREFIX.length + 40; // 0xef0100 + 40 hex chars\n if (code.length !== expectedLength) {\n return { isUpgraded: false, upgradedAddress: null };\n }\n\n // Extract the 20-byte address (40 hex characters after the prefix)\n const upgradedAddress = `0x${code.slice(8, 48)}` as const;\n\n return { isUpgraded: true, upgradedAddress };\n};\n\n/**\n * The RPC method handler middleware for `wallet_getAccountUpgradeStatus`\n *\n * @param req - The JSON RPC request's end callback.\n * @param res - The JSON RPC request's pending response object.\n * @param hooks - The hooks required for account upgrade status checking.\n */\nexport async function walletGetAccountUpgradeStatus(\n req: JsonRpcRequest<GetAccountUpgradeStatusParams> & { origin: string },\n res: PendingJsonRpcResponse,\n hooks: WalletGetAccountUpgradeStatusHooks,\n): Promise<void> {\n const { params, origin } = req;\n\n // Validate parameters using Superstruct\n validateParams(params, GetAccountUpgradeStatusParamsStruct);\n\n const { account, chainId } = params;\n\n // Validate and normalize the account address with authorization check\n const normalizedAccount = await validateAndNormalizeAddress(\n account,\n origin,\n hooks.getPermittedAccountsForOrigin,\n );\n\n // Use current chain ID if not provided\n let targetChainId: Hex;\n if (chainId !== undefined) {\n targetChainId = chainId;\n } else {\n const currentChainIdForDomain = hooks.getCurrentChainIdForDomain(origin);\n if (!currentChainIdForDomain) {\n throw rpcErrors.invalidParams({\n message: `Could not determine current chain ID for origin: ${origin}`,\n });\n }\n targetChainId = currentChainIdForDomain;\n }\n\n const { isSupported } = await hooks.isEip7702Supported({\n address: normalizedAccount,\n chainId: targetChainId,\n });\n\n if (!isSupported) {\n res.result = {\n isSupported,\n account: normalizedAccount,\n isUpgraded: false,\n upgradedAddress: null,\n chainId: targetChainId,\n };\n return;\n }\n\n try {\n // Get the network configuration for the target chain\n const hexChainId = targetChainId;\n const networkClientId =\n hooks.getSelectedNetworkClientIdForChain(hexChainId);\n\n if (!networkClientId) {\n throw rpcErrors.invalidParams({\n message: `Network client ID not found for chain ID ${targetChainId}`,\n });\n }\n\n // Check if the account is upgraded using the EIP7702 utils\n const { isUpgraded, upgradedAddress } = await isAccountUpgraded(\n normalizedAccount,\n networkClientId,\n hooks.getCode,\n );\n\n res.result = {\n isSupported,\n account: normalizedAccount,\n isUpgraded,\n upgradedAddress,\n chainId: targetChainId,\n };\n } catch (error) {\n // Re-throw RPC errors as-is\n if (error instanceof JsonRpcError) {\n throw error;\n }\n throw rpcErrors.internal({\n message: `Failed to get account upgrade status: ${getErrorMessage(error)}`,\n });\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/eip-7702-internal-rpc-middleware",
|
|
3
|
-
"version": "0.1.0-preview-
|
|
3
|
+
"version": "0.1.0-preview-7cfbb337",
|
|
4
4
|
"description": "Implements internal JSON-RPC methods for EIP-7702 account upgrade functionality",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|