From b979f8cc18d0b120cf6805d1ba67b8c511322c7e Mon Sep 17 00:00:00 2001 From: mous <97399882+mouseless-eth@users.noreply.github.com> Date: Mon, 7 Oct 2024 22:34:14 +0100 Subject: [PATCH] Feat/higher level erc20 helper (#278) * prepareUserOperaiton with ERC-20 flow * lint * refactor * fix imports * refactor * fix build * fix package.json * fix import * fix import * fix * fix ordering * cleanup erc20 sponsor flow * chore: format * refactor * chore: format * flow for approving+sending userOperation * lint * update tests * lint * fix * chore: format * set viem version * chore: format * set viem peer dependency version * chore: format * add test cases * chore: format * fix tests * chore: format * fix ERC-7677 endpoints * fix test cases * remove getAccount util * add comments * add changeset * rename method to prepareUserOperationWithErc20Paymaster * fix PR comments * lint * fix * set error message * add getChainId, rename to prepareUserOperationForErc20Paymaster, remove global experimental export * lint * remove changeset * remove console.log * chore: format * fetch chain from account * fix failing tests * move helper to experimental/pimlico/utils --------- Co-authored-by: mouseless-eth --- bun.lockb | Bin 577488 -> 532672 bytes package.json | 2 +- .../mock-paymaster/helpers/abi.ts | 875 +++++++++++++----- .../mock-paymaster/helpers/schema.ts | 4 +- .../mock-paymaster/helpers/utils.ts | 22 +- .../helpers/verifyingPaymasters.ts | 111 --- .../mock-aa-infra/mock-paymaster/index.ts | 38 +- .../mock-aa-infra/mock-paymaster/relay.ts | 220 ++--- .../mock-paymaster/singletonPaymasters.ts | 381 ++++++++ .../permissionless-test/src/erc20-utils.ts | 80 ++ packages/permissionless-test/src/utils.ts | 54 +- .../clients/createSmartAccountClient.ts | 75 +- .../experimental/pimlico/index.ts | 2 + ...pareUserOperationForErc20Paymaster.test.ts | 195 ++++ .../prepareUserOperationForErc20Paymaster.ts | 270 ++++++ packages/permissionless/package.json | 10 +- packages/permissionless/pnpm-lock.yaml | 131 +++ packages/wagmi-demo/src/index.css | 30 +- 18 files changed, 1914 insertions(+), 586 deletions(-) delete mode 100644 packages/permissionless-test/mock-aa-infra/mock-paymaster/helpers/verifyingPaymasters.ts create mode 100644 packages/permissionless-test/mock-aa-infra/mock-paymaster/singletonPaymasters.ts create mode 100644 packages/permissionless-test/src/erc20-utils.ts create mode 100644 packages/permissionless/experimental/pimlico/index.ts create mode 100644 packages/permissionless/experimental/pimlico/utils/prepareUserOperationForErc20Paymaster.test.ts create mode 100644 packages/permissionless/experimental/pimlico/utils/prepareUserOperationForErc20Paymaster.ts create mode 100644 packages/permissionless/pnpm-lock.yaml diff --git a/bun.lockb b/bun.lockb index 190980270529896056e98bf15aec05f745d5f238..8f89f8b2c4c2baf218fda70c513f0d9ab3282a00 100755 GIT binary patch delta 152491 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 OjgUPA^W!t()BgroM}Z>% delta 181383 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 { @@ -24,3 +26,21 @@ export const getAnvilWalletClient = (anvilRpc: string) => { return walletClient } + +export const isTokenSupported = async (token: Address) => { + if (token !== ERC20_ADDRESS) { + throw new RpcError( + "Token is not supported", + ValidationErrors.InvalidFields + ) + } +} + +export type PaymasterMode = + | { + mode: "verifying" + } + | { + mode: "erc20" + token: Address + } diff --git a/packages/permissionless-test/mock-aa-infra/mock-paymaster/helpers/verifyingPaymasters.ts b/packages/permissionless-test/mock-aa-infra/mock-paymaster/helpers/verifyingPaymasters.ts deleted file mode 100644 index 85c87428..00000000 --- a/packages/permissionless-test/mock-aa-infra/mock-paymaster/helpers/verifyingPaymasters.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { - http, - type Account, - type Address, - type Chain, - type Hex, - type Transport, - type WalletClient, - concat, - createPublicClient, - getContract, - getContractAddress, - pad, - parseEther, - slice -} from "viem" -import { foundry } from "viem/chains" -import { VERIFYING_PAYMASTER_V06_ABI, VERIFYING_PAYMASTER_V07_ABI } from "./abi" - -const DETERMINISTIC_DEPLOYER = "0x4e59b44847b379578588920ca78fbf26c0b4956c" - -// Creates the call that deploys the VerifyingPaymaster v0.7 -const VERIFYING_PAYMASTER_V07_CALL = (owner: Address): Hex => - concat([ - "0x000000000000000000000000000000000000000000000000000000000000000060c06040523480156200001157600080fd5b506040516200145938038062001459833981016040819052620000349162000236565b8233806200005d57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b62000068816200009b565b506200007481620000eb565b6001600160a01b03908116608052821660a0526200009281620001ae565b505050620002b5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516301ffc9a760e01b815263122a0e9b60e31b60048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa15801562000137573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200015d91906200028a565b620001ab5760405162461bcd60e51b815260206004820152601e60248201527f49456e747279506f696e7420696e74657266616365206d69736d617463680000604482015260640162000054565b50565b620001b8620001ef565b6001600160a01b038116620001e457604051631e4fbdf760e01b81526000600482015260240162000054565b620001ab816200009b565b6000546001600160a01b031633146200021e5760405163118cdaa760e01b815233600482015260240162000054565b565b6001600160a01b0381168114620001ab57600080fd5b6000806000606084860312156200024c57600080fd5b8351620002598162000220565b60208501519093506200026c8162000220565b60408501519092506200027f8162000220565b809150509250925092565b6000602082840312156200029d57600080fd5b81518015158114620002ae57600080fd5b9392505050565b60805160a051611146620003136000396000818161013401526109a40152600081816102640152818161031a015281816103b1015281816105ab01528181610645015281816106b501528181610742015261080a01526111466000f3fe6080604052600436106100e85760003560e01c80638da5cb5b1161008a578063c23a5cea11610059578063c23a5cea1461029b578063c399ec88146102bb578063d0e30db0146102d0578063f2fde38b146102d857600080fd5b80638da5cb5b1461020457806394d4ad6014610222578063b0d691fe14610252578063bb9fe6bf1461028657600080fd5b806352b7512c116100c657806352b7512c146101735780635829c5f5146101a1578063715018a6146101cf5780637c627b21146101e457600080fd5b80630396cb60146100ed578063205c28781461010257806323d9ac9b14610122575b600080fd5b6101006100fb366004610cec565b6102f8565b005b34801561010e57600080fd5b5061010061011d366004610d2e565b610383565b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561017f57600080fd5b5061019361018e366004610d73565b6103f5565b60405161016a929190610dc1565b3480156101ad57600080fd5b506101c16101bc366004610e31565b610419565b60405190815260200161016a565b3480156101db57600080fd5b50610100610529565b3480156101f057600080fd5b506101006101ff366004610ed8565b61053d565b34801561021057600080fd5b506000546001600160a01b0316610156565b34801561022e57600080fd5b5061024261023d366004610f43565b610559565b60405161016a9493929190610f85565b34801561025e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b34801561029257600080fd5b506101006105a1565b3480156102a757600080fd5b506101006102b6366004610fd1565b61061e565b3480156102c757600080fd5b506101c161069d565b61010061072d565b3480156102e457600080fd5b506101006102f3366004610fd1565b61078f565b6103006107d2565b604051621cb65b60e51b815263ffffffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630396cb609034906024016000604051808303818588803b15801561036757600080fd5b505af115801561037b573d6000803e3d6000fd5b505050505050565b61038b6107d2565b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561036757600080fd5b606060006104016107ff565b61040c85858561086f565b915091505b935093915050565b600083358060208601356104306040880188610fee565b60405161043e929190611035565b6040519081900390206104546060890189610fee565b604051610462929190611035565b604051908190039020608089013561047d60e08b018b610fee565b61048c91603491601491611045565b6104959161106f565b604080516001600160a01b0390971660208801528601949094526060850192909252608084015260a08084019190915260c08084019290925287013560e0830152860135610100820152466101208201523061014082015265ffffffffffff80861661016083015284166101808201526101a001604051602081830303815290604052805190602001209150509392505050565b6105316107d2565b61053b6000610a27565b565b6105456107ff565b6105528585858585610a77565b5050505050565b600080368161056b8560348189611045565b810190610578919061108d565b9094509250858561058b603460406110c0565b610596928290611045565b949793965094505050565b6105a96107d2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561060457600080fd5b505af1158015610618573d6000803e3d6000fd5b50505050565b6106266107d2565b60405163611d2e7560e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b15801561068957600080fd5b505af1158015610552573d6000803e3d6000fd5b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610704573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072891906110e1565b905090565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b15801561068957600080fd5b6107976107d2565b6001600160a01b0381166107c657604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6107cf81610a27565b50565b6000546001600160a01b0316331461053b5760405163118cdaa760e01b81523360048201526024016107bd565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461053b5760405162461bcd60e51b815260206004820152601560248201527414d95b99195c881b9bdd08115b9d1c9e541bda5b9d605a1b60448201526064016107bd565b606060008080368161088761023d60e08b018b610fee565b9296509094509250905060408114806108a05750604181145b610914576040805162461bcd60e51b81526020600482015260248101919091527f566572696679696e675061796d61737465723a20696e76616c6964207369676e60448201527f6174757265206c656e67746820696e207061796d6173746572416e644461746160648201526084016107bd565b60006109576109248b8787610419565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b90506109998184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610aaf92505050565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146109fc576109dd60018686610adb565b6040518060200160405280600081525090965096505050505050610411565b610a0860008686610adb565b6040805160208101909152600081529b909a5098505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405162461bcd60e51b815260206004820152600d60248201526c6d757374206f7665727269646560981b60448201526064016107bd565b600080600080610abf8686610b13565b925092509250610acf8282610b60565b50909150505b92915050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610b03576000610b06565b60015b60ff161717949350505050565b60008060008351604103610b4d5760208401516040850151606086015160001a610b3f88828585610c1d565b955095509550505050610b59565b50508151600091506002905b9250925092565b6000826003811115610b7457610b746110fa565b03610b7d575050565b6001826003811115610b9157610b916110fa565b03610baf5760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115610bc357610bc36110fa565b03610be45760405163fce698f760e01b8152600481018290526024016107bd565b6003826003811115610bf857610bf86110fa565b03610c19576040516335e2f38360e21b8152600481018290526024016107bd565b5050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115610c585750600091506003905082610ce2565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015610cac573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610cd857506000925060019150829050610ce2565b9250600091508190505b9450945094915050565b600060208284031215610cfe57600080fd5b813563ffffffff81168114610d1257600080fd5b9392505050565b6001600160a01b03811681146107cf57600080fd5b60008060408385031215610d4157600080fd5b8235610d4c81610d19565b946020939093013593505050565b60006101208284031215610d6d57600080fd5b50919050565b600080600060608486031215610d8857600080fd5b833567ffffffffffffffff811115610d9f57600080fd5b610dab86828701610d5a565b9660208601359650604090950135949350505050565b604081526000835180604084015260005b81811015610def5760208187018101516060868401015201610dd2565b506000606082850101526060601f19601f8301168401019150508260208301529392505050565b803565ffffffffffff81168114610e2c57600080fd5b919050565b600080600060608486031215610e4657600080fd5b833567ffffffffffffffff811115610e5d57600080fd5b610e6986828701610d5a565b935050610e7860208501610e16565b9150610e8660408501610e16565b90509250925092565b60008083601f840112610ea157600080fd5b50813567ffffffffffffffff811115610eb957600080fd5b602083019150836020828501011115610ed157600080fd5b9250929050565b600080600080600060808688031215610ef057600080fd5b853560038110610eff57600080fd5b9450602086013567ffffffffffffffff811115610f1b57600080fd5b610f2788828901610e8f565b9699909850959660408101359660609091013595509350505050565b60008060208385031215610f5657600080fd5b823567ffffffffffffffff811115610f6d57600080fd5b610f7985828601610e8f565b90969095509350505050565b600065ffffffffffff808716835280861660208401525060606040830152826060830152828460808401376000608084840101526080601f19601f850116830101905095945050505050565b600060208284031215610fe357600080fd5b8135610d1281610d19565b6000808335601e1984360301811261100557600080fd5b83018035915067ffffffffffffffff82111561102057600080fd5b602001915036819003821315610ed157600080fd5b8183823760009101908152919050565b6000808585111561105557600080fd5b8386111561106257600080fd5b5050820193919092039150565b80356020831015610ad557600019602084900360031b1b1692915050565b600080604083850312156110a057600080fd5b6110a983610e16565b91506110b760208401610e16565b90509250929050565b80820180821115610ad557634e487b7160e01b600052601160045260246000fd5b6000602082840312156110f357600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fdfea26469706673582212209da0f81924019274222346779de206a7e6bccf682a1e50527de363f369f94d0564736f6c634300081700330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", - pad(owner), - pad(owner) - ]) - -// Creates the call that deploys the VerifyingPaymaster v0.6 -const VERIFYING_PAYMASTER_V06_CALL = (owner: Address): Hex => - concat([ - "0x000000000000000000000000000000000000000000000000000000000000000060c06040523480156200001157600080fd5b5060405162001401380380620014018339810160408190526200003491620001ad565b81620000403362000066565b6001600160a01b03908116608052811660a0526200005e81620000b6565b5050620001ec565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000c062000139565b6001600160a01b0381166200012b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620001368162000066565b50565b6000546001600160a01b03163314620001955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000122565b565b6001600160a01b03811681146200013657600080fd5b60008060408385031215620001c157600080fd5b8251620001ce8162000197565b6020840151909250620001e18162000197565b809150509250929050565b60805160a0516111b76200024a600039600081816101340152610a310152600081816102360152818161031a015281816103b1015281816104ac01528181610540015281816105b701528181610644015261083e01526111b76000f3fe6080604052600436106100e85760003560e01c8063a9a234091161008a578063c399ec8811610059578063c399ec881461028d578063d0e30db0146102a2578063f2fde38b146102aa578063f465c77e146102ca57600080fd5b8063a9a2340914610204578063b0d691fe14610224578063bb9fe6bf14610258578063c23a5cea1461026d57600080fd5b8063715018a6116100c6578063715018a6146101735780638da5cb5b1461018857806394d4ad60146101a657806394e1fc19146101d657600080fd5b80630396cb60146100ed578063205c28781461010257806323d9ac9b14610122575b600080fd5b6101006100fb366004610d63565b6102f8565b005b34801561010e57600080fd5b5061010061011d366004610da5565b610383565b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561017f57600080fd5b506101006103f5565b34801561019457600080fd5b506000546001600160a01b0316610156565b3480156101b257600080fd5b506101c66101c1366004610e13565b610409565b60405161016a9493929190610e55565b3480156101e257600080fd5b506101f66101f1366004610ed5565b610446565b60405190815260200161016a565b34801561021057600080fd5b5061010061021f366004610f33565b610488565b34801561023057600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b34801561026457600080fd5b506101006104a2565b34801561027957600080fd5b50610100610288366004610f93565b610519565b34801561029957600080fd5b506101f661059f565b61010061062f565b3480156102b657600080fd5b506101006102c5366004610f93565b610691565b3480156102d657600080fd5b506102ea6102e5366004610fb0565b61070f565b60405161016a929190611044565b610300610733565b604051621cb65b60e51b815263ffffffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630396cb609034906024016000604051808303818588803b15801561036757600080fd5b505af115801561037b573d6000803e3d6000fd5b505050505050565b61038b610733565b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561036757600080fd5b6103fd610733565b610407600061078d565b565b600080368161041c605460148789611066565b8101906104299190611090565b909450925061043b8560548189611066565b949793965094505050565b6000610451846107dd565b463085856040516020016104699594939291906110c3565b6040516020818303038152906040528051906020012090509392505050565b610490610833565b61049c848484846108a3565b50505050565b6104aa610733565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561050557600080fd5b505af115801561049c573d6000803e3d6000fd5b610521610733565b60405163611d2e7560e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b15801561058457600080fd5b505af1158015610598573d6000803e3d6000fd5b5050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062a919061110b565b905090565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b15801561058457600080fd5b610699610733565b6001600160a01b0381166107035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61070c8161078d565b50565b6060600061071b610833565b6107268585856108db565b915091505b935093915050565b6000546001600160a01b031633146104075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106fa565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60603660006107f0610120850185611124565b9150915083610120610180828503038082016040519650602081018701604052808752508183602088013780604083850101836020890101375050505050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104075760405162461bcd60e51b815260206004820152601560248201527414d95b99195c881b9bdd08115b9d1c9e541bda5b9d605a1b60448201526064016106fa565b60405162461bcd60e51b815260206004820152600d60248201526c6d757374206f7665727269646560981b60448201526064016106fa565b60606000808036816108f46101c16101208b018b611124565b92965090945092509050604081148061090d5750604181145b610981576040805162461bcd60e51b81526020600482015260248101919091527f566572696679696e675061796d61737465723a20696e76616c6964207369676e60448201527f6174757265206c656e67746820696e207061796d6173746572416e644461746160648201526084016106fa565b60006109e46109918b8787610446565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050610a268184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ab492505050565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610a8957610a6a60018686610ad8565b604051806020016040528060008152509096509650505050505061072b565b610a9560008686610ad8565b6040805160208101909152600081529b909a5098505050505050505050565b6000806000610ac38585610b10565b91509150610ad081610b55565b509392505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610b00576000610b03565b60015b60ff161717949350505050565b6000808251604103610b465760208301516040840151606085015160001a610b3a87828585610c9f565b94509450505050610b4e565b506000905060025b9250929050565b6000816004811115610b6957610b6961116b565b03610b715750565b6001816004811115610b8557610b8561116b565b03610bd25760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106fa565b6002816004811115610be657610be661116b565b03610c335760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106fa565b6003816004811115610c4757610c4761116b565b0361070c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106fa565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610cd65750600090506003610d5a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610d2a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610d5357600060019250925050610d5a565b9150600090505b94509492505050565b600060208284031215610d7557600080fd5b813563ffffffff81168114610d8957600080fd5b9392505050565b6001600160a01b038116811461070c57600080fd5b60008060408385031215610db857600080fd5b8235610dc381610d90565b946020939093013593505050565b60008083601f840112610de357600080fd5b50813567ffffffffffffffff811115610dfb57600080fd5b602083019150836020828501011115610b4e57600080fd5b60008060208385031215610e2657600080fd5b823567ffffffffffffffff811115610e3d57600080fd5b610e4985828601610dd1565b90969095509350505050565b600065ffffffffffff808716835280861660208401525060606040830152826060830152828460808401376000608084840101526080601f19601f850116830101905095945050505050565b60006101608284031215610eb457600080fd5b50919050565b803565ffffffffffff81168114610ed057600080fd5b919050565b600080600060608486031215610eea57600080fd5b833567ffffffffffffffff811115610f0157600080fd5b610f0d86828701610ea1565b935050610f1c60208501610eba565b9150610f2a60408501610eba565b90509250925092565b60008060008060608587031215610f4957600080fd5b843560038110610f5857600080fd5b9350602085013567ffffffffffffffff811115610f7457600080fd5b610f8087828801610dd1565b9598909750949560400135949350505050565b600060208284031215610fa557600080fd5b8135610d8981610d90565b600080600060608486031215610fc557600080fd5b833567ffffffffffffffff811115610fdc57600080fd5b610fe886828701610ea1565b9660208601359650604090950135949350505050565b6000815180845260005b8181101561102457602081850181015186830182015201611008565b506000602082860101526020601f19601f83011685010191505092915050565b6040815260006110576040830185610ffe565b90508260208301529392505050565b6000808585111561107657600080fd5b8386111561108357600080fd5b5050820193919092039150565b600080604083850312156110a357600080fd5b6110ac83610eba565b91506110ba60208401610eba565b90509250929050565b60a0815260006110d660a0830188610ffe565b6020830196909652506001600160a01b0393909316604084015265ffffffffffff918216606084015216608090910152919050565b60006020828403121561111d57600080fd5b5051919050565b6000808335601e1984360301811261113b57600080fd5b83018035915067ffffffffffffffff82111561115657600080fd5b602001915036819003821315610b4e57600080fd5b634e487b7160e01b600052602160045260246000fdfea2646970667358221220bc69dcc52cd6c4ebdf52276b6a56f83b85831b738e3b681ab51ab0bbab6a03c164736f6c634300081100330000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", - pad(owner) - ]) - -export const setupVerifyingPaymasterV07 = async ( - walletClient: WalletClient, - anvilRpc: string -) => { - const data = VERIFYING_PAYMASTER_V07_CALL(walletClient.account.address) - - const publicClient = createPublicClient({ - transport: http(anvilRpc), - chain: foundry - }) - - await walletClient - .sendTransaction({ - to: DETERMINISTIC_DEPLOYER, - data - }) - .then((hash) => publicClient.waitForTransactionReceipt({ hash })) - - const address = getContractAddress({ - opcode: "CREATE2", - from: DETERMINISTIC_DEPLOYER, - salt: slice(data, 0, 32), - bytecode: slice(data, 32) - }) - - const verifyingPaymaster = getContract({ - address, - abi: VERIFYING_PAYMASTER_V07_ABI, - client: walletClient - }) - - await verifyingPaymaster.write.deposit({ - value: parseEther("50") - }) - - return verifyingPaymaster -} - -export const setupVerifyingPaymasterV06 = async ( - walletClient: WalletClient, - anvilRpc: string -) => { - const data = VERIFYING_PAYMASTER_V06_CALL(walletClient.account.address) - - const publicClient = createPublicClient({ - transport: http(anvilRpc), - chain: foundry - }) - - await walletClient - .sendTransaction({ - to: DETERMINISTIC_DEPLOYER, - data - }) - .then((hash) => publicClient.waitForTransactionReceipt({ hash })) - - const address = getContractAddress({ - opcode: "CREATE2", - from: DETERMINISTIC_DEPLOYER, - salt: slice(data, 0, 32), - bytecode: slice(data, 32) - }) - - const verifyingPaymaster = getContract({ - address, - abi: VERIFYING_PAYMASTER_V06_ABI, - client: walletClient - }) - - await verifyingPaymaster.write.deposit({ - value: parseEther("50") - }) - - return verifyingPaymaster -} diff --git a/packages/permissionless-test/mock-aa-infra/mock-paymaster/index.ts b/packages/permissionless-test/mock-aa-infra/mock-paymaster/index.ts index 158b84b8..814e750e 100644 --- a/packages/permissionless-test/mock-aa-infra/mock-paymaster/index.ts +++ b/packages/permissionless-test/mock-aa-infra/mock-paymaster/index.ts @@ -4,12 +4,13 @@ import { defineInstance } from "prool" import { http, createPublicClient } from "viem" import { createBundlerClient } from "viem/account-abstraction" import { foundry } from "viem/chains" +import { deployErc20Token } from "../../src/erc20-utils" import { getAnvilWalletClient } from "./helpers/utils" -import { - setupVerifyingPaymasterV06, - setupVerifyingPaymasterV07 -} from "./helpers/verifyingPaymasters" import { createRpcHandler } from "./relay" +import { + SingletonPaymasterV06, + SingletonPaymasterV07 +} from "./singletonPaymasters" export const paymaster = defineInstance( ({ @@ -26,25 +27,28 @@ export const paymaster = defineInstance( name: "mock-paymaster", start: async ({ port = _port }) => { const walletClient = getAnvilWalletClient(anvilRpc) - const verifyingPaymasterV07 = await setupVerifyingPaymasterV07( - walletClient, - anvilRpc - ) - const verifyingPaymasterV06 = await setupVerifyingPaymasterV06( - walletClient, - anvilRpc - ) - const publicClient = createPublicClient({ transport: http(anvilRpc), chain: foundry }) - const bundler = createBundlerClient({ chain: foundry, transport: http(altoRpc) }) + const singletonPaymasterV07 = new SingletonPaymasterV07( + walletClient, + anvilRpc + ) + const singletonPaymasterV06 = new SingletonPaymasterV06( + walletClient, + anvilRpc + ) + + await singletonPaymasterV06.setup() + await singletonPaymasterV07.setup() + await deployErc20Token(walletClient, publicClient) + app.register(cors, { origin: "*", methods: ["POST", "GET", "OPTIONS"] @@ -52,10 +56,8 @@ export const paymaster = defineInstance( const rpcHandler = createRpcHandler( bundler, - verifyingPaymasterV07, - verifyingPaymasterV06, - publicClient, - walletClient + singletonPaymasterV07, + singletonPaymasterV06 ) app.post("/", {}, rpcHandler) diff --git a/packages/permissionless-test/mock-aa-infra/mock-paymaster/relay.ts b/packages/permissionless-test/mock-aa-infra/mock-paymaster/relay.ts index 07852581..2d7c55ce 100644 --- a/packages/permissionless-test/mock-aa-infra/mock-paymaster/relay.ts +++ b/packages/permissionless-test/mock-aa-infra/mock-paymaster/relay.ts @@ -1,19 +1,9 @@ import util from "node:util" import type { FastifyReply, FastifyRequest } from "fastify" import { - type Account, type Address, BaseError, - type Chain, - type Client, - type GetContractReturnType, - type Hex, - type PublicClient, type RpcRequestError, - type Transport, - type WalletClient, - concat, - encodeAbiParameters, getAddress, toHex } from "viem" @@ -23,13 +13,8 @@ import { entryPoint06Address, entryPoint07Address } from "viem/account-abstraction" -import { readContract } from "viem/actions" import { fromZodError } from "zod-validation-error" -import { getPackedUserOperation } from "../../../permissionless" -import { - VERIFYING_PAYMASTER_V06_ABI, - VERIFYING_PAYMASTER_V07_ABI -} from "./helpers/abi" +import { ERC20_ADDRESS } from "../../src/erc20-utils" import { InternalBundlerError, type JsonRpcSchema, @@ -41,24 +26,31 @@ import { pmGetPaymasterStubDataParamsSchema, pmSponsorUserOperationParamsSchema } from "./helpers/schema" -import { maxBigInt } from "./helpers/utils" +import { + type PaymasterMode, + isTokenSupported, + maxBigInt +} from "./helpers/utils" +import { + type SingletonPaymasterV06, + type SingletonPaymasterV07, + getDummyPaymasterData +} from "./singletonPaymasters" const handleMethodV06 = async ( userOperation: UserOperation<"0.6">, + paymasterMode: PaymasterMode, bundler: BundlerClient, - verifyingPaymasterV06: GetContractReturnType< - typeof VERIFYING_PAYMASTER_V06_ABI - >, - publicClient: Client, - walletClient: WalletClient, + singletonPaymasterV06: SingletonPaymasterV06, estimateGas: boolean ) => { let op = { ...userOperation, - paymasterAndData: concat([ - verifyingPaymasterV06.address, - "0x000000000000000000000000000000000000000000000000000000006602f66a0000000000000000000000000000000000000000000000000000000000000000dba7a71bd49ae0174b1e4577b28f8b7c262d4085cfa192f1c19b516c85d2d1ef17eadeb549d71caf5d5f24fb6519088c1c13427343843131dd6ec19a3c6a350e1b" - ]) + ...getDummyPaymasterData( + true, + singletonPaymasterV06.singletonPaymaster.address, + paymasterMode + ) } const callGasLimit = userOperation.callGasLimit @@ -100,47 +92,11 @@ const handleMethodV06 = async ( ) } - const validAfter = 0 - const validUntil = Math.floor(Date.now() / 1000) + 6000 - op.paymasterAndData = concat([ - verifyingPaymasterV06.address, - encodeAbiParameters( - [ - { name: "validUntil", type: "uint48" }, - { name: "validAfter", type: "uint48" } - ], - [validUntil, validAfter] - ), - toHex(0, { size: 65 }) - ]) - - const hash = await readContract(publicClient, { - abi: VERIFYING_PAYMASTER_V06_ABI, - functionName: "getHash", - address: verifyingPaymasterV06.address, - args: [{ ...op, initCode: op.initCode ?? "0x" }, validUntil, validAfter] - }) - - const sig = await walletClient.signMessage({ - message: { raw: hash } - }) - const paymasterAndData = concat([ - verifyingPaymasterV06.address, - encodeAbiParameters( - [ - { name: "validUntil", type: "uint48" }, - { name: "validAfter", type: "uint48" } - ], - [validUntil, validAfter] - ), - sig - ]) - const result = { preVerificationGas: toHex(op.preVerificationGas), callGasLimit: toHex(op.callGasLimit), verificationGasLimit: toHex(op.verificationGasLimit || 0), - paymasterAndData + ...(await singletonPaymasterV06.encodePaymasterData(op, paymasterMode)) } return result @@ -148,19 +104,14 @@ const handleMethodV06 = async ( const handleMethodV07 = async ( userOperation: UserOperation<"0.7">, + paymasterMode: PaymasterMode, bundler: BundlerClient, - verifyingPaymasterV07: GetContractReturnType< - typeof VERIFYING_PAYMASTER_V07_ABI - >, - publicClient: Client, - walletClient: WalletClient, + singletonPaymasterV07: SingletonPaymasterV07, estimateGas: boolean ) => { let op = { ...userOperation, - paymaster: verifyingPaymasterV07.address, - paymasterData: - "0x000000000000000000000000000000000000000000000000000000006602f66a0000000000000000000000000000000000000000000000000000000000000000dba7a71bd49ae0174b1e4577b28f8b7c262d4085cfa192f1c19b516c85d2d1ef17eadeb549d71caf5d5f24fb6519088c1c13427343843131dd6ec19a3c6a350e1b" as Hex + ...singletonPaymasterV07.getDummyPaymasterData(paymasterMode) } const callGasLimit = userOperation.callGasLimit @@ -203,42 +154,6 @@ const handleMethodV07 = async ( ) } - const validAfter = 0 - const validUntil = Math.floor(Date.now() / 1000) + 6000 - op.paymasterData = concat([ - encodeAbiParameters( - [ - { name: "validUntil", type: "uint48" }, - { name: "validAfter", type: "uint48" } - ], - [validUntil, validAfter] - ), - toHex(0, { size: 65 }) - ]) - op.paymaster = verifyingPaymasterV07.address - - const hash = await readContract(publicClient, { - abi: VERIFYING_PAYMASTER_V07_ABI, - functionName: "getHash", - address: verifyingPaymasterV07.address, - args: [getPackedUserOperation(op), validUntil, validAfter] - }) - - const sig = await walletClient.signMessage({ - message: { raw: hash } - }) - const paymaster = verifyingPaymasterV07.address - const paymasterData = concat([ - encodeAbiParameters( - [ - { name: "validUntil", type: "uint48" }, - { name: "validAfter", type: "uint48" } - ], - [validUntil, validAfter] - ), - sig - ]) - const result = { preVerificationGas: toHex(op.preVerificationGas), callGasLimit: toHex(op.callGasLimit), @@ -247,8 +162,7 @@ const handleMethodV07 = async ( ), paymasterPostOpGasLimit: toHex(op.paymasterPostOpGasLimit || 0), verificationGasLimit: toHex(op.verificationGasLimit || 0), - paymaster, - paymasterData + ...(await singletonPaymasterV07.encodePaymasterData(op, paymasterMode)) } return result @@ -256,14 +170,8 @@ const handleMethodV07 = async ( const handleMethod = async ( bundler: BundlerClient, - verifyingPaymasterV07: GetContractReturnType< - typeof VERIFYING_PAYMASTER_V07_ABI - >, - verifyingPaymasterV06: GetContractReturnType< - typeof VERIFYING_PAYMASTER_V06_ABI - >, - publicClient: PublicClient, - walletClient: WalletClient, + singletonPaymasterV07: SingletonPaymasterV07, + singletonPaymasterV06: SingletonPaymasterV06, parsedBody: JsonRpcSchema ) => { if (parsedBody.method === "pm_sponsorUserOperation") { @@ -283,10 +191,9 @@ const handleMethod = async ( if (entryPoint === entryPoint07Address) { return await handleMethodV07( userOperation, + { mode: "verifying" }, bundler, - verifyingPaymasterV07, - publicClient, - walletClient, + singletonPaymasterV07, true ) } @@ -294,10 +201,9 @@ const handleMethod = async ( if (entryPoint === entryPoint06Address) { return await handleMethodV06( userOperation, + { mode: "verifying" }, bundler, - verifyingPaymasterV06, - publicClient, - walletClient, + singletonPaymasterV06, true ) } @@ -320,7 +226,9 @@ const handleMethod = async ( ) } - const [, entryPoint] = params.data + const [, entryPoint, , data] = params.data + + const paymasterMode = getPaymasterMode(data) const sponsorData = { name: "Pimlico", @@ -329,11 +237,9 @@ const handleMethod = async ( if (entryPoint === entryPoint07Address) { return { - paymaster: verifyingPaymasterV07.address, - paymasterData: - "0x00000000000000000000000000000000000000000000000000000101010101010000000000000000000000000000000000000000000000000000000000000000cd91f19f0f19ce862d7bec7b7d9b95457145afc6f639c28fd0360f488937bfa41e6eedcd3a46054fd95fcd0e3ef6b0bc0a615c4d975eef55c8a3517257904d5b1c", + ...singletonPaymasterV07.getDummyPaymasterData(paymasterMode), paymasterVerificationGasLimit: toHex(50_000n), - paymasterPostOpGasLimit: toHex(20_000n), + paymasterPostOpGasLimit: toHex(100_000n), sponsor: sponsorData, isFinal: false } @@ -341,7 +247,7 @@ const handleMethod = async ( if (entryPoint === entryPoint06Address) { return { - paymasterAndData: `${verifyingPaymasterV06.address}00000000000000000000000000000000000000000000000000000101010101010000000000000000000000000000000000000000000000000000000000000000cd91f19f0f19ce862d7bec7b7d9b95457145afc6f639c28fd0360f488937bfa41e6eedcd3a46054fd95fcd0e3ef6b0bc0a615c4d975eef55c8a3517257904d5b1c`, + ...singletonPaymasterV06.getDummyPaymasterData(paymasterMode), sponsor: sponsorData, isFinal: false } @@ -363,28 +269,31 @@ const handleMethod = async ( ) } - const [userOperation, entryPoint] = params.data + const [userOperation, entryPoint, , data] = params.data + const paymasterMode = getPaymasterMode(data) if (entryPoint === entryPoint07Address) { - return await handleMethodV07( + const { paymaster, paymasterData } = await handleMethodV07( userOperation as UserOperation<"0.7">, + paymasterMode, bundler, - verifyingPaymasterV07, - publicClient, - walletClient, + singletonPaymasterV07, false ) + + return { paymaster, paymasterData } } if (entryPoint === entryPoint06Address) { - return await handleMethodV06( + const { paymasterAndData } = await handleMethodV06( userOperation, + paymasterMode, bundler, - verifyingPaymasterV06, - publicClient, - walletClient, + singletonPaymasterV06, false ) + + return { paymasterAndData } } throw new RpcError( @@ -422,6 +331,11 @@ const handleMethod = async ( const quotes = { [getAddress("0xffffffffffffffffffffffffffffffffffffffff")]: { + exchangeRateNativeToUsd: "0x1a2b3c4d5e6f7890abcdef", + exchangeRate: "0x3a7b9c8d6e5f4321", + postOpGas: "0x1a2b3c" + }, + [ERC20_ADDRESS]: { exchangeRateNativeToUsd: "0x5cc717fbb3450c0000000", exchangeRate: "0x5cc717fbb3450c0000", postOpGas: "0xc350" @@ -430,9 +344,9 @@ const handleMethod = async ( let paymaster: Address if (entryPoint === entryPoint07Address) { - paymaster = verifyingPaymasterV07.address + paymaster = singletonPaymasterV07.singletonPaymaster.address } else { - paymaster = verifyingPaymasterV06.address + paymaster = singletonPaymasterV06.singletonPaymaster.address } return { @@ -454,14 +368,8 @@ const handleMethod = async ( export const createRpcHandler = ( bundler: BundlerClient, - verifyingPaymasterV07: GetContractReturnType< - typeof VERIFYING_PAYMASTER_V07_ABI - >, - verifyingPaymasterV06: GetContractReturnType< - typeof VERIFYING_PAYMASTER_V06_ABI - >, - publicClient: PublicClient, - walletClient: WalletClient + singletonPaymasterV07: SingletonPaymasterV07, + singletonPaymasterV06: SingletonPaymasterV06 ) => { return async (request: FastifyRequest, _reply: FastifyReply) => { const body = request.body @@ -476,10 +384,8 @@ export const createRpcHandler = ( try { const result = await handleMethod( bundler, - verifyingPaymasterV07, - verifyingPaymasterV06, - publicClient, - walletClient, + singletonPaymasterV07, + singletonPaymasterV06, parsedBody.data ) @@ -508,3 +414,13 @@ export const createRpcHandler = ( } } } + +const getPaymasterMode = (data: any): PaymasterMode => { + if (data !== null && "token" in data) { + isTokenSupported(data.token) + + return { mode: "erc20", token: data.token } + } + + return { mode: "verifying" } +} diff --git a/packages/permissionless-test/mock-aa-infra/mock-paymaster/singletonPaymasters.ts b/packages/permissionless-test/mock-aa-infra/mock-paymaster/singletonPaymasters.ts new file mode 100644 index 00000000..ca8be1ca --- /dev/null +++ b/packages/permissionless-test/mock-aa-infra/mock-paymaster/singletonPaymasters.ts @@ -0,0 +1,381 @@ +import { + http, + type Account, + type Address, + type Chain, + type GetContractReturnType, + type Hex, + type PublicClient, + type Transport, + type WalletClient, + concat, + createPublicClient, + encodePacked, + getContract, + getContractAddress, + getCreate2Address, + pad, + parseEther, + slice, + toBytes +} from "viem" +import { + type UserOperation, + toPackedUserOperation +} from "viem/account-abstraction" +import { foundry } from "viem/chains" +import { getPublicClient } from "../../src/utils" +import { + SINGLETON_PAYMASTER_V06_ABI, + SINGLETON_PAYMASTER_V07_ABI +} from "./helpers/abi" +import type { PaymasterMode } from "./helpers/utils" + +const DETERMINISTIC_DEPLOYER = "0x4e59b44847b379578588920ca78fbf26c0b4956c" + +const EXCHANGE_RATE = 30_000_000 +const POST_OP_GAS_OVERHEAD = 100_000 + +export const getDummyPaymasterData = ( + isV6: boolean, + paymaster: Address, + paymasterMode: PaymasterMode +): { paymaster: Address; paymasterData: Hex } | { paymasterAndData: Hex } => { + let encodedDummyData: Hex + + const validUntil = 0 + const validAfter = 0 + const mode = paymasterMode.mode === "verifying" ? 0 : 1 + + if (paymasterMode.mode === "verifying") { + encodedDummyData = encodePacked( + [ + "uint8", // mode + "uint48", // validUntil + "uint48", // validAfter + "bytes" // signature + ], + [ + mode, + validUntil, + validAfter, + "0xcd91f19f0f19ce862d7bec7b7d9b95457145afc6f639c28fd0360f488937bfa41e6eedcd3a46054fd95fcd0e3ef6b0bc0a615c4d975eef55c8a3517257904d5b1c" + ] + ) + } else { + encodedDummyData = encodePacked( + [ + "uint8", // mode + "uint48", // validUntil + "uint48", // validAfter + "address", // token + "uint128", // postOpGasOverhead + "uint256", // exchangeRate + "bytes" // signature + ], + [ + mode, + validUntil, + validAfter, + paymasterMode.token, + POST_OP_GAS_OVERHEAD, + EXCHANGE_RATE, + "0xcd91f19f0f19ce862d7bec7b7d9b95457145afc6f639c28fd0360f488937bfa41e6eedcd3a46054fd95fcd0e3ef6b0bc0a615c4d975eef55c8a3517257904d5b1c" + ] + ) + } + + if (isV6) { + return { + paymasterAndData: concat([paymaster, encodedDummyData]) + } + } + + return { + paymaster, + paymasterData: encodedDummyData + } +} + +// Creates the call that deploys the SingletonPaymaster v0.7 +const SINGLETON_PAYMASTER_V07_CALL = (owner: Address): Hex => + concat([ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x610160604052600060a052600160c052605060e052600c6101005260346101205260146101405234801561003257600080fd5b50604051612634380380612634833981016040819052610051916101aa565b828282808383806001600160a01b03811661008657604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61008f81610128565b50506001600160a01b031660805260005b81518110156100fa5760018060008484815181106100c0576100c061029d565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790556001016100a0565b5050600280546001600160a01b0319166001600160a01b039390931692909217909155506102b39350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b038116811461018f57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156101bf57600080fd5b6101c884610178565b92506101d660208501610178565b60408501519092506001600160401b038111156101f257600080fd5b8401601f8101861361020357600080fd5b80516001600160401b0381111561021c5761021c610194565b604051600582901b90603f8201601f191681016001600160401b038111828210171561024a5761024a610194565b60405291825260208184018101929081018984111561026857600080fd5b6020850194505b8385101561028e5761028085610178565b81526020948501940161026f565b50809450505050509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e0516101005161012051610140516122b36103816000396000505060008181610c020152610dc7015260008181610665015261140801526000818161069901526115a4015260008181610c2e01528181610d0401528181610fb201526112a601526000818161063401528181610c5f01528181610cc50152818161110401526111e7015260008181610327015281816104370152818161058c01528181610700015281816107cd01528181610856015281816109090152610b6201526122b36000f3fe6080604052600436106101445760003560e01c80637c627b21116100c0578063c399ec8811610074578063eb12d61e11610059578063eb12d61e1461039b578063f0f44260146103bb578063f2fde38b146103db57600080fd5b8063c399ec881461037e578063d0e30db01461039357600080fd5b8063b0d691fe116100a5578063b0d691fe14610315578063bb9fe6bf14610349578063c23a5cea1461035e57600080fd5b80637c627b21146102ca5780638da5cb5b146102ea57600080fd5b80635525dcfb1161011757806363b241aa116100fc57806363b241aa14610255578063715018a614610275578063736c0d5b1461028a57600080fd5b80635525dcfb146101d557806361d027b31461020357600080fd5b80630396cb60146101495780630e316ab71461015e578063205c28781461017e57806352b7512c1461019e575b600080fd5b61015c610157366004611ba1565b6103fb565b005b34801561016a57600080fd5b5061015c610179366004611c00565b6104ad565b34801561018a57600080fd5b5061015c610199366004611c1d565b610538565b3480156101aa57600080fd5b506101be6101b9366004611c62565b6105d0565b6040516101cc929190611cb0565b60405180910390f35b3480156101e157600080fd5b506101f56101f0366004611d23565b6105f3565b6040519081526020016101cc565b34801561020f57600080fd5b506002546102309073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101cc565b34801561026157600080fd5b506101f5610270366004611d55565b610630565b34801561028157600080fd5b5061015c6106c6565b34801561029657600080fd5b506102ba6102a5366004611c00565b60016020526000908152604090205460ff1681565b60405190151581526020016101cc565b3480156102d657600080fd5b5061015c6102e5366004611dab565b6106da565b3480156102f657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610230565b34801561032157600080fd5b506102307f000000000000000000000000000000000000000000000000000000000000000081565b34801561035557600080fd5b5061015c6106f6565b34801561036a57600080fd5b5061015c610379366004611c00565b610780565b34801561038a57600080fd5b506101f5610825565b61015c6108db565b3480156103a757600080fd5b5061015c6103b6366004611c00565b610963565b3480156103c757600080fd5b5061015c6103d6366004611c00565b6109eb565b3480156103e757600080fd5b5061015c6103f6366004611c00565b610a8e565b610403610af7565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561049157600080fd5b505af11580156104a5573d6000803e3d6000fd5b505050505050565b6104b5610af7565b73ffffffffffffffffffffffffffffffffffffffff811660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b91015b60405180910390a150565b610540610af7565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561049157600080fd5b606060006105dc610b4a565b6105e7858585610be9565b91509150935093915050565b6000670de0b6b3a7640000826106098587611e77565b6106139088611e8e565b61061d9190611e77565b6106279190611ea1565b95945050505050565b60007f000000000000000000000000000000000000000000000000000000000000000060ff168360ff16036106935761068c827f000000000000000000000000000000000000000000000000000000000000000060ff16610d50565b90506106c0565b61068c827f000000000000000000000000000000000000000000000000000000000000000060ff16610d50565b92915050565b6106ce610af7565b6106d86000610ecd565b565b6106e2610b4a565b6106ef8585858585610f42565b5050505050565b6106fe610af7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561076657600080fd5b505af115801561077a573d6000803e3d6000fd5b50505050565b610788610af7565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b15801561081157600080fd5b505af11580156106ef573d6000803e3d6000fd5b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156108b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d69190611edc565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b15801561081157600080fd5b61096b610af7565b73ffffffffffffffffffffffffffffffffffffffff811660008181526001602081815260409283902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690921790915590519182527f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f24910161052d565b6109f3610af7565b6002546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527f4ab5be82436d353e61ca18726e984e561f5c1cc7c6d38b29d2553c790434705a910160405180910390a1600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610a96610af7565b73ffffffffffffffffffffffffffffffffffffffff8116610aeb576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b610af481610ecd565b50565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106d8576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610ae2565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e7400000000000000000000006044820152606401610ae2565b60606000803681610c26610c0060e08a018a611ef5565b7f000000000000000000000000000000000000000000000000000000000000000061103e565b9250925092507f000000000000000000000000000000000000000000000000000000000000000060ff168360ff1614158015610c8857507f000000000000000000000000000000000000000000000000000000000000000060ff168360ff1614155b15610cbf576040517f654a4f2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606060007f000000000000000000000000000000000000000000000000000000000000000060ff168560ff1603610d0257610cfc8a85858c6110de565b90925090505b7f000000000000000000000000000000000000000000000000000000000000000060ff168560ff1603610d4157610d3b8a85858c61128b565b90925090505b90999098509650505050505050565b60008083356020850135608086013560a087013560c0880135610d7660408a018a611ef5565b604051610d84929190611f61565b604051908190039020610d9a60608b018b611ef5565b604051610da8929190611f61565b604051908190039020610dbe60e08c018c611ef5565b600090610deb8d7f0000000000000000000000000000000000000000000000000000000000000000611e8e565b92610df893929190611f71565b604051610e06929190611f61565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff90991660208301528101969096526060860194909452608085019290925260a084015260c083015260e082015261010081019190915261012001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301819052469183019190915230606083015291506080016040516020818303038152906040528051906020012091505092915050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000806000610f54898961134d565b5050945094509450945094506000610f8088846fffffffffffffffffffffffffffffffff1689876105f3565b600254909150610faa908690889073ffffffffffffffffffffffffffffffffffffffff16846113a2565b6040805160ff7f000000000000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff8781166020830152918101839052606081018690529087169083907f7a270f29ae17e8e2304ff1245deb50c3b6206bca82928d904f3e284d35c5ffd29060800160405180910390a35050505050505050505050565b6000368161104d846001611e8e565b851015611086576040517fcc32193e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000868587611096826001611e8e565b926110a393929190611f71565b6110ac91611f9b565b60f81c905036600088886110c1896001611e8e565b6110cc928290611f71565b939a9099509297509195505050505050565b606060008060003660006110f289896113ff565b9350935093509350600061115c6111297f00000000000000000000000000000000000000000000000000000000000000008d610630565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b905060006111a08285858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061150a92505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205491925060ff909116906111db82158989611534565b90508d356040805160ff7f0000000000000000000000000000000000000000000000000000000000000000168152600060208201819052918101829052606081019190915273ffffffffffffffffffffffffffffffffffffffff91909116908c907f7a270f29ae17e8e2304ff1245deb50c3b6206bca82928d904f3e284d35c5ffd29060800160405180910390a36040805160208101909152600081529e909d509b505050505050505050505050565b606060008061129a868661156c565b905060006112cb6111297f00000000000000000000000000000000000000000000000000000000000000008a610630565b905060006112dd828460a0015161150a565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604082205486519187015193945060ff169261131e91841591611534565b9050600061133b8c8760600151886080015189604001518d61181e565b9c919b50909950505050505050505050565b600080808080808080611362898b018b612021565b9050806000015181602001518260400151836060015184608001518560a001518660c0015197509750975097509750975097505092959891949750929550565b60405181606052826040528360601b602c526f23b872dd000000000000000000000000600c52602060006064601c6000895af13d1560016000511417166113f157637939f4246000526004601cfd5b600060605260405250505050565b600080368160ff7f000000000000000000000000000000000000000000000000000000000000000016851015611461576040517ff96ce32900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611470600682888a611f71565b611479916120e3565b60d01c9050600061148e600c6006898b611f71565b611497916120e3565b60d01c90503660006114ac89600c818d611f71565b9092509050604081148015906114c3575060418114155b156114fa576040517ff95eeeac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9299919850965090945092505050565b60008060008061151a8686611952565b92509250925061152a828261199f565b5090949350505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561155c57600061155f565b60015b60ff161717949350505050565b6040805160c0810182526000808252602082018190529181018290526060808201839052608082019290925260a081019190915260ff7f0000000000000000000000000000000000000000000000000000000000000000168210156115fd576040517ff96ce32900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061160c6006828587611f71565b611615916120e3565b60d01c9050600061162a600c60068688611f71565b611633916120e3565b60d01c905060006116486020600c8789611f71565b61165191612148565b60601c9050600061166660306020888a611f71565b61166f916121ad565b60801c9050600061168460506030898b611f71565b61168d91612212565b905036600061169f896050818d611f71565b909250905073ffffffffffffffffffffffffffffffffffffffff85166116f1576040517f33c1dac900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260000361172b576040517f5b33c69600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040811480159061173d575060418114155b15611774576040517ff95eeeac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518060c001604052808965ffffffffffff1681526020018865ffffffffffff168152602001866fffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152509b9a5050505050505050505050565b6040805160e081019091526060908061183a6020890189611c00565b73ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001846fffffffffffffffffffffffffffffffff1681526020018381526020016000815260200160008152506040516020016119389190600060e08201905073ffffffffffffffffffffffffffffffffffffffff835116825273ffffffffffffffffffffffffffffffffffffffff6020840151166020830152604083015160408301526fffffffffffffffffffffffffffffffff60608401511660608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b604051602081830303815290604052905095945050505050565b6000806000835160410361198c5760208401516040850151606086015160001a61197e88828585611aa7565b955095509550505050611998565b50508151600091506002905b9250925092565b60008260038111156119b3576119b361224e565b036119bc575050565b60018260038111156119d0576119d061224e565b03611a07576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115611a1b57611a1b61224e565b03611a55576040517ffce698f700000000000000000000000000000000000000000000000000000000815260048101829052602401610ae2565b6003826003811115611a6957611a6961224e565b03611aa3576040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260048101829052602401610ae2565b5050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611ae25750600091506003905082611b97565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611b36573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611b8d57506000925060019150829050611b97565b9250600091508190505b9450945094915050565b600060208284031215611bb357600080fd5b813563ffffffff81168114611bc757600080fd5b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610af457600080fd5b8035611bfb81611bce565b919050565b600060208284031215611c1257600080fd5b8135611bc781611bce565b60008060408385031215611c3057600080fd5b8235611c3b81611bce565b946020939093013593505050565b60006101208284031215611c5c57600080fd5b50919050565b600080600060608486031215611c7757600080fd5b833567ffffffffffffffff811115611c8e57600080fd5b611c9a86828701611c49565b9660208601359650604090950135949350505050565b604081526000835180604084015260005b81811015611cde5760208187018101516060868401015201611cc1565b5060006060828501015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150508260208301529392505050565b60008060008060808587031215611d3957600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215611d6857600080fd5b823560ff81168114611d7957600080fd5b9150602083013567ffffffffffffffff811115611d9557600080fd5b611da185828601611c49565b9150509250929050565b600080600080600060808688031215611dc357600080fd5b853560038110611dd257600080fd5b9450602086013567ffffffffffffffff811115611dee57600080fd5b8601601f81018813611dff57600080fd5b803567ffffffffffffffff811115611e1657600080fd5b886020828401011115611e2857600080fd5b959860209190910197509495604081013595606090910135945092505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176106c0576106c0611e48565b808201808211156106c0576106c0611e48565b600082611ed7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215611eee57600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611f2a57600080fd5b83018035915067ffffffffffffffff821115611f4557600080fd5b602001915036819003821315611f5a57600080fd5b9250929050565b8183823760009101908152919050565b60008085851115611f8157600080fd5b83861115611f8e57600080fd5b5050820193919092039150565b80357fff000000000000000000000000000000000000000000000000000000000000008116906001841015611ffa577fff00000000000000000000000000000000000000000000000000000000000000808560010360031b1b82161691505b5092915050565b80356fffffffffffffffffffffffffffffffff81168114611bfb57600080fd5b600060e082840312801561203457600080fd5b6000905060405160e0810181811067ffffffffffffffff82111715612080577f4e487b710000000000000000000000000000000000000000000000000000000083526041600452602483fd5b60405261208c84611bf0565b815261209a60208501611bf0565b6020820152604084810135908201526120b560608501612001565b60608201526080848101359082015260a0808501359082015260c09384013593810193909352509092915050565b80357fffffffffffff00000000000000000000000000000000000000000000000000008116906006841015611ffa577fffffffffffff0000000000000000000000000000000000000000000000000000808560060360031b1b82161691505092915050565b80357fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008116906014841015611ffa577fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808560140360031b1b82161691505092915050565b80357fffffffffffffffffffffffffffffffff000000000000000000000000000000008116906010841015611ffa577fffffffffffffffffffffffffffffffff00000000000000000000000000000000808560100360031b1b82161691505092915050565b803560208310156106c0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220d4b47765504d1aee07971ecb33f299cd13465059fbfeb55e32bdeb75ec9e629264736f6c634300081a00330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + pad(owner), + "0x00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001", // couldn't get encodeAbiParameters with type address[] to work + pad(owner) + ]) + +// Creates the call that deploys the SingletonPaymaster v0.6 +const SINGLETON_PAYMASTER_V06_CALL = (owner: Address): Hex => + concat([ + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x610140604052600060a052600160c052605060e052600c6101005260146101205234801561002c57600080fd5b5060405161270838038061270883398101604081905261004b916101a4565b828282808383806001600160a01b03811661008057604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61008981610122565b50506001600160a01b031660805260005b81518110156100f45760018060008484815181106100ba576100ba610297565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905560010161009a565b5050600280546001600160a01b0319166001600160a01b039390931692909217909155506102ad9350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b038116811461018957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156101b957600080fd5b6101c284610172565b92506101d060208501610172565b60408501519092506001600160401b038111156101ec57600080fd5b8401601f810186136101fd57600080fd5b80516001600160401b038111156102165761021661018e565b604051600582901b90603f8201601f191681016001600160401b03811182821017156102445761024461018e565b60405291825260208184018101929081018984111561026257600080fd5b6020850194505b838510156102885761027a85610172565b815260209485019401610269565b50809450505050509250925092565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e051610100516101205161239561037360003960008181610e980152610fc70152600081816108da01526114f501526000818161090e0152611691015260008181610d7801528181610ff3015281816110c901526114450152600081816108a9015281816110240152818161108a0152818161129b01526113870152600081816102d501528181610433015281816105880152818161064101528181610708015281816107980152818161084b0152610bd201526123956000f3fe6080604052600436106101445760003560e01c8063b0d691fe116100c0578063dd16f84711610074578063f0f4426011610059578063f0f4426014610389578063f2fde38b146103a9578063f465c77e146103c957600080fd5b8063dd16f84714610349578063eb12d61e1461036957600080fd5b8063c23a5cea116100a5578063c23a5cea1461030c578063c399ec881461032c578063d0e30db01461034157600080fd5b8063b0d691fe146102c3578063bb9fe6bf146102f757600080fd5b806361d027b311610117578063736c0d5b116100fc578063736c0d5b146102385780638da5cb5b14610278578063a9a23409146102a357600080fd5b806361d027b3146101d1578063715018a61461022357600080fd5b80630396cb60146101495780630e316ab71461015e578063205c28781461017e5780635525dcfb1461019e575b600080fd5b61015c610157366004611c95565b6103f7565b005b34801561016a57600080fd5b5061015c610179366004611ced565b6104a9565b34801561018a57600080fd5b5061015c610199366004611d0a565b610534565b3480156101aa57600080fd5b506101be6101b9366004611d36565b6105cc565b6040519081526020015b60405180910390f35b3480156101dd57600080fd5b506002546101fe9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c8565b34801561022f57600080fd5b5061015c610609565b34801561024457600080fd5b50610268610253366004611ced565b60016020526000908152604090205460ff1681565b60405190151581526020016101c8565b34801561028457600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166101fe565b3480156102af57600080fd5b5061015c6102be366004611d68565b61061d565b3480156102cf57600080fd5b506101fe7f000000000000000000000000000000000000000000000000000000000000000081565b34801561030357600080fd5b5061015c610637565b34801561031857600080fd5b5061015c610327366004611ced565b6106bb565b34801561033857600080fd5b506101be610767565b61015c61081d565b34801561035557600080fd5b506101be610364366004611e13565b6108a5565b34801561037557600080fd5b5061015c610384366004611ced565b61093b565b34801561039557600080fd5b5061015c6103a4366004611ced565b6109c3565b3480156103b557600080fd5b5061015c6103c4366004611ced565b610a66565b3480156103d557600080fd5b506103e96103e4366004611e69565b610acf565b6040516101c8929190611eb7565b6103ff610af2565b6040517f0396cb6000000000000000000000000000000000000000000000000000000000815263ffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690630396cb609034906024016000604051808303818588803b15801561048d57600080fd5b505af11580156104a1573d6000803e3d6000fd5b505050505050565b6104b1610af2565b73ffffffffffffffffffffffffffffffffffffffff811660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905590519182527f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b91015b60405180910390a150565b61053c610af2565b6040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561048d57600080fd5b6000670de0b6b3a7640000826105e28587611f59565b6105ec9088611f70565b6105f69190611f59565b6106009190611f83565b95945050505050565b610611610af2565b61061b6000610b45565b565b610625610bba565b61063184848484610c59565b50505050565b61063f610af2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156106a757600080fd5b505af1158015610631573d6000803e3d6000fd5b6106c3610af2565b6040517fc23a5cea00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b15801561074c57600080fd5b505af1158015610760573d6000803e3d6000fd5b5050505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156107f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108189190611fbe565b905090565b6040517fb760faf90000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b760faf99034906024016000604051808303818588803b15801561074c57600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000060ff168360ff160361090857610901827f000000000000000000000000000000000000000000000000000000000000000060ff16610e08565b9050610935565b610901827f000000000000000000000000000000000000000000000000000000000000000060ff16610e08565b92915050565b610943610af2565b73ffffffffffffffffffffffffffffffffffffffff811660008181526001602081815260409283902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690921790915590519182527f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f249101610529565b6109cb610af2565b6002546040805173ffffffffffffffffffffffffffffffffffffffff928316815291831660208301527f4ab5be82436d353e61ca18726e984e561f5c1cc7c6d38b29d2553c790434705a910160405180910390a1600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610a6e610af2565b73ffffffffffffffffffffffffffffffffffffffff8116610ac3576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b610acc81610b45565b50565b60606000610adb610bba565b610ae6858585610fad565b91509150935093915050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461061b576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610aba565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461061b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420456e747279506f696e7400000000000000000000006044820152606401610aba565b6000806000806000806000610c6e8a8a611115565b96509650965096509650965096506000818303610c8c575081610ca2565b610c9f83610c9a4885611f70565b61116a565b90505b6000610cc28a876fffffffffffffffffffffffffffffffff16848a6105cc565b905060028d6002811115610cd857610cd8611fd7565b14610df957600254600090610d07908a908c9073ffffffffffffffffffffffffffffffffffffffff1685611182565b905080610d70576040517f1db0f4fb00000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610aba565b6040805160ff7f000000000000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff8b81166020830152918101849052606081018a9052908b169087907f7a270f29ae17e8e2304ff1245deb50c3b6206bca82928d904f3e284d35c5ffd29060800160405180910390a3505b50505050505050505050505050565b600080610e186020850185611ced565b6020850135608086013560a087013560c088013560e08901356101008a0135610e4460608c018c612006565b604051610e52929190612072565b60405180910390208b8060400190610e6a9190612006565b604051610e78929190612072565b604051908190039020610e8f6101208e018e612006565b600090610ebc8f7f0000000000000000000000000000000000000000000000000000000000000000611f70565b92610ec993929190612082565b604051610ed7929190612072565b6040805191829003822073ffffffffffffffffffffffffffffffffffffffff909b1660208301528101989098526060880196909652608087019490945260a086019290925260c085015260e084015261010083015261012082015261014081019190915261016001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301819052469183019190915230606083015291506080016040516020818303038152906040528051906020012091505092915050565b60606000803681610feb610fc56101208a018a612006565b7f00000000000000000000000000000000000000000000000000000000000000006111d5565b9250925092507f000000000000000000000000000000000000000000000000000000000000000060ff168360ff161415801561104d57507f000000000000000000000000000000000000000000000000000000000000000060ff168360ff1614155b15611084576040517f654a4f2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606060007f000000000000000000000000000000000000000000000000000000000000000060ff168560ff16036110c7576110c18a85858c611275565b90925090505b7f000000000000000000000000000000000000000000000000000000000000000060ff168560ff1603611106576111008a85858c61142a565b90925090505b90999098509650505050505050565b60008080808080808061112a898b018b6120cc565b9050806000015181602001518260400151836060015184608001518560a001518660c0015197509750975097509750975097505092959891949750929550565b6000818310611179578161117b565b825b9392505050565b600060405182606052836040528460601b602c526f23b872dd000000000000000000000000600c52602060006064601c60008a5af13d156001600051141716915060006060528060405250949350505050565b600036816111e4846001611f70565b85101561121d576040517fcc32193e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600086858761122d826001611f70565b9261123a93929190612082565b6112439161218e565b60f81c90503660008888611258896001611f70565b611263928290612082565b939a9099509297509195505050505050565b6060600080600036600061128989896114ec565b935093509350935060006112f36112c07f00000000000000000000000000000000000000000000000000000000000000008d6108a5565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b905060006113378285858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506115f792505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205491925060ff9091169061137282158989611621565b905061138160208f018f611ced565b604080517f000000000000000000000000000000000000000000000000000000000000000060ff1681526000602082018190528183018190526060820152905173ffffffffffffffffffffffffffffffffffffffff92909216918d917f7a270f29ae17e8e2304ff1245deb50c3b6206bca82928d904f3e284d35c5ffd2919081900360800190a36040805160208101909152600081529e909d509b505050505050505050505050565b60606000806114398686611659565b9050600061146a6112c07f00000000000000000000000000000000000000000000000000000000000000008a6108a5565b9050600061147c828460a001516115f7565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260016020908152604082205486519187015193945060ff16926114bd91841591611621565b905060006114da8c8760600151886080015189604001518d61190b565b9c919b50909950505050505050505050565b600080368160ff7f00000000000000000000000000000000000000000000000000000000000000001685101561154e576040517ff96ce32900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061155d600682888a612082565b611566916121f4565b60d01c9050600061157b600c6006898b612082565b611584916121f4565b60d01c905036600061159989600c818d612082565b9092509050604081148015906115b0575060418114155b156115e7576040517ff95eeeac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9299919850965090945092505050565b6000806000806116078686611a46565b9250925092506116178282611a93565b5090949350505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b8561164957600061164c565b60015b60ff161717949350505050565b6040805160c0810182526000808252602082018190529181018290526060808201839052608082019290925260a081019190915260ff7f0000000000000000000000000000000000000000000000000000000000000000168210156116ea576040517ff96ce32900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116f96006828587612082565b611702916121f4565b60d01c90506000611717600c60068688612082565b611720916121f4565b60d01c905060006117356020600c8789612082565b61173e91612259565b60601c9050600061175360306020888a612082565b61175c916122be565b60801c9050600061177160506030898b612082565b61177a91612323565b905036600061178c896050818d612082565b909250905073ffffffffffffffffffffffffffffffffffffffff85166117de576040517f33c1dac900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82600003611818576040517f5b33c69600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040811480159061182a575060418114155b15611861576040517ff95eeeac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518060c001604052808965ffffffffffff1681526020018865ffffffffffff168152602001866fffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200185815260200184848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152509b9a5050505050505050505050565b6040805160e08101909152606090806119276020890189611ced565b73ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001846fffffffffffffffffffffffffffffffff1681526020018381526020018760e001358152602001876101000135815250604051602001611a2c9190600060e08201905073ffffffffffffffffffffffffffffffffffffffff835116825273ffffffffffffffffffffffffffffffffffffffff6020840151166020830152604083015160408301526fffffffffffffffffffffffffffffffff60608401511660608301526080830151608083015260a083015160a083015260c083015160c083015292915050565b604051602081830303815290604052905095945050505050565b60008060008351604103611a805760208401516040850151606086015160001a611a7288828585611b9b565b955095509550505050611a8c565b50508151600091506002905b9250925092565b6000826003811115611aa757611aa7611fd7565b03611ab0575050565b6001826003811115611ac457611ac4611fd7565b03611afb576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002826003811115611b0f57611b0f611fd7565b03611b49576040517ffce698f700000000000000000000000000000000000000000000000000000000815260048101829052602401610aba565b6003826003811115611b5d57611b5d611fd7565b03611b97576040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260048101829052602401610aba565b5050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115611bd65750600091506003905082611c8b565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611c2a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611c8157506000925060019150829050611c8b565b9250600091508190505b9450945094915050565b600060208284031215611ca757600080fd5b813563ffffffff8116811461117b57600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610acc57600080fd5b8035611ce881611cbb565b919050565b600060208284031215611cff57600080fd5b813561117b81611cbb565b60008060408385031215611d1d57600080fd5b8235611d2881611cbb565b946020939093013593505050565b60008060008060808587031215611d4c57600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060608587031215611d7e57600080fd5b843560038110611d8d57600080fd5b9350602085013567ffffffffffffffff811115611da957600080fd5b8501601f81018713611dba57600080fd5b803567ffffffffffffffff811115611dd157600080fd5b876020828401011115611de357600080fd5b949760209190910196509394604001359392505050565b60006101608284031215611e0d57600080fd5b50919050565b60008060408385031215611e2657600080fd5b823560ff81168114611e3757600080fd5b9150602083013567ffffffffffffffff811115611e5357600080fd5b611e5f85828601611dfa565b9150509250929050565b600080600060608486031215611e7e57600080fd5b833567ffffffffffffffff811115611e9557600080fd5b611ea186828701611dfa565b9660208601359650604090950135949350505050565b604081526000835180604084015260005b81811015611ee55760208187018101516060868401015201611ec8565b5060006060828501015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168401019150508260208301529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761093557610935611f2a565b8082018082111561093557610935611f2a565b600082611fb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215611fd057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261203b57600080fd5b83018035915067ffffffffffffffff82111561205657600080fd5b60200191503681900382131561206b57600080fd5b9250929050565b8183823760009101908152919050565b6000808585111561209257600080fd5b8386111561209f57600080fd5b5050820193919092039150565b80356fffffffffffffffffffffffffffffffff81168114611ce857600080fd5b600060e08284031280156120df57600080fd5b6000905060405160e0810181811067ffffffffffffffff8211171561212b577f4e487b710000000000000000000000000000000000000000000000000000000083526041600452602483fd5b60405261213784611cdd565b815261214560208501611cdd565b602082015260408481013590820152612160606085016120ac565b60608201526080848101359082015260a0808501359082015260c09384013593810193909352509092915050565b80357fff0000000000000000000000000000000000000000000000000000000000000081169060018410156121ed577fff00000000000000000000000000000000000000000000000000000000000000808560010360031b1b82161691505b5092915050565b80357fffffffffffff000000000000000000000000000000000000000000000000000081169060068410156121ed577fffffffffffff0000000000000000000000000000000000000000000000000000808560060360031b1b82161691505092915050565b80357fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169060148410156121ed577fffffffffffffffffffffffffffffffffffffffff000000000000000000000000808560140360031b1b82161691505092915050565b80357fffffffffffffffffffffffffffffffff0000000000000000000000000000000081169060108410156121ed577fffffffffffffffffffffffffffffffff00000000000000000000000000000000808560100360031b1b82161691505092915050565b80356020831015610935577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b169291505056fea2646970667358221220b198dacaa988aafcb9441005f2a899880d533689da493c4dc98e301d7822f21a64736f6c634300081a00330000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + pad(owner), + "0x00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001", // couldn't get encodeAbiParameters with type address[] to work + pad(owner) + ]) + +const SINGLETON_PAYMASTER_V06_ADDRESS = (owner: Address) => + getCreate2Address({ + from: DETERMINISTIC_DEPLOYER, + salt: slice(SINGLETON_PAYMASTER_V06_CALL(owner), 0, 32), + bytecode: slice(SINGLETON_PAYMASTER_V06_CALL(owner), 32) + }) + +const SINGLETON_PAYMASTER_V07_ADDRESS = (owner: Address) => + getCreate2Address({ + from: DETERMINISTIC_DEPLOYER, + salt: slice(SINGLETON_PAYMASTER_V07_CALL(owner), 0, 32), + bytecode: slice(SINGLETON_PAYMASTER_V07_CALL(owner), 32) + }) + +export class SingletonPaymasterV07 { + private anvilRpc: string + private walletClient: WalletClient + public singletonPaymaster: GetContractReturnType< + typeof SINGLETON_PAYMASTER_V07_ABI, + { + public: PublicClient + wallet: WalletClient + } + > + + constructor( + walletClient: WalletClient, + anvilRpc: string + ) { + this.walletClient = walletClient + this.singletonPaymaster = getContract({ + address: SINGLETON_PAYMASTER_V07_ADDRESS( + walletClient.account.address + ), + abi: SINGLETON_PAYMASTER_V07_ABI, + client: { + wallet: walletClient as WalletClient, + public: getPublicClient(anvilRpc) + } + }) + this.anvilRpc = anvilRpc + } + + public getDummyPaymasterData(paymasterMode: PaymasterMode): { + paymaster: Address + paymasterData: Hex + } { + return getDummyPaymasterData( + false, + this.singletonPaymaster.address, + paymasterMode + ) as { + paymaster: Address + paymasterData: Hex + } + } + + async encodePaymasterData( + op: UserOperation<"0.7">, + paymasterMode: PaymasterMode + ) { + const validAfter = 0 + const validUntil = Math.floor(Date.now() / 1000) + 60_000 + + const mode = paymasterMode.mode === "verifying" ? 0 : 1 + op.paymaster = this.singletonPaymaster.address + op.paymasterData = encodePacked( + ["uint8", "uint48", "uint48"], + [mode, validUntil, validAfter] + ) + + // if ERC-20 mode, add extra ERC-20 fields + if (paymasterMode.mode === "erc20") { + op.paymasterData = encodePacked( + ["bytes", "address", "uint128", "uint256"], + [ + op.paymasterData, + paymasterMode.token, + POST_OP_GAS_OVERHEAD, + EXCHANGE_RATE + ] + ) + } + + const hash = await this.singletonPaymaster.read.getHash([ + mode, + toPackedUserOperation(op) + ]) + + const sig = await this.walletClient.signMessage({ + message: { raw: toBytes(hash) } + }) + + return { + paymaster: this.singletonPaymaster.address, + paymasterData: encodePacked( + ["bytes", "bytes"], + [op.paymasterData, sig] + ) + } + } + + async setup() { + const data = SINGLETON_PAYMASTER_V07_CALL( + this.walletClient.account.address + ) + + const publicClient = createPublicClient({ + transport: http(this.anvilRpc), + chain: foundry + }) + + await this.walletClient + .sendTransaction({ + to: DETERMINISTIC_DEPLOYER, + data + }) + .then((hash) => publicClient.waitForTransactionReceipt({ hash })) + + const address = getContractAddress({ + opcode: "CREATE2", + from: DETERMINISTIC_DEPLOYER, + salt: slice(data, 0, 32), + bytecode: slice(data, 32) + }) + + const singletonPaymaster = getContract({ + address, + abi: SINGLETON_PAYMASTER_V07_ABI, + client: this.walletClient + }) + + await singletonPaymaster.write.deposit({ + value: parseEther("50") + }) + + return singletonPaymaster + } +} + +export class SingletonPaymasterV06 { + private walletClient: WalletClient + public singletonPaymaster: GetContractReturnType< + typeof SINGLETON_PAYMASTER_V06_ABI, + { + public: PublicClient + wallet: WalletClient + } + > + private anvilRpc: string + + constructor( + walletClient: WalletClient, + anvilRpc: string + ) { + this.walletClient = walletClient + this.singletonPaymaster = getContract({ + address: SINGLETON_PAYMASTER_V06_ADDRESS( + walletClient.account.address + ), + abi: SINGLETON_PAYMASTER_V06_ABI, + client: { + wallet: this.walletClient, + public: getPublicClient(anvilRpc) + } + }) + this.anvilRpc = anvilRpc + } + + public getDummyPaymasterData(paymasterMode: PaymasterMode): { + paymasterAndData: Hex + } { + return getDummyPaymasterData( + true, + this.singletonPaymaster.address, + paymasterMode + ) as { + paymasterAndData: Hex + } + } + + async encodePaymasterData( + op: UserOperation<"0.6">, + paymasterMode: PaymasterMode + ) { + const validAfter = 0 + const validUntil = Math.floor(Date.now() / 1000) + 60_000 + const mode = paymasterMode.mode === "verifying" ? 0 : 1 + op.paymasterAndData = encodePacked( + ["address", "uint8", "uint48", "uint48"], + [this.singletonPaymaster.address, mode, validUntil, validAfter] + ) + + if (paymasterMode.mode === "erc20") { + op.paymasterAndData = encodePacked( + ["bytes", "address", "uint128", "uint256"], + [ + op.paymasterAndData, + paymasterMode.token, + POST_OP_GAS_OVERHEAD, + EXCHANGE_RATE + ] + ) + } + + const hash = await this.singletonPaymaster.read.getHash([ + mode, + { + ...op, + initCode: op.initCode || "0x", + paymasterAndData: op.paymasterAndData || "0x" + } + ]) + const sig = await this.walletClient.signMessage({ + message: { raw: hash } + }) + + return { + paymasterAndData: encodePacked( + ["bytes", "bytes"], + [op.paymasterAndData, sig] + ) + } + } + + async setup() { + const data = SINGLETON_PAYMASTER_V06_CALL( + this.walletClient.account.address + ) + + const publicClient = createPublicClient({ + transport: http(this.anvilRpc), + chain: foundry + }) + + await this.walletClient + .sendTransaction({ + to: DETERMINISTIC_DEPLOYER, + data + }) + .then((hash) => publicClient.waitForTransactionReceipt({ hash })) + + const address = getContractAddress({ + opcode: "CREATE2", + from: DETERMINISTIC_DEPLOYER, + salt: slice(data, 0, 32), + bytecode: slice(data, 32) + }) + + const singletonPaymaster = getContract({ + address, + abi: SINGLETON_PAYMASTER_V06_ABI, + client: this.walletClient + }) + + await singletonPaymaster.write.deposit({ + value: parseEther("50") + }) + + return singletonPaymaster + } +} diff --git a/packages/permissionless-test/src/erc20-utils.ts b/packages/permissionless-test/src/erc20-utils.ts new file mode 100644 index 00000000..014521d2 --- /dev/null +++ b/packages/permissionless-test/src/erc20-utils.ts @@ -0,0 +1,80 @@ +import { + type Account, + type Address, + type Chain, + type PublicClient, + type Transport, + type WalletClient, + concat, + encodeFunctionData, + getCreate2Address, + hexToBigInt, + pad, + parseAbi, + toHex +} from "viem" +import { getAnvilWalletClient, getPublicClient } from "./utils" + +const ERC20_BYTECODE = concat([ + "0x60a060405234801561001057600080fd5b50604051610ff0380380610ff083398101604081905261002f9161022c565b6040518060400160405280600981526020016805465737445524332360bc1b8152506040518060400160405280600381526020016205432360ec1b815250816003908161007c919061034d565b506004610089828261034d565b5050506100a63369d3c21bcecceda10000006100b160201b60201c565b60ff166080526104a3565b6001600160a01b0382166100e457600060405163ec442f0560e01b81526004016100db9190610430565b60405180910390fd5b6100f0600083836100f4565b5050565b6001600160a01b03831661011f5780600260008282546101149190610454565b9091555061017e9050565b6001600160a01b0383166000908152602081905260409020548181101561015f5783818360405163391434e360e21b81526004016100db9392919061046d565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661019a576002805482900390556101b9565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101fc9190610495565b60405180910390a3505050565b60ff8116811461021857600080fd5b50565b805161022681610209565b92915050565b60006020828403121561024157610241600080fd5b600061024d848461021b565b949350505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b60028104600182168061029557607f821691505b6020821081036102a7576102a761026b565b50919050565b60006102266102b98381565b90565b6102c5836102ad565b815460001960089490940293841b1916921b91909117905550565b60006102ed8184846102bc565b505050565b818110156100f0576103056000826102e0565b6001016102f2565b601f8211156102ed576000818152602090206020601f850104810160208510156103345750805b6103466020601f8601048301826102f2565b5050505050565b81516001600160401b0381111561036657610366610255565b6103708254610281565b61037b82828561030d565b6020601f8311600181146103af57600084156103975750858201515b600019600886021c1981166002860217865550610408565b600085815260208120601f198616915b828110156103df57888501518255602094850194600190920191016103bf565b868310156103fb5784890151600019601f89166008021c191682555b6001600288020188555050505b505050505050565b60006001600160a01b038216610226565b61042a81610410565b82525050565b602081016102268284610421565b634e487b7160e01b600052601160045260246000fd5b808201808211156102265761022661043e565b8061042a565b6060810161047b8286610421565b6104886020830185610467565b61024d6040830184610467565b602081016102268284610467565b608051610b326104be60003960006101650152610b326000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c8063313ce56711610081578063a9059cbb1161005b578063a9059cbb146101cf578063dd62ed3e146101e2578063fb4dcefa1461022857600080fd5b8063313ce5671461016357806370a082311461019157806395d89b41146101c757600080fd5b806318160ddd116100b257806318160ddd1461012c57806323b872dd1461013d5780632d688ca81461015057600080fd5b806305ea5c22146100d957806306fdde03146100ee578063095ea7b31461010c575b600080fd5b6100ec6100e7366004610868565b61023b565b005b6100f661024b565b604051610103919061092c565b60405180910390f35b61011f61011a366004610944565b6102dd565b604051610103919061098b565b6002545b604051610103919061099f565b61011f61014b366004610868565b6102f7565b6100ec61015e366004610944565b61031b565b7f000000000000000000000000000000000000000000000000000000000000000060405161010391906109b6565b61013061019f3660046109c4565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100f6610329565b61011f6101dd366004610944565b610338565b6101306101f03660046109ed565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6100ec6102363660046109ed565b610346565b61024683838361037c565b505050565b60606003805461025a90610a4f565b80601f016020809104026020016040519081016040528092919081815260200182805461028690610a4f565b80156102d35780601f106102a8576101008083540402835291602001916102d3565b820191906000526020600020905b8154815290600101906020018083116102b657829003601f168201915b5050505050905090565b6000336102eb81858561037c565b60019150505b92915050565b600033610305858285610389565b610310858585610441565b506001949350505050565b61032582826104ec565b5050565b60606004805461025a90610a4f565b6000336102eb818585610441565b61032582826103778573ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b610441565b6102468383836001610548565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461043b578181101561042c578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161042393929190610a84565b60405180910390fd5b61043b84848484036000610548565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166104915760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016104239190610aac565b73ffffffffffffffffffffffffffffffffffffffff82166104e15760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016104239190610aac565b61024683838361068e565b73ffffffffffffffffffffffffffffffffffffffff821661053c5760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016104239190610aac565b6103256000838361068e565b73ffffffffffffffffffffffffffffffffffffffff84166105985760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016104239190610aac565b73ffffffffffffffffffffffffffffffffffffffff83166105e85760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016104239190610aac565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160209081526040808320938716835292905220829055801561043b578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610680919061099f565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff83166106c65780600260008282546106bb9190610ae9565b909155506107589050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020548181101561072c578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161042393929190610a84565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff8216610781576002805482900390556107ad565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161080a919061099f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff82166102f1565b61083e81610817565b811461084957600080fd5b50565b80356102f181610835565b8061083e565b80356102f181610857565b60008060006060848603121561088057610880600080fd5b600061088c868661084c565b935050602061089d8682870161084c565b92505060406108ae8682870161085d565b9150509250925092565b60005b838110156108d35781810151838201526020016108bb565b50506000910152565b60006108e6825190565b8084526020840193506108fd8185602086016108b8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920192915050565b6020808252810161093d81846108dc565b9392505050565b6000806040838503121561095a5761095a600080fd5b6000610966858561084c565b92505060206109778582860161085d565b9150509250929050565b8015155b82525050565b602081016102f18284610981565b80610985565b602081016102f18284610999565b60ff8116610985565b602081016102f182846109ad565b6000602082840312156109d9576109d9600080fd5b60006109e5848461084c565b949350505050565b60008060408385031215610a0357610a03600080fd5b6000610a0f858561084c565b92505060206109778582860161084c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600281046001821680610a6357607f821691505b602082108103610a7557610a75610a20565b50919050565b61098581610817565b60608101610a928286610a7b565b610a9f6020830185610999565b6109e56040830184610999565b602081016102f18284610a7b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156102f1576102f1610aba56fea2646970667358221220d40f68e247510ec8b7876d327ac47b949de248d0626aaf2670151c5e84ee6b4a64736f6c634300081a0033", + pad(toHex(18n)) // constructor args (token_decimals) +]) + +export const deployErc20Token = async ( + walletClient: WalletClient, + publicClient: PublicClient +) => { + if ( + (await publicClient.getCode({ address: ERC20_ADDRESS })) === undefined + ) { + await walletClient.sendTransaction({ + to: "0x4e59b44847b379578588920ca78fbf26c0b4956c", + data: concat([ + "0x0000000000000000000000000000000000000000000000000000000000000000", + ERC20_BYTECODE + ]) + }) + } +} + +export const tokenBalanceOf = async (holder: Address, anvilRpc: string) => { + const publicClient = getPublicClient(anvilRpc) + + const balance = await publicClient.call({ + to: ERC20_ADDRESS, + value: 0n, + data: encodeFunctionData({ + abi: parseAbi(["function balanceOf(address)"]), + args: [holder] + }) + }) + + return hexToBigInt(balance.data ?? "0x") +} + +export const sudoMintTokens = async ({ + amount, + to, + anvilRpc +}: { + amount: bigint + to: Address + anvilRpc: string +}) => { + const walletClient = getAnvilWalletClient({ addressIndex: 0, anvilRpc }) + + await walletClient.sendTransaction({ + to: ERC20_ADDRESS, + value: 0n, + data: encodeFunctionData({ + abi: parseAbi(["function sudoMint(address, uint256)"]), + args: [to, amount] + }) + }) +} + +export const ERC20_ADDRESS = getCreate2Address({ + from: "0x4e59b44847b379578588920ca78fbf26c0b4956c", + salt: "0x0000000000000000000000000000000000000000000000000000000000000000", + bytecode: ERC20_BYTECODE +}) diff --git a/packages/permissionless-test/src/utils.ts b/packages/permissionless-test/src/utils.ts index bf2fa01d..aa823318 100644 --- a/packages/permissionless-test/src/utils.ts +++ b/packages/permissionless-test/src/utils.ts @@ -1,14 +1,4 @@ -import { - http, - type Account, - type Address, - type Chain, - type Transport, - type WalletClient, - createPublicClient, - createWalletClient, - parseEther -} from "viem" +import { http, createPublicClient, createWalletClient } from "viem" import { type SmartAccount, createBundlerClient, @@ -199,9 +189,12 @@ export const getPimlicoClient = ({ export const getPublicClient = (anvilRpc: string) => { const transport = http(anvilRpc, { - onFetchRequest: async (request) => { - // console.log("fetching", await request.json()) - } + //onFetchRequest: async (req) => { + // console.log(await req.json(), "request") + //}, + //onFetchResponse: async (response) => { + // console.log(await response.clone().json(), "response") + //} }) return createPublicClient({ @@ -211,39 +204,6 @@ export const getPublicClient = (anvilRpc: string) => { }) } -const usedWallets = new Set
() - -export const fund = async ({ - to, - anvilRpc -}: { to: Address; anvilRpc: string }) => { - let funder: WalletClient - - const wallets = Array.from({ length: 10 }, (_, index) => - getAnvilWalletClient({ addressIndex: index, anvilRpc }) - ) - const publicClient = getPublicClient(anvilRpc) - - do { - const availableFunders = wallets.filter( - (wallet) => !usedWallets.has(wallet.account.address) - ) - const randomIndex = Math.floor(Math.random() * availableFunders.length) - funder = availableFunders[randomIndex] - } while (!funder) - - // mark the funder as used - usedWallets.add(funder.account.address) - - const hash = await funder.sendTransaction({ - to, - value: parseEther("1") - }) - - // wait for funding confirmation - await publicClient.waitForTransactionReceipt({ hash }) -} - export const getSimpleAccountClient = async < entryPointVersion extends "0.6" | "0.7" >({ diff --git a/packages/permissionless/clients/createSmartAccountClient.ts b/packages/permissionless/clients/createSmartAccountClient.ts index 024b0437..b501a771 100644 --- a/packages/permissionless/clients/createSmartAccountClient.ts +++ b/packages/permissionless/clients/createSmartAccountClient.ts @@ -1,20 +1,23 @@ -import type { - BundlerRpcSchema, - Chain, - Client, - ClientConfig, - EstimateFeesPerGasReturnType, - Prettify, - RpcSchema, - Transport +import { + type BundlerRpcSchema, + type Chain, + type Client, + type ClientConfig, + type EstimateFeesPerGasReturnType, + type Prettify, + type RpcSchema, + type Transport, + createClient } from "viem" import { type BundlerActions, type BundlerClientConfig, type PaymasterActions, + type PrepareUserOperationParameters, type SmartAccount, type UserOperationRequest, - createBundlerClient + bundlerActions, + type prepareUserOperation as viemPrepareUserOperation } from "viem/account-abstraction" import { type SmartAccountActions, @@ -101,6 +104,8 @@ export type SmartAccountClientConfig< userOperation: UserOperationRequest }) => Promise>) | undefined + /** Prepare User Operation configuration. */ + prepareUserOperation?: typeof viemPrepareUserOperation | undefined } | undefined } @@ -134,17 +139,43 @@ export function createSmartAccountClient( userOperation } = parameters - const client = createBundlerClient({ - ...parameters, - client: client_, - chain: parameters.chain ?? client_?.chain, - key, - name, - transport: bundlerTransport, - paymaster, - paymasterContext, - userOperation - }) + const client = Object.assign( + createClient({ + ...parameters, + chain: parameters.chain ?? client_?.chain, + transport: bundlerTransport, + key, + name, + type: "bundlerClient" // TODO: is this okay? + }), + { client: client_, paymaster, paymasterContext, userOperation } + ) + + if (parameters.userOperation?.prepareUserOperation) { + const customPrepareUserOp = + parameters.userOperation.prepareUserOperation + + return client + .extend(bundlerActions) + .extend((client) => ({ + prepareUserOperation: ( + args: PrepareUserOperationParameters + ) => { + return customPrepareUserOp(client, args) + } + })) + .extend(bundlerActions) + .extend((client) => ({ + prepareUserOperation: ( + args: PrepareUserOperationParameters + ) => { + return customPrepareUserOp(client, args) + } + })) + .extend(smartAccountActions()) as SmartAccountClient + } - return client.extend(smartAccountActions()) as unknown as SmartAccountClient + return client + .extend(bundlerActions) + .extend(smartAccountActions()) as SmartAccountClient } diff --git a/packages/permissionless/experimental/pimlico/index.ts b/packages/permissionless/experimental/pimlico/index.ts new file mode 100644 index 00000000..80c0e415 --- /dev/null +++ b/packages/permissionless/experimental/pimlico/index.ts @@ -0,0 +1,2 @@ +import { prepareUserOperationForErc20Paymaster } from "./utils/prepareUserOperationForErc20Paymaster" +export { prepareUserOperationForErc20Paymaster } diff --git a/packages/permissionless/experimental/pimlico/utils/prepareUserOperationForErc20Paymaster.test.ts b/packages/permissionless/experimental/pimlico/utils/prepareUserOperationForErc20Paymaster.test.ts new file mode 100644 index 00000000..add364b1 --- /dev/null +++ b/packages/permissionless/experimental/pimlico/utils/prepareUserOperationForErc20Paymaster.test.ts @@ -0,0 +1,195 @@ +import { http, parseEther, zeroAddress } from "viem" +import { + entryPoint06Address, + entryPoint07Address +} from "viem/account-abstraction" +import { foundry } from "viem/chains" +import { describe, expect } from "vitest" +import { + ERC20_ADDRESS, + sudoMintTokens, + tokenBalanceOf +} from "../../../../permissionless-test/src/erc20-utils.ts" +import { testWithRpc } from "../../../../permissionless-test/src/testWithRpc.ts" +import { + getCoreSmartAccounts, + getPublicClient +} from "../../../../permissionless-test/src/utils" +import { createSmartAccountClient } from "../../../clients/createSmartAccountClient.ts" +import { createPimlicoClient } from "../../../clients/pimlico.ts" +import { prepareUserOperationForErc20Paymaster } from "./prepareUserOperationForErc20Paymaster.ts" + +describe.each(getCoreSmartAccounts())( + "prepareUserOperationForErc20Paymaster $name", + ({ + getSmartAccountClient, + supportsEntryPointV06, + supportsEntryPointV07 + }) => { + testWithRpc.skipIf(!supportsEntryPointV06)( + "prepareUserOperationForErc20Paymaster_v06", + async ({ rpc }) => { + const { anvilRpc } = rpc + + const account = ( + await getSmartAccountClient({ + entryPoint: { + version: "0.6" + }, + ...rpc + }) + ).account + + const pimlicoClient = createPimlicoClient({ + transport: http(rpc.paymasterRpc), + entryPoint: { + address: entryPoint06Address, + version: "0.6" + } + }) + + const publicClient = getPublicClient(anvilRpc) + + const smartAccountClient = createSmartAccountClient({ + // @ts-ignore + client: getPublicClient(anvilRpc), + account, + paymaster: pimlicoClient, + chain: foundry, + userOperation: { + prepareUserOperation: + prepareUserOperationForErc20Paymaster(pimlicoClient) + }, + bundlerTransport: http(rpc.altoRpc) + }) + + const INITIAL_TOKEN_BALANCE = parseEther("100") + const INTIAL_ETH_BALANCE = await publicClient.getBalance({ + address: smartAccountClient.account.address + }) + + sudoMintTokens({ + amount: INITIAL_TOKEN_BALANCE, + to: smartAccountClient.account.address, + anvilRpc + }) + + const opHash = await smartAccountClient.sendUserOperation({ + calls: [ + { + to: zeroAddress, + data: "0x", + value: 0n + } + ], + paymasterContext: { + token: ERC20_ADDRESS + } + }) + + const receipt = + await smartAccountClient.waitForUserOperationReceipt({ + hash: opHash + }) + + expect(receipt).toBeTruthy() + expect(receipt).toBeTruthy() + expect(receipt.success).toBeTruthy() + + const FINAL_TOKEN_BALANCE = await tokenBalanceOf( + smartAccountClient.account.address, + rpc.anvilRpc + ) + const FINAL_ETH_BALANCE = await publicClient.getBalance({ + address: smartAccountClient.account.address + }) + + expect(FINAL_TOKEN_BALANCE).toBeLessThan(INITIAL_TOKEN_BALANCE) // Token balance should be deducted + expect(FINAL_ETH_BALANCE).toEqual(INTIAL_ETH_BALANCE) // There should be no ETH balance change + } + ) + + testWithRpc.skipIf(!supportsEntryPointV07)( + "prepareUserOperationForErc20Paymaster_v07", + async ({ rpc }) => { + const { anvilRpc } = rpc + + const account = ( + await getSmartAccountClient({ + entryPoint: { + version: "0.7" + }, + ...rpc + }) + ).account + + const publicClient = getPublicClient(anvilRpc) + + const pimlicoClient = createPimlicoClient({ + transport: http(rpc.paymasterRpc), + entryPoint: { + address: entryPoint07Address, + version: "0.7" + } + }) + + const smartAccountClient = createSmartAccountClient({ + // @ts-ignore + client: getPublicClient(anvilRpc), + account, + paymaster: pimlicoClient, + chain: foundry, + userOperation: { + prepareUserOperation: + prepareUserOperationForErc20Paymaster(pimlicoClient) + }, + bundlerTransport: http(rpc.altoRpc) + }) + + const INITIAL_TOKEN_BALANCE = parseEther("100") + const INTIAL_ETH_BALANCE = await publicClient.getBalance({ + address: smartAccountClient.account.address + }) + + sudoMintTokens({ + amount: INITIAL_TOKEN_BALANCE, + to: smartAccountClient.account.address, + anvilRpc + }) + + const opHash = await smartAccountClient.sendUserOperation({ + calls: [ + { + to: zeroAddress, + data: "0x", + value: 0n + } + ], + paymasterContext: { + token: ERC20_ADDRESS + } + }) + + const receipt = + await smartAccountClient.waitForUserOperationReceipt({ + hash: opHash + }) + + expect(receipt).toBeTruthy() + expect(receipt).toBeTruthy() + expect(receipt.success).toBeTruthy() + + const FINAL_TOKEN_BALANCE = await tokenBalanceOf( + smartAccountClient.account.address, + rpc.anvilRpc + ) + const FINAL_ETH_BALANCE = await publicClient.getBalance({ + address: smartAccountClient.account.address + }) + + expect(FINAL_TOKEN_BALANCE).toBeLessThan(INITIAL_TOKEN_BALANCE) // Token balance should be deducted + expect(FINAL_ETH_BALANCE).toEqual(INTIAL_ETH_BALANCE) // There should be no ETH balance change + } + ) + } +) diff --git a/packages/permissionless/experimental/pimlico/utils/prepareUserOperationForErc20Paymaster.ts b/packages/permissionless/experimental/pimlico/utils/prepareUserOperationForErc20Paymaster.ts new file mode 100644 index 00000000..df3c4993 --- /dev/null +++ b/packages/permissionless/experimental/pimlico/utils/prepareUserOperationForErc20Paymaster.ts @@ -0,0 +1,270 @@ +import { + type Address, + type Chain, + type Client, + type ContractFunctionParameters, + type Transport, + encodeFunctionData, + erc20Abi, + getAddress, + maxUint256 +} from "viem" +import { + type BundlerClient, + type PrepareUserOperationParameters, + type PrepareUserOperationRequest, + type PrepareUserOperationReturnType, + type SmartAccount, + type UserOperation, + type UserOperationCall, + getPaymasterData as getPaymasterData_, + prepareUserOperation +} from "viem/account-abstraction" +import { getChainId as getChainId_ } from "viem/actions" +import { readContract } from "viem/actions" +import { getAction, parseAccount } from "viem/utils" +import { getTokenQuotes } from "../../../actions/pimlico" + +export const prepareUserOperationForErc20Paymaster = + (pimlicoClient: Client) => + async < + account extends SmartAccount | undefined, + const calls extends readonly unknown[], + const request extends PrepareUserOperationRequest< + account, + accountOverride, + calls + >, + accountOverride extends SmartAccount | undefined = undefined + >( + client: Client, + parameters_: PrepareUserOperationParameters< + account, + accountOverride, + calls, + request + > + ): Promise< + PrepareUserOperationReturnType + > => { + const parameters = parameters_ as PrepareUserOperationParameters + const account_ = client.account + + if (!account_) throw new Error("Account not found") + const account = parseAccount(account_) + + const bundlerClient = client as unknown as BundlerClient + + const paymasterContext = parameters.paymasterContext + ? parameters.paymasterContext + : bundlerClient?.paymasterContext + + if ( + typeof paymasterContext === "object" && + paymasterContext !== null && + "token" in paymasterContext && + typeof paymasterContext.token === "string" + ) { + //////////////////////////////////////////////////////////////////////////////// + // Inject custom approval before calling prepareUserOperation + //////////////////////////////////////////////////////////////////////////////// + + const token = getAddress(paymasterContext.token) + + let chainId: number | undefined + async function getChainId(): Promise { + if (chainId) return chainId + if (client.chain) return client.chain.id + const chainId_ = await getAction( + client, + getChainId_, + "getChainId" + )({}) + chainId = chainId_ + return chainId + } + + const quotes = await getAction( + pimlicoClient, + getTokenQuotes, + "getTokenQuotes" + )({ + tokens: [token], + chain: + pimlicoClient.chain ?? client.chain ?? account.client.chain, + entryPointAddress: account.entryPoint.address + }) + + const { + postOpGas, + exchangeRate, + paymaster: paymasterERC20Address + } = quotes[0] + + const callsWithDummyApproval = [ + { + abi: erc20Abi, + functionName: "approve", + args: [paymasterERC20Address, maxUint256], // dummy approval to ensure simulation passes + to: paymasterContext.token + }, + ...(parameters.calls ? parameters.calls : []) + ] + + if (parameters.callData) { + throw new Error( + "parameter callData is not supported with prepareUserOperationForErc20Paymaster" + ) + } + + //////////////////////////////////////////////////////////////////////////////// + // Call prepareUserOperation + //////////////////////////////////////////////////////////////////////////////// + + const userOperation = await getAction( + client, + prepareUserOperation, + "prepareUserOperation" + )({ + ...parameters, + calls: callsWithDummyApproval + } as unknown as PrepareUserOperationParameters) + + //////////////////////////////////////////////////////////////////////////////// + // Call pimlico_getTokenQuotes and calculate the approval amount needed for op + //////////////////////////////////////////////////////////////////////////////// + + const maxFeePerGas = userOperation.maxFeePerGas + + const userOperationMaxGas = + userOperation.preVerificationGas + + userOperation.callGasLimit + + userOperation.verificationGasLimit + + (userOperation.paymasterPostOpGasLimit || 0n) + + (userOperation.paymasterVerificationGasLimit || 0n) + + const userOperationMaxCost = userOperationMaxGas * maxFeePerGas + + // using formula here https://github.com/pimlicolabs/singleton-paymaster/blob/main/src/base/BaseSingletonPaymaster.sol#L334-L341 + const maxCostInToken = + ((userOperationMaxCost + postOpGas * maxFeePerGas) * + exchangeRate) / + BigInt(1e18) + + //////////////////////////////////////////////////////////////////////////////// + // Check if we need to approve the token + // If the user has existing approval that is sufficient, skip approval injection + //////////////////////////////////////////////////////////////////////////////// + + const publicClient = account.client + + const allowance = await getAction( + publicClient, + readContract, + "readContract" + )({ + abi: erc20Abi, + functionName: "allowance", + args: [account.address, paymasterERC20Address], + address: token + }) + + const hasSufficientApproval = allowance >= maxCostInToken + + const finalCalls = hasSufficientApproval + ? parameters.calls + : [ + { + abi: erc20Abi, + functionName: "approve", + args: [paymasterERC20Address, maxCostInToken], + to: paymasterContext.token + }, + ...parameters.calls + ] + + userOperation.callData = await account.encodeCalls( + finalCalls.map((call_) => { + const call = call_ as + | UserOperationCall + | (ContractFunctionParameters & { + to: Address + value: bigint + }) + if ("abi" in call) + return { + data: encodeFunctionData(call), + to: call.to, + value: call.value + } as UserOperationCall + return call as UserOperationCall + }) + ) + parameters.calls = finalCalls + + //////////////////////////////////////////////////////////////////////////////// + // Declare Paymaster properties. (taken from viem) + //////////////////////////////////////////////////////////////////////////////// + + const paymaster = parameters.paymaster ?? bundlerClient?.paymaster + const { getPaymasterData } = (() => { + // If `paymaster: true`, we will assume the Bundler Client supports Paymaster Actions. + if (paymaster === true) + return { + getPaymasterData: (parameters: any) => + getAction( + bundlerClient, + getPaymasterData_, + "getPaymasterData" + )(parameters) + } + + // If Actions are passed to `paymaster` (via Paymaster Client or directly), we will use them. + if ( + typeof paymaster === "object" && + paymaster.getPaymasterData + ) { + const { getPaymasterData } = paymaster + return { + getPaymasterData + } + } + + throw new Error( + "Expected paymaster: cannot sponsor ERC-20 without paymaster" + ) + })() + + //////////////////////////////////////////////////////////////////////////////// + // Re-calculate Paymaster data fields. + //////////////////////////////////////////////////////////////////////////////// + + const paymasterData = await getPaymasterData({ + chainId: await getChainId(), + entryPointAddress: account.entryPoint.address, + context: paymasterContext, + ...(userOperation as UserOperation) + }) + + return { + ...userOperation, + ...paymasterData + } as unknown as PrepareUserOperationReturnType< + account, + accountOverride, + calls, + request + > + } + + return (await getAction( + client, + prepareUserOperation, + "prepareUserOperation" + )(parameters)) as unknown as PrepareUserOperationReturnType< + account, + accountOverride, + calls, + request + > + } diff --git a/packages/permissionless/package.json b/packages/permissionless/package.json index fc9de444..e4d4632b 100644 --- a/packages/permissionless/package.json +++ b/packages/permissionless/package.json @@ -64,13 +64,13 @@ "import": "./_esm/errors/index.js", "default": "./_cjs/errors/index.js" }, - "./experimental": { - "types": "./_types/experimental/index.d.ts", - "import": "./_esm/experimental/index.js", - "default": "./_cjs/experimental/index.js" + "./experimental/pimlico": { + "types": "./_types/experimental/pimlico/index.d.ts", + "import": "./_esm/experimental/pimlico/index.js", + "default": "./_cjs/experimental/pimlico/index.js" } }, "peerDependencies": { - "viem": "^2.20.0" + "viem": "^2.21.2" } } diff --git a/packages/permissionless/pnpm-lock.yaml b/packages/permissionless/pnpm-lock.yaml new file mode 100644 index 00000000..3ec541b5 --- /dev/null +++ b/packages/permissionless/pnpm-lock.yaml @@ -0,0 +1,131 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + viem: + specifier: ^2.20.0 + version: 2.21.2 + +packages: + + '@adraffy/ens-normalize@1.10.0': + resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + + '@noble/curves@1.4.0': + resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} + + '@scure/base@1.1.8': + resolution: {integrity: sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg==} + + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + + '@scure/bip39@1.4.0': + resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} + + abitype@1.0.5: + resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + isows@1.0.4: + resolution: {integrity: sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==} + peerDependencies: + ws: '*' + + viem@2.21.2: + resolution: {integrity: sha512-gTzwKbmyepEDUBKXs3GslTcg5KXfDIgQfHKNxIV9cs7Xout55F8NvHhNeBGBfuw1Ix4Vz8aCMFGYwX5a64CGFg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + webauthn-p256@0.0.5: + resolution: {integrity: sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + +snapshots: + + '@adraffy/ens-normalize@1.10.0': {} + + '@noble/curves@1.4.0': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/hashes@1.4.0': {} + + '@noble/hashes@1.5.0': {} + + '@scure/base@1.1.8': {} + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.8 + + '@scure/bip39@1.4.0': + dependencies: + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.8 + + abitype@1.0.5: {} + + isows@1.0.4(ws@8.17.1): + dependencies: + ws: 8.17.1 + + viem@2.21.2: + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.4.0 + abitype: 1.0.5 + isows: 1.0.4(ws@8.17.1) + webauthn-p256: 0.0.5 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + webauthn-p256@0.0.5: + dependencies: + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + + ws@8.17.1: {} diff --git a/packages/wagmi-demo/src/index.css b/packages/wagmi-demo/src/index.css index 0733a7ee..60b4e260 100644 --- a/packages/wagmi-demo/src/index.css +++ b/packages/wagmi-demo/src/index.css @@ -1,21 +1,21 @@ :root { - background-color: #181818; - color: rgba(255, 255, 255, 0.87); - color-scheme: light dark; - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - font-synthesis: none; - font-weight: 400; - line-height: 1.5; - text-rendering: optimizeLegibility; + background-color: #181818; + color: rgba(255, 255, 255, 0.87); + color-scheme: light dark; + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + font-synthesis: none; + font-weight: 400; + line-height: 1.5; + text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; } @media (prefers-color-scheme: light) { - :root { - background-color: #f8f8f8; - color: #181818; - } + :root { + background-color: #f8f8f8; + color: #181818; + } }