FRE-600: Fix code review blockers

- Consolidated duplicate UndoManagers to single instance
- Fixed connection promise to only resolve on 'connected' status
- Fixed WebSocketProvider import (WebsocketProvider)
- Added proper doc.destroy() cleanup
- Renamed isPresenceInitialized property to avoid conflict

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
2026-04-25 00:08:01 -04:00
parent 65b552bb08
commit 7c684a42cc
48450 changed files with 5679671 additions and 383 deletions

View File

@@ -0,0 +1,64 @@
// TODO(v3): Remove this.
import { sendCalls, } from '../../../actions/wallet/sendCalls.js';
import { encodeFunctionData, } from '../../../utils/abi/encodeFunctionData.js';
import { getAction } from '../../../utils/getAction.js';
/**
* Requests for the wallet to sign and broadcast a batch of write contract calls (transactions) to the network.
*
* - Docs: https://viem.sh/experimental/eip5792/writeContracts
*
* @param client - Client to use
* @param parameters - {@link WriteContractsParameters}
* @returns Unique identifier for the call batch. {@link WriteContractsReturnType}
*
* @example
* import { createPublicClient, http, parseAbi } from 'viem'
* import { mainnet } from 'viem/chains'
* import { writeContracts } from 'viem/experimental'
*
* const client = createPublicClient({
* chain: mainnet,
* transport: http(),
* })
* const abi = parseAbi([
* 'function approve(address, uint256) returns (bool)',
* 'function transferFrom(address, address, uint256) returns (bool)',
* ])
* const id = await writeContracts(client, {
* contracts: [
* {
* address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
* abi,
* functionName: 'approve',
* args: ['0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC', 100n],
* },
* {
* address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
* abi,
* functionName: 'transferFrom',
* args: [
* '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',
* '0x0000000000000000000000000000000000000000',
* 100n
* ],
* },
* ],
* })
*/
export async function writeContracts(client, parameters) {
const contracts = parameters.contracts;
const calls = contracts.map((contract) => {
const { address, abi, functionName, args, value } = contract;
return {
data: encodeFunctionData({
abi,
functionName,
args,
}),
to: address,
value,
};
});
return getAction(client, sendCalls, 'sendCalls')({ ...parameters, calls });
}
//# sourceMappingURL=writeContracts.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"writeContracts.js","sourceRoot":"","sources":["../../../../experimental/eip5792/actions/writeContracts.ts"],"names":[],"mappings":"AAAA,yBAAyB;AAIzB,OAAO,EAIL,SAAS,GACV,MAAM,sCAAsC,CAAA;AAc7C,OAAO,EAEL,kBAAkB,GACnB,MAAM,0CAA0C,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AA0BvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAMlC,MAAgC,EAChC,UAKC;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,SAA8C,CAAA;IAC3E,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACvC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAA;QAC5D,OAAO;YACL,IAAI,EAAE,kBAAkB,CAAC;gBACvB,GAAG;gBACH,YAAY;gBACZ,IAAI;aACL,CAAC;YACF,EAAE,EAAE,OAAO;YACX,KAAK;SACyC,CAAA;IAClD,CAAC,CAAC,CAAA;IACF,OAAO,SAAS,CACd,MAAM,EACN,SAAS,EACT,WAAW,CACZ,CAAC,EAAE,GAAG,UAAU,EAAE,KAAK,EAAyB,CAAC,CAAA;AACpD,CAAC"}

View File

@@ -0,0 +1,37 @@
// TODO(v3): Remove this.
import { getCallsStatus, } from '../../../actions/wallet/getCallsStatus.js';
import { getCapabilities, } from '../../../actions/wallet/getCapabilities.js';
import { sendCalls, } from '../../../actions/wallet/sendCalls.js';
import { showCallsStatus, } from '../../../actions/wallet/showCallsStatus.js';
import { waitForCallsStatus, } from '../../../actions/wallet/waitForCallsStatus.js';
import { writeContracts, } from '../actions/writeContracts.js';
/**
* A suite of EIP-5792 Wallet Actions.
*
* - Docs: https://viem.sh/experimental
*
* @example
* import { createPublicClient, createWalletClient, http } from 'viem'
* import { mainnet } from 'viem/chains'
* import { eip5792Actions } from 'viem/experimental'
*
* const walletClient = createWalletClient({
* chain: mainnet,
* transport: http(),
* }).extend(eip5792Actions())
*
* const hash = await walletClient.sendCalls({...})
*/
export function eip5792Actions() {
return (client) => {
return {
getCallsStatus: (parameters) => getCallsStatus(client, parameters),
getCapabilities: ((parameters) => getCapabilities(client, parameters)),
sendCalls: (parameters) => sendCalls(client, parameters),
showCallsStatus: (parameters) => showCallsStatus(client, parameters),
waitForCallsStatus: (parameters) => waitForCallsStatus(client, parameters),
writeContracts: (parameters) => writeContracts(client, parameters),
};
};
}
//# sourceMappingURL=eip5792.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"eip5792.js","sourceRoot":"","sources":["../../../../experimental/eip5792/decorators/eip5792.ts"],"names":[],"mappings":"AAAA,yBAAyB;AAEzB,OAAO,EAGL,cAAc,GACf,MAAM,2CAA2C,CAAA;AAClD,OAAO,EAGL,eAAe,GAChB,MAAM,4CAA4C,CAAA;AACnD,OAAO,EAGL,SAAS,GACV,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAGL,eAAe,GAChB,MAAM,4CAA4C,CAAA;AACnD,OAAO,EAGL,kBAAkB,GACnB,MAAM,+CAA+C,CAAA;AAKtD,OAAO,EAGL,cAAc,GACf,MAAM,8BAA8B,CAAA;AA0MrC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,CAKL,MAAyC,EACT,EAAE;QAClC,OAAO;YACL,cAAc,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC;YAClE,eAAe,EAAE,CAAC,CAAC,UAAe,EAAE,EAAE,CACpC,eAAe,CAAC,MAAa,EAAE,UAAU,CAAC,CAAQ;YACpD,SAAS,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC;YACxD,eAAe,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC;YACpE,kBAAkB,EAAE,CAAC,UAAU,EAAE,EAAE,CACjC,kBAAkB,CAAC,MAAM,EAAE,UAAU,CAAC;YACxC,cAAc,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC;SACnE,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}

View File

@@ -0,0 +1,130 @@
import { numberToHex, parseAccount } from '../../../utils/index.js';
/**
* Request permissions from a wallet to perform actions on behalf of a user.
*
* - Docs: https://viem.sh/experimental/erc7715/grantPermissions
*
* @example
* import { createWalletClient, custom } from 'viem'
* import { mainnet } from 'viem/chains'
* import { grantPermissions } from 'viem/experimental'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* })
*
* const result = await grantPermissions(client, {
* expiry: 1716846083638,
* permissions: [
* {
* type: 'native-token-transfer',
* data: {
* ticker: 'ETH',
* },
* policies: [
* {
* type: 'token-allowance',
* data: {
* allowance: parseEther('1'),
* },
* }
* ],
* required: true,
* },
* ],
* })
*/
export async function grantPermissions(client, parameters) {
const { account, expiry, permissions, signer } = parameters;
const result = await client.request({
method: 'wallet_grantPermissions',
params: [
formatParameters({ account, expiry, permissions, signer }),
],
}, { retryCount: 0 });
return formatRequest(result);
}
function formatParameters(parameters) {
const { expiry, permissions, signer: signer_ } = parameters;
const account = parameters.account
? parseAccount(parameters.account)
: undefined;
const signer = (() => {
if (!account && !signer_)
return undefined;
// JSON-RPC Account as signer.
if (account?.type === 'json-rpc')
return {
type: 'wallet',
};
// Local Account as signer.
if (account?.type === 'local')
return {
type: 'account',
data: {
id: account.address,
},
};
// ERC-7715 Signer as signer.
return signer_;
})();
return {
expiry,
permissions: permissions.map((permission) => ({
...permission,
policies: permission.policies.map((policy) => {
const data = (() => {
if (policy.type === 'token-allowance')
return {
allowance: numberToHex(policy.data.allowance),
};
if (policy.type === 'gas-limit')
return {
limit: numberToHex(policy.data.limit),
};
return policy.data;
})();
return {
data,
type: typeof policy.type === 'string' ? policy.type : policy.type.custom,
};
}),
required: permission.required ?? false,
type: typeof permission.type === 'string'
? permission.type
: permission.type.custom,
})),
...(signer ? { signer } : {}),
};
}
function formatRequest(result) {
return {
expiry: result.expiry,
...(result.factory ? { factory: result.factory } : {}),
...(result.factoryData ? { factoryData: result.factoryData } : {}),
grantedPermissions: result.grantedPermissions.map((permission) => ({
...permission,
policies: permission.policies.map((policy) => {
const data = (() => {
if (policy.type === 'token-allowance')
return {
allowance: BigInt(policy.data.allowance),
};
if (policy.type === 'gas-limit')
return {
limit: BigInt(policy.data.limit),
};
return policy.data;
})();
return {
data,
type: policy.type,
};
}),
})),
permissionsContext: result.permissionsContext,
...(result.signerData ? { signerData: result.signerData } : {}),
};
}
//# sourceMappingURL=grantPermissions.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"grantPermissions.js","sourceRoot":"","sources":["../../../../experimental/erc7715/actions/grantPermissions.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,26 @@
import { grantPermissions, } from '../actions/grantPermissions.js';
/**
* A suite of ERC-7715 Wallet Actions.
*
* - Docs: https://viem.sh/experimental
*
* @example
* import { createPublicClient, createWalletClient, http } from 'viem'
* import { mainnet } from 'viem/chains'
* import { erc7715Actions } from 'viem/experimental'
*
* const walletClient = createWalletClient({
* chain: mainnet,
* transport: http(),
* }).extend(erc7715Actions())
*
* const result = await walletClient.grantPermissions({...})
*/
export function erc7715Actions() {
return (client) => {
return {
grantPermissions: (parameters) => grantPermissions(client, parameters),
};
};
}
//# sourceMappingURL=erc7715.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"erc7715.js","sourceRoot":"","sources":["../../../../experimental/erc7715/decorators/erc7715.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,gBAAgB,GACjB,MAAM,gCAAgC,CAAA;AA0CvC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,CAKL,MAAyC,EACzB,EAAE;QAClB,OAAO;YACL,gBAAgB,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC;SACvE,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}

View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=permission.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"permission.js","sourceRoot":"","sources":["../../../../experimental/erc7715/types/permission.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=policy.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../../experimental/erc7715/types/policy.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=signer.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"signer.js","sourceRoot":"","sources":["../../../../experimental/erc7715/types/signer.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,84 @@
import { parseAccount } from '../../../accounts/utils/parseAccount.js';
import { getEip712Domain, } from '../../../actions/public/getEip712Domain.js';
import { signTypedData } from '../../../actions/wallet/signTypedData.js';
import { AccountNotFoundError } from '../../../errors/account.js';
import { getAction } from '../../../utils/getAction.js';
import { toPrefixedMessage } from '../../../utils/signature/toPrefixedMessage.js';
/**
* Signs a [EIP-191](https://eips.ethereum.org/EIPS/eip-191) personal sign message via [ERC-7739 `PersonalSign` format](https://eips.ethereum.org/EIPS/eip-7702).
*
* This Action is suitable to sign messages for Smart Accounts that implement (or conform to) [ERC-7739](https://eips.ethereum.org/EIPS/eip-7702) (e.g. Solady's [ERC1271.sol](https://github.com/Vectorized/solady/blob/main/src/accounts/ERC1271.sol)).
*
* - Docs: https://viem.sh/experimental/erc7739/signMessage
*
* With the calculated signature, you can:
* - use [`verifyMessage`](https://viem.sh/docs/utilities/verifyMessage) to verify the signature,
*
* @param client - Client to use
* @param parameters - {@link SignMessageParameters}
* @returns The signed message. {@link SignMessageReturnType}
*
* @example
* import { createWalletClient, custom } from 'viem'
* import { mainnet } from 'viem/chains'
* import { signMessage } from 'viem/experimental/erc7739'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* })
*
* const signature = await signMessage(client, {
* account: '0xE8Df82fA4E10e6A12a9Dab552bceA2acd26De9bb',
* message: 'hello world',
* verifier: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* })
*
* @example
* // Account Hoisting
* import { createWalletClient, custom } from 'viem'
* import { privateKeyToAccount } from 'viem/accounts'
* import { mainnet } from 'viem/chains'
* import { signMessage } from 'viem/experimental/erc7739'
*
* const client = createWalletClient({
* account: '0xE8Df82fA4E10e6A12a9Dab552bceA2acd26De9bb',
* chain: mainnet,
* transport: custom(window.ethereum),
* })
*
* const signature = await signMessage(client, {
* message: 'hello world',
* verifier: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* })
*/
export async function signMessage(client, parameters) {
const { account: account_ = client.account, factory, factoryData, message, verifier, } = parameters;
if (!account_)
throw new AccountNotFoundError({
docsPath: '/experimental/erc7739/signMessage',
});
const account = parseAccount(account_);
const { salt: _, ...domain } = await (async () => {
if (parameters.verifierDomain)
return parameters.verifierDomain;
const { domain } = await getAction(client, getEip712Domain, 'getEip712Domain')({
address: verifier,
factory,
factoryData,
});
return domain;
})();
return getAction(client, signTypedData, 'signTypedData')({
account,
domain,
types: {
PersonalSign: [{ name: 'prefixed', type: 'bytes' }],
},
primaryType: 'PersonalSign',
message: {
prefixed: toPrefixedMessage(message),
},
});
}
//# sourceMappingURL=signMessage.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"signMessage.js","sourceRoot":"","sources":["../../../../experimental/erc7739/actions/signMessage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AACtE,OAAO,EAEL,eAAe,GAChB,MAAM,4CAA4C,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAA;AAGxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAMjE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAA;AAgCjF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAK/B,MAAyC,EACzC,UAA2D;IAE3D,MAAM,EACJ,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,OAAO,EAClC,OAAO,EACP,WAAW,EACX,OAAO,EACP,QAAQ,GACT,GAAG,UAAU,CAAA;IAEd,IAAI,CAAC,QAAQ;QACX,MAAM,IAAI,oBAAoB,CAAC;YAC7B,QAAQ,EAAE,mCAAmC;SAC9C,CAAC,CAAA;IACJ,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IAEtC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;QAC/C,IAAI,UAAU,CAAC,cAAc;YAAE,OAAO,UAAU,CAAC,cAAc,CAAA;QAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,MAAM,EACN,eAAe,EACf,iBAAiB,CAClB,CAAC;YACA,OAAO,EAAE,QAAS;YAClB,OAAO;YACP,WAAW;SACZ,CAAC,CAAA;QACF,OAAO,MAAM,CAAA;IACf,CAAC,CAAC,EAAE,CAAA;IAEJ,OAAO,SAAS,CACd,MAAM,EACN,aAAa,EACb,eAAe,CAChB,CAAC;QACA,OAAO;QACP,MAAM;QACN,KAAK,EAAE;YACL,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SACpD;QACD,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE;YACP,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC;SACrC;KACF,CAAC,CAAA;AACJ,CAAC"}

View File

@@ -0,0 +1,154 @@
import { parseAccount } from '../../../accounts/utils/parseAccount.js';
import { getEip712Domain, } from '../../../actions/public/getEip712Domain.js';
import { signTypedData as signTypedData_ } from '../../../actions/wallet/signTypedData.js';
import { AccountNotFoundError } from '../../../errors/account.js';
import { getAction } from '../../../utils/getAction.js';
import { wrapTypedDataSignature } from '../utils/wrapTypedDataSignature.js';
/**
* Signs an [EIP-712](https://eips.ethereum.org/EIPS/eip-712) typed data message via [ERC-7739 `TypedDataSign` format](https://eips.ethereum.org/EIPS/eip-7702).
*
* This Action is suitable to sign messages for Smart Accounts that implement (or conform to) [ERC-7739](https://eips.ethereum.org/EIPS/eip-7702) (e.g. Solady's [ERC1271.sol](https://github.com/Vectorized/solady/blob/main/src/accounts/ERC1271.sol)).
*
* - Docs: https://viem.sh/experimental/erc7739/signTypedData
*
* @param client - Client to use
* @param parameters - {@link SignTypedDataParameters}
* @returns The signed data. {@link SignTypedDataReturnType}
*
* @example
* import { createWalletClient, custom } from 'viem'
* import { mainnet } from 'viem/chains'
* import { signTypedData } from 'viem/experimental/erc7739'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* })
* const signature = await signTypedData(client, {
* account: '0xE8Df82fA4E10e6A12a9Dab552bceA2acd26De9bb',
* domain: {
* name: 'Ether Mail',
* version: '1',
* chainId: 1,
* verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
* },
* types: {
* Person: [
* { name: 'name', type: 'string' },
* { name: 'wallet', type: 'address' },
* ],
* Mail: [
* { name: 'from', type: 'Person' },
* { name: 'to', type: 'Person' },
* { name: 'contents', type: 'string' },
* ],
* },
* primaryType: 'Mail',
* message: {
* from: {
* name: 'Cow',
* wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',
* },
* to: {
* name: 'Bob',
* wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',
* },
* contents: 'Hello, Bob!',
* },
* verifier: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* })
*
* @example
* // Account Hoisting
* import { createWalletClient, http } from 'viem'
* import { privateKeyToAccount } from 'viem/accounts'
* import { mainnet } from 'viem/chains'
* import { signTypedData } from 'viem/experimental/erc7739'
*
* const client = createWalletClient({
* account: '0xE8Df82fA4E10e6A12a9Dab552bceA2acd26De9bb'
* chain: mainnet,
* transport: http(),
* })
* const signature = await signTypedData(client, {
* domain: {
* name: 'Ether Mail',
* version: '1',
* chainId: 1,
* verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
* },
* types: {
* Person: [
* { name: 'name', type: 'string' },
* { name: 'wallet', type: 'address' },
* ],
* Mail: [
* { name: 'from', type: 'Person' },
* { name: 'to', type: 'Person' },
* { name: 'contents', type: 'string' },
* ],
* },
* primaryType: 'Mail',
* message: {
* from: {
* name: 'Cow',
* wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',
* },
* to: {
* name: 'Bob',
* wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',
* },
* contents: 'Hello, Bob!',
* },
* verifier: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
* })
*/
export async function signTypedData(client, parameters) {
const { account: account_ = client.account, domain, factory, factoryData, message, primaryType, types, verifier, } = parameters;
if (!account_)
throw new AccountNotFoundError({
docsPath: '/experimental/erc7739/signTypedData',
});
const account = parseAccount(account_);
// Retrieve account EIP712 domain.
const { domain: verifierDomain } = await (async () => {
if (parameters.verifierDomain)
return {
domain: parameters.verifierDomain,
};
return getAction(client, getEip712Domain, 'getEip712Domain')({
address: verifier,
factory,
factoryData,
});
})();
// Sign with typed data wrapper.
const signature = await getAction(client, signTypedData_, 'signTypedData')({
account,
domain,
types: {
...types,
TypedDataSign: [
{ name: 'contents', type: primaryType },
{ name: 'name', type: 'string' },
{ name: 'version', type: 'string' },
{ name: 'chainId', type: 'uint256' },
{ name: 'verifyingContract', type: 'address' },
{ name: 'salt', type: 'bytes32' },
],
},
primaryType: 'TypedDataSign',
message: {
contents: message,
...verifierDomain,
},
});
return wrapTypedDataSignature({
domain,
message,
primaryType,
signature,
types,
});
}
//# sourceMappingURL=signTypedData.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"signTypedData.js","sourceRoot":"","sources":["../../../../experimental/erc7739/actions/signTypedData.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AACtE,OAAO,EAEL,eAAe,GAChB,MAAM,4CAA4C,CAAA;AACnD,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,MAAM,0CAA0C,CAAA;AAG1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAOjE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAA;AAmC3E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAOjC,MAAyC,EACzC,UAKC;IAED,MAAM,EACJ,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC,OAAO,EAClC,MAAM,EACN,OAAO,EACP,WAAW,EACX,OAAO,EACP,WAAW,EACX,KAAK,EACL,QAAQ,GACT,GAAG,UAAgD,CAAA;IAEpD,IAAI,CAAC,QAAQ;QACX,MAAM,IAAI,oBAAoB,CAAC;YAC7B,QAAQ,EAAE,qCAAqC;SAChD,CAAC,CAAA;IACJ,MAAM,OAAO,GAAG,YAAY,CAAC,QAAS,CAAC,CAAA;IAEvC,kCAAkC;IAClC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;QACnD,IAAI,UAAU,CAAC,cAAc;YAC3B,OAAO;gBACL,MAAM,EAAE,UAAU,CAAC,cAAc;aAClC,CAAA;QACH,OAAO,SAAS,CACd,MAAM,EACN,eAAe,EACf,iBAAiB,CAClB,CAAC;YACA,OAAO,EAAE,QAAS;YAClB,OAAO;YACP,WAAW;SACZ,CAAC,CAAA;IACJ,CAAC,CAAC,EAAE,CAAA;IAEJ,gCAAgC;IAChC,MAAM,SAAS,GAAG,MAAM,SAAS,CAC/B,MAAM,EACN,cAAc,EACd,eAAe,CAChB,CAAC;QACA,OAAO;QACP,MAAM;QACN,KAAK,EAAE;YACL,GAAG,KAAK;YACR,aAAa,EAAE;gBACb,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE;gBACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAChC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;gBACpC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC9C,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE;aAClC;SACF;QACD,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE;YACP,QAAQ,EAAE,OAAc;YACxB,GAAI,cAAsB;SAC3B;KACF,CAAC,CAAA;IAEF,OAAO,sBAAsB,CAAC;QAC5B,MAAM;QACN,OAAO;QACP,WAAW;QACX,SAAS;QACT,KAAK;KACN,CAAC,CAAA;AACJ,CAAC"}

View File

@@ -0,0 +1,27 @@
import { signMessage, } from '../actions/signMessage.js';
import { signTypedData, } from '../actions/signTypedData.js';
/**
* A suite of Actions based on [Solady contracts](https://github.com/Vectorized/solady).
*
* @example
* import { createPublicClient, createWalletClient, http } from 'viem'
* import { mainnet } from 'viem/chains'
* import { erc7739Actions } from 'viem/experimental'
*
* const walletClient = createWalletClient({
* chain: mainnet,
* transport: http(),
* }).extend(erc7739Actions())
*
* const result = await walletClient.signMessage({...})
*/
export function erc7739Actions(parameters = {}) {
const { verifier } = parameters;
return (client) => {
return {
signMessage: (parameters) => signMessage(client, { verifier, ...parameters }),
signTypedData: (parameters) => signTypedData(client, { verifier, ...parameters }),
};
};
}
//# sourceMappingURL=erc7739.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"erc7739.js","sourceRoot":"","sources":["../../../../experimental/erc7739/decorators/erc7739.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,WAAW,GACZ,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAGL,aAAa,GACd,MAAM,6BAA6B,CAAA;AAwLpC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAE5B,aAAiD,EAAE;IACnD,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAA;IAC/B,OAAO,CAKL,MAAyC,EACN,EAAE;QACrC,OAAO;YACL,WAAW,EAAE,CAAC,UAAU,EAAE,EAAE,CAC1B,WAAW,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAG,UAAU,EAAE,CAAC;YAClD,aAAa,EAAE,CAAC,UAAU,EAAE,EAAE,CAC5B,aAAa,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,GAAI,UAAkB,EAAE,CAAC;SAC9D,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}

8
node_modules/viem/_esm/experimental/erc7739/index.js generated vendored Normal file
View File

@@ -0,0 +1,8 @@
// biome-ignore lint/performance/noBarrelFile: entrypoint
export { signMessage, } from './actions/signMessage.js';
export { signTypedData, } from './actions/signTypedData.js';
export { erc7739Actions, } from './decorators/erc7739.js';
export { hashMessage, } from './utils/hashMessage.js';
export { hashTypedData, } from './utils/hashTypedData.js';
export { wrapTypedDataSignature, } from './utils/wrapTypedDataSignature.js';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../experimental/erc7739/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAIL,WAAW,GACZ,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAIL,aAAa,GACd,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAGL,cAAc,GACf,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAIL,WAAW,GACZ,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAIL,aAAa,GACd,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAIL,sBAAsB,GACvB,MAAM,mCAAmC,CAAA"}

2
node_modules/viem/_esm/experimental/erc7739/types.js generated vendored Normal file
View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=types.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../experimental/erc7739/types.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,32 @@
import { hashTypedData } from '../../../utils/index.js';
import { toPrefixedMessage, } from '../../../utils/signature/toPrefixedMessage.js';
/**
* Generates a signable hash for a ERC-7739 personal sign message.
*
* @example
* ```ts
* const hash = hashMessage({
* message: 'hello world',
* verifierDomain: {
* name: 'Smart Account',
* version: '1',
* verifyingContract: '0x1234567890abcdef1234567890abcdef12345678',
* chainId: 1,
* },
* })
* ```
*/
export function hashMessage(parameters) {
const { message, verifierDomain: { salt: _, ...domain }, } = parameters;
return hashTypedData({
domain,
types: {
PersonalSign: [{ name: 'prefixed', type: 'bytes' }],
},
primaryType: 'PersonalSign',
message: {
prefixed: toPrefixedMessage(message),
},
});
}
//# sourceMappingURL=hashMessage.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"hashMessage.js","sourceRoot":"","sources":["../../../../experimental/erc7739/utils/hashMessage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAEvD,OAAO,EAEL,iBAAiB,GAClB,MAAM,+CAA+C,CAAA;AAiBtD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,WAAW,CACzB,UAAiC;IAEjC,MAAM,EACJ,OAAO,EACP,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,GACvC,GAAG,UAAU,CAAA;IACd,OAAO,aAAa,CAAC;QACnB,MAAM;QACN,KAAK,EAAE;YACL,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;SACpD;QACD,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE;YACP,QAAQ,EAAE,iBAAiB,CAAC,OAAO,CAAC;SACrC;KACF,CAAC,CAAA;AACJ,CAAC"}

View File

@@ -0,0 +1,68 @@
import { hashTypedData as hashTypedData_, } from '../../../utils/signature/hashTypedData.js';
/**
* Generates a signable hash for ERC-7739 typed data.
*
* @example
* ```ts
* const hash = hashTypedData({
* domain: {
* name: 'Ether Mail',
* version: '1',
* chainId: 1,
* verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
* },
* types: {
* Person: [
* { name: 'name', type: 'string' },
* { name: 'wallet', type: 'address' },
* ],
* Mail: [
* { name: 'from', type: 'Person' },
* { name: 'to', type: 'Person' },
* { name: 'contents', type: 'string' },
* ],
* },
* primaryType: 'Mail',
* message: {
* from: {
* name: 'Cow',
* wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',
* },
* to: {
* name: 'Bob',
* wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',
* },
* contents: 'Hello, Bob!',
* },
* verifierDomain: {
* name: 'Smart Account',
* version: '1',
* verifyingContract: '0x1234567890abcdef1234567890abcdef12345678',
* chainId: 1,
* },
* })
* ```
*/
export function hashTypedData(parameters) {
const { domain, message, primaryType, types, verifierDomain } = parameters;
return hashTypedData_({
domain: domain,
types: {
...types,
TypedDataSign: [
{ name: 'contents', type: primaryType },
{ name: 'name', type: 'string' },
{ name: 'version', type: 'string' },
{ name: 'chainId', type: 'uint256' },
{ name: 'verifyingContract', type: 'address' },
{ name: 'salt', type: 'bytes32' },
],
},
primaryType: 'TypedDataSign',
message: {
contents: message,
...verifierDomain,
},
});
}
//# sourceMappingURL=hashTypedData.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"hashTypedData.js","sourceRoot":"","sources":["../../../../experimental/erc7739/utils/hashTypedData.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,aAAa,IAAI,cAAc,GAChC,MAAM,2CAA2C,CAAA;AAkBlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,MAAM,UAAU,aAAa,CAI3B,UAA2D;IAE3D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,UAAU,CAAA;IAE1E,OAAO,cAAc,CAAC;QACpB,MAAM,EAAE,MAAa;QACrB,KAAK,EAAE;YACL,GAAG,KAAK;YACR,aAAa,EAAE;gBACb,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE;gBACvC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAChC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACnC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;gBACpC,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC9C,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE;aAClC;SACF;QACD,WAAW,EAAE,eAAe;QAC5B,OAAO,EAAE;YACP,QAAQ,EAAE,OAAc;YACxB,GAAI,cAAsB;SAC3B;KACF,CAAC,CAAA;AACJ,CAAC"}

View File

@@ -0,0 +1,82 @@
import { serializeSignature } from '../../../accounts/index.js';
import { encodePacked } from '../../../utils/abi/encodePacked.js';
import { isHex } from '../../../utils/data/isHex.js';
import { size } from '../../../utils/data/size.js';
import { bytesToHex, stringToHex } from '../../../utils/encoding/toHex.js';
import { encodeType, hashStruct, } from '../../../utils/signature/hashTypedData.js';
import { getTypesForEIP712Domain } from '../../../utils/typedData.js';
/**
* Wraps a typed data signature for ERC-7739.
*
* @example
* ```ts
* const signature = wrapTypedDataSignature({
* domain: {
* name: 'Ether Mail',
* version: '1',
* chainId: 1,
* verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',
* },
* types: {
* Person: [
* { name: 'name', type: 'string' },
* { name: 'wallet', type: 'address' },
* ],
* Mail: [
* { name: 'from', type: 'Person' },
* { name: 'to', type: 'Person' },
* { name: 'contents', type: 'string' },
* ],
* },
* primaryType: 'Mail',
* message: {
* from: {
* name: 'Cow',
* wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',
* },
* to: {
* name: 'Bob',
* wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',
* },
* contents: 'Hello, Bob!',
* },
* signature: '0x...',
* })
* ```
*/
export function wrapTypedDataSignature(parameters) {
const { domain, message, primaryType, signature, types } = parameters;
const signatureHex = (() => {
if (isHex(signature))
return signature;
if (typeof signature === 'object' && 'r' in signature && 's' in signature)
return serializeSignature(signature);
return bytesToHex(signature);
})();
// Compute dependencies for wrapped signature.
const hashedDomain = hashStruct({
data: domain ?? {},
types: {
EIP712Domain: getTypesForEIP712Domain({ domain }),
},
primaryType: 'EIP712Domain',
});
const hashedContents = hashStruct({
data: message,
types: types,
primaryType,
});
const encodedType = encodeType({
primaryType,
types: types,
});
// Construct wrapped signature.
return encodePacked(['bytes', 'bytes32', 'bytes32', 'bytes', 'uint16'], [
signatureHex,
hashedDomain,
hashedContents,
stringToHex(encodedType),
size(stringToHex(encodedType)),
]);
}
//# sourceMappingURL=wrapTypedDataSignature.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"wrapTypedDataSignature.js","sourceRoot":"","sources":["../../../../experimental/erc7739/utils/wrapTypedDataSignature.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAG/D,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACjE,OAAO,EAAuB,KAAK,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAClD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAC1E,OAAO,EACL,UAAU,EACV,UAAU,GACX,MAAM,2CAA2C,CAAA;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAerE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAA4C;IAE5C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,UAAU,CAAA;IAErE,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE;QACzB,IAAI,KAAK,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;QACtC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG,IAAI,SAAS;YACvE,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAA;QACtC,OAAO,UAAU,CAAC,SAAS,CAAC,CAAA;IAC9B,CAAC,CAAC,EAAE,CAAA;IAEJ,8CAA8C;IAC9C,MAAM,YAAY,GAAG,UAAU,CAAC;QAC9B,IAAI,EAAE,MAAM,IAAI,EAAE;QAClB,KAAK,EAAE;YACL,YAAY,EAAE,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;SAClD;QACD,WAAW,EAAE,cAAc;KAC5B,CAAC,CAAA;IACF,MAAM,cAAc,GAAG,UAAU,CAAC;QAChC,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,KAAY;QACnB,WAAW;KACZ,CAAC,CAAA;IACF,MAAM,WAAW,GAAG,UAAU,CAAC;QAC7B,WAAW;QACX,KAAK,EAAE,KAAY;KACpB,CAAC,CAAA;IAEF,+BAA+B;IAC/B,OAAO,YAAY,CACjB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,EAClD;QACE,YAAY;QACZ,YAAY;QACZ,cAAc;QACd,WAAW,CAAC,WAAW,CAAC;QACxB,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;KAC/B,CACF,CAAA;AACH,CAAC"}

View File

@@ -0,0 +1,113 @@
import { parseAccount, } from '../../../accounts/utils/parseAccount.js';
import { ethAddress } from '../../../constants/address.js';
import { AccountNotFoundError } from '../../../errors/account.js';
import { hexToBigInt, } from '../../../utils/encoding/fromHex.js';
import { numberToHex, } from '../../../utils/encoding/toHex.js';
/**
* Retrieves assets for a given account from the target Wallet.
*
* @example
* import { createWalletClient, custom } from 'viem'
* import { mainnet } from 'viem/chains'
* import { getAssets } from 'viem/experimental'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* })
*
* const result = await getAssets(client, {
* account: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
* })
*
* @param client - Client to use to make the request.
* @param parameters - Parameters.
* @returns Assets for the given account.
*/
export async function getAssets(client, ...[parameters]) {
const { account = client.account, aggregate = true } = parameters ?? {};
const result = await client.request({
method: 'wallet_getAssets',
params: [formatRequest({ ...parameters, account })],
});
const response = formatResponse(result);
const aggregated = (() => {
if (!aggregate)
return undefined;
const aggregated = {};
for (const [chainId, assets] of Object.entries(response)) {
if (chainId === '0')
continue;
const seen = new Set();
for (const asset of assets) {
const key = typeof aggregate === 'function'
? aggregate(asset)
: (asset.address ?? ethAddress);
const item = (aggregated[key] ?? {});
if (seen.has(key))
continue;
seen.add(key);
aggregated[key] = {
...asset,
balance: asset.balance + (item?.balance ?? 0n),
chainIds: [...(item?.chainIds ?? []), Number(chainId)],
};
}
}
return Object.values(aggregated);
})();
if (aggregated)
return { 0: aggregated, ...response };
return response;
}
/** @internal */
function formatRequest(parameters = {}) {
const { account: account_, assets, assetTypes, chainIds } = parameters;
if (typeof account_ === 'undefined')
throw new AccountNotFoundError({
docsPath: '/experimental/erc7811/getAssets',
});
const account = parseAccount(account_);
return {
account: account.address,
assetFilter: assets,
assetTypeFilter: assetTypes,
chainFilter: chainIds?.map((chainId) => numberToHex(chainId)),
};
}
/** @internal */
function formatResponse(response) {
return Object.fromEntries(Object.entries(response).map(([chainId, assets]) => [
Number(chainId),
assets.map((asset) => {
const balance = hexToBigInt(asset.balance);
const metadata = asset.metadata;
const type = (() => {
if (asset.type === 'native')
return 'native';
if (asset.type === 'erc20')
return 'erc20';
if (asset.type === 'erc721')
return 'erc721';
return { custom: asset.type };
})();
const address = type === 'native' ? undefined : asset.address;
return {
balance,
type,
...(address ? { address } : {}),
...(metadata
? {
metadata: {
...metadata,
...('tokenId' in metadata
? { tokenId: hexToBigInt(metadata.tokenId) }
: {}),
},
}
: {}),
};
}),
]));
}
//# sourceMappingURL=getAssets.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"getAssets.js","sourceRoot":"","sources":["../../../../experimental/erc7811/actions/getAssets.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,27 @@
import { getAssets, } from '../actions/getAssets.js';
/**
* A suite of ERC-7811 Wallet Actions.
*
* @example
* import { createPublicClient, createWalletClient, http } from 'viem'
* import { mainnet } from 'viem/chains'
* import { erc7811Actions } from 'viem/experimental/erc7811'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: http(),
* }).extend(erc7811Actions())
*
* const response = await client.getAssets({
* account: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266',
* })
*/
export function erc7811Actions() {
return (client) => {
return {
// @ts-expect-error
getAssets: (...[parameters]) => getAssets(client, parameters),
};
};
}
//# sourceMappingURL=erc7811.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"erc7811.js","sourceRoot":"","sources":["../../../../experimental/erc7811/decorators/erc7811.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,SAAS,GACV,MAAM,yBAAyB,CAAA;AAwChC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,CAKL,MAAyC,EAChB,EAAE;QAC3B,OAAO;YACL,mBAAmB;YACnB,SAAS,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC;SAC9D,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}

4
node_modules/viem/_esm/experimental/erc7811/index.js generated vendored Normal file
View File

@@ -0,0 +1,4 @@
// biome-ignore lint/performance/noBarrelFile: entrypoint
export { getAssets, } from './actions/getAssets.js';
export { erc7811Actions } from './decorators/erc7811.js';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../experimental/erc7811/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAIL,SAAS,GACV,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EAAuB,cAAc,EAAE,MAAM,yBAAyB,CAAA"}

View File

@@ -0,0 +1,99 @@
import { sendTransaction, } from '../../../actions/wallet/sendTransaction.js';
import { withCache } from '../../../utils/promise/withCache.js';
import { executionMode } from '../constants.js';
import { ExecuteUnsupportedError } from '../errors.js';
import { encodeExecuteData, } from '../utils/encodeExecuteData.js';
import { getExecuteError, } from '../utils/getExecuteError.js';
import { supportsExecutionMode } from './supportsExecutionMode.js';
/**
* Executes call(s) using the `execute` function on an [ERC-7821-compatible contract](https://eips.ethereum.org/EIPS/eip-7821).
*
* @example
* ```ts
* import { createClient, http } from 'viem'
* import { privateKeyToAccount } from 'viem/accounts'
* import { mainnet } from 'viem/chains'
* import { execute } from 'viem/experimental/erc7821'
*
* const account = privateKeyToAccount('0x...')
*
* const client = createClient({
* chain: mainnet,
* transport: http(),
* })
*
* const hash = await execute(client, {
* account,
* calls: [{
* {
* data: '0xdeadbeef',
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* },
* {
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: 69420n,
* },
* }],
* to: account.address,
* })
* ```
*
* @example
* ```ts
* // Account Hoisting
* import { createClient, http } from 'viem'
* import { privateKeyToAccount } from 'viem/accounts'
* import { mainnet } from 'viem/chains'
* import { execute } from 'viem/experimental/erc7821'
*
* const account = privateKeyToAccount('0x...')
*
* const client = createClient({
* account,
* chain: mainnet,
* transport: http(),
* })
*
* const hash = await execute(client, {
* calls: [{
* {
* data: '0xdeadbeef',
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* },
* {
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: 69420n,
* },
* }],
* to: account.address,
* })
* ```
*
* @param client - Client to use.
* @param parameters - {@link ExecuteParameters}
* @returns Transaction hash. {@link ExecuteReturnType}
*/
export async function execute(client, parameters) {
const { authorizationList, calls, opData } = parameters;
const address = authorizationList?.[0]?.address ?? parameters.address;
const mode = opData ? executionMode.opData : executionMode.default;
const supported = await withCache(() => supportsExecutionMode(client, {
address,
mode,
}), {
cacheKey: `supportsExecutionMode.${client.uid}.${address}.${mode}`,
});
if (!supported)
throw new ExecuteUnsupportedError();
try {
return await sendTransaction(client, {
...parameters,
to: parameters.address,
data: encodeExecuteData({ calls, opData }),
});
}
catch (e) {
throw getExecuteError(e, { calls });
}
}
//# sourceMappingURL=execute.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../../experimental/erc7821/actions/execute.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,eAAe,GAChB,MAAM,4CAA4C,CAAA;AAenD,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAEL,iBAAiB,GAClB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAEL,eAAe,GAChB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAoClE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAM3B,MAAyC,EACzC,UAAmE;IAEnE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAAA;IAEvD,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,UAAU,CAAC,OAAO,CAAA;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAA;IAElE,MAAM,SAAS,GAAG,MAAM,SAAS,CAC/B,GAAG,EAAE,CACH,qBAAqB,CAAC,MAAM,EAAE;QAC5B,OAAO;QACP,IAAI;KACL,CAAC,EACJ;QACE,QAAQ,EAAE,yBAAyB,MAAM,CAAC,GAAG,IAAI,OAAO,IAAI,IAAI,EAAE;KACnE,CACF,CAAA;IACD,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,uBAAuB,EAAE,CAAA;IAEnD,IAAI,CAAC;QACH,OAAO,MAAM,eAAe,CAAC,MAAM,EAAE;YACnC,GAAG,UAAU;YACb,EAAE,EAAE,UAAU,CAAC,OAAO;YACtB,IAAI,EAAE,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;SACpC,CAAC,CAAA;IACX,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,eAAe,CAAC,CAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAClD,CAAC;AACH,CAAC"}

View File

@@ -0,0 +1,121 @@
import { sendTransaction, } from '../../../actions/wallet/sendTransaction.js';
import { withCache } from '../../../utils/promise/withCache.js';
import { ExecuteUnsupportedError } from '../errors.js';
import { encodeExecuteBatchesData, } from '../utils/encodeExecuteBatchesData.js';
import { getExecuteError, } from '../utils/getExecuteError.js';
import { supportsExecutionMode } from './supportsExecutionMode.js';
/**
* Executes batches of call(s) using "batch of batches" mode on an [ERC-7821-compatible contract](https://eips.ethereum.org/EIPS/eip-7821).
*
* @example
* ```ts
* import { createClient, http, parseEther } from 'viem'
* import { privateKeyToAccount } from 'viem/accounts'
* import { mainnet } from 'viem/chains'
* import { executeBatches } from 'viem/experimental/erc7821'
*
* const account = privateKeyToAccount('0x...')
*
* const client = createClient({
* chain: mainnet,
* transport: http(),
* })
*
* const hash = await executeBatches(client, {
* account,
* batches: [
* {
* calls: [
* {
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* },
* ],
* },
* {
* calls: [
* {
* to: '0xcb98643b8786950F0461f3B0edf99D88F274574D',
* value: parseEther('2'),
* },
* {
* data: '0xdeadbeef',
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* },
* ],
* },
* ],
* to: account.address,
* })
* ```
*
* @example
* ```ts
* // Account Hoisting
* import { createClient, http, parseEther } from 'viem'
* import { privateKeyToAccount } from 'viem/accounts'
* import { mainnet } from 'viem/chains'
* import { executeBatches } from 'viem/experimental/erc7821'
*
* const account = privateKeyToAccount('0x...')
*
* const client = createClient({
* chain: mainnet,
* transport: http(),
* })
*
* const hash = await executeBatches(client, {
* batches: [
* {
* calls: [
* {
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* value: parseEther('1'),
* },
* ],
* },
* {
* calls: [
* {
* to: '0xcb98643b8786950F0461f3B0edf99D88F274574D',
* value: parseEther('2'),
* },
* {
* data: '0xdeadbeef',
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* },
* ],
* },
* ],
* to: account.address,
* })
* ```
*
* @param client - Client to use.
* @param parameters - {@link ExecuteBatchesParameters}
* @returns Transaction hash. {@link ExecuteBatchesReturnType}
*/
export async function executeBatches(client, parameters) {
const { authorizationList, batches } = parameters;
const address = authorizationList?.[0]?.address ?? parameters.address;
const supported = await withCache(() => supportsExecutionMode(client, {
address,
mode: 'batchOfBatches',
}), {
cacheKey: `supportsExecutionMode.${client.uid}.${address}.batchOfBatches`,
});
if (!supported)
throw new ExecuteUnsupportedError();
try {
return await sendTransaction(client, {
...parameters,
to: parameters.address,
data: encodeExecuteBatchesData({ batches }),
});
}
catch (e) {
const calls = batches.flatMap((b) => b.calls);
throw getExecuteError(e, { calls });
}
}
//# sourceMappingURL=executeBatches.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"executeBatches.js","sourceRoot":"","sources":["../../../../experimental/erc7821/actions/executeBatches.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,eAAe,GAChB,MAAM,4CAA4C,CAAA;AAenD,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAEL,wBAAwB,GACzB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAEL,eAAe,GAChB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAqClE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAMlC,MAAyC,EACzC,UAA4E;IAE5E,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,UAAU,CAAA;IAEjD,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,UAAU,CAAC,OAAO,CAAA;IAErE,MAAM,SAAS,GAAG,MAAM,SAAS,CAC/B,GAAG,EAAE,CACH,qBAAqB,CAAC,MAAM,EAAE;QAC5B,OAAO;QACP,IAAI,EAAE,gBAAgB;KACvB,CAAC,EACJ;QACE,QAAQ,EAAE,yBAAyB,MAAM,CAAC,GAAG,IAAI,OAAO,iBAAiB;KAC1E,CACF,CAAA;IACD,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,uBAAuB,EAAE,CAAA;IAEnD,IAAI,CAAC;QACH,OAAO,MAAM,eAAe,CAAC,MAAM,EAAE;YACnC,GAAG,UAAU;YACb,EAAE,EAAE,UAAU,CAAC,OAAO;YACtB,IAAI,EAAE,wBAAwB,CAAC,EAAE,OAAO,EAAE,CAAC;SACrC,CAAC,CAAA;IACX,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAA2B,CAAA;QACvE,MAAM,eAAe,CAAC,CAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAClD,CAAC;AACH,CAAC"}

View File

@@ -0,0 +1,49 @@
import { readContract } from '../../../actions/public/readContract.js';
import { withCache } from '../../../utils/promise/withCache.js';
import { abi, executionMode } from '../constants.js';
const toSerializedMode = {
default: executionMode.default,
opData: executionMode.opData,
batchOfBatches: executionMode.batchOfBatches,
};
/**
* Checks if the contract supports the ERC-7821 execution mode.
*
* @example
* ```ts
* import { createClient, http } from 'viem'
* import { mainnet } from 'viem/chains'
* import { supportsExecutionMode } from 'viem/experimental/erc7821'
*
* const client = createClient({
* chain: mainnet,
* transport: http(),
* })
*
* const supported = await supportsExecutionMode(client, {
* to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',
* })
* ```
*
* @param client - Client to use.
* @param parameters - {@link SupportsExecutionModeParameters}
* @returns If the execution mode is supported. {@link SupportsExecutionModeReturnType}
*/
export async function supportsExecutionMode(client, parameters) {
const { address, mode: m = 'default' } = parameters;
const mode = m.startsWith('0x') ? m : toSerializedMode[m];
try {
return await withCache(() => readContract(client, {
abi,
address,
functionName: 'supportsExecutionMode',
args: [mode],
}), {
cacheKey: `supportsExecutionMode.${address}.${mode}`,
});
}
catch {
return false;
}
}
//# sourceMappingURL=supportsExecutionMode.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"supportsExecutionMode.js","sourceRoot":"","sources":["../../../../experimental/erc7821/actions/supportsExecutionMode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAMtE,OAAO,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAC/D,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAWpD,MAAM,gBAAgB,GAAG;IACvB,OAAO,EAAE,aAAa,CAAC,OAAO;IAC9B,MAAM,EAAE,aAAa,CAAC,MAAM;IAC5B,cAAc,EAAE,aAAa,CAAC,cAAc;CACpC,CAAA;AAEV;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAGzC,MAAgC,EAChC,UAA2C;IAE3C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,SAAS,EAAE,GAAG,UAAU,CAAA;IACnD,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,gBAAwB,CAAC,CAAC,CAAC,CAAA;IAClE,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,CACpB,GAAG,EAAE,CACH,YAAY,CAAC,MAAM,EAAE;YACnB,GAAG;YACH,OAAO;YACP,YAAY,EAAE,uBAAuB;YACrC,IAAI,EAAE,CAAC,IAAI,CAAC;SACb,CAAC,EACJ;YACE,QAAQ,EAAE,yBAAyB,OAAO,IAAI,IAAI,EAAE;SACrD,CACF,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}

View File

@@ -0,0 +1,63 @@
export const abi = [
{
type: 'fallback',
stateMutability: 'payable',
},
{
type: 'receive',
stateMutability: 'payable',
},
{
type: 'function',
name: 'execute',
inputs: [
{
name: 'mode',
type: 'bytes32',
internalType: 'bytes32',
},
{
name: 'executionData',
type: 'bytes',
internalType: 'bytes',
},
],
outputs: [],
stateMutability: 'payable',
},
{
type: 'function',
name: 'supportsExecutionMode',
inputs: [
{
name: 'mode',
type: 'bytes32',
internalType: 'bytes32',
},
],
outputs: [
{
name: 'result',
type: 'bool',
internalType: 'bool',
},
],
stateMutability: 'view',
},
{
type: 'error',
name: 'FnSelectorNotRecognized',
inputs: [],
},
{
type: 'error',
name: 'UnsupportedExecutionMode',
inputs: [],
},
];
export const executionMode = {
default: '0x0100000000000000000000000000000000000000000000000000000000000000',
opData: '0x0100000000007821000100000000000000000000000000000000000000000000',
batchOfBatches: '0x0100000000007821000200000000000000000000000000000000000000000000',
};
//# sourceMappingURL=constants.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../experimental/erc7821/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB;QACE,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,SAAS;KAC3B;IACD;QACE,IAAI,EAAE,SAAS;QACf,eAAe,EAAE,SAAS;KAC3B;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,SAAS;gBACf,YAAY,EAAE,SAAS;aACxB;YACD;gBACE,IAAI,EAAE,eAAe;gBACrB,IAAI,EAAE,OAAO;gBACb,YAAY,EAAE,OAAO;aACtB;SACF;QACD,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,SAAS;KAC3B;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,uBAAuB;QAC7B,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,SAAS;gBACf,YAAY,EAAE,SAAS;aACxB;SACF;QACD,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM;gBACZ,YAAY,EAAE,MAAM;aACrB;SACF;QACD,eAAe,EAAE,MAAM;KACxB;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,yBAAyB;QAC/B,MAAM,EAAE,EAAE;KACX;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,0BAA0B;QAChC,MAAM,EAAE,EAAE;KACX;CACO,CAAA;AAEV,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,OAAO,EAAE,oEAAoE;IAC7E,MAAM,EAAE,oEAAoE;IAC5E,cAAc,EACZ,oEAAoE;CAC9D,CAAA"}

View File

@@ -0,0 +1,26 @@
import { execute, } from '../actions/execute.js';
import { executeBatches, } from '../actions/executeBatches.js';
import { supportsExecutionMode, } from '../actions/supportsExecutionMode.js';
/**
* A suite of Actions for [ERC-7821](https://eips.ethereum.org/EIPS/eip-7821).
*
* @example
* import { createClient, http } from 'viem'
* import { mainnet } from 'viem/chains'
* import { erc7821Actions } from 'viem/experimental'
*
* const client = createClient({
* chain: mainnet,
* transport: http(),
* }).extend(erc7821Actions())
*/
export function erc7821Actions() {
return (client) => {
return {
execute: (parameters) => execute(client, parameters),
executeBatches: (parameters) => executeBatches(client, parameters),
supportsExecutionMode: (parameters) => supportsExecutionMode(client, parameters),
};
};
}
//# sourceMappingURL=erc7821.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"erc7821.js","sourceRoot":"","sources":["../../../../experimental/erc7821/decorators/erc7821.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,OAAO,GACR,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAIL,cAAc,GACf,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAGL,qBAAqB,GACtB,MAAM,qCAAqC,CAAA;AAkN5C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,CAKL,MAAyC,EACT,EAAE;QAClC,OAAO;YACL,OAAO,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC;YACpD,cAAc,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC;YAClE,qBAAqB,EAAE,CAAC,UAAU,EAAE,EAAE,CACpC,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC;SAC5C,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}

21
node_modules/viem/_esm/experimental/erc7821/errors.js generated vendored Normal file
View File

@@ -0,0 +1,21 @@
import { BaseError } from '../../errors/base.js';
export class ExecuteUnsupportedError extends BaseError {
constructor() {
super('ERC-7821 execution is not supported.', {
name: 'ExecuteUnsupportedError',
});
}
}
export class FunctionSelectorNotRecognizedError extends BaseError {
constructor() {
super('Function is not recognized.', {
metaMessages: [
'This could be due to any of the following:',
' - The contract does not have the function,',
' - The address is not a contract.',
],
name: 'FunctionSelectorNotRecognizedError',
});
}
}
//# sourceMappingURL=errors.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../experimental/erc7821/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAKhD,MAAM,OAAO,uBAAwB,SAAQ,SAAS;IACpD;QACE,KAAK,CAAC,sCAAsC,EAAE;YAC5C,IAAI,EAAE,yBAAyB;SAChC,CAAC,CAAA;IACJ,CAAC;CACF;AAMD,MAAM,OAAO,kCAAmC,SAAQ,SAAS;IAC/D;QACE,KAAK,CAAC,6BAA6B,EAAE;YACnC,YAAY,EAAE;gBACZ,4CAA4C;gBAC5C,8CAA8C;gBAC9C,oCAAoC;aACrC;YACD,IAAI,EAAE,oCAAoC;SAC3C,CAAC,CAAA;IACJ,CAAC;CACF"}

11
node_modules/viem/_esm/experimental/erc7821/index.js generated vendored Normal file
View File

@@ -0,0 +1,11 @@
// biome-ignore lint/performance/noBarrelFile: entrypoint
export { execute, } from './actions/execute.js';
export { executeBatches, } from './actions/executeBatches.js';
export { supportsExecutionMode, } from './actions/supportsExecutionMode.js';
export { erc7821Actions } from './decorators/erc7821.js';
export { ExecuteUnsupportedError, FunctionSelectorNotRecognizedError, } from './errors.js';
export { encodeCalls, } from './utils/encodeCalls.js';
export { encodeExecuteBatchesData, } from './utils/encodeExecuteBatchesData.js';
export { encodeExecuteData, } from './utils/encodeExecuteData.js';
export { getExecuteError, } from './utils/getExecuteError.js';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../experimental/erc7821/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAIL,OAAO,GACR,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAIL,cAAc,GACf,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAIL,qBAAqB,GACtB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAuB,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7E,OAAO,EACL,uBAAuB,EAEvB,kCAAkC,GAEnC,MAAM,aAAa,CAAA;AAEpB,OAAO,EAEL,WAAW,GACZ,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAIL,wBAAwB,GACzB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAIL,iBAAiB,GAClB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAGL,eAAe,GAChB,MAAM,4BAA4B,CAAA"}

View File

@@ -0,0 +1,18 @@
import * as AbiParameters from 'ox/AbiParameters';
import { encodeFunctionData, } from '../../../utils/abi/encodeFunctionData.js';
export function encodeCalls(calls_, opData) {
const calls = calls_.map((call_) => {
const call = call_;
return {
data: call.abi ? encodeFunctionData(call) : (call.data ?? '0x'),
value: call.value ?? 0n,
target: call.to,
};
});
return AbiParameters.encode(AbiParameters.from([
'struct Call { address target; uint256 value; bytes data; }',
'Call[] calls',
...(opData ? ['bytes opData'] : []),
]), [calls, ...(opData ? [opData] : [])]);
}
//# sourceMappingURL=encodeCalls.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"encodeCalls.js","sourceRoot":"","sources":["../../../../experimental/erc7821/utils/encodeCalls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAA;AAKjD,OAAO,EAEL,kBAAkB,GACnB,MAAM,0CAA0C,CAAA;AAQjD,MAAM,UAAU,WAAW,CACzB,MAAiC,EACjC,MAAwB;IAExB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,KAAa,CAAA;QAC1B,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;YAC/D,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;YACvB,MAAM,EAAE,IAAI,CAAC,EAAE;SAChB,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,aAAa,CAAC,MAAM,CACzB,aAAa,CAAC,IAAI,CAAC;QACjB,4DAA4D;QAC5D,cAAc;QACd,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC,EACF,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAQ,CAC5C,CAAA;AACH,CAAC"}

View File

@@ -0,0 +1,19 @@
import * as AbiParameters from 'ox/AbiParameters';
import { encodeFunctionData, } from '../../../utils/abi/encodeFunctionData.js';
import { abi, executionMode } from '../constants.js';
import { encodeCalls } from './encodeCalls.js';
export function encodeExecuteBatchesData(parameters) {
const { batches } = parameters;
const encodedBatches = AbiParameters.encode(AbiParameters.from('bytes[]'), [
batches.map((b) => {
const batch = b;
return encodeCalls(batch.calls, batch.opData);
}),
]);
return encodeFunctionData({
abi,
functionName: 'execute',
args: [executionMode.batchOfBatches, encodedBatches],
});
}
//# sourceMappingURL=encodeExecuteBatchesData.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"encodeExecuteBatchesData.js","sourceRoot":"","sources":["../../../../experimental/erc7821/utils/encodeExecuteBatchesData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAA;AAKjD,OAAO,EAEL,kBAAkB,GACnB,MAAM,0CAA0C,CAAA;AACjD,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAA6B,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAmBzE,MAAM,UAAU,wBAAwB,CACtC,UAAuD;IAEvD,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAA;IAE9B,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;QACzE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAChB,MAAM,KAAK,GAAG,CAAU,CAAA;YACxB,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;QAC/C,CAAC,CAAC;KACH,CAAC,CAAA;IAEF,OAAO,kBAAkB,CAAC;QACxB,GAAG;QACH,YAAY,EAAE,SAAS;QACvB,IAAI,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,cAAc,CAAC;KACrD,CAAC,CAAA;AACJ,CAAC"}

View File

@@ -0,0 +1,14 @@
import { encodeFunctionData, } from '../../../utils/abi/encodeFunctionData.js';
import { abi, executionMode } from '../constants.js';
import { encodeCalls } from './encodeCalls.js';
export function encodeExecuteData(parameters) {
const { calls, opData } = parameters;
const encodedCalls = encodeCalls(calls, opData);
const mode = opData ? executionMode.opData : executionMode.default;
return encodeFunctionData({
abi,
functionName: 'execute',
args: [mode, encodedCalls],
});
}
//# sourceMappingURL=encodeExecuteData.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"encodeExecuteData.js","sourceRoot":"","sources":["../../../../experimental/erc7821/utils/encodeExecuteData.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,kBAAkB,GACnB,MAAM,0CAA0C,CAAA;AACjD,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAA6B,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAkBzE,MAAM,UAAU,iBAAiB,CAC/B,UAA8C;IAE9C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAAA;IAEpC,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAA;IAElE,OAAO,kBAAkB,CAAC;QACxB,GAAG;QACH,YAAY,EAAE,SAAS;QACvB,IAAI,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC;KAC3B,CAAC,CAAA;AACJ,CAAC"}

View File

@@ -0,0 +1,37 @@
import * as AbiError from 'ox/AbiError';
import { decodeErrorResult } from '../../../utils/abi/decodeErrorResult.js';
import { getContractError, } from '../../../utils/errors/getContractError.js';
import { FunctionSelectorNotRecognizedError, } from '../errors.js';
export function getExecuteError(e, parameters) {
const error = e.walk((e) => 'data' in e);
if (!error?.data)
return e;
if (error.data ===
AbiError.getSelector(AbiError.from('error FnSelectorNotRecognized()')))
return new FunctionSelectorNotRecognizedError();
let matched = null;
for (const c of parameters.calls) {
const call = c;
if (!call.abi)
continue;
try {
const matches = Boolean(decodeErrorResult({
abi: call.abi,
data: error.data,
}));
if (!matches)
continue;
matched = call;
}
catch { }
}
if (matched)
return getContractError(error, {
abi: matched.abi,
address: matched.to,
args: matched.args,
functionName: matched.functionName,
});
return e;
}
//# sourceMappingURL=getExecuteError.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"getExecuteError.js","sourceRoot":"","sources":["../../../../experimental/erc7821/utils/getExecuteError.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAA;AAKvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAA;AAC3E,OAAO,EAEL,gBAAgB,GACjB,MAAM,2CAA2C,CAAA;AAClD,OAAO,EACL,kCAAkC,GAEnC,MAAM,cAAc,CAAA;AAarB,MAAM,UAAU,eAAe,CAC7B,CAAY,EACZ,UAA4C;IAE5C,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,IAAK,CAAW,CAErC,CAAA;IAEb,IAAI,CAAC,KAAK,EAAE,IAAI;QAAE,OAAO,CAAU,CAAA;IACnC,IACE,KAAK,CAAC,IAAI;QACV,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAEtE,OAAO,IAAI,kCAAkC,EAAW,CAAA;IAE1D,IAAI,OAAO,GAAgB,IAAI,CAAA;IAC/B,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,CAAS,CAAA;QACtB,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,SAAQ;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CACrB,iBAAiB,CAAC;gBAChB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,IAAI,EAAE,KAAK,CAAC,IAAK;aAClB,CAAC,CACH,CAAA;YACD,IAAI,CAAC,OAAO;gBAAE,SAAQ;YACtB,OAAO,GAAG,IAAI,CAAA;QAChB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IACD,IAAI,OAAO;QACT,OAAO,gBAAgB,CAAC,KAAkB,EAAE;YAC1C,GAAG,EAAE,OAAO,CAAC,GAAU;YACvB,OAAO,EAAE,OAAO,CAAC,EAAE;YACnB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAC,CAAA;IAEJ,OAAO,CAAU,CAAA;AACnB,CAAC"}

View File

@@ -0,0 +1,128 @@
import { requestAddresses, } from '../../../actions/wallet/requestAddresses.js';
import { numberToHex } from '../../../utils/encoding/toHex.js';
/**
* Requests to connect account(s) with optional capabilities.
*
* - Docs: https://viem.sh/experimental/erc7846/connect
* - JSON-RPC Methods: [`wallet_connect`](https://github.com/ethereum/ERCs/blob/abd1c9f4eda2d6ad06ade0e3af314637a27d1ee7/ERCS/erc-7846.md)
*
* @param client - Client to use
* @param parameters - {@link ConnectParameters}
* @returns List of accounts managed by a wallet {@link ConnectReturnType}
*
* @example
* import { createWalletClient, custom } from 'viem'
* import { mainnet } from 'viem/chains'
* import { connect } from 'viem/experimental/erc7846'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* })
* const response = await connect(client)
*/
export async function connect(client, parameters = {}) {
const capabilities = formatRequestCapabilities(parameters.capabilities);
const response = await (async () => {
try {
return await client.request({ method: 'wallet_connect', params: [{ capabilities, version: '1' }] }, { dedupe: true, retryCount: 0 });
}
catch (e) {
const error = e;
// If the wallet does not support `wallet_connect`, and has no
// capabilities, attempt to use `eth_requestAccounts` instead.
if (!parameters.capabilities &&
(error.name === 'InvalidInputRpcError' ||
error.name === 'InvalidParamsRpcError' ||
error.name === 'MethodNotFoundRpcError' ||
error.name === 'MethodNotSupportedRpcError' ||
error.name === 'UnsupportedProviderMethodError')) {
const addresses = await requestAddresses(client);
return {
accounts: addresses.map((address) => ({
address,
capabilities: {},
})),
};
}
throw error;
}
})();
return {
...response,
accounts: (response.accounts ?? []).map((account) => ({
...account,
capabilities: formatResponseCapabilities(account.capabilities),
})),
};
}
function formatRequestCapabilities(capabilities) {
const { unstable_addSubAccount, unstable_getSubAccounts: getSubAccounts, unstable_signInWithEthereum, ...rest } = capabilities ?? {};
const addSubAccount = unstable_addSubAccount
? {
...unstable_addSubAccount,
account: {
...unstable_addSubAccount.account,
...(unstable_addSubAccount.account.chainId
? {
chainId: numberToHex(unstable_addSubAccount.account.chainId),
}
: {}),
},
}
: undefined;
const { chainId, expirationTime, issuedAt, notBefore } = unstable_signInWithEthereum ?? {};
const signInWithEthereum = unstable_signInWithEthereum
? {
...unstable_signInWithEthereum,
chainId: numberToHex(chainId),
...(expirationTime
? {
expirationTime: expirationTime.toISOString(),
}
: {}),
...(issuedAt
? {
issuedAt: issuedAt.toISOString(),
}
: {}),
...(notBefore
? {
notBefore: notBefore.toISOString(),
}
: {}),
}
: undefined;
return {
...rest,
...(addSubAccount
? {
addSubAccount,
}
: {}),
...(getSubAccounts
? {
getSubAccounts,
}
: {}),
...(signInWithEthereum
? {
signInWithEthereum,
}
: {}),
};
}
function formatResponseCapabilities(capabilities) {
return Object.entries(capabilities ?? {}).reduce((capabilities, [key, value]) => {
const k = (() => {
if (key === 'signInWithEthereum')
return 'unstable_signInWithEthereum';
if (key === 'subAccounts')
return 'unstable_subAccounts';
return key;
})();
capabilities[k] = value;
return capabilities;
}, {});
}
//# sourceMappingURL=connect.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../../experimental/erc7846/actions/connect.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,25 @@
/**
* Requests to disconnect connected accounts.
*
* - Docs: https://viem.sh/experimental/erc7846/disconnect
* - JSON-RPC Methods: [`wallet_disconnect`](https://github.com/ethereum/ERCs/blob/abd1c9f4eda2d6ad06ade0e3af314637a27d1ee7/ERCS/erc-7846.md)
*
* @param client - Client to use
* @returns void
*
* @example
* import { createWalletClient, custom } from 'viem'
* import { mainnet } from 'viem/chains'
* import { disconnect } from 'viem/experimental/erc7846'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* })
*
* await disconnect(client)
*/
export async function disconnect(client) {
return await client.request({ method: 'wallet_disconnect' }, { dedupe: true, retryCount: 0 });
}
//# sourceMappingURL=disconnect.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"disconnect.js","sourceRoot":"","sources":["../../../../experimental/erc7846/actions/disconnect.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAgC;IAEhC,OAAO,MAAM,MAAM,CAAC,OAAO,CACzB,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAC/B,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAChC,CAAA;AACH,CAAC"}

View File

@@ -0,0 +1,26 @@
import { connect, } from '../actions/connect.js';
import { disconnect } from '../actions/disconnect.js';
/**
* A suite of ERC-7846 Wallet Actions.
*
* @example
* import { createPublicClient, createWalletClient, http } from 'viem'
* import { mainnet } from 'viem/chains'
* import { erc7846Actions } from 'viem/experimental/erc7846'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: http(),
* }).extend(erc7846Actions())
*
* const response = await client.connect()
*/
export function erc7846Actions() {
return (client) => {
return {
connect: (parameters) => connect(client, parameters),
disconnect: () => disconnect(client),
};
};
}
//# sourceMappingURL=erc7846.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"erc7846.js","sourceRoot":"","sources":["../../../../experimental/erc7846/decorators/erc7846.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,OAAO,GACR,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAoDrD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,CAIL,MAAgC,EAChB,EAAE;QAClB,OAAO;YACL,OAAO,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC;YACpD,UAAU,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;SACrC,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}

5
node_modules/viem/_esm/experimental/erc7846/index.js generated vendored Normal file
View File

@@ -0,0 +1,5 @@
// biome-ignore lint/performance/noBarrelFile: entrypoint
export { connect, } from './actions/connect.js';
export { disconnect, } from './actions/disconnect.js';
export { erc7846Actions } from './decorators/erc7846.js';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../experimental/erc7846/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAIL,OAAO,GACR,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAEL,UAAU,GACX,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAuB,cAAc,EAAE,MAAM,yBAAyB,CAAA"}

View File

@@ -0,0 +1,42 @@
import { numberToHex } from '../../../utils/index.js';
/**
* Requests to add a Sub Account.
*
* - Docs: https://viem.sh/experimental/erc7895/addSubAccount
* - JSON-RPC Methods: [`wallet_addSubAccount`](https://github.com/ethereum/ERCs/blob/abd1c9f4eda2d6ad06ade0e3af314637a27d1ee7/ERCS/erc-7895.md)
*
* @param client - Client to use
* @param parameters - {@link AddSubAccountParameters}
* @returns Sub Account. {@link AddSubAccountReturnType}
*
* @example
* import { createWalletClient, custom } from 'viem'
* import { mainnet } from 'viem/chains'
* import { addSubAccount } from 'viem/experimental/erc7895'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: custom(window.ethereum),
* })
* const response = await addSubAccount(client, {
* keys: [{ publicKey: '0x0000000000000000000000000000000000000000', type: 'address' }],
* type: 'create',
* })
*/
export async function addSubAccount(client, parameters) {
return client.request({
method: 'wallet_addSubAccount',
params: [
{
account: {
...parameters,
...(parameters.chainId
? { chainId: numberToHex(parameters.chainId) }
: {}),
},
version: '1',
},
],
});
}
//# sourceMappingURL=addSubAccount.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"addSubAccount.js","sourceRoot":"","sources":["../../../../experimental/erc7895/actions/addSubAccount.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAoCrD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAgC,EAChC,UAAmC;IAEnC,OAAO,MAAM,CAAC,OAAO,CAAC;QACpB,MAAM,EAAE,sBAAsB;QAC9B,MAAM,EAAE;YACN;gBACE,OAAO,EAAE;oBACP,GAAG,UAAU;oBACb,GAAG,CAAC,UAAU,CAAC,OAAO;wBACpB,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;wBAC9C,CAAC,CAAC,EAAE,CAAC;iBACC;gBACV,OAAO,EAAE,GAAG;aACb;SACF;KACF,CAAC,CAAA;AACJ,CAAC"}

View File

@@ -0,0 +1,27 @@
import { addSubAccount, } from '../actions/addSubAccount.js';
/**
* A suite of ERC-7895 Wallet Actions.
*
* @example
* import { createPublicClient, createWalletClient, http } from 'viem'
* import { mainnet } from 'viem/chains'
* import { erc7895Actions } from 'viem/experimental'
*
* const client = createWalletClient({
* chain: mainnet,
* transport: http(),
* }).extend(erc7895Actions())
*
* const response = await client.addSubAccount({
* keys: [{ key: '0x0000000000000000000000000000000000000000', type: 'address' }],
* type: 'create',
* })
*/
export function erc7895Actions() {
return (client) => {
return {
addSubAccount: (parameters) => addSubAccount(client, parameters),
};
};
}
//# sourceMappingURL=erc7895.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"erc7895.js","sourceRoot":"","sources":["../../../../experimental/erc7895/decorators/erc7895.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,aAAa,GACd,MAAM,6BAA6B,CAAA;AAiCpC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,CAIL,MAAgC,EAChB,EAAE;QAClB,OAAO;YACL,aAAa,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC;SACjE,CAAA;IACH,CAAC,CAAA;AACH,CAAC"}

4
node_modules/viem/_esm/experimental/erc7895/index.js generated vendored Normal file
View File

@@ -0,0 +1,4 @@
// biome-ignore lint/performance/noBarrelFile: entrypoint
export { addSubAccount, } from './actions/addSubAccount.js';
export { erc7895Actions } from './decorators/erc7895.js';
//# sourceMappingURL=index.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../experimental/erc7895/index.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,OAAO,EAIL,aAAa,GACd,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EAAuB,cAAc,EAAE,MAAM,yBAAyB,CAAA"}

51
node_modules/viem/_esm/experimental/index.js generated vendored Normal file
View File

@@ -0,0 +1,51 @@
// biome-ignore lint/performance/noBarrelFile: entrypoint module
export {
/** @deprecated This is no longer experimental use `import { getCallsStatus } from 'viem/actions'` instead. */
getCallsStatus, } from '../actions/wallet/getCallsStatus.js';
export {
/** @deprecated This is no longer experimental use `import { getCapabilities } from 'viem/actions'` instead. */
getCapabilities, } from '../actions/wallet/getCapabilities.js';
export {
/** @deprecated This is no longer experimental use `import { prepareAuthorization } from 'viem/actions'` instead. */
prepareAuthorization, } from '../actions/wallet/prepareAuthorization.js';
export {
/** @deprecated This is no longer experimental use `import { sendCalls } from 'viem/actions'` instead. */
sendCalls, } from '../actions/wallet/sendCalls.js';
export {
/** @deprecated This is no longer experimental use `import { showCallsStatus } from 'viem/actions'` instead. */
showCallsStatus, } from '../actions/wallet/showCallsStatus.js';
export {
/** @deprecated This is no longer experimental use `import { signAuthorization } from 'viem/actions'` instead. */
signAuthorization, } from '../actions/wallet/signAuthorization.js';
export {
/** @deprecated This is no longer experimental use `import { waitForCallsStatus } from 'viem/actions'` instead. */
waitForCallsStatus, } from '../actions/wallet/waitForCallsStatus.js';
export {
/** @deprecated This is no longer experimental use `import { createWalletClient } from 'viem'` or `import { walletActions } from 'viem'` instead. */
walletActions as eip7702Actions, } from '../clients/decorators/wallet.js';
export {
/** @deprecated This is no longer experimental use `import { hashAuthorization } from 'viem/utils'` instead. */
hashAuthorization, } from '../utils/authorization/hashAuthorization.js';
export {
/** @deprecated This is no longer experimental use `import { recoverAuthorizationAddress } from 'viem/utils'` instead. */
recoverAuthorizationAddress, } from '../utils/authorization/recoverAuthorizationAddress.js';
export {
/** @deprecated This is no longer experimental use `import { serializeAuthorizationList } from 'viem/utils'` instead. */
serializeAuthorizationList, } from '../utils/authorization/serializeAuthorizationList.js';
export {
/** @deprecated This is no longer experimental use `import { verifyAuthorization } from 'viem/utils'` instead. */
verifyAuthorization, } from '../utils/authorization/verifyAuthorization.js';
export {
/** @deprecated Use `sendCalls` instead. */
writeContracts, } from './eip5792/actions/writeContracts.js';
export {
/** @deprecated This is no longer experimental use `import { createWalletClient } from 'viem'` or `import { walletActions } from 'viem'` instead. */
eip5792Actions, } from './eip5792/decorators/eip5792.js';
export { grantPermissions, } from './erc7715/actions/grantPermissions.js';
export { erc7715Actions, } from './erc7715/decorators/erc7715.js';
export { erc7739Actions, } from './erc7739/decorators/erc7739.js';
export { erc7811Actions, } from './erc7811/decorators/erc7811.js';
export { erc7821Actions, } from './erc7821/decorators/erc7821.js';
export { erc7846Actions, } from './erc7846/decorators/erc7846.js';
export { erc7895Actions, } from './erc7895/decorators/erc7895.js';
//# sourceMappingURL=index.js.map

1
node_modules/viem/_esm/experimental/index.js.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../experimental/index.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO;AAOL,gHAAgH;AAChH,cAAc,GACf,MAAM,qCAAqC,CAAA;AAC5C,OAAO;AAOL,iHAAiH;AACjH,eAAe,GAChB,MAAM,sCAAsC,CAAA;AAC7C,OAAO;AAOL,sHAAsH;AACtH,oBAAoB,GACrB,MAAM,2CAA2C,CAAA;AAClD,OAAO;AAOL,2GAA2G;AAC3G,SAAS,GACV,MAAM,gCAAgC,CAAA;AACvC,OAAO;AAOL,iHAAiH;AACjH,eAAe,GAChB,MAAM,sCAAsC,CAAA;AAC7C,OAAO;AAOL,mHAAmH;AACnH,iBAAiB,GAClB,MAAM,wCAAwC,CAAA;AAC/C,OAAO;AASL,oHAAoH;AACpH,kBAAkB,GACnB,MAAM,yCAAyC,CAAA;AAEhD,OAAO;AAGL,sJAAsJ;AACtJ,aAAa,IAAI,cAAc,GAChC,MAAM,iCAAiC,CAAA;AAqBxC,OAAO;AAOL,iHAAiH;AACjH,iBAAiB,GAClB,MAAM,6CAA6C,CAAA;AACpD,OAAO;AAOL,2HAA2H;AAC3H,2BAA2B,GAC5B,MAAM,uDAAuD,CAAA;AAC9D,OAAO;AAKL,0HAA0H;AAC1H,0BAA0B,GAC3B,MAAM,sDAAsD,CAAA;AAC7D,OAAO;AAOL,mHAAmH;AACnH,mBAAmB,GACpB,MAAM,+CAA+C,CAAA;AACtD,OAAO;AASL,2CAA2C;AAC3C,cAAc,GACf,MAAM,qCAAqC,CAAA;AAC5C,OAAO;AAGL,sJAAsJ;AACtJ,cAAc,GACf,MAAM,iCAAiC,CAAA;AAExC,OAAO,EAGL,gBAAgB,GACjB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAEL,cAAc,GACf,MAAM,iCAAiC,CAAA;AAExC,OAAO,EAGL,cAAc,GACf,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAEL,cAAc,GACf,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAEL,cAAc,GACf,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAEL,cAAc,GACf,MAAM,iCAAiC,CAAA;AAExC,OAAO,EAEL,cAAc,GACf,MAAM,iCAAiC,CAAA"}