@zerodev/sdk 4.0.2-alpha.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +450 -0
- package/dist/cjs/index.d.ts +21 -0
- package/dist/cjs/index.js +50 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/kernel-zerodev/abis/ERC165SessionKeyValidatorAbi.d.ts +162 -0
- package/dist/cjs/kernel-zerodev/abis/ERC165SessionKeyValidatorAbi.js +215 -0
- package/dist/cjs/kernel-zerodev/abis/ERC165SessionKeyValidatorAbi.js.map +1 -0
- package/dist/cjs/kernel-zerodev/abis/ERC20Abi.d.ts +39 -0
- package/dist/cjs/kernel-zerodev/abis/ERC20Abi.js +157 -0
- package/dist/cjs/kernel-zerodev/abis/ERC20Abi.js.map +1 -0
- package/dist/cjs/kernel-zerodev/abis/ESCDAValidatorAbi.d.ts +158 -0
- package/dist/cjs/kernel-zerodev/abis/ESCDAValidatorAbi.js +210 -0
- package/dist/cjs/kernel-zerodev/abis/ESCDAValidatorAbi.js.map +1 -0
- package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.d.ts +496 -0
- package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.js +646 -0
- package/dist/cjs/kernel-zerodev/abis/KernelAccountAbi.js.map +1 -0
- package/dist/cjs/kernel-zerodev/abis/KernelFactoryAbi.d.ts +293 -0
- package/dist/cjs/kernel-zerodev/abis/KernelFactoryAbi.js +384 -0
- package/dist/cjs/kernel-zerodev/abis/KernelFactoryAbi.js.map +1 -0
- package/dist/cjs/kernel-zerodev/abis/KillSwitchValidatorAbi.d.ts +150 -0
- package/dist/cjs/kernel-zerodev/abis/KillSwitchValidatorAbi.js +200 -0
- package/dist/cjs/kernel-zerodev/abis/KillSwitchValidatorAbi.js.map +1 -0
- package/dist/cjs/kernel-zerodev/abis/MultiSendAbi.d.ts +15 -0
- package/dist/cjs/kernel-zerodev/abis/MultiSendAbi.js +24 -0
- package/dist/cjs/kernel-zerodev/abis/MultiSendAbi.js.map +1 -0
- package/dist/cjs/kernel-zerodev/abis/Test_ERC20Abi.d.ts +39 -0
- package/dist/cjs/kernel-zerodev/abis/Test_ERC20Abi.js +161 -0
- package/dist/cjs/kernel-zerodev/abis/Test_ERC20Abi.js.map +1 -0
- package/dist/cjs/kernel-zerodev/abis/Test_ERC721Abi.d.ts +287 -0
- package/dist/cjs/kernel-zerodev/abis/Test_ERC721Abi.js +377 -0
- package/dist/cjs/kernel-zerodev/abis/Test_ERC721Abi.js.map +1 -0
- package/dist/cjs/kernel-zerodev/abis/TokenActionsAbi.d.ts +63 -0
- package/dist/cjs/kernel-zerodev/abis/TokenActionsAbi.js +85 -0
- package/dist/cjs/kernel-zerodev/abis/TokenActionsAbi.js.map +1 -0
- package/dist/cjs/kernel-zerodev/abis/index.d.ts +8 -0
- package/dist/cjs/kernel-zerodev/abis/index.js +18 -0
- package/dist/cjs/kernel-zerodev/abis/index.js.map +1 -0
- package/dist/cjs/kernel-zerodev/account.d.ts +36 -0
- package/dist/cjs/kernel-zerodev/account.js +239 -0
- package/dist/cjs/kernel-zerodev/account.js.map +1 -0
- package/dist/cjs/kernel-zerodev/api/index.d.ts +1 -0
- package/dist/cjs/kernel-zerodev/api/index.js +24 -0
- package/dist/cjs/kernel-zerodev/api/index.js.map +1 -0
- package/dist/cjs/kernel-zerodev/client/create-client.d.ts +11 -0
- package/dist/cjs/kernel-zerodev/client/create-client.js +21 -0
- package/dist/cjs/kernel-zerodev/client/create-client.js.map +1 -0
- package/dist/cjs/kernel-zerodev/constants.d.ts +23 -0
- package/dist/cjs/kernel-zerodev/constants.js +45 -0
- package/dist/cjs/kernel-zerodev/constants.js.map +1 -0
- package/dist/cjs/kernel-zerodev/errors.d.ts +5 -0
- package/dist/cjs/kernel-zerodev/errors.js +12 -0
- package/dist/cjs/kernel-zerodev/errors.js.map +1 -0
- package/dist/cjs/kernel-zerodev/ethers-provider/ethers-provider.d.ts +21 -0
- package/dist/cjs/kernel-zerodev/ethers-provider/ethers-provider.js +94 -0
- package/dist/cjs/kernel-zerodev/ethers-provider/ethers-provider.js.map +1 -0
- package/dist/cjs/kernel-zerodev/middleware/gas-estimator.d.ts +15 -0
- package/dist/cjs/kernel-zerodev/middleware/gas-estimator.js +132 -0
- package/dist/cjs/kernel-zerodev/middleware/gas-estimator.js.map +1 -0
- package/dist/cjs/kernel-zerodev/middleware/paymaster.d.ts +5 -0
- package/dist/cjs/kernel-zerodev/middleware/paymaster.js +43 -0
- package/dist/cjs/kernel-zerodev/middleware/paymaster.js.map +1 -0
- package/dist/cjs/kernel-zerodev/paymaster/base.d.ts +16 -0
- package/dist/cjs/kernel-zerodev/paymaster/base.js +58 -0
- package/dist/cjs/kernel-zerodev/paymaster/base.js.map +1 -0
- package/dist/cjs/kernel-zerodev/paymaster/index.d.ts +3 -0
- package/dist/cjs/kernel-zerodev/paymaster/index.js +10 -0
- package/dist/cjs/kernel-zerodev/paymaster/index.js.map +1 -0
- package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.d.ts +14 -0
- package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.js +173 -0
- package/dist/cjs/kernel-zerodev/paymaster/token-paymaster.js.map +1 -0
- package/dist/cjs/kernel-zerodev/paymaster/types.d.ts +29 -0
- package/dist/cjs/kernel-zerodev/paymaster/types.js +3 -0
- package/dist/cjs/kernel-zerodev/paymaster/types.js.map +1 -0
- package/dist/cjs/kernel-zerodev/paymaster/verifying-paymaster.d.ts +8 -0
- package/dist/cjs/kernel-zerodev/paymaster/verifying-paymaster.js +31 -0
- package/dist/cjs/kernel-zerodev/paymaster/verifying-paymaster.js.map +1 -0
- package/dist/cjs/kernel-zerodev/provider.d.ts +41 -0
- package/dist/cjs/kernel-zerodev/provider.js +225 -0
- package/dist/cjs/kernel-zerodev/provider.js.map +1 -0
- package/dist/cjs/kernel-zerodev/signer/zd-local-account.d.ts +13 -0
- package/dist/cjs/kernel-zerodev/signer/zd-local-account.js +61 -0
- package/dist/cjs/kernel-zerodev/signer/zd-local-account.js.map +1 -0
- package/dist/cjs/kernel-zerodev/types.d.ts +7 -0
- package/dist/cjs/kernel-zerodev/types.js +3 -0
- package/dist/cjs/kernel-zerodev/types.js.map +1 -0
- package/dist/cjs/kernel-zerodev/utils/ERC4337-utils.d.ts +5 -0
- package/dist/cjs/kernel-zerodev/utils/ERC4337-utils.js +106 -0
- package/dist/cjs/kernel-zerodev/utils/ERC4337-utils.js.map +1 -0
- package/dist/cjs/kernel-zerodev/utils/calc-pre-verification-gas.d.ts +15 -0
- package/dist/cjs/kernel-zerodev/utils/calc-pre-verification-gas.js +33 -0
- package/dist/cjs/kernel-zerodev/utils/calc-pre-verification-gas.js.map +1 -0
- package/dist/cjs/kernel-zerodev/utils.d.ts +21 -0
- package/dist/cjs/kernel-zerodev/utils.js +108 -0
- package/dist/cjs/kernel-zerodev/utils.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator/base.d.ts +53 -0
- package/dist/cjs/kernel-zerodev/validator/base.js +248 -0
- package/dist/cjs/kernel-zerodev/validator/base.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator/ecdsa-validator.d.ts +19 -0
- package/dist/cjs/kernel-zerodev/validator/ecdsa-validator.js +93 -0
- package/dist/cjs/kernel-zerodev/validator/ecdsa-validator.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator/erc165-session-key-validator.d.ts +27 -0
- package/dist/cjs/kernel-zerodev/validator/erc165-session-key-validator.js +103 -0
- package/dist/cjs/kernel-zerodev/validator/erc165-session-key-validator.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator/index.d.ts +6 -0
- package/dist/cjs/kernel-zerodev/validator/index.js +15 -0
- package/dist/cjs/kernel-zerodev/validator/index.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator/kill-switch-validator.d.ts +21 -0
- package/dist/cjs/kernel-zerodev/validator/kill-switch-validator.js +110 -0
- package/dist/cjs/kernel-zerodev/validator/kill-switch-validator.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator/types.d.ts +17 -0
- package/dist/cjs/kernel-zerodev/validator/types.js +3 -0
- package/dist/cjs/kernel-zerodev/validator/types.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator-provider/base.d.ts +28 -0
- package/dist/cjs/kernel-zerodev/validator-provider/base.js +94 -0
- package/dist/cjs/kernel-zerodev/validator-provider/base.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator-provider/ecdsa-provider.d.ts +8 -0
- package/dist/cjs/kernel-zerodev/validator-provider/ecdsa-provider.js +60 -0
- package/dist/cjs/kernel-zerodev/validator-provider/ecdsa-provider.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts +8 -0
- package/dist/cjs/kernel-zerodev/validator-provider/erc165-session-key-provider.js +64 -0
- package/dist/cjs/kernel-zerodev/validator-provider/erc165-session-key-provider.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator-provider/index.d.ts +6 -0
- package/dist/cjs/kernel-zerodev/validator-provider/index.js +15 -0
- package/dist/cjs/kernel-zerodev/validator-provider/index.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator-provider/kill-switch-provider.d.ts +8 -0
- package/dist/cjs/kernel-zerodev/validator-provider/kill-switch-provider.js +64 -0
- package/dist/cjs/kernel-zerodev/validator-provider/kill-switch-provider.js.map +1 -0
- package/dist/cjs/kernel-zerodev/validator-provider/types.d.ts +21 -0
- package/dist/cjs/kernel-zerodev/validator-provider/types.js +3 -0
- package/dist/cjs/kernel-zerodev/validator-provider/types.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/esm/index.d.ts +21 -0
- package/dist/esm/index.js +13 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/kernel-zerodev/abis/ERC165SessionKeyValidatorAbi.d.ts +162 -0
- package/dist/esm/kernel-zerodev/abis/ERC165SessionKeyValidatorAbi.js +212 -0
- package/dist/esm/kernel-zerodev/abis/ERC165SessionKeyValidatorAbi.js.map +1 -0
- package/dist/esm/kernel-zerodev/abis/ERC20Abi.d.ts +39 -0
- package/dist/esm/kernel-zerodev/abis/ERC20Abi.js +154 -0
- package/dist/esm/kernel-zerodev/abis/ERC20Abi.js.map +1 -0
- package/dist/esm/kernel-zerodev/abis/ESCDAValidatorAbi.d.ts +158 -0
- package/dist/esm/kernel-zerodev/abis/ESCDAValidatorAbi.js +207 -0
- package/dist/esm/kernel-zerodev/abis/ESCDAValidatorAbi.js.map +1 -0
- package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.d.ts +496 -0
- package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.js +643 -0
- package/dist/esm/kernel-zerodev/abis/KernelAccountAbi.js.map +1 -0
- package/dist/esm/kernel-zerodev/abis/KernelFactoryAbi.d.ts +293 -0
- package/dist/esm/kernel-zerodev/abis/KernelFactoryAbi.js +381 -0
- package/dist/esm/kernel-zerodev/abis/KernelFactoryAbi.js.map +1 -0
- package/dist/esm/kernel-zerodev/abis/KillSwitchValidatorAbi.d.ts +150 -0
- package/dist/esm/kernel-zerodev/abis/KillSwitchValidatorAbi.js +197 -0
- package/dist/esm/kernel-zerodev/abis/KillSwitchValidatorAbi.js.map +1 -0
- package/dist/esm/kernel-zerodev/abis/MultiSendAbi.d.ts +15 -0
- package/dist/esm/kernel-zerodev/abis/MultiSendAbi.js +21 -0
- package/dist/esm/kernel-zerodev/abis/MultiSendAbi.js.map +1 -0
- package/dist/esm/kernel-zerodev/abis/Test_ERC20Abi.d.ts +39 -0
- package/dist/esm/kernel-zerodev/abis/Test_ERC20Abi.js +158 -0
- package/dist/esm/kernel-zerodev/abis/Test_ERC20Abi.js.map +1 -0
- package/dist/esm/kernel-zerodev/abis/Test_ERC721Abi.d.ts +287 -0
- package/dist/esm/kernel-zerodev/abis/Test_ERC721Abi.js +374 -0
- package/dist/esm/kernel-zerodev/abis/Test_ERC721Abi.js.map +1 -0
- package/dist/esm/kernel-zerodev/abis/TokenActionsAbi.d.ts +63 -0
- package/dist/esm/kernel-zerodev/abis/TokenActionsAbi.js +82 -0
- package/dist/esm/kernel-zerodev/abis/TokenActionsAbi.js.map +1 -0
- package/dist/esm/kernel-zerodev/abis/index.d.ts +8 -0
- package/dist/esm/kernel-zerodev/abis/index.js +9 -0
- package/dist/esm/kernel-zerodev/abis/index.js.map +1 -0
- package/dist/esm/kernel-zerodev/account.d.ts +36 -0
- package/dist/esm/kernel-zerodev/account.js +234 -0
- package/dist/esm/kernel-zerodev/account.js.map +1 -0
- package/dist/esm/kernel-zerodev/api/index.d.ts +1 -0
- package/dist/esm/kernel-zerodev/api/index.js +17 -0
- package/dist/esm/kernel-zerodev/api/index.js.map +1 -0
- package/dist/esm/kernel-zerodev/client/create-client.d.ts +11 -0
- package/dist/esm/kernel-zerodev/client/create-client.js +17 -0
- package/dist/esm/kernel-zerodev/client/create-client.js.map +1 -0
- package/dist/esm/kernel-zerodev/constants.d.ts +23 -0
- package/dist/esm/kernel-zerodev/constants.js +42 -0
- package/dist/esm/kernel-zerodev/constants.js.map +1 -0
- package/dist/esm/kernel-zerodev/errors.d.ts +5 -0
- package/dist/esm/kernel-zerodev/errors.js +6 -0
- package/dist/esm/kernel-zerodev/errors.js.map +1 -0
- package/dist/esm/kernel-zerodev/ethers-provider/ethers-provider.d.ts +21 -0
- package/dist/esm/kernel-zerodev/ethers-provider/ethers-provider.js +90 -0
- package/dist/esm/kernel-zerodev/ethers-provider/ethers-provider.js.map +1 -0
- package/dist/esm/kernel-zerodev/middleware/gas-estimator.d.ts +15 -0
- package/dist/esm/kernel-zerodev/middleware/gas-estimator.js +124 -0
- package/dist/esm/kernel-zerodev/middleware/gas-estimator.js.map +1 -0
- package/dist/esm/kernel-zerodev/middleware/paymaster.d.ts +5 -0
- package/dist/esm/kernel-zerodev/middleware/paymaster.js +39 -0
- package/dist/esm/kernel-zerodev/middleware/paymaster.js.map +1 -0
- package/dist/esm/kernel-zerodev/paymaster/base.d.ts +16 -0
- package/dist/esm/kernel-zerodev/paymaster/base.js +51 -0
- package/dist/esm/kernel-zerodev/paymaster/base.js.map +1 -0
- package/dist/esm/kernel-zerodev/paymaster/index.d.ts +3 -0
- package/dist/esm/kernel-zerodev/paymaster/index.js +7 -0
- package/dist/esm/kernel-zerodev/paymaster/index.js.map +1 -0
- package/dist/esm/kernel-zerodev/paymaster/token-paymaster.d.ts +14 -0
- package/dist/esm/kernel-zerodev/paymaster/token-paymaster.js +168 -0
- package/dist/esm/kernel-zerodev/paymaster/token-paymaster.js.map +1 -0
- package/dist/esm/kernel-zerodev/paymaster/types.d.ts +29 -0
- package/dist/esm/kernel-zerodev/paymaster/types.js +2 -0
- package/dist/esm/kernel-zerodev/paymaster/types.js.map +1 -0
- package/dist/esm/kernel-zerodev/paymaster/verifying-paymaster.d.ts +8 -0
- package/dist/esm/kernel-zerodev/paymaster/verifying-paymaster.js +27 -0
- package/dist/esm/kernel-zerodev/paymaster/verifying-paymaster.js.map +1 -0
- package/dist/esm/kernel-zerodev/provider.d.ts +41 -0
- package/dist/esm/kernel-zerodev/provider.js +222 -0
- package/dist/esm/kernel-zerodev/provider.js.map +1 -0
- package/dist/esm/kernel-zerodev/signer/zd-local-account.d.ts +13 -0
- package/dist/esm/kernel-zerodev/signer/zd-local-account.js +58 -0
- package/dist/esm/kernel-zerodev/signer/zd-local-account.js.map +1 -0
- package/dist/esm/kernel-zerodev/types.d.ts +7 -0
- package/dist/esm/kernel-zerodev/types.js +2 -0
- package/dist/esm/kernel-zerodev/types.js.map +1 -0
- package/dist/esm/kernel-zerodev/utils/ERC4337-utils.d.ts +5 -0
- package/dist/esm/kernel-zerodev/utils/ERC4337-utils.js +100 -0
- package/dist/esm/kernel-zerodev/utils/ERC4337-utils.js.map +1 -0
- package/dist/esm/kernel-zerodev/utils/calc-pre-verification-gas.d.ts +15 -0
- package/dist/esm/kernel-zerodev/utils/calc-pre-verification-gas.js +29 -0
- package/dist/esm/kernel-zerodev/utils/calc-pre-verification-gas.js.map +1 -0
- package/dist/esm/kernel-zerodev/utils.d.ts +21 -0
- package/dist/esm/kernel-zerodev/utils.js +96 -0
- package/dist/esm/kernel-zerodev/utils.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator/base.d.ts +53 -0
- package/dist/esm/kernel-zerodev/validator/base.js +245 -0
- package/dist/esm/kernel-zerodev/validator/base.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator/ecdsa-validator.d.ts +19 -0
- package/dist/esm/kernel-zerodev/validator/ecdsa-validator.js +89 -0
- package/dist/esm/kernel-zerodev/validator/ecdsa-validator.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator/erc165-session-key-validator.d.ts +27 -0
- package/dist/esm/kernel-zerodev/validator/erc165-session-key-validator.js +99 -0
- package/dist/esm/kernel-zerodev/validator/erc165-session-key-validator.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator/index.d.ts +6 -0
- package/dist/esm/kernel-zerodev/validator/index.js +10 -0
- package/dist/esm/kernel-zerodev/validator/index.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator/kill-switch-validator.d.ts +21 -0
- package/dist/esm/kernel-zerodev/validator/kill-switch-validator.js +106 -0
- package/dist/esm/kernel-zerodev/validator/kill-switch-validator.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator/types.d.ts +17 -0
- package/dist/esm/kernel-zerodev/validator/types.js +2 -0
- package/dist/esm/kernel-zerodev/validator/types.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator-provider/base.d.ts +28 -0
- package/dist/esm/kernel-zerodev/validator-provider/base.js +91 -0
- package/dist/esm/kernel-zerodev/validator-provider/base.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator-provider/ecdsa-provider.d.ts +8 -0
- package/dist/esm/kernel-zerodev/validator-provider/ecdsa-provider.js +56 -0
- package/dist/esm/kernel-zerodev/validator-provider/ecdsa-provider.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts +8 -0
- package/dist/esm/kernel-zerodev/validator-provider/erc165-session-key-provider.js +60 -0
- package/dist/esm/kernel-zerodev/validator-provider/erc165-session-key-provider.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator-provider/index.d.ts +6 -0
- package/dist/esm/kernel-zerodev/validator-provider/index.js +10 -0
- package/dist/esm/kernel-zerodev/validator-provider/index.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator-provider/kill-switch-provider.d.ts +8 -0
- package/dist/esm/kernel-zerodev/validator-provider/kill-switch-provider.js +60 -0
- package/dist/esm/kernel-zerodev/validator-provider/kill-switch-provider.js.map +1 -0
- package/dist/esm/kernel-zerodev/validator-provider/types.d.ts +21 -0
- package/dist/esm/kernel-zerodev/validator-provider/types.js +2 -0
- package/dist/esm/kernel-zerodev/validator-provider/types.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/types/index.d.ts +22 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/abis/ERC165SessionKeyValidatorAbi.d.ts +163 -0
- package/dist/types/kernel-zerodev/abis/ERC165SessionKeyValidatorAbi.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/abis/ERC20Abi.d.ts +40 -0
- package/dist/types/kernel-zerodev/abis/ERC20Abi.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/abis/ESCDAValidatorAbi.d.ts +159 -0
- package/dist/types/kernel-zerodev/abis/ESCDAValidatorAbi.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/abis/KernelAccountAbi.d.ts +497 -0
- package/dist/types/kernel-zerodev/abis/KernelAccountAbi.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/abis/KernelFactoryAbi.d.ts +294 -0
- package/dist/types/kernel-zerodev/abis/KernelFactoryAbi.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/abis/KillSwitchValidatorAbi.d.ts +151 -0
- package/dist/types/kernel-zerodev/abis/KillSwitchValidatorAbi.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/abis/MultiSendAbi.d.ts +16 -0
- package/dist/types/kernel-zerodev/abis/MultiSendAbi.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/abis/Test_ERC20Abi.d.ts +40 -0
- package/dist/types/kernel-zerodev/abis/Test_ERC20Abi.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/abis/Test_ERC721Abi.d.ts +288 -0
- package/dist/types/kernel-zerodev/abis/Test_ERC721Abi.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/abis/TokenActionsAbi.d.ts +64 -0
- package/dist/types/kernel-zerodev/abis/TokenActionsAbi.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/abis/index.d.ts +9 -0
- package/dist/types/kernel-zerodev/abis/index.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/account.d.ts +37 -0
- package/dist/types/kernel-zerodev/account.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/api/index.d.ts +2 -0
- package/dist/types/kernel-zerodev/api/index.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/client/create-client.d.ts +12 -0
- package/dist/types/kernel-zerodev/client/create-client.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/constants.d.ts +24 -0
- package/dist/types/kernel-zerodev/constants.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/errors.d.ts +6 -0
- package/dist/types/kernel-zerodev/errors.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/ethers-provider/ethers-provider.d.ts +39 -0
- package/dist/types/kernel-zerodev/ethers-provider/ethers-provider.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/middleware/gas-estimator.d.ts +20 -0
- package/dist/types/kernel-zerodev/middleware/gas-estimator.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/middleware/paymaster.d.ts +6 -0
- package/dist/types/kernel-zerodev/middleware/paymaster.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/paymaster/base.d.ts +17 -0
- package/dist/types/kernel-zerodev/paymaster/base.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/paymaster/index.d.ts +4 -0
- package/dist/types/kernel-zerodev/paymaster/index.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/paymaster/token-paymaster.d.ts +15 -0
- package/dist/types/kernel-zerodev/paymaster/token-paymaster.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/paymaster/types.d.ts +30 -0
- package/dist/types/kernel-zerodev/paymaster/types.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/paymaster/verifying-paymaster.d.ts +9 -0
- package/dist/types/kernel-zerodev/paymaster/verifying-paymaster.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/provider.d.ts +42 -0
- package/dist/types/kernel-zerodev/provider.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/signer/zd-local-account.d.ts +14 -0
- package/dist/types/kernel-zerodev/signer/zd-local-account.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/types.d.ts +8 -0
- package/dist/types/kernel-zerodev/types.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/utils/ERC4337-utils.d.ts +18 -0
- package/dist/types/kernel-zerodev/utils/ERC4337-utils.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/utils/calc-pre-verification-gas.d.ts +44 -0
- package/dist/types/kernel-zerodev/utils/calc-pre-verification-gas.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/utils.d.ts +22 -0
- package/dist/types/kernel-zerodev/utils.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator/base.d.ts +54 -0
- package/dist/types/kernel-zerodev/validator/base.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator/ecdsa-validator.d.ts +20 -0
- package/dist/types/kernel-zerodev/validator/ecdsa-validator.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator/erc165-session-key-validator.d.ts +28 -0
- package/dist/types/kernel-zerodev/validator/erc165-session-key-validator.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator/index.d.ts +7 -0
- package/dist/types/kernel-zerodev/validator/index.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator/kill-switch-validator.d.ts +22 -0
- package/dist/types/kernel-zerodev/validator/kill-switch-validator.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator/types.d.ts +18 -0
- package/dist/types/kernel-zerodev/validator/types.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator-provider/base.d.ts +29 -0
- package/dist/types/kernel-zerodev/validator-provider/base.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator-provider/ecdsa-provider.d.ts +9 -0
- package/dist/types/kernel-zerodev/validator-provider/ecdsa-provider.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts +9 -0
- package/dist/types/kernel-zerodev/validator-provider/erc165-session-key-provider.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator-provider/index.d.ts +7 -0
- package/dist/types/kernel-zerodev/validator-provider/index.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator-provider/kill-switch-provider.d.ts +9 -0
- package/dist/types/kernel-zerodev/validator-provider/kill-switch-provider.d.ts.map +1 -0
- package/dist/types/kernel-zerodev/validator-provider/types.d.ts +22 -0
- package/dist/types/kernel-zerodev/validator-provider/types.d.ts.map +1 -0
- package/package.json +70 -0
- package/src/index.ts +41 -0
- package/src/kernel-zerodev/__tests__/mocks/mock-signer-validator.ts +20 -0
- package/src/kernel-zerodev/__tests__/mocks/mock-signer.ts +14 -0
- package/src/kernel-zerodev/abis/ERC165SessionKeyValidatorAbi.ts +211 -0
- package/src/kernel-zerodev/abis/ERC20Abi.ts +153 -0
- package/src/kernel-zerodev/abis/ESCDAValidatorAbi.ts +206 -0
- package/src/kernel-zerodev/abis/KernelAccountAbi.ts +642 -0
- package/src/kernel-zerodev/abis/KernelFactoryAbi.ts +380 -0
- package/src/kernel-zerodev/abis/KillSwitchValidatorAbi.ts +196 -0
- package/src/kernel-zerodev/abis/MultiSendAbi.ts +20 -0
- package/src/kernel-zerodev/abis/Test_ERC20Abi.ts +157 -0
- package/src/kernel-zerodev/abis/Test_ERC721Abi.ts +373 -0
- package/src/kernel-zerodev/abis/TokenActionsAbi.ts +81 -0
- package/src/kernel-zerodev/abis/index.ts +17 -0
- package/src/kernel-zerodev/account.ts +308 -0
- package/src/kernel-zerodev/api/index.ts +25 -0
- package/src/kernel-zerodev/client/create-client.ts +37 -0
- package/src/kernel-zerodev/constants.ts +71 -0
- package/src/kernel-zerodev/errors.ts +13 -0
- package/src/kernel-zerodev/ethers-provider/ethers-provider.ts +118 -0
- package/src/kernel-zerodev/middleware/gas-estimator.ts +183 -0
- package/src/kernel-zerodev/middleware/paymaster.ts +66 -0
- package/src/kernel-zerodev/paymaster/base.ts +76 -0
- package/src/kernel-zerodev/paymaster/index.ts +9 -0
- package/src/kernel-zerodev/paymaster/token-paymaster.ts +209 -0
- package/src/kernel-zerodev/paymaster/types.ts +36 -0
- package/src/kernel-zerodev/paymaster/verifying-paymaster.ts +38 -0
- package/src/kernel-zerodev/provider.ts +307 -0
- package/src/kernel-zerodev/signer/zd-local-account.ts +63 -0
- package/src/kernel-zerodev/types.ts +8 -0
- package/src/kernel-zerodev/utils/ERC4337-utils.ts +161 -0
- package/src/kernel-zerodev/utils/calc-pre-verification-gas.ts +88 -0
- package/src/kernel-zerodev/utils.ts +166 -0
- package/src/kernel-zerodev/validator/base.ts +273 -0
- package/src/kernel-zerodev/validator/ecdsa-validator.ts +117 -0
- package/src/kernel-zerodev/validator/erc165-session-key-validator.ts +127 -0
- package/src/kernel-zerodev/validator/index.ts +12 -0
- package/src/kernel-zerodev/validator/kill-switch-validator.ts +142 -0
- package/src/kernel-zerodev/validator/types.ts +36 -0
- package/src/kernel-zerodev/validator-provider/base.ts +140 -0
- package/src/kernel-zerodev/validator-provider/ecdsa-provider.ts +61 -0
- package/src/kernel-zerodev/validator-provider/erc165-session-key-provider.ts +68 -0
- package/src/kernel-zerodev/validator-provider/index.ts +12 -0
- package/src/kernel-zerodev/validator-provider/kill-switch-provider.ts +68 -0
- package/src/kernel-zerodev/validator-provider/types.ts +26 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type Address,
|
|
3
|
+
type Chain,
|
|
4
|
+
type Hex,
|
|
5
|
+
type HttpTransport,
|
|
6
|
+
type RpcTransactionRequest,
|
|
7
|
+
} from "viem";
|
|
8
|
+
import {
|
|
9
|
+
deepHexlify,
|
|
10
|
+
resolveProperties,
|
|
11
|
+
type SmartAccountProviderOpts,
|
|
12
|
+
getChain,
|
|
13
|
+
type UserOperationCallData,
|
|
14
|
+
type BatchUserOperationCallData,
|
|
15
|
+
type SendUserOperationResult,
|
|
16
|
+
asyncPipe,
|
|
17
|
+
noOpMiddleware,
|
|
18
|
+
type UserOperationStruct,
|
|
19
|
+
type BytesLike,
|
|
20
|
+
SmartAccountProvider,
|
|
21
|
+
type AccountMiddlewareFn,
|
|
22
|
+
} from "@alchemy/aa-core";
|
|
23
|
+
import {
|
|
24
|
+
BUNDLER_URL,
|
|
25
|
+
DEFAULT_SEND_TX_MAX_RETRIES,
|
|
26
|
+
DEFAULT_SEND_TX_RETRY_INTERVAL_MS,
|
|
27
|
+
ENTRYPOINT_ADDRESS,
|
|
28
|
+
minPriorityFeePerBidDefaults,
|
|
29
|
+
} from "./constants.js";
|
|
30
|
+
import { KernelSmartContractAccount, isKernelAccount } from "./account.js";
|
|
31
|
+
import { withZeroDevGasEstimator } from "./middleware/gas-estimator.js";
|
|
32
|
+
import { isValidRequest } from "./utils/ERC4337-utils.js";
|
|
33
|
+
import { InvalidOperation } from "./errors.js";
|
|
34
|
+
import { withZeroDevPaymasterAndData } from "./middleware/paymaster.js";
|
|
35
|
+
import { createZeroDevPublicErc4337Client } from "./client/create-client.js";
|
|
36
|
+
import type {
|
|
37
|
+
PaymasterAndBundlerProviders,
|
|
38
|
+
PaymasterConfig,
|
|
39
|
+
PaymasterPolicy,
|
|
40
|
+
} from "./paymaster/types.js";
|
|
41
|
+
|
|
42
|
+
export type ZeroDevProviderConfig = {
|
|
43
|
+
projectId: string;
|
|
44
|
+
chain: Chain | number;
|
|
45
|
+
entryPointAddress?: Address;
|
|
46
|
+
rpcUrl?: string;
|
|
47
|
+
account?: KernelSmartContractAccount;
|
|
48
|
+
bundlerProvider?: PaymasterAndBundlerProviders;
|
|
49
|
+
opts?: SmartAccountProviderOpts & {
|
|
50
|
+
sendTxMaxRetries?: number;
|
|
51
|
+
sendTxRetryIntervalMs?: number;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export enum Operation {
|
|
56
|
+
Call,
|
|
57
|
+
DelegateCall,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
type UserOpDataOperationTypes<T> = T extends UserOperationCallData
|
|
61
|
+
? Operation.Call | Operation.DelegateCall
|
|
62
|
+
: T extends BatchUserOperationCallData
|
|
63
|
+
? Operation.Call
|
|
64
|
+
: never;
|
|
65
|
+
|
|
66
|
+
export class ZeroDevProvider extends SmartAccountProvider<HttpTransport> {
|
|
67
|
+
protected projectId: string;
|
|
68
|
+
protected sendTxMaxRetries: number;
|
|
69
|
+
protected sendTxRetryIntervalMs: number;
|
|
70
|
+
|
|
71
|
+
constructor({
|
|
72
|
+
projectId,
|
|
73
|
+
chain,
|
|
74
|
+
entryPointAddress = ENTRYPOINT_ADDRESS,
|
|
75
|
+
rpcUrl = BUNDLER_URL,
|
|
76
|
+
account,
|
|
77
|
+
bundlerProvider,
|
|
78
|
+
opts,
|
|
79
|
+
}: ZeroDevProviderConfig) {
|
|
80
|
+
const _chain = typeof chain === "number" ? getChain(chain) : chain;
|
|
81
|
+
const rpcClient = createZeroDevPublicErc4337Client({
|
|
82
|
+
chain: _chain,
|
|
83
|
+
rpcUrl,
|
|
84
|
+
projectId,
|
|
85
|
+
bundlerProvider,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
super(rpcClient, entryPointAddress, _chain, account, {
|
|
89
|
+
...opts,
|
|
90
|
+
txMaxRetries: opts?.txMaxRetries ?? 10,
|
|
91
|
+
txRetryIntervalMs: opts?.txRetryIntervalMs ?? 10000,
|
|
92
|
+
minPriorityFeePerBid:
|
|
93
|
+
opts?.minPriorityFeePerBid ??
|
|
94
|
+
minPriorityFeePerBidDefaults.get(_chain.id),
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
this.projectId = projectId;
|
|
98
|
+
this.sendTxMaxRetries =
|
|
99
|
+
opts?.sendTxMaxRetries ?? DEFAULT_SEND_TX_MAX_RETRIES;
|
|
100
|
+
this.sendTxRetryIntervalMs =
|
|
101
|
+
opts?.sendTxRetryIntervalMs ?? DEFAULT_SEND_TX_RETRY_INTERVAL_MS;
|
|
102
|
+
|
|
103
|
+
withZeroDevGasEstimator(this);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
getProjectId = (): string => this.projectId;
|
|
107
|
+
|
|
108
|
+
sendUserOperation = async <
|
|
109
|
+
T extends UserOperationCallData | BatchUserOperationCallData
|
|
110
|
+
>(
|
|
111
|
+
data: T,
|
|
112
|
+
operation: UserOpDataOperationTypes<T> = Operation.Call as UserOpDataOperationTypes<T>
|
|
113
|
+
): Promise<SendUserOperationResult> => {
|
|
114
|
+
if (!isKernelAccount(this.account)) {
|
|
115
|
+
throw new Error("account not connected!");
|
|
116
|
+
}
|
|
117
|
+
if (!this.account.validator) {
|
|
118
|
+
throw new Error("validator not connected!");
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
let callData: BytesLike = "0x";
|
|
122
|
+
|
|
123
|
+
if (Array.isArray(data)) {
|
|
124
|
+
if (operation === Operation.Call) {
|
|
125
|
+
callData = await this.account.encodeBatchExecute(data);
|
|
126
|
+
} else {
|
|
127
|
+
throw InvalidOperation;
|
|
128
|
+
}
|
|
129
|
+
} else if (isKernelAccount(this.account)) {
|
|
130
|
+
if (operation === Operation.DelegateCall) {
|
|
131
|
+
callData = await this.account.encodeExecuteDelegate(
|
|
132
|
+
data.target,
|
|
133
|
+
data.value ?? 0n,
|
|
134
|
+
data.data
|
|
135
|
+
);
|
|
136
|
+
} else if (operation === Operation.Call) {
|
|
137
|
+
callData = await this.account.encodeExecute(
|
|
138
|
+
data.target,
|
|
139
|
+
data.value ?? 0n,
|
|
140
|
+
data.data
|
|
141
|
+
);
|
|
142
|
+
} else {
|
|
143
|
+
throw InvalidOperation;
|
|
144
|
+
}
|
|
145
|
+
} else {
|
|
146
|
+
throw InvalidOperation;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const initCode = await this.account.getInitCode();
|
|
150
|
+
let hash: string = "";
|
|
151
|
+
let i = 0;
|
|
152
|
+
let maxFeePerGas = 0n;
|
|
153
|
+
let maxPriorityFeePerGas = 0n;
|
|
154
|
+
let request: UserOperationStruct;
|
|
155
|
+
|
|
156
|
+
const nonce = await this.account.getNonce();
|
|
157
|
+
do {
|
|
158
|
+
const uoStruct = await asyncPipe(
|
|
159
|
+
this.dummyPaymasterDataMiddleware,
|
|
160
|
+
this.feeDataGetter,
|
|
161
|
+
this.paymasterDataMiddleware,
|
|
162
|
+
this.gasEstimator,
|
|
163
|
+
this.customMiddleware ?? noOpMiddleware
|
|
164
|
+
)({
|
|
165
|
+
initCode,
|
|
166
|
+
sender: this.getAddress(),
|
|
167
|
+
nonce,
|
|
168
|
+
callData,
|
|
169
|
+
signature: await this.account
|
|
170
|
+
.getValidator()
|
|
171
|
+
.getDynamicDummySignature(await this.getAddress(), callData as Hex),
|
|
172
|
+
maxFeePerGas,
|
|
173
|
+
maxPriorityFeePerGas,
|
|
174
|
+
} as UserOperationStruct);
|
|
175
|
+
request = deepHexlify(await resolveProperties(uoStruct));
|
|
176
|
+
|
|
177
|
+
if (!isValidRequest(request)) {
|
|
178
|
+
// this pretty prints the uo
|
|
179
|
+
throw new Error(
|
|
180
|
+
`Request is missing parameters. All properties on UserOperationStruct must be set. uo: ${JSON.stringify(
|
|
181
|
+
request,
|
|
182
|
+
null,
|
|
183
|
+
2
|
|
184
|
+
)}`
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
request.signature = await this.account.validator.getSignature(request);
|
|
189
|
+
try {
|
|
190
|
+
hash = await this.rpcClient.sendUserOperation(
|
|
191
|
+
request,
|
|
192
|
+
this.entryPointAddress
|
|
193
|
+
);
|
|
194
|
+
} catch (error: any) {
|
|
195
|
+
if (this.isReplacementOpError(error) && i++ < this.sendTxMaxRetries) {
|
|
196
|
+
maxFeePerGas = (BigInt(request.maxFeePerGas) * 113n) / 100n;
|
|
197
|
+
maxPriorityFeePerGas =
|
|
198
|
+
(BigInt(request.maxPriorityFeePerGas) * 113n) / 100n;
|
|
199
|
+
console.log(
|
|
200
|
+
`After ${
|
|
201
|
+
this.sendTxRetryIntervalMs / 60000
|
|
202
|
+
} minutes, resending tx with Increased Gas fees: maxFeePerGas: ${maxFeePerGas}, maxPriorityFeePerGas: ${maxPriorityFeePerGas}`
|
|
203
|
+
);
|
|
204
|
+
await new Promise((resolve) =>
|
|
205
|
+
setTimeout(resolve, this.sendTxRetryIntervalMs)
|
|
206
|
+
);
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
throw this.unwrapError(error);
|
|
210
|
+
}
|
|
211
|
+
} while (hash === "");
|
|
212
|
+
|
|
213
|
+
return {
|
|
214
|
+
hash,
|
|
215
|
+
request,
|
|
216
|
+
};
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
isReplacementOpError(errorIn: any): boolean {
|
|
220
|
+
if (errorIn.cause != null) {
|
|
221
|
+
const failedOpMessage: string | undefined = errorIn?.cause?.message;
|
|
222
|
+
return (
|
|
223
|
+
(failedOpMessage?.includes(
|
|
224
|
+
"replacement op must increase maxFeePerGas and MaxPriorityFeePerGas"
|
|
225
|
+
) ||
|
|
226
|
+
failedOpMessage?.match(/.*replacement.*underpriced.*/) !== null) ??
|
|
227
|
+
false
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
unwrapError(errorIn: any): Error {
|
|
234
|
+
if (errorIn?.cause != null) {
|
|
235
|
+
let paymasterInfo: string = "";
|
|
236
|
+
let failedOpMessage: string | undefined = errorIn?.cause?.message;
|
|
237
|
+
if (failedOpMessage?.includes("FailedOp") === true) {
|
|
238
|
+
// TODO: better error extraction methods will be needed
|
|
239
|
+
const matched = failedOpMessage.match(/FailedOp\((.*)\)/);
|
|
240
|
+
if (matched != null) {
|
|
241
|
+
const split = matched[1].split(",");
|
|
242
|
+
paymasterInfo = `(paymaster address: ${split[1]})`;
|
|
243
|
+
failedOpMessage = split[2];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const error = new Error(
|
|
247
|
+
`The bundler has failed to include UserOperation in a batch: ${failedOpMessage} ${paymasterInfo}`
|
|
248
|
+
);
|
|
249
|
+
error.stack = errorIn.stack;
|
|
250
|
+
return error;
|
|
251
|
+
}
|
|
252
|
+
return errorIn;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
getAccount: () => KernelSmartContractAccount = () => {
|
|
256
|
+
if (!isKernelAccount(this.account)) {
|
|
257
|
+
throw new Error("account not connected!");
|
|
258
|
+
}
|
|
259
|
+
return this.account;
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
dummyPaymasterDataMiddleware: AccountMiddlewareFn = async (
|
|
263
|
+
struct: UserOperationStruct
|
|
264
|
+
): Promise<UserOperationStruct> => {
|
|
265
|
+
struct.paymasterAndData =
|
|
266
|
+
"0xfe7dbcab8aaee4eb67943c1e6be95b1d065985c6000000000000000000000000000000000000000000000000000001869aa31cf400000000000000000000000000000000000000000000000000000000000000007dfe2190f34af27b265bae608717cdc9368b471fc0c097ab7b4088f255b4961e57b039e7e571b15221081c5dce7bcb93459b27a3ab65d2f8a889f4a40b4022801b";
|
|
267
|
+
return struct;
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
withZeroDevPaymasterAndData(config: PaymasterConfig<PaymasterPolicy>) {
|
|
271
|
+
if (!this.isConnected()) {
|
|
272
|
+
throw new Error(
|
|
273
|
+
"ZeroDevProvider: account is not set, did you call `connect` first?"
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return withZeroDevPaymasterAndData(this, config);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
request: (args: { method: string; params?: any[] }) => Promise<any> = async (
|
|
281
|
+
args
|
|
282
|
+
) => {
|
|
283
|
+
const { method, params } = args;
|
|
284
|
+
switch (method) {
|
|
285
|
+
case "eth_chainId":
|
|
286
|
+
return this.chain.id;
|
|
287
|
+
case "eth_sendTransaction":
|
|
288
|
+
const [tx] = params as [RpcTransactionRequest];
|
|
289
|
+
return this.sendTransaction(tx);
|
|
290
|
+
case "personal_sign":
|
|
291
|
+
if (!this.account) {
|
|
292
|
+
throw new Error("account not connected!");
|
|
293
|
+
}
|
|
294
|
+
const [data, address] = params!;
|
|
295
|
+
if (address !== (await this.getAddress())) {
|
|
296
|
+
throw new Error(
|
|
297
|
+
"cannot sign for address that is not the current account"
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
// @ts-ignore
|
|
301
|
+
return this.account.signWithEip6492(data);
|
|
302
|
+
default:
|
|
303
|
+
// @ts-ignore
|
|
304
|
+
return this.rpcClient.request(args);
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type SmartAccountSigner } from "@alchemy/aa-core";
|
|
2
|
+
import {
|
|
3
|
+
isHex,
|
|
4
|
+
type HDAccount,
|
|
5
|
+
type Hash,
|
|
6
|
+
type PrivateKeyAccount,
|
|
7
|
+
type TypedData,
|
|
8
|
+
type TypedDataDefinition,
|
|
9
|
+
type Hex,
|
|
10
|
+
} from "viem";
|
|
11
|
+
import { mnemonicToAccount, privateKeyToAccount } from "viem/accounts";
|
|
12
|
+
|
|
13
|
+
export class ZeroDevLocalAccountSigner<T extends HDAccount | PrivateKeyAccount>
|
|
14
|
+
implements SmartAccountSigner
|
|
15
|
+
{
|
|
16
|
+
private owner: T;
|
|
17
|
+
constructor(owner: T) {
|
|
18
|
+
this.owner = owner;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
readonly signMessage: (msg: string | Uint8Array) => Promise<`0x${string}`> = (
|
|
22
|
+
msg
|
|
23
|
+
) => {
|
|
24
|
+
if (typeof msg === "string" && !isHex(msg)) {
|
|
25
|
+
return this.owner.signMessage({
|
|
26
|
+
message: msg,
|
|
27
|
+
});
|
|
28
|
+
} else {
|
|
29
|
+
return this.owner.signMessage({
|
|
30
|
+
message: {
|
|
31
|
+
raw: msg,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
readonly signTypedData: <
|
|
38
|
+
TTypedData extends TypedData | { [key: string]: unknown },
|
|
39
|
+
TPrimaryType extends string = string
|
|
40
|
+
>(
|
|
41
|
+
typedData: TypedDataDefinition<TTypedData, TPrimaryType>
|
|
42
|
+
) => Promise<Hash> = async (typedData) => {
|
|
43
|
+
return await this.owner.signTypedData(typedData);
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
readonly getAddress: () => Promise<`0x${string}`> = async () => {
|
|
47
|
+
return this.owner.address;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
static mnemonicToAccountSigner(
|
|
51
|
+
key: string
|
|
52
|
+
): ZeroDevLocalAccountSigner<HDAccount> {
|
|
53
|
+
const owner = mnemonicToAccount(key);
|
|
54
|
+
return new ZeroDevLocalAccountSigner(owner);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
static privateKeyToAccountSigner(
|
|
58
|
+
key: Hex
|
|
59
|
+
): ZeroDevLocalAccountSigner<PrivateKeyAccount> {
|
|
60
|
+
const owner = privateKeyToAccount(key);
|
|
61
|
+
return new ZeroDevLocalAccountSigner(owner);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type WithOptional<T, K extends keyof T> = Pick<Partial<T>, K>;
|
|
2
|
+
export type WithRequired<T, K extends keyof T> = Required<Pick<T, K>>;
|
|
3
|
+
export type MakeOptional<T, K extends keyof T> = Omit<T, K> &
|
|
4
|
+
Partial<Pick<T, K>>;
|
|
5
|
+
export type RequiredKeys<T> = {
|
|
6
|
+
[K in keyof T]-?: {} extends Pick<T, K> ? never : K;
|
|
7
|
+
}[keyof T];
|
|
8
|
+
export type RequiredProps<T> = Pick<T, RequiredKeys<T>>;
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EntryPointAbi,
|
|
3
|
+
type UserOperationRequest,
|
|
4
|
+
type UserOperationStruct,
|
|
5
|
+
} from "@alchemy/aa-core";
|
|
6
|
+
import type { NotPromise } from "./calc-pre-verification-gas.js";
|
|
7
|
+
import {
|
|
8
|
+
encodeAbiParameters,
|
|
9
|
+
parseAbiParameters,
|
|
10
|
+
type Hex,
|
|
11
|
+
keccak256,
|
|
12
|
+
toHex,
|
|
13
|
+
} from "viem";
|
|
14
|
+
|
|
15
|
+
// UserOperation is the first parameter of validateUseOp
|
|
16
|
+
const validateUserOpMethod = "simulateValidation";
|
|
17
|
+
|
|
18
|
+
const UserOpType = EntryPointAbi.find(
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
(entry) => entry.name === validateUserOpMethod
|
|
21
|
+
// @ts-ignore
|
|
22
|
+
)?.inputs[0];
|
|
23
|
+
|
|
24
|
+
function encode(
|
|
25
|
+
typevalues: Array<{ type: string; val: any }>,
|
|
26
|
+
forSignature: boolean
|
|
27
|
+
): string {
|
|
28
|
+
const types = typevalues
|
|
29
|
+
.map((typevalue) =>
|
|
30
|
+
typevalue.type === "bytes" && forSignature ? "bytes32" : typevalue.type
|
|
31
|
+
)
|
|
32
|
+
.join(", ");
|
|
33
|
+
const values = typevalues.map((typevalue) =>
|
|
34
|
+
typevalue.type === "bytes" && forSignature
|
|
35
|
+
? keccak256(typevalue.val)
|
|
36
|
+
: typevalue.val
|
|
37
|
+
);
|
|
38
|
+
return encodeAbiParameters(parseAbiParameters(types), values);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* pack the userOperation
|
|
43
|
+
* @param op
|
|
44
|
+
* @param forSignature "true" if the hash is needed to calculate the getUserOpHash()
|
|
45
|
+
* "false" to pack entire UserOp, for calculating the calldata cost of putting it on-chain.
|
|
46
|
+
*/
|
|
47
|
+
export function packUserOp(
|
|
48
|
+
op: NotPromise<UserOperationStruct>,
|
|
49
|
+
forSignature = true
|
|
50
|
+
): string {
|
|
51
|
+
if (forSignature) {
|
|
52
|
+
// lighter signature scheme (must match UserOperation#pack): do encode a zero-length signature, but strip afterwards the appended zero-length value
|
|
53
|
+
const userOpType = {
|
|
54
|
+
components: [
|
|
55
|
+
{
|
|
56
|
+
type: "address",
|
|
57
|
+
name: "sender",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
type: "uint256",
|
|
61
|
+
name: "nonce",
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
type: "bytes",
|
|
65
|
+
name: "initCode",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
type: "bytes",
|
|
69
|
+
name: "callData",
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
type: "uint256",
|
|
73
|
+
name: "callGasLimit",
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
type: "uint256",
|
|
77
|
+
name: "verificationGasLimit",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
type: "uint256",
|
|
81
|
+
name: "preVerificationGas",
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
type: "uint256",
|
|
85
|
+
name: "maxFeePerGas",
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
type: "uint256",
|
|
89
|
+
name: "maxPriorityFeePerGas",
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
type: "bytes",
|
|
93
|
+
name: "paymasterAndData",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
type: "bytes",
|
|
97
|
+
name: "signature",
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
name: "userOp",
|
|
101
|
+
type: "tuple",
|
|
102
|
+
};
|
|
103
|
+
// console.log('hard-coded userOpType', userOpType)
|
|
104
|
+
// console.log('from ABI userOpType', UserOpType)
|
|
105
|
+
let encoded = encodeAbiParameters(
|
|
106
|
+
userOpType.components,
|
|
107
|
+
Object.values({
|
|
108
|
+
...op,
|
|
109
|
+
signature: "0x",
|
|
110
|
+
})
|
|
111
|
+
);
|
|
112
|
+
// remove leading word (total length) and trailing word (zero-length signature)
|
|
113
|
+
encoded = ("0x" + encoded.slice(66, encoded.length - 64)) as Hex;
|
|
114
|
+
return encoded;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const typevalues = (UserOpType as any).components.map(
|
|
118
|
+
(c: { name: keyof typeof op; type: string }) => ({
|
|
119
|
+
type: c.type,
|
|
120
|
+
val: op[c.name],
|
|
121
|
+
})
|
|
122
|
+
);
|
|
123
|
+
return encode(typevalues, forSignature);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Utility method for asserting a {@link UserOperationStruct} is a {@link UserOperationRequest}
|
|
128
|
+
*
|
|
129
|
+
* @param request a {@link UserOperationStruct} to validate
|
|
130
|
+
* @returns a type guard that asserts the {@link UserOperationStruct} is a {@link UserOperationRequest}
|
|
131
|
+
*/
|
|
132
|
+
export function isValidRequest(
|
|
133
|
+
request: UserOperationStruct
|
|
134
|
+
): request is UserOperationRequest {
|
|
135
|
+
// These are the only ones marked as optional in the interface above
|
|
136
|
+
return (
|
|
137
|
+
!!request.callGasLimit &&
|
|
138
|
+
!!request.maxFeePerGas &&
|
|
139
|
+
request.maxPriorityFeePerGas != null &&
|
|
140
|
+
!!request.preVerificationGas &&
|
|
141
|
+
!!request.verificationGasLimit
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export const hexifyUserOp = (resolvedUserOp: any) => {
|
|
146
|
+
return Object.keys(resolvedUserOp)
|
|
147
|
+
.map((key) => {
|
|
148
|
+
let val = resolvedUserOp[key];
|
|
149
|
+
if (typeof val !== "string" || !val.startsWith("0x")) {
|
|
150
|
+
val = toHex(val);
|
|
151
|
+
}
|
|
152
|
+
return [key, val];
|
|
153
|
+
})
|
|
154
|
+
.reduce(
|
|
155
|
+
(set, [k, v]) => ({
|
|
156
|
+
...set,
|
|
157
|
+
[k]: v,
|
|
158
|
+
}),
|
|
159
|
+
{}
|
|
160
|
+
);
|
|
161
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { UserOperationStruct } from "@alchemy/aa-core";
|
|
2
|
+
import { toBytes, toHex } from "viem";
|
|
3
|
+
import { packUserOp } from "./ERC4337-utils.js";
|
|
4
|
+
|
|
5
|
+
export interface GasOverheads {
|
|
6
|
+
/**
|
|
7
|
+
* fixed overhead for entire handleOp bundle.
|
|
8
|
+
*/
|
|
9
|
+
fixed: number;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* per userOp overhead, added on top of the above fixed per-bundle.
|
|
13
|
+
*/
|
|
14
|
+
perUserOp: number;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* overhead for userOp word (32 bytes) block
|
|
18
|
+
*/
|
|
19
|
+
perUserOpWord: number;
|
|
20
|
+
|
|
21
|
+
// perCallDataWord: number
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* zero byte cost, for calldata gas cost calculations
|
|
25
|
+
*/
|
|
26
|
+
zeroByte: number;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* non-zero byte cost, for calldata gas cost calculations
|
|
30
|
+
*/
|
|
31
|
+
nonZeroByte: number;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* expected bundle size, to split per-bundle overhead between all ops.
|
|
35
|
+
*/
|
|
36
|
+
bundleSize: number;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* expected length of the userOp signature.
|
|
40
|
+
*/
|
|
41
|
+
sigSize: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export const DefaultGasOverheads: GasOverheads = {
|
|
45
|
+
fixed: 21000,
|
|
46
|
+
perUserOp: 18300,
|
|
47
|
+
perUserOpWord: 4,
|
|
48
|
+
zeroByte: 4,
|
|
49
|
+
nonZeroByte: 16,
|
|
50
|
+
bundleSize: 1,
|
|
51
|
+
sigSize: 65,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export type NotPromise<T> = {
|
|
55
|
+
[P in keyof T]: Exclude<T[P], Promise<any>>;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* calculate the preVerificationGas of the given UserOperation
|
|
60
|
+
* preVerificationGas (by definition) is the cost overhead that can't be calculated on-chain.
|
|
61
|
+
* it is based on parameters that are defined by the Ethereum protocol for external transactions.
|
|
62
|
+
* @param userOp filled userOp to calculate. The only possible missing fields can be the signature and preVerificationGas itself
|
|
63
|
+
* @param overheads gas overheads to use, to override the default values
|
|
64
|
+
*/
|
|
65
|
+
export function calcPreVerificationGas(
|
|
66
|
+
userOp: Partial<NotPromise<UserOperationStruct>>,
|
|
67
|
+
overheads?: Partial<GasOverheads>
|
|
68
|
+
): number {
|
|
69
|
+
const ov = { ...DefaultGasOverheads, ...(overheads ?? {}) };
|
|
70
|
+
const p: NotPromise<UserOperationStruct> = {
|
|
71
|
+
// dummy values, in case the UserOp is incomplete.
|
|
72
|
+
preVerificationGas: 21000, // dummy value, just for calldata cost
|
|
73
|
+
signature: toHex(Buffer.alloc(ov.sigSize, 1)), // dummy signature
|
|
74
|
+
...userOp,
|
|
75
|
+
} as any;
|
|
76
|
+
|
|
77
|
+
const packed = toBytes(packUserOp(p, false));
|
|
78
|
+
const callDataCost = packed
|
|
79
|
+
.map((x) => (x === 0 ? ov.zeroByte : ov.nonZeroByte))
|
|
80
|
+
.reduce((sum, x) => sum + x);
|
|
81
|
+
const ret = Math.round(
|
|
82
|
+
callDataCost +
|
|
83
|
+
ov.fixed / ov.bundleSize +
|
|
84
|
+
ov.perUserOp +
|
|
85
|
+
ov.perUserOpWord * packed.length
|
|
86
|
+
);
|
|
87
|
+
return ret;
|
|
88
|
+
}
|