diff --git a/packages/smart-wallet/.gitignore b/packages/smart-wallet/.gitignore new file mode 100644 index 000000000..bf08b70b5 --- /dev/null +++ b/packages/smart-wallet/.gitignore @@ -0,0 +1,16 @@ +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ + +# Docs +docs/ + +# Dotenv file +.env + +lib/ \ No newline at end of file diff --git a/packages/smart-wallet/README.md b/packages/smart-wallet/README.md new file mode 100644 index 000000000..5b1c38d80 --- /dev/null +++ b/packages/smart-wallet/README.md @@ -0,0 +1,3 @@ +# Smart Wallet Deployer + +Contracts and deployment scripts for the Zora Smart Wallet Factory. diff --git a/packages/smart-wallet/foundry.toml b/packages/smart-wallet/foundry.toml new file mode 100644 index 000000000..f751ffe68 --- /dev/null +++ b/packages/smart-wallet/foundry.toml @@ -0,0 +1,20 @@ +[profile.default] +evm_version = 'paris' +optimizer = true +optimizer_runs = 1_000_000 +out = 'out' +solc = '0.8.23' +via_ir = true +libs = ["node_modules"] + +[fuzz] +runs = 500 + +[fmt] +bracket_spacing = true +int_types = "long" +line_length = 150 +quote_style = "double" +tab_width = 4 + +# See more config options https://github.com/foundry-rs/foundry/tree/master/config diff --git a/packages/smart-wallet/package.json b/packages/smart-wallet/package.json new file mode 100644 index 000000000..e09e66f4e --- /dev/null +++ b/packages/smart-wallet/package.json @@ -0,0 +1,20 @@ +{ + "name": "smart-wallet", + "version": "0.0.0", + "main": "index.js", + "license": "MIT", + "private": true, + "scripts": { + "prettier:check": "prettier --check 'src/**/*.sol' 'test/**/*.sol' 'script/**/*.sol'", + "prettier": "prettier --write 'src/**/*.sol' 'test/**/*.sol' 'script/**/*.sol'" + }, + "dependencies": { + "@openzeppelin/contracts": "5.0.2", + "@openzeppelin/contracts-upgradeable": "5.0.2", + "ds-test": "https://github.com/dapphub/ds-test#cd98eff28324bfac652e63a239a60632a761790b", + "forge-std": "https://github.com/foundry-rs/forge-std#v1.8.2" + }, + "devDependencies": { + "permissionless": "^0.0.35" + } +} diff --git a/packages/smart-wallet/remappings.txt b/packages/smart-wallet/remappings.txt new file mode 100644 index 000000000..631ce3c33 --- /dev/null +++ b/packages/smart-wallet/remappings.txt @@ -0,0 +1,4 @@ +ds-test/=node_modules/ds-test/src/ +forge-std/=node_modules/forge-std/src/ +@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/ +@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/ \ No newline at end of file diff --git a/packages/smart-wallet/src/ZoraAccountManager.sol b/packages/smart-wallet/src/ZoraAccountManager.sol new file mode 100644 index 000000000..fde6ca866 --- /dev/null +++ b/packages/smart-wallet/src/ZoraAccountManager.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.23; + +import { ERC1967Proxy } from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; + +contract ZoraAccountManager is ERC1967Proxy { + constructor(address _logic, bytes memory _data) ERC1967Proxy(_logic, _data) { } +} diff --git a/packages/smart-wallet/src/ZoraAccountManagerImpl.sol b/packages/smart-wallet/src/ZoraAccountManagerImpl.sol new file mode 100644 index 000000000..e1e44e9cd --- /dev/null +++ b/packages/smart-wallet/src/ZoraAccountManagerImpl.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.23; + +import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import { UUPSUpgradeable, ERC1967Utils } from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; + +import { IEntryPoint } from "./interfaces/IEntryPoint.sol"; +import { ISmartWalletFactory } from "./interfaces/ISmartWalletFactory.sol"; + +contract ZoraAccountManagerImpl is UUPSUpgradeable, OwnableUpgradeable { + IEntryPoint public constant entryPoint = IEntryPoint(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789); + ISmartWalletFactory public constant smartWalletFactory = ISmartWalletFactory(0x0BA5ED0c6AA8c49038F819E587E2633c4A9F428a); + + constructor() initializer { } + + function initialize(address initialOwner) public initializer { + __Ownable_init(initialOwner); + } + + event ZoraSmartWalletCreated(address indexed smartWallet, address indexed baseOwner, address[] owners, uint256 nonce); + + function createSmartWallet(bytes[] calldata encodedOwners, uint256 nonce) external returns (address) { + smartWalletFactory.createAccount(encodedOwners, nonce); + + address[] memory owners = new address[](encodedOwners.length); + + for (uint256 i; i < encodedOwners.length; ++i) { + owners[i] = abi.decode(encodedOwners[i], (address)); + } + + address smartWallet = smartWalletFactory.getAddress(encodedOwners, nonce); + + emit ZoraSmartWalletCreated(smartWallet, owners[0], owners, nonce); + + return smartWallet; + } + + function getAddress(bytes[] calldata encodedOwners, uint256 nonce) external view returns (address) { + return smartWalletFactory.getAddress(encodedOwners, nonce); + } + + function getNonce(address smartWallet) external view returns (uint256) { + return entryPoint.getNonce(smartWallet, 0); + } + + function getKeyNonce(address smartWallet, uint192 key) external view returns (uint256) { + return entryPoint.getNonce(smartWallet, key); + } + + function implementation() external view returns (address) { + return ERC1967Utils.getImplementation(); + } + + function _authorizeUpgrade(address) internal override onlyOwner { } +} diff --git a/packages/smart-wallet/src/interfaces/IEntryPoint.sol b/packages/smart-wallet/src/interfaces/IEntryPoint.sol new file mode 100644 index 000000000..cfbc58529 --- /dev/null +++ b/packages/smart-wallet/src/interfaces/IEntryPoint.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.23; + +interface IEntryPoint { + function getNonce(address sender, uint192 key) external view returns (uint256); +} diff --git a/packages/smart-wallet/src/interfaces/ISmartWalletFactory.sol b/packages/smart-wallet/src/interfaces/ISmartWalletFactory.sol new file mode 100644 index 000000000..2fd22902f --- /dev/null +++ b/packages/smart-wallet/src/interfaces/ISmartWalletFactory.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.23; + +interface ISmartWalletFactory { + function createAccount(bytes[] calldata owners, uint256 nonce) external; + function getAddress(bytes[] calldata owners, uint256 nonce) external view returns (address); + + function initCodeHash() external view returns (bytes32); + function implementation() external view returns (address); +} diff --git a/packages/smart-wallet/test/ZoraAccountManager.t.sol b/packages/smart-wallet/test/ZoraAccountManager.t.sol new file mode 100644 index 000000000..0f84bc37a --- /dev/null +++ b/packages/smart-wallet/test/ZoraAccountManager.t.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import "forge-std/Test.sol"; + +import { ZoraAccountManagerImpl } from "../src/ZoraAccountManagerImpl.sol"; +import { ZoraAccountManager } from "../src/ZoraAccountManager.sol"; +import { ISmartWalletFactory } from "../src/interfaces/ISmartWalletFactory.sol"; + +contract ZoraAccountManagerTest is Test { + struct Users { + address alice; + address bob; + address charlie; + address owner; + } + + Users internal users; + address[] internal mockOwners; + + ZoraAccountManagerImpl internal managerImpl; + ZoraAccountManagerImpl internal manager; + + ISmartWalletFactory internal constant smartWalletFactory = ISmartWalletFactory(0x0BA5ED0c6AA8c49038F819E587E2633c4A9F428a); + + function setUp() public { + vm.createSelectFork(vm.envString("ZORA_SEPOLIA_RPC_URL")); + + users = Users({ alice: makeAddr("alice"), bob: makeAddr("bob"), charlie: makeAddr("charlie"), owner: makeAddr("owner") }); + mockOwners = new address[](3); + mockOwners[0] = users.alice; + mockOwners[1] = users.bob; + mockOwners[2] = users.charlie; + + managerImpl = new ZoraAccountManagerImpl(); + manager = ZoraAccountManagerImpl(address(new ZoraAccountManager(address(managerImpl), ""))); + manager.initialize(users.owner); + } + + function testDeploy() public view { + assertEq(manager.implementation(), address(managerImpl)); + assertEq(manager.owner(), users.owner); + } + + function testCreateSmartWallet() public { + bytes[] memory encodedOwners = encodeOwners(mockOwners); + uint256 nonce = 0; + + address smartWallet = manager.createSmartWallet(encodedOwners, nonce); + + assertEq(manager.getAddress(encodedOwners, nonce), smartWallet); + } + + function encodeOwners(address[] memory owners) public pure returns (bytes[] memory) { + bytes[] memory encodedOwners = new bytes[](owners.length); + + for (uint256 i; i < owners.length; ++i) { + encodedOwners[i] = abi.encode(owners[i]); + } + + return encodedOwners; + } +} diff --git a/yarn.lock b/yarn.lock index 2d550f350..9a3fb0f50 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2387,6 +2387,11 @@ widest-line "^3.1.0" wrap-ansi "^6.2.0" +"@openzeppelin/contracts-upgradeable@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.2.tgz#3e5321a2ecdd0b206064356798c21225b6ec7105" + integrity sha512-0MmkHSHiW2NRFiT9/r5Lu4eJq5UJ4/tzlOgYXNAIj/ONkQTVnz22pLxDvp4C4uZ9he7ZFvGn3Driptn1/iU7tQ== + "@openzeppelin/contracts-upgradeable@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.1.tgz#ebc163cbed2de6b8b69bff628261d18deb912a81" @@ -2397,6 +2402,11 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.2.tgz#1cb2d5e4d3360141a17dbc45094a8cad6aac16c1" integrity sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg== +"@openzeppelin/contracts@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.2.tgz#b1d03075e49290d06570b2fd42154d76c2a5d210" + integrity sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA== + "@openzeppelin/contracts@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.1.tgz#93da90fc209a0a4ff09c1deb037fbb35e4020890" @@ -3904,6 +3914,31 @@ viem "^1.0.0" zod "^3.21.4" +"@wagmi/cli@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@wagmi/cli/-/cli-2.1.4.tgz#a5427d3f11a52473eba1811b23b498305af03378" + integrity sha512-vamvEo/GeBjFxb5oZCvby4YZDOrK/RqD+tcWb5X0pqmJDyWbN2Mkv9DYTtVB+OtfVUzFKciN/8Vhw8luMtOJbw== + dependencies: + abitype "^0.9.8" + bundle-require "^4.0.2" + cac "^6.7.14" + change-case "^4.1.2" + chokidar "^3.5.3" + dedent "^0.7.0" + dotenv "^16.3.1" + dotenv-expand "^10.0.0" + esbuild "^0.19.0" + execa "^8.0.1" + find-up "^6.3.0" + fs-extra "^11.1.1" + globby "^13.2.2" + ora "^6.3.1" + pathe "^1.1.1" + picocolors "^1.0.0" + prettier "^3.0.3" + viem "2.*" + zod "^3.22.2" + "@wagmi/connectors@5.0.5": version "5.0.5" resolved "https://registry.yarnpkg.com/@wagmi/connectors/-/connectors-5.0.5.tgz#040a4e2e6858d9d6dcf0c0f36d20cc07f8b49da1" @@ -4269,6 +4304,11 @@ abitype@1.0.0: resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.0.tgz#237176dace81d90d018bebf3a45cb42f2a2d9e97" integrity sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ== +abitype@^0.9.8: + version "0.9.10" + resolved "https://registry.yarnpkg.com/abitype/-/abitype-0.9.10.tgz#fa6fa30a6465da98736f98b6c601a02ed49f6eec" + integrity sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ== + abitype@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.2.tgz#183c28f2f3b4278810ed1543941b555bb73f301d" @@ -4946,6 +4986,13 @@ bundle-require@^4.0.0: dependencies: load-tsconfig "^0.2.3" +bundle-require@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-4.1.0.tgz#3d5fcd19d5160d4cbac5e95ed5a394d1ecd40ce6" + integrity sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg== + dependencies: + load-tsconfig "^0.2.3" + busboy@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -5958,6 +6005,11 @@ dotenv@^16.0.3: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== +dotenv@^16.3.1: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + dotenv@^9.0.0: version "9.0.2" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" @@ -6278,6 +6330,35 @@ esbuild@^0.18.10, esbuild@~0.18.20: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" +esbuild@^0.19.0, "esbuild@npm:esbuild@~0.17.6 || ~0.18.0 || ~0.19.0": + version "0.19.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" + esbuild@^0.19.2: version "0.19.9" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.9.tgz#423a8f35153beb22c0b695da1cd1e6c0c8cdd490" @@ -6335,35 +6416,6 @@ esbuild@^0.20.1: "@esbuild/win32-ia32" "0.20.2" "@esbuild/win32-x64" "0.20.2" -"esbuild@npm:esbuild@~0.17.6 || ~0.18.0 || ~0.19.0": - version "0.19.12" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" - integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== - optionalDependencies: - "@esbuild/aix-ppc64" "0.19.12" - "@esbuild/android-arm" "0.19.12" - "@esbuild/android-arm64" "0.19.12" - "@esbuild/android-x64" "0.19.12" - "@esbuild/darwin-arm64" "0.19.12" - "@esbuild/darwin-x64" "0.19.12" - "@esbuild/freebsd-arm64" "0.19.12" - "@esbuild/freebsd-x64" "0.19.12" - "@esbuild/linux-arm" "0.19.12" - "@esbuild/linux-arm64" "0.19.12" - "@esbuild/linux-ia32" "0.19.12" - "@esbuild/linux-loong64" "0.19.12" - "@esbuild/linux-mips64el" "0.19.12" - "@esbuild/linux-ppc64" "0.19.12" - "@esbuild/linux-riscv64" "0.19.12" - "@esbuild/linux-s390x" "0.19.12" - "@esbuild/linux-x64" "0.19.12" - "@esbuild/netbsd-x64" "0.19.12" - "@esbuild/openbsd-x64" "0.19.12" - "@esbuild/sunos-x64" "0.19.12" - "@esbuild/win32-arm64" "0.19.12" - "@esbuild/win32-ia32" "0.19.12" - "@esbuild/win32-x64" "0.19.12" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -7055,6 +7107,10 @@ forever-agent@~0.6.1: version "1.6.0" resolved "https://github.com/foundry-rs/forge-std#705263c95892a906d7af65f0f73ce8a4a0c80b80" +"forge-std@https://github.com/foundry-rs/forge-std#v1.8.2": + version "1.8.2" + resolved "https://github.com/foundry-rs/forge-std#978ac6fadb62f5f0b723c996f64be52eddba6801" + form-data@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" @@ -10445,7 +10501,7 @@ ora@^4.0.0: strip-ansi "^6.0.0" wcwidth "^1.0.1" -ora@^6.1.2: +ora@^6.1.2, ora@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/ora/-/ora-6.3.1.tgz#a4e9e5c2cf5ee73c259e8b410273e706a2ad3ed6" integrity sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ== @@ -10775,6 +10831,11 @@ periscopic@^3.0.0: estree-walker "^3.0.0" is-reference "^3.0.0" +permissionless@^0.0.35: + version "0.0.35" + resolved "https://registry.yarnpkg.com/permissionless/-/permissionless-0.0.35.tgz#925818c169fdc5e282c14bfb3ec7ae1c4ff82e3f" + integrity sha512-wWnFJW9bCiIBvLVkZ7aPbX0w5LIeelb5dsBOKHIEaRf9xKaxNrpRWCsBRHHjiL0lhvqPlHvEmjJ71Y2mxPyDpg== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -12949,7 +13010,7 @@ ts-interface-checker@^0.1.9: resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== -ts-node@^10.9.1: +ts-node@^10.9.1, ts-node@^10.9.2: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== @@ -13216,6 +13277,11 @@ typescript@^5.1, typescript@^5.2.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== +typescript@^5.3.3: + version "5.4.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + typical@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" @@ -13607,6 +13673,20 @@ vfile@^6.0.0: unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" +viem@2.*, viem@^2.7.9: + version "2.10.2" + resolved "https://registry.yarnpkg.com/viem/-/viem-2.10.2.tgz#65c2ca82b64e6fb9ee84c02b95dcf2c270ffe651" + integrity sha512-gcOL+XxA0UWDarli856OEgumaBz4df/qNMpgno4NTSSZtJSC1XixIb3gWjVBei6Vx085ivw/U9ZE8gdniIo7fA== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@scure/bip32" "1.3.2" + "@scure/bip39" "1.2.1" + abitype "1.0.0" + isows "1.0.3" + ws "8.13.0" + viem@^1.0.0: version "1.20.0" resolved "https://registry.yarnpkg.com/viem/-/viem-1.20.0.tgz#25cb019831f46aeecf2c8c5cdbad41e4f79b2e32" @@ -14234,6 +14314,11 @@ zod@^3.21.4: resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.2.tgz#3add8c682b7077c05ac6f979fea6998b573e157b" integrity sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg== +zod@^3.22.2: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== + zustand@4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.1.tgz#0cd3a3e4756f21811bd956418fdc686877e8b3b0"