From 102d049e89f453704d57aa10d38bdd84b9c59939 Mon Sep 17 00:00:00 2001 From: mouseless <97399882+mouseless-eth@users.noreply.github.com> Date: Wed, 5 Jun 2024 19:29:01 +0100 Subject: [PATCH] fix mock verifying paymaster + update simulations contract --- mock-alto-bundler/Dockerfile | 12 +- mock-alto-bundler/alto-config.json | 2 +- mock-alto-bundler/src/constants.ts | 9 +- mock-alto-bundler/src/index.ts | 328 +++++----- mock-verifying-paymaster/Dockerfile | 14 +- .../src/helpers/schema.ts | 16 +- mock-verifying-paymaster/src/helpers/utils.ts | 88 +-- .../src/helpers/verifyingPaymasters.ts | 210 +++--- mock-verifying-paymaster/src/index.ts | 101 +-- mock-verifying-paymaster/src/relay.ts | 598 +++++++++--------- 10 files changed, 676 insertions(+), 702 deletions(-) diff --git a/mock-alto-bundler/Dockerfile b/mock-alto-bundler/Dockerfile index 5267543..ca400b6 100644 --- a/mock-alto-bundler/Dockerfile +++ b/mock-alto-bundler/Dockerfile @@ -1,21 +1,21 @@ -# Production ready dockerfile that runs pnpm start +# production ready dockerfile that runs pnpm start FROM node:20-alpine -# Set working directory +# set working directory WORKDIR /app # Install additional dependencies RUN apk add --no-cache git -# Install pnpm +# install pnpm RUN npm install -g pnpm@^8.15 -# Copy source code +# copy source code COPY . . -# Install dependencies +# install dependencies RUN pnpm fetch RUN pnpm install -# Start app +# start app ENTRYPOINT ["pnpm", "run", "start"] diff --git a/mock-alto-bundler/alto-config.json b/mock-alto-bundler/alto-config.json index 987c2c6..1135137 100644 --- a/mock-alto-bundler/alto-config.json +++ b/mock-alto-bundler/alto-config.json @@ -3,7 +3,7 @@ "log-environment": "production", "entrypoints": "0x5ff137d4b0fdcd49dca30c7cf57e578a026d2789,0x0000000071727De22E5E9d8BAf0edAc6f37da032", "balance-override-enabled": "true", - "entrypoint-simulation-contract": "0xb02456A0eC77837B22156CBA2FF53E662b326713", + "entrypoint-simulation-contract": "0x74Cb5e4eE81b86e70f9045036a1C5477de69eE87", "api-version": "v1,v2", "rpc-url": "http://anvil:8545", "min-balance": "0", diff --git a/mock-alto-bundler/src/constants.ts b/mock-alto-bundler/src/constants.ts index b79afa5..b53226b 100644 --- a/mock-alto-bundler/src/constants.ts +++ b/mock-alto-bundler/src/constants.ts @@ -10,9 +10,9 @@ export const ENTRY_POINT_V07_CREATECALL: Hex = export const SIMPLE_ACCOUNT_FACTORY_V07_CREATECALL: Hex = "0x000000000000000000000000000000000000000000000000000000000000000060a060405234801561001057600080fd5b506040516129e13803806129e183398101604081905261002f91610088565b8060405161003c9061007b565b6001600160a01b039091168152602001604051809103906000f080158015610068573d6000803e3d6000fd5b506001600160a01b0316608052506100b8565b612011806109d083390190565b60006020828403121561009a57600080fd5b81516001600160a01b03811681146100b157600080fd5b9392505050565b6080516108f06100e060003960008181604b01528181610114015261025801526108f06000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806311464fbe146100465780635fbfb9cf146100965780638cb84e18146100a9575b600080fd5b61006d7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61006d6100a436600461039d565b6100bc565b61006d6100b736600461039d565b6101ee565b6000806100c984846101ee565b905073ffffffffffffffffffffffffffffffffffffffff81163b80156100f1575090506101e8565b60405173ffffffffffffffffffffffffffffffffffffffff8616602482015284907f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052516101b790610390565b6101c2929190610406565b8190604051809103906000f59050801580156101e2573d6000803e3d6000fd5b50925050505b92915050565b60006103578260001b6040518060200161020790610390565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905273ffffffffffffffffffffffffffffffffffffffff871660248201527f000000000000000000000000000000000000000000000000000000000000000090604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fc4d66de800000000000000000000000000000000000000000000000000000000179052905161030093929101610406565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261033c9291602001610474565b6040516020818303038152906040528051906020012061035e565b9392505050565b60006103578383306000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b610417806104a483390190565b600080604083850312156103b057600080fd5b823573ffffffffffffffffffffffffffffffffffffffff811681146103d457600080fd5b946020939093013593505050565b60005b838110156103fd5781810151838201526020016103e5565b50506000910152565b73ffffffffffffffffffffffffffffffffffffffff8316815260406020820152600082518060408401526104418160608501602087016103e2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b600083516104868184602088016103e2565b83519083019061049a8183602088016103e2565b0194935050505056fe608060405260405161041738038061041783398101604081905261002291610268565b61002c8282610033565b5050610352565b61003c82610092565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561008657610081828261010e565b505050565b61008e610185565b5050565b806001600160a01b03163b6000036100cd57604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161012b9190610336565b600060405180830381855af49150503d8060008114610166576040519150601f19603f3d011682016040523d82523d6000602084013e61016b565b606091505b50909250905061017c8583836101a6565b95945050505050565b34156101a45760405163b398979f60e01b815260040160405180910390fd5b565b6060826101bb576101b682610205565b6101fe565b81511580156101d257506001600160a01b0384163b155b156101fb57604051639996b31560e01b81526001600160a01b03851660048201526024016100c4565b50805b9392505050565b8051156102155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b634e487b7160e01b600052604160045260246000fd5b60005b8381101561025f578181015183820152602001610247565b50506000910152565b6000806040838503121561027b57600080fd5b82516001600160a01b038116811461029257600080fd5b60208401519092506001600160401b03808211156102af57600080fd5b818501915085601f8301126102c357600080fd5b8151818111156102d5576102d561022e565b604051601f8201601f19908116603f011681019083821181831017156102fd576102fd61022e565b8160405282815288602084870101111561031657600080fd5b610327836020830160208801610244565b80955050505050509250929050565b60008251610348818460208701610244565b9190910192915050565b60b7806103606000396000f3fe6080604052600a600c565b005b60186014601a565b605e565b565b600060597f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e808015607c573d6000f35b3d6000fdfea2646970667358221220d7f23a80daebb5531c9e4a18d87e812fca112e5df7e56433218edcc12bbe415d64736f6c63430008170033a2646970667358221220f5be4d2659f1a124e46d76b875ad5264a1c62d421946ca067d6132fa6cc4309964736f6c6343000817003360c0604052306080523480156200001557600080fd5b50604051620020113803806200201183398101604081905262000038916200010a565b6001600160a01b03811660a0526200004f62000056565b506200013c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000a75760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620001075780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6000602082840312156200011d57600080fd5b81516001600160a01b03811681146200013557600080fd5b9392505050565b60805160a051611e70620001a160003960008181610320015281816106f00152818161079e0152818161092601528181610b6301528181610baa01528181610d6a015261121e015260008181610f3301528181610f5c015261117d0152611e706000f3fe6080604052600436106101125760003560e01c80638da5cb5b116100a5578063bc197c8111610074578063c4d66de811610059578063c4d66de8146103c1578063d087d288146103e1578063f23a6e61146103f657600080fd5b8063bc197c8114610364578063c399ec88146103ac57600080fd5b80638da5cb5b14610269578063ad3cb1cc146102bb578063b0d691fe14610311578063b61d27f61461034457600080fd5b80634a58db19116100e15780634a58db19146102195780634d44560d146102215780634f1ef2861461024157806352d1902d1461025457600080fd5b806301ffc9a71461011e578063150b7a021461015357806319822f7c146101c957806347e1da2a146101f757600080fd5b3661011957005b600080fd5b34801561012a57600080fd5b5061013e61013936600461179b565b61043c565b60405190151581526020015b60405180910390f35b34801561015f57600080fd5b5061019861016e366004611848565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161014a565b3480156101d557600080fd5b506101e96101e43660046118bb565b610521565b60405190815260200161014a565b34801561020357600080fd5b50610217610212366004611954565b610547565b005b6102176106ee565b34801561022d57600080fd5b5061021761023c3660046119ee565b610794565b61021761024f366004611a49565b610843565b34801561026057600080fd5b506101e9610862565b34801561027557600080fd5b506000546102969073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161014a565b3480156102c757600080fd5b506103046040518060400160405280600581526020017f352e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161014a9190611b4f565b34801561031d57600080fd5b507f0000000000000000000000000000000000000000000000000000000000000000610296565b34801561035057600080fd5b5061021761035f366004611ba0565b610891565b34801561037057600080fd5b5061019861037f366004611bfc565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b3480156103b857600080fd5b506101e96108e0565b3480156103cd57600080fd5b506102176103dc366004611cbb565b610997565b3480156103ed57600080fd5b506101e9610b16565b34801561040257600080fd5b50610198610411366004611cd8565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f150b7a020000000000000000000000000000000000000000000000000000000014806104cf57507fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061051b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b600061052b610b92565b6105358484610c33565b905061054082610ce7565b9392505050565b61054f610d52565b8481148015610565575082158061056557508281145b6105d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e67206172726179206c656e677468730000000000000000000000000060448201526064015b60405180910390fd5b600083900361067c5760005b858110156106765761066e8787838181106105f9576105f9611d42565b905060200201602081019061060e9190611cbb565b600085858581811061062257610622611d42565b90506020028101906106349190611d71565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e1392505050565b6001016105dc565b506106e6565b60005b858110156106e4576106dc87878381811061069c5761069c611d42565b90506020020160208101906106b19190611cbb565b8686848181106106c3576106c3611d42565b9050602002013585858581811061062257610622611d42565b60010161067f565b505b505050505050565b7f00000000000000000000000000000000000000000000000000000000000000006040517fb760faf900000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff919091169063b760faf99034906024016000604051808303818588803b15801561077957600080fd5b505af115801561078d573d6000803e3d6000fd5b5050505050565b61079c610e90565b7f00000000000000000000000000000000000000000000000000000000000000006040517f205c287800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063205c287890604401600060405180830381600087803b15801561082f57600080fd5b505af11580156106e6573d6000803e3d6000fd5b61084b610f1b565b6108548261101f565b61085e8282611027565b5050565b600061086c611165565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b610899610d52565b6108da848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e1392505050565b50505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024015b602060405180830381865afa15801561096e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109929190611dd6565b905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156109e25750825b905060008267ffffffffffffffff1660011480156109ff5750303b155b905081158015610a0d575080155b15610a44576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011785558315610aa55784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b610aae866111d4565b83156106e65784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050505050565b6040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482018190529073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906335567e1a90604401610951565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610c31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e740000000060448201526064016105c7565b565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c8120610cae81610c74610100870187611d71565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061126892505050565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614610cda57600191505061051b565b5060009392505050565b50565b8015610ce45760405160009033907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90849084818181858888f193505050503d806000811461078d576040519150601f19603f3d011682016040523d82523d6000602084013e61078d565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480610dad575060005473ffffffffffffffffffffffffffffffffffffffff1633145b610c31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6163636f756e743a206e6f74204f776e6572206f7220456e747279506f696e7460448201526064016105c7565b6000808473ffffffffffffffffffffffffffffffffffffffff168484604051610e3c9190611def565b60006040518083038185875af1925050503d8060008114610e79576040519150601f19603f3d011682016040523d82523d6000602084013e610e7e565b606091505b50915091508161078d57805160208201fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331480610eb557503330145b610c31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c79206f776e65720000000000000000000000000000000000000000000060448201526064016105c7565b3073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480610fe857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610fcf7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614155b15610c31576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ce4610e90565b8173ffffffffffffffffffffffffffffffffffffffff166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156110ac575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526110a991810190611dd6565b60015b6110fa576040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831660048201526024016105c7565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8114611156576040517faa1d49a4000000000000000000000000000000000000000000000000000000008152600481018290526024016105c7565b6111608383611292565b505050565b3073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610c31576040517fe07c8dba00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217835560405191927f0000000000000000000000000000000000000000000000000000000000000000909116917f47e55c76e7a6f1fd8996a1da8008c1ea29699cca35e7bcd057f2dec313b6e5de9190a350565b60008060008061127886866112f5565b9250925092506112888282611342565b5090949350505050565b61129b82611446565b60405173ffffffffffffffffffffffffffffffffffffffff8316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28051156112ed576111608282611515565b61085e611598565b6000806000835160410361132f5760208401516040850151606086015160001a611321888285856115d0565b95509550955050505061133b565b50508151600091506002905b9250925092565b600082600381111561135657611356611e0b565b0361135f575050565b600182600381111561137357611373611e0b565b036113aa576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028260038111156113be576113be611e0b565b036113f8576040517ffce698f7000000000000000000000000000000000000000000000000000000008152600481018290526024016105c7565b600382600381111561140c5761140c611e0b565b0361085e576040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600481018290526024016105c7565b8073ffffffffffffffffffffffffffffffffffffffff163b6000036114af576040517f4c9c8ce300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016105c7565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60606000808473ffffffffffffffffffffffffffffffffffffffff168460405161153f9190611def565b600060405180830381855af49150503d806000811461157a576040519150601f19603f3d011682016040523d82523d6000602084013e61157f565b606091505b509150915061158f8583836116ca565b95945050505050565b3415610c31576040517fb398979f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561160b57506000915060039050826116c0565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa15801561165f573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166116b6575060009250600191508290506116c0565b9250600091508190505b9450945094915050565b6060826116df576116da82611759565b610540565b8151158015611703575073ffffffffffffffffffffffffffffffffffffffff84163b155b15611752576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016105c7565b5080610540565b8051156117695780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156117ad57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461054057600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610ce457600080fd5b60008083601f84011261181157600080fd5b50813567ffffffffffffffff81111561182957600080fd5b60208301915083602082850101111561184157600080fd5b9250929050565b60008060008060006080868803121561186057600080fd5b853561186b816117dd565b9450602086013561187b816117dd565b935060408601359250606086013567ffffffffffffffff81111561189e57600080fd5b6118aa888289016117ff565b969995985093965092949392505050565b6000806000606084860312156118d057600080fd5b833567ffffffffffffffff8111156118e757600080fd5b840161012081870312156118fa57600080fd5b95602085013595506040909401359392505050565b60008083601f84011261192157600080fd5b50813567ffffffffffffffff81111561193957600080fd5b6020830191508360208260051b850101111561184157600080fd5b6000806000806000806060878903121561196d57600080fd5b863567ffffffffffffffff8082111561198557600080fd5b6119918a838b0161190f565b909850965060208901359150808211156119aa57600080fd5b6119b68a838b0161190f565b909650945060408901359150808211156119cf57600080fd5b506119dc89828a0161190f565b979a9699509497509295939492505050565b60008060408385031215611a0157600080fd5b8235611a0c816117dd565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008060408385031215611a5c57600080fd5b8235611a67816117dd565b9150602083013567ffffffffffffffff80821115611a8457600080fd5b818501915085601f830112611a9857600080fd5b813581811115611aaa57611aaa611a1a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611af057611af0611a1a565b81604052828152886020848701011115611b0957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b83811015611b46578181015183820152602001611b2e565b50506000910152565b6020815260008251806020840152611b6e816040850160208701611b2b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060008060608587031215611bb657600080fd5b8435611bc1816117dd565b935060208501359250604085013567ffffffffffffffff811115611be457600080fd5b611bf0878288016117ff565b95989497509550505050565b60008060008060008060008060a0898b031215611c1857600080fd5b8835611c23816117dd565b97506020890135611c33816117dd565b9650604089013567ffffffffffffffff80821115611c5057600080fd5b611c5c8c838d0161190f565b909850965060608b0135915080821115611c7557600080fd5b611c818c838d0161190f565b909650945060808b0135915080821115611c9a57600080fd5b50611ca78b828c016117ff565b999c989b5096995094979396929594505050565b600060208284031215611ccd57600080fd5b8135610540816117dd565b60008060008060008060a08789031215611cf157600080fd5b8635611cfc816117dd565b95506020870135611d0c816117dd565b94506040870135935060608701359250608087013567ffffffffffffffff811115611d3657600080fd5b6119dc89828a016117ff565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611da657600080fd5b83018035915067ffffffffffffffff821115611dc157600080fd5b60200191503681900382131561184157600080fd5b600060208284031215611de857600080fd5b5051919050565b60008251611e01818460208701611b2b565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220646ccd794d1cd309da39b56bcfe1238dae05a9d8106dddf47fe099a78d7801e864736f6c634300081700330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" -// Will deploy entryPointSimulations (required for V0.7) to 0xb02456A0eC77837B22156CBA2FF53E662b326713 +// Will deploy entryPointSimulations (required for V0.7) to 0x74Cb5e4eE81b86e70f9045036a1C5477de69eE87 export const ENTRY_POINT_SIMULATIONS_CREATECALL: Hex = - "0x313233340000000000000000000000000000000000000000000000000000000060806040526040516100109061005f565b604051809103906000f08015801561002c573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905534801561005957600080fd5b5061006c565b6135f38061050783390190565b61048c8061007b6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c18f522614610030575b600080fd5b61004361003e366004610230565b610059565b60405161005091906103b0565b60405180910390f35b60606000825167ffffffffffffffff811115610077576100776101e9565b6040519080825280602002602001820160405280156100aa57816020015b60608152602001906001900390816100955790505b50905060005b835181101561019d57606060007f850aaf621a3721219c57b79d6077e318862cf95113b5637afaddb124884a5eb060008054906101000a90046001600160a01b031687858151811061010457610104610414565b602002602001015160405160240161011d92919061042a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050600061015f8882845a6101a5565b905080610174576101716000196101bd565b92505b8285858151811061018757610187610414565b60209081029190910101525050506001016100b0565b509392505050565b6000806000845160208601878987f195945050505050565b60603d828111156101cb5750815b604051602082018101604052818152816000602083013e9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610228576102286101e9565b604052919050565b600080604080848603121561024457600080fd5b83356001600160a01b038116811461025b57600080fd5b925060208481013567ffffffffffffffff8082111561027957600080fd5b8187019150601f88601f84011261028f57600080fd5b8235828111156102a1576102a16101e9565b8060051b6102b08682016101ff565b918252848101860191868101908c8411156102ca57600080fd5b87870192505b83831015610357578235868111156102e85760008081fd5b8701603f81018e136102fa5760008081fd5b888101358781111561030e5761030e6101e9565b61031f818801601f19168b016101ff565b8181528f8c8385010111156103345760008081fd5b818c84018c83013760009181018b019190915283525091870191908701906102d0565b8099505050505050505050509250929050565b6000815180845260005b8181101561039057602081850181015186830182015201610374565b506000602082860101526020601f19601f83011685010191505092915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561040757603f198886030184526103f585835161036a565b945092850192908501906001016103d9565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038316815260406020820181905260009061044e9083018461036a565b94935050505056fea26469706673582212200efd2a1f8831851c04baa63b11f7841e4a0a2de2f12b688cea3645c65719872364736f6c6343000818003360a060405260405162000012906200009d565b604051809103906000f0801580156200002f573d6000803e3d6000fd5b506001600160a01b0390811660805260408051808201825260008082528251808401909352808352602080840191825282018390529051600380546001600160a01b031916919094161790925551600455516005553480156200009157600080fd5b506001600255620000ab565b61021380620033e083390190565b60805161331c620000c46000396000505061331c6000f3fe6080604052600436106100f75760003560e01c80635895273b1161008a578063c23a5cea11610059578063c23a5cea146103c2578063c3bce009146103e2578063c5f996e61461040f578063fc7e286d1461043c57600080fd5b80635895273b1461033757806370a0823114610364578063b760faf91461039a578063bb9fe6bf146103ad57600080fd5b8063205c2878116100c6578063205c2878146101bf57806322cdde4c146101df57806335567e1a146101ff5780635287ce121461021f57600080fd5b80630396cb601461010c5780630bd28e3b1461011f5780630da826611461013f5780631b2e01b81461017957600080fd5b3661010757610105336104e4565b005b600080fd5b61010561011a3660046127cb565b610505565b34801561012b57600080fd5b5061010561013a366004612808565b610799565b34801561014b57600080fd5b5061015f61015a366004612958565b6107d0565b604080519283526020830191909152015b60405180910390f35b34801561018557600080fd5b506101b1610194366004612aa8565b600160209081526000928352604080842090915290825290205481565b604051908152602001610170565b3480156101cb57600080fd5b506101056101da366004612add565b610905565b3480156101eb57600080fd5b506101b16101fa366004612b22565b610a56565b34801561020b57600080fd5b506101b161021a366004612aa8565b610a98565b34801561022b57600080fd5b506102dc61023a366004612b57565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b031660009081526020818152604091829020825160a0810184528154815260019091015460ff811615159282019290925261010082046001600160701b031692810192909252600160781b810463ffffffff166060830152600160981b900465ffffffffffff16608082015290565b6040516101709190600060a082019050825182526020830151151560208301526001600160701b03604084015116604083015263ffffffff606084015116606083015265ffffffffffff608084015116608083015292915050565b34801561034357600080fd5b50610357610352366004612b22565b610ade565b6040516101709190612bc4565b34801561037057600080fd5b506101b161037f366004612b57565b6001600160a01b031660009081526020819052604090205490565b6101056103a8366004612b57565b6104e4565b3480156103b957600080fd5b50610105610bdb565b3480156103ce57600080fd5b506101056103dd366004612b57565b610d0f565b3480156103ee57600080fd5b506104026103fd366004612b22565b610f33565b6040516101709190612c2b565b34801561041b57600080fd5b5061042f61042a366004612cfe565b6110fc565b6040516101709190612da4565b34801561044857600080fd5b506104a1610457366004612b57565b6000602081905290815260409020805460019091015460ff81169061010081046001600160701b031690600160781b810463ffffffff1690600160981b900465ffffffffffff1685565b6040805195865293151560208601526001600160701b039092169284019290925263ffffffff909116606083015265ffffffffffff16608082015260a001610170565b60015b60058110156104f8576001016104e7565b610501826111e7565b5050565b33600090815260208190526040902063ffffffff821661056c5760405162461bcd60e51b815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c617900000000000060448201526064015b60405180910390fd5b600181015463ffffffff600160781b909104811690831610156105d15760405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152606401610563565b60018101546000906105f290349061010090046001600160701b0316612deb565b9050600081116106395760405162461bcd60e51b81526020600482015260126024820152711b9bc81cdd185ad9481cdc1958da599a595960721b6044820152606401610563565b6001600160701b038111156106815760405162461bcd60e51b815260206004820152600e60248201526d7374616b65206f766572666c6f7760901b6044820152606401610563565b6040805160a08101825283548152600160208083018281526001600160701b0386811685870190815263ffffffff8a811660608801818152600060808a0181815233808352828a52918c90209a518b55965199909801805494519151965165ffffffffffff16600160981b0265ffffffffffff60981b1997909416600160781b029690961669ffffffffffffffffffff60781b1991909516610100026effffffffffffffffffffffffffff0019991515999099166effffffffffffffffffffffffffffff1990941693909317979097179190911691909117179055835185815290810192909252917fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01910160405180910390a2505050565b3360009081526001602090815260408083206001600160c01b038516845290915281208054916107c883612dfe565b919050555050565b8251606081015160a08201516000928392909181016127100160405a603f02816107fc576107fc612e17565b0410156108475760408051631101335b60e11b8152600060048201526024810191909152600f60448201526e41413935206f7574206f662067617360881b6064820152608401610563565b8751600090156108db576000610864846000015160008c86611230565b9050806108d9576000610878610800611248565b8051909150156108d35784600001516001600160a01b03168a602001517f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a2018760200151846040516108ca929190612e2d565b60405180910390a35b60019250505b505b600088608001515a88030190506108f4828a8a84611274565b955095505050505094509492505050565b33600090815260208190526040902080548211156109655760405162461bcd60e51b815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152606401610563565b8054610972908390612e46565b8155604080516001600160a01b03851681526020810184905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb910160405180910390a26000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114610a05576040519150601f19603f3d011682016040523d82523d6000602084013e610a0a565b606091505b5050905080610a505760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b6044820152606401610563565b50505050565b6000610a61826114a0565b6040805160208101929092523090820152466060820152608001604051602081830303815290604052805190602001209050919050565b6001600160a01b03821660009081526001602090815260408083206001600160c01b038516845290915290819020549082901b67ffffffffffffffff1916175b92915050565b610b28604051806101000160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152602001606081525090565b610b306114b9565b610b38612646565b610b41836114e1565b6000806000610b52600087866115ae565b925092509250600080610b6588876117dc565b915091506040518061010001604052808760800151815260200183815260200186815260200185815260200184815260200182815260200160001515815260200160405180604001604052806002815260200161060f60f31b8152508152509650505050505050610bd66001600255565b919050565b33600090815260208190526040812060018101549091600160781b90910463ffffffff169003610c3a5760405162461bcd60e51b815260206004820152600a6024820152691b9bdd081cdd185ad95960b21b6044820152606401610563565b600181015460ff16610c825760405162461bcd60e51b8152602060048201526011602482015270616c726561647920756e7374616b696e6760781b6044820152606401610563565b6001810154600090610ca190600160781b900463ffffffff1642612e59565b60018301805460ff65ffffffffffff60981b011916600160981b65ffffffffffff841690810260ff19169190911790915560405190815290915033907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a906020015b60405180910390a25050565b336000908152602081905260409020600181015461010090046001600160701b031680610d755760405162461bcd60e51b81526020600482015260146024820152734e6f207374616b6520746f20776974686472617760601b6044820152606401610563565b6001820154600160981b900465ffffffffffff16610dd55760405162461bcd60e51b815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152606401610563565b600182015442600160981b90910465ffffffffffff161115610e395760405162461bcd60e51b815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152606401610563565b600182018054610100600160c81b0319169055604080516001600160a01b03851681526020810183905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3910160405180910390a26000836001600160a01b03168260405160006040518083038185875af1925050503d8060008114610edd576040519150601f19603f3d011682016040523d82523d6000602084013e610ee2565b606091505b5050905080610a505760405162461bcd60e51b815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152606401610563565b610f3b6126de565b610f43612646565b610f4c836114e1565b6000806000610f5d600087866115ae565b925092509250610f716000848460006118e9565b6000610f84856000015160e00151611a85565b855151909150600090610f9690611a85565b9050610fb5604051806040016040528060008152602001600081525090565b366000610fc560408c018c612e7f565b909250905060006014821015610fdc576000610ff7565b610fea601460008486612ecd565b610ff391612ef7565b60601c5b905061100281611a85565b9350505050600086905060006040518060a001604052808a6080015181526020018a6040015181526020018981526020018881526020016110448b6060015190565b90526040805180820182526003546001600160a01b0390811682528251808401909352600454835260055460208481019190915282019290925291925083161580159061109b57506001836001600160a01b031614155b156110c8576040518060400160405280846001600160a01b031681526020016110c385611a85565b905290505b6040805160a08101825292835260208301959095529381019290925250606081019290925260808201529695505050505050565b60408051606080820183526000808352602083015291810191909152611120612646565b611129866114e1565b611135600087836115ae565b506000915060609050816001600160a01b038816156111c45760005a9050886001600160a01b0316888860405161116d929190612f2c565b6000604051808303816000865af19150503d80600081146111aa576040519150601f19603f3d011682016040523d82523d6000602084013e6111af565b606091505b5090945092505a6111c09082612e46565b9150505b604080516060810182529182529215156020820152918201529695505050505050565b60006111f38234611ad7565b9050816001600160a01b03167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c482604051610d0391815260200190565b6000806000845160208601878987f195945050505050565b60603d828111156112565750815b604051602082018101604052818152816000602083013e9392505050565b60008060005a86519091506000908161128c82611b0a565b60e08301519091506001600160a01b0381166112ab57825193506113c3565b8093506000895111156113c357878202965060028b60028111156112d1576112d1612f3c565b146113c35760005a9050816001600160a01b0316637c627b218560a001518e8d8c886040518663ffffffff1660e01b81526004016113129493929190612f52565b600060405180830381600088803b15801561132c57600080fd5b5087f19350505050801561133e575060015b6113bd578a5180516020808e01519201516001600160a01b0390911691907ff62676f440ff169a3a9afdbf812e89e7f95975ee8e5c31214ffdef631c5f479290611389610800611248565b604051611397929190612e2d565b60405180910390a38a608001515a87030198506113b760028c8c8c611274565b90985096505b5a900395505b5a60a0840151606085015160808d01519288039a909a019901908903808211156113f6576064600a828403020499909901985b505060408a015188830297508781101561145c5760028c600281111561141e5761141e612f3c565b036114415780975061142f8b611b3c565b61143c8b60008a8c611b8b565b611491565b8a608001515a87030198508a60400151975061142f8b611b3c565b8781036114698682611ad7565b506000808e600281111561147f5761147f612f3c565b14905061148e8d828c8e611b8b565b50505b50505050505094509492505050565b60006114ab82611c06565b805190602001209050919050565b60028054036114db57604051633ee5aeb560e01b815260040160405180910390fd5b60028055565b6115546040516135a560f21b60208201526bffffffffffffffffffffffff193060601b166022820152600160f81b603682015260009060370160408051808303601f190181529190528051602090910120600680546001600160a01b0319166001600160a01b0390921691909117905550565b60006115856115666040840184612e7f565b6115736020860186612b57565b61158060e0870187612e7f565b611cbe565b9050805160001461050157600081604051631101335b60e11b8152600401610563929190612e2d565b6000806000805a85519091506115c48782611d9a565b6115cd87610a56565b6020870152604081015161012082015161010083015160a08401516080850151606086015160c0870151861717171717176effffffffffffffffffffffffffffff81111561165d5760405162461bcd60e51b815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152606401610563565b600061168c8460c081015160a08201516080830151606084015160408501516101009095015194010101010290565b905061169b8b8b8b8487611ea8565b97506116af8460000151856020015161203f565b611705578a604051631101335b60e11b8152600401610563918152604060208201819052601a908201527f4141323520696e76616c6964206163636f756e74206e6f6e6365000000000000606082015260800190565b825a86031115611761578a604051631101335b60e11b8152600401610563918152604060208201819052601e908201527f41413236206f76657220766572696669636174696f6e4761734c696d69740000606082015260800190565b606060005a60e08701519091506001600160a01b03161561178d576117888d8d8d8661208d565b995091505b60408b018390528160608c015260a08c01355a88030160808c015260645a6117b59083612e46565b6117c0906073612f9c565b6117ca9190612fb3565b97505050505050505093509350939050565b60008060005a905060006117f1856060015190565b60405190915036600061180760608a018a612e7f565b91509150600081600381111561181c57833591505b506372288ed160e01b6001600160e01b03198216016118925760008a8a6020015160405160240161184e929190613123565b60408051601f198184030181529190526020810180516001600160e01b0316638dd7712f60e01b1790529050611886818b888a6107d0565b90995097506118dc9050565b6118d683838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508991508a90506107d0565b90985096505b5050505050509250929050565b6000806118f58561223c565b91509150816001600160a01b0316836001600160a01b03161461195b5785604051631101335b60e11b81526004016105639181526040602082018190526014908201527320a0991a1039b4b3b730ba3ab9329032b93937b960611b606082015260800190565b80156119b35785604051631101335b60e11b81526004016105639181526040602082018190526017908201527f414132322065787069726564206f72206e6f7420647565000000000000000000606082015260800190565b60006119be8561223c565b925090506001600160a01b03811615611a1a5786604051631101335b60e11b81526004016105639181526040602082018190526014908201527320a0999a1039b4b3b730ba3ab9329032b93937b960611b606082015260800190565b8115611a7c5786604051631101335b60e11b81526004016105639181526040602082018190526021908201527f41413332207061796d61737465722065787069726564206f72206e6f742064756060820152606560f81b608082015260a00190565b50505050505050565b604080518082018252600080825260208083018281526001600160a01b03959095168252819052919091206001015461010081046001600160701b03168252600160781b900463ffffffff1690915290565b6001600160a01b038216600090815260208190526040812080548290611afe908590612deb565b91829055509392505050565b61010081015161012082015160009190808203611b28575092915050565b611b348248830161228f565b949350505050565b80518051602080840151928101516040519081526001600160a01b0390921692917f67b4fa9642f42120bf031f3051d1824b0fe25627945b27b8a6a65d5761d5482e910160405180910390a350565b835160e081015181516020808801519301516040516001600160a01b039384169492909316927f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f91611bf89189908990899093845291151560208401526040830152606082015260800190565b60405180910390a450505050565b6060813560208301356000611c26611c216040870187612e7f565b6122a7565b90506000611c3a611c216060880188612e7f565b9050608086013560a087013560c08801356000611c5d611c2160e08c018c612e7f565b604080516001600160a01b039a909a1660208b015289810198909852606089019690965250608087019390935260a086019190915260c085015260e08401526101008084019190915281518084039091018152610120909201905292915050565b606084158015611cd657506001600160a01b0384163b155b15611d15575060408051808201909152601981527f41413230206163636f756e74206e6f74206465706c6f796564000000000000006020820152611d91565b60148210611d80576000611d2c6014828587612ecd565b611d3591612ef7565b60601c9050803b600003611d7e57505060408051808201909152601b81527f41413330207061796d6173746572206e6f74206465706c6f79656400000000006020820152611d91565b505b506040805160208101909152600081525b95945050505050565b611da76020830183612b57565b6001600160a01b03168152602082810135908201526001600160801b036080808401358281166060850152811c604084015260a084013560c0808501919091528401359182166101008401521c610120820152366000611e0a60e0850185612e7f565b90925090508015611e8d576034811015611e665760405162461bcd60e51b815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152606401610563565b611e7082826122ba565b60a086015260808501526001600160a01b031660e0840152610a50565b600060e084018190526080840181905260a084015250505050565b8251805160009190611ec78887611ec260408b018b612e7f565b612322565b60e082015160006001600160a01b038216611f0b576001600160a01b038316600090815260208190526040902054878111611f0457808803611f07565b60005b9150505b60208801516040516306608bdf60e21b81526001600160a01b038516916319822f7c918991611f41918e91908790600401613145565b60206040518083038160008887f193505050508015611f7d575060408051601f3d908101601f19168201909252611f7a9181019061316a565b60015b611fa85789611f8d610800611248565b6040516365c8fd4d60e01b8152600401610563929190613183565b94506001600160a01b038216612032576001600160a01b038316600090815260208190526040902080548089111561202c578b604051631101335b60e11b81526004016105639181526040602082018190526017908201527f41413231206469646e2774207061792070726566756e64000000000000000000606082015260800190565b88900390555b5050505095945050505050565b6001600160a01b038216600090815260016020908152604080832084821c808552925282208054849167ffffffffffffffff831691908561207f83612dfe565b909155501495945050505050565b60606000805a855160e08101516001600160a01b03811660009081526020819052604090208054939450919290919087811015612116578a604051631101335b60e11b8152600401610563918152604060208201819052601e908201527f41413331207061796d6173746572206465706f73697420746f6f206c6f770000606082015260800190565b8781038260000181905550600084608001519050836001600160a01b03166352b7512c828d8d602001518d6040518563ffffffff1660e01b815260040161215f93929190613145565b60006040518083038160008887f1935050505080156121a057506040513d6000823e601f3d908101601f1916820160405261219d91908101906131c0565b60015b6121cb578b6121b0610800611248565b6040516365c8fd4d60e01b8152600401610563929190613241565b9098509650805a87031115611491578b604051631101335b60e11b81526004016105639181526040602082018190526027908201527f41413336206f766572207061796d6173746572566572696669636174696f6e47606082015266185cd31a5b5a5d60ca1b608082015260a00190565b6000808260000361225257506000928392509050565b600061225d846125d5565b9050806040015165ffffffffffff164211806122845750806020015165ffffffffffff1642105b905194909350915050565b600081831061229e57816122a0565b825b9392505050565b6000604051828085833790209392505050565b600080806122cb6014828688612ecd565b6122d491612ef7565b60601c6122e5602460148789612ecd565b6122ee9161327e565b60801c6122ff60346024888a612ecd565b6123089161327e565b9194506001600160801b0316925060801c90509250925092565b8015610a50578251516001600160a01b0381163b1561238d5784604051631101335b60e11b8152600401610563918152604060208201819052601f908201527f414131302073656e64657220616c726561647920636f6e737472756374656400606082015260800190565b60006123a16006546001600160a01b031690565b6001600160a01b031663570e1a3686600001516040015186866040518463ffffffff1660e01b81526004016123d79291906132b5565b60206040518083038160008887f11580156123f6573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061241b91906132c9565b90506001600160a01b03811661247d5785604051631101335b60e11b8152600401610563918152604060208201819052601b908201527f4141313320696e6974436f6465206661696c6564206f72204f4f470000000000606082015260800190565b816001600160a01b0316816001600160a01b0316146124e75785604051631101335b60e11b815260040161056391815260406020808301829052908201527f4141313420696e6974436f6465206d7573742072657475726e2073656e646572606082015260800190565b806001600160a01b03163b60000361254a5785604051631101335b60e11b815260040161056391815260406020808301829052908201527f4141313520696e6974436f6465206d757374206372656174652073656e646572606082015260800190565b60006125596014828688612ecd565b61256291612ef7565b60601c9050826001600160a01b031686602001517fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d83896000015160e001516040516125c49291906001600160a01b0392831681529116602082015260400190565b60405180910390a350505050505050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003612611575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b6040518060a001604052806126b960405180610140016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081525090565b8152602001600080191681526020016000815260200160008152602001600081525090565b6040518060a0016040528061271b6040518060a0016040528060008152602001600081526020016000815260200160008152602001606081525090565b815260200161273d604051806040016040528060008152602001600081525090565b815260200161275f604051806040016040528060008152602001600081525090565b8152602001612781604051806040016040528060008152602001600081525090565b815260200161278e612793565b905290565b604051806040016040528060006001600160a01b0316815260200161278e604051806040016040528060008152602001600081525090565b6000602082840312156127dd57600080fd5b813563ffffffff811681146122a057600080fd5b80356001600160c01b0381168114610bd657600080fd5b60006020828403121561281a57600080fd5b6122a0826127f1565b634e487b7160e01b600052604160045260246000fd5b60405160a0810167ffffffffffffffff8111828210171561285c5761285c612823565b60405290565b604051610140810167ffffffffffffffff8111828210171561285c5761285c612823565b604051601f8201601f1916810167ffffffffffffffff811182821017156128af576128af612823565b604052919050565b600067ffffffffffffffff8211156128d1576128d1612823565b50601f01601f191660200190565b600082601f8301126128f057600080fd5b81356129036128fe826128b7565b612886565b81815284602083860101111561291857600080fd5b816020850160208301376000918101602001919091529392505050565b6001600160a01b038116811461294a57600080fd5b50565b8035610bd681612935565b60008060008084860361022081121561297057600080fd5b853567ffffffffffffffff8082111561298857600080fd5b61299489838a016128df565b9650601f19830192506101c09150818312156129af57600080fd5b6129b7612839565b610140808512156129c757600080fd5b6129cf612862565b94506129dd60208b0161294d565b855260408a0135602086015260608a0135604086015260808a0135606086015260a08a0135608086015260c08a013560a086015260e08a013560c0860152610100612a29818c0161294d565b60e08701526101208b81013591870191909152908a013590850152928352610160880135602084015261018088013560408401526101a088013560608401528188013560808401529194506101e08701359180831115612a8857600080fd5b5050612a96878288016128df565b94979396509394610200013593505050565b60008060408385031215612abb57600080fd5b8235612ac681612935565b9150612ad4602084016127f1565b90509250929050565b60008060408385031215612af057600080fd5b8235612afb81612935565b946020939093013593505050565b60006101208284031215612b1c57600080fd5b50919050565b600060208284031215612b3457600080fd5b813567ffffffffffffffff811115612b4b57600080fd5b611b3484828501612b09565b600060208284031215612b6957600080fd5b81356122a081612935565b60005b83811015612b8f578181015183820152602001612b77565b50506000910152565b60008151808452612bb0816020860160208601612b74565b601f01601f19169290920160200192915050565b6020815281516020820152602082015160408201526040820151606082015260608201516080820152608082015160a082015260a082015160c082015260c0820151151560e0820152600060e0830151610100808185015250611b34610120840182612b98565b602080825282516101408383015280516101608401529081015161018083015260408101516101a083015260608101516101c08301526080015160a06101e0830152600090612c7e610200840182612b98565b90506020840151612c9c604085018280518252602090810151910152565b506040840151805160808581019190915260209182015160a08601526060860151805160c087015282015160e086015285015180516001600160a01b031661010086015280820151805161012087015290910151610140850152509392505050565b60008060008060608587031215612d1457600080fd5b843567ffffffffffffffff80821115612d2c57600080fd5b612d3888838901612b09565b955060208701359150612d4a82612935565b90935060408601359080821115612d6057600080fd5b818701915087601f830112612d7457600080fd5b813581811115612d8357600080fd5b886020828501011115612d9557600080fd5b95989497505060200194505050565b602081528151602082015260208201511515604082015260006040830151606080840152611b346080840182612b98565b634e487b7160e01b600052601160045260246000fd5b80820180821115610ad857610ad8612dd5565b600060018201612e1057612e10612dd5565b5060010190565b634e487b7160e01b600052601260045260246000fd5b828152604060208201526000611b346040830184612b98565b81810381811115610ad857610ad8612dd5565b65ffffffffffff818116838216019080821115612e7857612e78612dd5565b5092915050565b6000808335601e19843603018112612e9657600080fd5b83018035915067ffffffffffffffff821115612eb157600080fd5b602001915036819003821315612ec657600080fd5b9250929050565b60008085851115612edd57600080fd5b83861115612eea57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff198135818116916014851015612f245780818660140360031b1b83161692505b505092915050565b8183823760009101908152919050565b634e487b7160e01b600052602160045260246000fd5b600060038610612f7257634e487b7160e01b600052602160045260246000fd5b85825260806020830152612f896080830186612b98565b6040830194909452506060015292915050565b8082028115828204841417610ad857610ad8612dd5565b600082612fd057634e487b7160e01b600052601260045260246000fd5b500490565b6000808335601e19843603018112612fec57600080fd5b830160208101925035905067ffffffffffffffff81111561300c57600080fd5b803603821315612ec657600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6000610120613063846130568561294d565b6001600160a01b03169052565b6020830135602085015261307a6040840184612fd5565b82604087015261308d838701828461301b565b9250505061309e6060840184612fd5565b85830360608701526130b183828461301b565b925050506080830135608085015260a083013560a085015260c083013560c08501526130e060e0840184612fd5565b85830360e08701526130f383828461301b565b9250505061010061310681850185612fd5565b8684038388015261311884828461301b565b979650505050505050565b6040815260006131366040830185613044565b90508260208301529392505050565b6060815260006131586060830186613044565b60208301949094525060400152919050565b60006020828403121561317c57600080fd5b5051919050565b82815260606020820152600d60608201526c10504c8cc81c995d995c9d1959609a1b608082015260a060408201526000611b3460a0830184612b98565b600080604083850312156131d357600080fd5b825167ffffffffffffffff8111156131ea57600080fd5b8301601f810185136131fb57600080fd5b80516132096128fe826128b7565b81815286602083850101111561321e57600080fd5b61322f826020830160208601612b74565b60209590950151949694955050505050565b82815260606020820152600d60608201526c10504cccc81c995d995c9d1959609a1b608082015260a060408201526000611b3460a0830184612b98565b6fffffffffffffffffffffffffffffffff198135818116916010851015612f245760109490940360031b84901b1690921692915050565b602081526000611b3460208301848661301b565b6000602082840312156132db57600080fd5b81516122a08161293556fea264697066735822122099ae08d39dacb9ab7d3a1dc41144725af78fc4d22636256fa2fc78a52d942b2d64736f6c63430008180033608060405234801561001057600080fd5b506101f3806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063570e1a3614610030575b600080fd5b61004361003e3660046100ec565b61005f565b6040516001600160a01b03909116815260200160405180910390f35b60008061006f601482858761015e565b61007891610188565b60601c9050600061008c846014818861015e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525084519495509360209350849250905082850182875af190506000519350806100e357600093505b50505092915050565b600080602083850312156100ff57600080fd5b823567ffffffffffffffff8082111561011757600080fd5b818501915085601f83011261012b57600080fd5b81358181111561013a57600080fd5b86602082850101111561014c57600080fd5b60209290920196919550909350505050565b6000808585111561016e57600080fd5b8386111561017b57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156101b55780818660140360031b1b83161692505b50509291505056fea26469706673582212207d0926b595a3228b5a860941db0aba740199bf9528a25116d689f339c9daed2264736f6c63430008180033" + "0x313233340000000000000000000000000000000000000000000000000000000060806040526040516100109061005f565b604051809103906000f08015801561002c573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b039290921691909117905534801561005957600080fd5b5061006c565b613d318061050783390190565b61048c8061007b6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c18f522614610030575b600080fd5b61004361003e366004610230565b610059565b60405161005091906103b0565b60405180910390f35b60606000825167ffffffffffffffff811115610077576100776101e9565b6040519080825280602002602001820160405280156100aa57816020015b60608152602001906001900390816100955790505b50905060005b835181101561019d57606060007f850aaf621a3721219c57b79d6077e318862cf95113b5637afaddb124884a5eb060008054906101000a90046001600160a01b031687858151811061010457610104610414565b602002602001015160405160240161011d92919061042a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091529050600061015f8882845a6101a5565b905080610174576101716000196101bd565b92505b8285858151811061018757610187610414565b60209081029190910101525050506001016100b0565b509392505050565b6000806000845160208601878987f195945050505050565b60603d828111156101cb5750815b604051602082018101604052818152816000602083013e9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610228576102286101e9565b604052919050565b600080604080848603121561024457600080fd5b83356001600160a01b038116811461025b57600080fd5b925060208481013567ffffffffffffffff8082111561027957600080fd5b8187019150601f88601f84011261028f57600080fd5b8235828111156102a1576102a16101e9565b8060051b6102b08682016101ff565b918252848101860191868101908c8411156102ca57600080fd5b87870192505b83831015610357578235868111156102e85760008081fd5b8701603f81018e136102fa5760008081fd5b888101358781111561030e5761030e6101e9565b61031f818801601f19168b016101ff565b8181528f8c8385010111156103345760008081fd5b818c84018c83013760009181018b019190915283525091870191908701906102d0565b8099505050505050505050509250929050565b6000815180845260005b8181101561039057602081850181015186830182015201610374565b506000602082860101526020601f19601f83011685010191505092915050565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b8281101561040757603f198886030184526103f585835161036a565b945092850192908501906001016103d9565b5092979650505050505050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038316815260406020820181905260009061044e9083018461036a565b94935050505056fea26469706673582212207ddd3776bce2d23a4710581621f90634e5e2f38c35b4ba3416ba605ac54ef07b64736f6c6343000817003360a060405260405162000012906200009d565b604051809103906000f0801580156200002f573d6000803e3d6000fd5b506001600160a01b0390811660805260408051808201825260008082528251808401909352808352602080840191825282018390529051600380546001600160a01b031916919094161790925551600455516005553480156200009157600080fd5b506001600255620000ab565b6102138062003b1e83390190565b608051613a5a620000c460003960005050613a5a6000f3fe6080604052600436106101395760003560e01c80635287ce12116100ab578063bb9fe6bf1161006f578063bb9fe6bf14610505578063c23a5cea1461051a578063c3bce0091461053a578063c5f996e614610567578063fc7e286d14610587578063fe2171cb1461062f57600080fd5b80635287ce12146103575780635895273b1461046f57806370a082311461048f578063b760faf9146104c5578063baa22044146104d857600080fd5b80631b2e01b8116100fd5780631b2e01b814610219578063205c28781461025f57806322cdde4c1461027f578063263934db1461029f57806330ec25d1146102cc57806335567e1a146102f957600080fd5b80630396cb601461014e5780630513fbf4146101615780630bd28e3b146101975780630da82661146101b75780630dbfc6bd146101ec57600080fd5b36610149576101473361064f565b005b600080fd5b61014761015c366004612c8c565b610670565b34801561016d57600080fd5b5061018161017c366004612cfd565b610904565b60405161018e9190612e11565b60405180910390f35b3480156101a357600080fd5b506101476101b2366004612e8c565b610a24565b3480156101c357600080fd5b506101d76101d2366004612fd8565b610a5b565b6040805192835260208301919091520161018e565b3480156101f857600080fd5b5061020c610207366004613127565b610b90565b60405161018e91906131c6565b34801561022557600080fd5b5061025161023436600461321d565b600160209081526000928352604080842090915290825290205481565b60405190815260200161018e565b34801561026b57600080fd5b5061014761027a366004613252565b610c4f565b34801561028b57600080fd5b5061025161029a366004613297565b610da0565b3480156102ab57600080fd5b506102bf6102ba366004613127565b610de2565b60405161018e91906132cb565b3480156102d857600080fd5b506102ec6102e7366004613127565b610e79565b60405161018e91906133a7565b34801561030557600080fd5b5061025161031436600461321d565b6001600160a01b039190911660009081526001602090815260408083206001600160c01b0385168452909152908190205491901b67ffffffffffffffff19161790565b34801561036357600080fd5b506104146103723660046133fe565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b031660009081526020818152604091829020825160a0810184528154815260019091015460ff811615159282019290925261010082046001600160701b031692810192909252600160781b810463ffffffff166060830152600160981b900465ffffffffffff16608082015290565b60405161018e9190600060a082019050825182526020830151151560208301526001600160701b03604084015116604083015263ffffffff606084015116606083015265ffffffffffff608084015116608083015292915050565b34801561047b57600080fd5b506102bf61048a366004613297565b610f2e565b34801561049b57600080fd5b506102516104aa3660046133fe565b6001600160a01b031660009081526020819052604090205490565b6101476104d33660046133fe565b61064f565b3480156104e457600080fd5b506104f86104f3366004612cfd565b610fe9565b60405161018e919061341b565b34801561051157600080fd5b50610147611046565b34801561052657600080fd5b506101476105353660046133fe565b61117a565b34801561054657600080fd5b5061055a610555366004613297565b61139e565b60405161018e919061342e565b34801561057357600080fd5b506104f8610582366004613441565b611563565b34801561059357600080fd5b506105ec6105a23660046133fe565b6000602081905290815260409020805460019091015460ff81169061010081046001600160701b031690600160781b810463ffffffff1690600160981b900465ffffffffffff1685565b6040805195865293151560208601526001600160701b039092169284019290925263ffffffff909116606083015265ffffffffffff16608082015260a00161018e565b34801561063b57600080fd5b5061055a61064a366004613127565b61164e565b60015b600581101561066357600101610652565b61066c82611662565b5050565b33600090815260208190526040902063ffffffff82166106d75760405162461bcd60e51b815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c617900000000000060448201526064015b60405180910390fd5b600181015463ffffffff600160781b9091048116908316101561073c5760405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d650000000060448201526064016106ce565b600181015460009061075d90349061010090046001600160701b03166134fc565b9050600081116107a45760405162461bcd60e51b81526020600482015260126024820152711b9bc81cdd185ad9481cdc1958da599a595960721b60448201526064016106ce565b6001600160701b038111156107ec5760405162461bcd60e51b815260206004820152600e60248201526d7374616b65206f766572666c6f7760901b60448201526064016106ce565b6040805160a08101825283548152600160208083018281526001600160701b0386811685870190815263ffffffff8a811660608801818152600060808a0181815233808352828a52918c90209a518b55965199909801805494519151965165ffffffffffff16600160981b0265ffffffffffff60981b1997909416600160781b029690961669ffffffffffffffffffff60781b1991909516610100026effffffffffffffffffffffffffff0019991515999099166effffffffffffffffffffffffffffff1990941693909317979097179190911691909117179055835185815290810192909252917fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01910160405180910390a2505050565b60606000866001600160401b0381111561092057610920612ea7565b60405190808252806020026020018201604052801561096d57816020015b6040805160608082018352600080835260208301529181019190915281526020019060019003908161093e5790505b50905060005b87811015610a185760006109ef8a8a848181106109925761099261350f565b90506020028101906109a49190613525565b8989858181106109b6576109b661350f565b90506020020160208101906109cb91906133fe565b8888868181106109dd576109dd61350f565b90506020028101906105829190613546565b905080838381518110610a0457610a0461350f565b602090810291909101015250600101610973565b50979650505050505050565b3360009081526001602090815260408083206001600160c01b03851684529091528120805491610a538361358c565b919050555050565b8251606081015160a08201516000928392909181016127100160405a603f0281610a8757610a876135a5565b041015610ad25760408051631101335b60e11b8152600060048201526024810191909152600f60448201526e41413935206f7574206f662067617360881b60648201526084016106ce565b875160009015610b66576000610aef846000015160008c866116ab565b905080610b64576000610b036108006116c3565b805190915015610b5e5784600001516001600160a01b03168a602001517f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a201876020015184604051610b559291906135bb565b60405180910390a35b60019250505b505b600088608001515a8803019050610b7f828a8a846116ef565b955095505050505094509492505050565b60606000826001600160401b03811115610bac57610bac612ea7565b604051908082528060200260200182016040528015610be557816020015b610bd2612ac0565b815260200190600190039081610bca5790505b50905060005b83811015610c45576000610c1c868684818110610c0a57610c0a61350f565b905060200281019061048a9190613525565b905080838381518110610c3157610c3161350f565b602090810291909101015250600101610beb565b5090505b92915050565b3360009081526020819052604090208054821115610caf5760405162461bcd60e51b815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c617267650000000000000060448201526064016106ce565b8054610cbc9083906135d4565b8155604080516001600160a01b03851681526020810184905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb910160405180910390a26000836001600160a01b03168360405160006040518083038185875af1925050503d8060008114610d4f576040519150601f19603f3d011682016040523d82523d6000602084013e610d54565b606091505b5050905080610d9a5760405162461bcd60e51b81526020600482015260126024820152716661696c656420746f20776974686472617760701b60448201526064016106ce565b50505050565b6000610dab8261191b565b6040805160208101929092523090820152466060820152608001604051602081830303815290604052805190602001209050919050565b610dea612ac0565b6000826001600160401b03811115610e0457610e04612ea7565b604051908082528060200260200182016040528015610e3d57816020015b610e2a612ac0565b815260200190600190039081610e225790505b509050610e4a8484610b90565b905080610e586001856135d4565b81518110610e6857610e6861350f565b602002602001015191505092915050565b60606000826001600160401b03811115610e9557610e95612ea7565b604051908082528060200260200182016040528015610ece57816020015b610ebb612b07565b815260200190600190039081610eb35790505b50905060005b83811015610c45576000610f05868684818110610ef357610ef361350f565b90506020028101906105559190613525565b905080838381518110610f1a57610f1a61350f565b602090810291909101015250600101610ed4565b610f36612ac0565b610f3e611934565b610f46612bbc565b610f4f8361195c565b6000806000610f6060008786611a29565b925092509250600080610f738887611c57565b915091506040518061010001604052808760800151815260200183815260200186815260200185815260200184815260200182815260200160001515815260200160405180604001604052806002815260200161060f60f31b8152508152509650505050505050610fe46001600255565b919050565b60408051606080820183526000808352602083018190529282015290611013888888888888610904565b9050806110216001896135d4565b815181106110315761103161350f565b60200260200101519150509695505050505050565b33600090815260208190526040812060018101549091600160781b90910463ffffffff1690036110a55760405162461bcd60e51b815260206004820152600a6024820152691b9bdd081cdd185ad95960b21b60448201526064016106ce565b600181015460ff166110ed5760405162461bcd60e51b8152602060048201526011602482015270616c726561647920756e7374616b696e6760781b60448201526064016106ce565b600181015460009061110c90600160781b900463ffffffff16426135e7565b60018301805460ff65ffffffffffff60981b011916600160981b65ffffffffffff841690810260ff19169190911790915560405190815290915033907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a906020015b60405180910390a25050565b336000908152602081905260409020600181015461010090046001600160701b0316806111e05760405162461bcd60e51b81526020600482015260146024820152734e6f207374616b6520746f20776974686472617760601b60448201526064016106ce565b6001820154600160981b900465ffffffffffff166112405760405162461bcd60e51b815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b65282920666972737400000060448201526064016106ce565b600182015442600160981b90910465ffffffffffff1611156112a45760405162461bcd60e51b815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f7420647565000000000060448201526064016106ce565b600182018054610100600160c81b0319169055604080516001600160a01b03851681526020810183905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3910160405180910390a26000836001600160a01b03168260405160006040518083038185875af1925050503d8060008114611348576040519150601f19603f3d011682016040523d82523d6000602084013e61134d565b606091505b5050905080610d9a5760405162461bcd60e51b815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b65000000000000000060448201526064016106ce565b6113a6612b07565b6113ae612bbc565b6113b78361195c565b6000806113c660008685611a29565b50915091506113d9600083836000611d64565b60006113ec846000015160e00151611f00565b8451519091506000906113fe90611f00565b905061141d604051806040016040528060008152602001600081525090565b36600061142d60408b018b613546565b90925090506000601482101561144457600061145f565b61145260146000848661360d565b61145b91613637565b60601c5b905061146a81611f00565b9350505050600085905060006040518060a0016040528089608001518152602001896040015181526020018881526020018781526020016114ac8a6060015190565b90526040805180820182526003546001600160a01b0390811682528251808401909352600454835260055460208481019190915282019290925291925083161580159061150357506001836001600160a01b031614155b15611530576040518060400160405280846001600160a01b0316815260200161152b85611f00565b905290505b6040805160a081018252928352602083019590955293810192909252506060810192909252608082015295945050505050565b60408051606080820183526000808352602083015291810191909152611587612bbc565b6115908661195c565b61159c60008783611a29565b506000915060609050816001600160a01b0388161561162b5760005a9050886001600160a01b031688886040516115d492919061366c565b6000604051808303816000865af19150503d8060008114611611576040519150601f19603f3d011682016040523d82523d6000602084013e611616565b606091505b5090945092505a61162790826135d4565b9150505b604080516060810182529182529215156020820152918201529695505050505050565b611656612b07565b6000610e4a8484610e79565b600061166e8234611f52565b9050816001600160a01b03167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c48260405161116e91815260200190565b6000806000845160208601878987f195945050505050565b60603d828111156116d15750815b604051602082018101604052818152816000602083013e9392505050565b60008060005a86519091506000908161170782611f85565b60e08301519091506001600160a01b038116611726578251935061183e565b80935060008951111561183e57878202965060028b600281111561174c5761174c61367c565b1461183e5760005a9050816001600160a01b0316637c627b218560a001518e8d8c886040518663ffffffff1660e01b815260040161178d9493929190613692565b600060405180830381600088803b1580156117a757600080fd5b5087f1935050505080156117b9575060015b611838578a5180516020808e01519201516001600160a01b0390911691907ff62676f440ff169a3a9afdbf812e89e7f95975ee8e5c31214ffdef631c5f4792906118046108006116c3565b6040516118129291906135bb565b60405180910390a38a608001515a870301985061183260028c8c8c6116ef565b90985096505b5a900395505b5a60a0840151606085015160808d01519288039a909a01990190890380821115611871576064600a828403020499909901985b505060408a01518883029750878110156118d75760028c60028111156118995761189961367c565b036118bc578097506118aa8b611fb7565b6118b78b60008a8c612006565b61190c565b8a608001515a87030198508a6040015197506118aa8b611fb7565b8781036118e48682611f52565b506000808e60028111156118fa576118fa61367c565b1490506119098d828c8e612006565b50505b50505050505094509492505050565b600061192682612081565b805190602001209050919050565b600280540361195657604051633ee5aeb560e01b815260040160405180910390fd5b60028055565b6119cf6040516135a560f21b60208201526bffffffffffffffffffffffff193060601b166022820152600160f81b603682015260009060370160408051808303601f190181529190528051602090910120600680546001600160a01b0319166001600160a01b0390921691909117905550565b6000611a006119e16040840184613546565b6119ee60208601866133fe565b6119fb60e0870187613546565b612139565b9050805160001461066c57600081604051631101335b60e11b81526004016106ce9291906135bb565b6000806000805a8551909150611a3f8782612215565b611a4887610da0565b6020870152604081015161012082015161010083015160a08401516080850151606086015160c0870151861717171717176effffffffffffffffffffffffffffff811115611ad85760405162461bcd60e51b815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f77000000000000000060448201526064016106ce565b6000611b078460c081015160a08201516080830151606084015160408501516101009095015194010101010290565b9050611b168b8b8b8487612323565b9750611b2a846000015185602001516124ba565b611b80578a604051631101335b60e11b81526004016106ce918152604060208201819052601a908201527f4141323520696e76616c6964206163636f756e74206e6f6e6365000000000000606082015260800190565b825a86031115611bdc578a604051631101335b60e11b81526004016106ce918152604060208201819052601e908201527f41413236206f76657220766572696669636174696f6e4761734c696d69740000606082015260800190565b606060005a60e08701519091506001600160a01b031615611c0857611c038d8d8d86612507565b995091505b60408b018390528160608c015260a08c01355a88030160808c015260645a611c3090836135d4565b611c3b9060736136dc565b611c4591906136f3565b97505050505050505093509350939050565b60008060005a90506000611c6c856060015190565b604051909150366000611c8260608a018a613546565b915091506000816003811115611c9757833591505b506372288ed160e01b6001600160e01b0319821601611d0d5760008a8a60200151604051602401611cc9929190613862565b60408051601f198184030181529190526020810180516001600160e01b0316638dd7712f60e01b1790529050611d01818b888a610a5b565b9099509750611d579050565b611d5183838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508991508a9050610a5b565b90985096505b5050505050509250929050565b600080611d70856126b6565b91509150816001600160a01b0316836001600160a01b031614611dd65785604051631101335b60e11b81526004016106ce9181526040602082018190526014908201527320a0991a1039b4b3b730ba3ab9329032b93937b960611b606082015260800190565b8015611e2e5785604051631101335b60e11b81526004016106ce9181526040602082018190526017908201527f414132322065787069726564206f72206e6f7420647565000000000000000000606082015260800190565b6000611e39856126b6565b925090506001600160a01b03811615611e955786604051631101335b60e11b81526004016106ce9181526040602082018190526014908201527320a0999a1039b4b3b730ba3ab9329032b93937b960611b606082015260800190565b8115611ef75786604051631101335b60e11b81526004016106ce9181526040602082018190526021908201527f41413332207061796d61737465722065787069726564206f72206e6f742064756060820152606560f81b608082015260a00190565b50505050505050565b604080518082018252600080825260208083018281526001600160a01b03959095168252819052919091206001015461010081046001600160701b03168252600160781b900463ffffffff1690915290565b6001600160a01b038216600090815260208190526040812080548290611f799085906134fc565b91829055509392505050565b61010081015161012082015160009190808203611fa3575092915050565b611faf82488301612709565b949350505050565b80518051602080840151928101516040519081526001600160a01b0390921692917f67b4fa9642f42120bf031f3051d1824b0fe25627945b27b8a6a65d5761d5482e910160405180910390a350565b835160e081015181516020808801519301516040516001600160a01b039384169492909316927f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f916120739189908990899093845291151560208401526040830152606082015260800190565b60405180910390a450505050565b60608135602083013560006120a161209c6040870187613546565b612721565b905060006120b561209c6060880188613546565b9050608086013560a087013560c088013560006120d861209c60e08c018c613546565b604080516001600160a01b039a909a1660208b015289810198909852606089019690965250608087019390935260a086019190915260c085015260e08401526101008084019190915281518084039091018152610120909201905292915050565b60608415801561215157506001600160a01b0384163b155b15612190575060408051808201909152601981527f41413230206163636f756e74206e6f74206465706c6f79656400000000000000602082015261220c565b601482106121fb5760006121a7601482858761360d565b6121b091613637565b60601c9050803b6000036121f957505060408051808201909152601b81527f41413330207061796d6173746572206e6f74206465706c6f7965640000000000602082015261220c565b505b506040805160208101909152600081525b95945050505050565b61222260208301836133fe565b6001600160a01b03168152602082810135908201526001600160801b036080808401358281166060850152811c604084015260a084013560c0808501919091528401359182166101008401521c61012082015236600061228560e0850185613546565b909250905080156123085760348110156122e15760405162461bcd60e51b815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e644461746100000060448201526064016106ce565b6122eb8282612734565b60a086015260808501526001600160a01b031660e0840152610d9a565b600060e084018190526080840181905260a084015250505050565b8251805160009190612342888761233d60408b018b613546565b61279c565b60e082015160006001600160a01b038216612386576001600160a01b03831660009081526020819052604090205487811161237f57808803612382565b60005b9150505b60208801516040516306608bdf60e21b81526001600160a01b038516916319822f7c9189916123bc918e91908790600401613884565b60206040518083038160008887f1935050505080156123f8575060408051601f3d908101601f191682019092526123f5918101906138a9565b60015b61242357896124086108006116c3565b6040516365c8fd4d60e01b81526004016106ce9291906138c2565b94506001600160a01b0382166124ad576001600160a01b03831660009081526020819052604090208054808911156124a7578b604051631101335b60e11b81526004016106ce9181526040602082018190526017908201527f41413231206469646e2774207061792070726566756e64000000000000000000606082015260800190565b88900390555b5050505095945050505050565b6001600160a01b038216600090815260016020908152604080832084821c80855292528220805484916001600160401b0383169190856124f98361358c565b909155501495945050505050565b60606000805a855160e08101516001600160a01b03811660009081526020819052604090208054939450919290919087811015612590578a604051631101335b60e11b81526004016106ce918152604060208201819052601e908201527f41413331207061796d6173746572206465706f73697420746f6f206c6f770000606082015260800190565b8781038260000181905550600084608001519050836001600160a01b03166352b7512c828d8d602001518d6040518563ffffffff1660e01b81526004016125d993929190613884565b60006040518083038160008887f19350505050801561261a57506040513d6000823e601f3d908101601f1916820160405261261791908101906138ff565b60015b612645578b61262a6108006116c3565b6040516365c8fd4d60e01b81526004016106ce92919061397f565b9098509650805a8703111561190c578b604051631101335b60e11b81526004016106ce9181526040602082018190526027908201527f41413336206f766572207061796d6173746572566572696669636174696f6e47606082015266185cd31a5b5a5d60ca1b608082015260a00190565b600080826000036126cc57506000928392509050565b60006126d784612a4f565b9050806040015165ffffffffffff164211806126fe5750806020015165ffffffffffff1642105b905194909350915050565b6000818310612718578161271a565b825b9392505050565b6000604051828085833790209392505050565b60008080612745601482868861360d565b61274e91613637565b60601c61275f60246014878961360d565b612768916139bc565b60801c61277960346024888a61360d565b612782916139bc565b9194506001600160801b0316925060801c90509250925092565b8015610d9a578251516001600160a01b0381163b156128075784604051631101335b60e11b81526004016106ce918152604060208201819052601f908201527f414131302073656e64657220616c726561647920636f6e737472756374656400606082015260800190565b600061281b6006546001600160a01b031690565b6001600160a01b031663570e1a3686600001516040015186866040518463ffffffff1660e01b81526004016128519291906139f3565b60206040518083038160008887f1158015612870573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128959190613a07565b90506001600160a01b0381166128f75785604051631101335b60e11b81526004016106ce918152604060208201819052601b908201527f4141313320696e6974436f6465206661696c6564206f72204f4f470000000000606082015260800190565b816001600160a01b0316816001600160a01b0316146129615785604051631101335b60e11b81526004016106ce91815260406020808301829052908201527f4141313420696e6974436f6465206d7573742072657475726e2073656e646572606082015260800190565b806001600160a01b03163b6000036129c45785604051631101335b60e11b81526004016106ce91815260406020808301829052908201527f4141313520696e6974436f6465206d757374206372656174652073656e646572606082015260800190565b60006129d3601482868861360d565b6129dc91613637565b60601c9050826001600160a01b031686602001517fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d83896000015160e00151604051612a3e9291906001600160a01b0392831681529116602082015260400190565b60405180910390a350505050505050565b60408051606081018252600080825260208201819052918101919091528160a081901c65ffffffffffff8116600003612a8b575065ffffffffffff5b604080516060810182526001600160a01b03909316835260d09490941c602083015265ffffffffffff16928101929092525090565b604051806101000160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152602001606081525090565b6040518060a00160405280612b446040518060a0016040528060008152602001600081526020016000815260200160008152602001606081525090565b8152602001612b66604051806040016040528060008152602001600081525090565b8152602001612b88604051806040016040528060008152602001600081525090565b8152602001612baa604051806040016040528060008152602001600081525090565b8152602001612bb7612c54565b905290565b6040518060a00160405280612c2f60405180610140016040528060006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081525090565b8152602001600080191681526020016000815260200160008152602001600081525090565b604051806040016040528060006001600160a01b03168152602001612bb7604051806040016040528060008152602001600081525090565b600060208284031215612c9e57600080fd5b813563ffffffff8116811461271a57600080fd5b60008083601f840112612cc457600080fd5b5081356001600160401b03811115612cdb57600080fd5b6020830191508360208260051b8501011115612cf657600080fd5b9250929050565b60008060008060008060608789031215612d1657600080fd5b86356001600160401b0380821115612d2d57600080fd5b612d398a838b01612cb2565b90985096506020890135915080821115612d5257600080fd5b612d5e8a838b01612cb2565b90965094506040890135915080821115612d7757600080fd5b50612d8489828a01612cb2565b979a9699509497509295939492505050565b60005b83811015612db1578181015183820152602001612d99565b50506000910152565b60008151808452612dd2816020860160208601612d96565b601f01601f19169290920160200192915050565b805182526020810151151560208301526000604082015160606040850152611faf6060850182612dba565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612e6857603f19888603018452612e56858351612de6565b94509285019290850190600101612e3a565b5092979650505050505050565b80356001600160c01b0381168114610fe457600080fd5b600060208284031215612e9e57600080fd5b61271a82612e75565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b0381118282101715612edf57612edf612ea7565b60405290565b60405161014081016001600160401b0381118282101715612edf57612edf612ea7565b604051601f8201601f191681016001600160401b0381118282101715612f3057612f30612ea7565b604052919050565b60006001600160401b03821115612f5157612f51612ea7565b50601f01601f191660200190565b600082601f830112612f7057600080fd5b8135612f83612f7e82612f38565b612f08565b818152846020838601011115612f9857600080fd5b816020850160208301376000918101602001919091529392505050565b6001600160a01b0381168114612fca57600080fd5b50565b8035610fe481612fb5565b600080600080848603610220811215612ff057600080fd5b85356001600160401b038082111561300757600080fd5b61301389838a01612f5f565b9650601f19830192506101c091508183121561302e57600080fd5b613036612ebd565b6101408085121561304657600080fd5b61304e612ee5565b945061305c60208b01612fcd565b855260408a0135602086015260608a0135604086015260808a0135606086015260a08a0135608086015260c08a013560a086015260e08a013560c08601526101006130a8818c01612fcd565b60e08701526101208b81013591870191909152908a013590850152928352610160880135602084015261018088013560408401526101a088013560608401528188013560808401529194506101e0870135918083111561310757600080fd5b505061311587828801612f5f565b94979396509394610200013593505050565b6000806020838503121561313a57600080fd5b82356001600160401b0381111561315057600080fd5b61315c85828601612cb2565b90969095509350505050565b6000610100825184526020830151602085015260408301516040850152606083015160608501526080830151608085015260a083015160a085015260c0830151151560c085015260e08301518160e086015261220c82860182612dba565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612e6857603f1988860301845261320b858351613168565b945092850192908501906001016131ef565b6000806040838503121561323057600080fd5b823561323b81612fb5565b915061324960208401612e75565b90509250929050565b6000806040838503121561326557600080fd5b823561327081612fb5565b946020939093013593505050565b6000610120828403121561329157600080fd5b50919050565b6000602082840312156132a957600080fd5b81356001600160401b038111156132bf57600080fd5b611faf8482850161327e565b60208152600061271a6020830184613168565b80516101408084528151908401526020810151610160840152604081015161018084015260608101516101a08401526080015160a06101c084015260009061332a6101e0850182612dba565b90506020830151613348602086018280518252602090810151910152565b5060408301518051606086015260208101516080860152506060830151805160a0860152602081015160c0860152506080830151610c4560e086018280516001600160a01b031682526020908101518051828401520151604090910152565b600060208083016020845280855180835260408601915060408160051b87010192506020870160005b82811015612e6857603f198886030184526133ec8583516132de565b945092850192908501906001016133d0565b60006020828403121561341057600080fd5b813561271a81612fb5565b60208152600061271a6020830184612de6565b60208152600061271a60208301846132de565b6000806000806060858703121561345757600080fd5b84356001600160401b038082111561346e57600080fd5b61347a8883890161327e565b95506020870135915061348c82612fb5565b909350604086013590808211156134a257600080fd5b818701915087601f8301126134b657600080fd5b8135818111156134c557600080fd5b8860208285010111156134d757600080fd5b95989497505060200194505050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c4957610c496134e6565b634e487b7160e01b600052603260045260246000fd5b6000823561011e1983360301811261353c57600080fd5b9190910192915050565b6000808335601e1984360301811261355d57600080fd5b8301803591506001600160401b0382111561357757600080fd5b602001915036819003821315612cf657600080fd5b60006001820161359e5761359e6134e6565b5060010190565b634e487b7160e01b600052601260045260246000fd5b828152604060208201526000611faf6040830184612dba565b81810381811115610c4957610c496134e6565b65ffffffffffff818116838216019080821115613606576136066134e6565b5092915050565b6000808585111561361d57600080fd5b8386111561362a57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156136645780818660140360031b1b83161692505b505092915050565b8183823760009101908152919050565b634e487b7160e01b600052602160045260246000fd5b6000600386106136b257634e487b7160e01b600052602160045260246000fd5b858252608060208301526136c96080830186612dba565b6040830194909452506060015292915050565b8082028115828204841417610c4957610c496134e6565b60008261371057634e487b7160e01b600052601260045260246000fd5b500490565b6000808335601e1984360301811261372c57600080fd5b83016020810192503590506001600160401b0381111561374b57600080fd5b803603821315612cf657600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006101206137a28461379585612fcd565b6001600160a01b03169052565b602083013560208501526137b96040840184613715565b8260408701526137cc838701828461375a565b925050506137dd6060840184613715565b85830360608701526137f083828461375a565b925050506080830135608085015260a083013560a085015260c083013560c085015261381f60e0840184613715565b85830360e087015261383283828461375a565b9250505061010061384581850185613715565b8684038388015261385784828461375a565b979650505050505050565b6040815260006138756040830185613783565b90508260208301529392505050565b6060815260006138976060830186613783565b60208301949094525060400152919050565b6000602082840312156138bb57600080fd5b5051919050565b82815260606020820152600d60608201526c10504c8cc81c995d995c9d1959609a1b608082015260a060408201526000611faf60a0830184612dba565b6000806040838503121561391257600080fd5b82516001600160401b0381111561392857600080fd5b8301601f8101851361393957600080fd5b8051613947612f7e82612f38565b81815286602083850101111561395c57600080fd5b61396d826020830160208601612d96565b60209590950151949694955050505050565b82815260606020820152600d60608201526c10504cccc81c995d995c9d1959609a1b608082015260a060408201526000611faf60a0830184612dba565b6fffffffffffffffffffffffffffffffff1981358181169160108510156136645760109490940360031b84901b1690921692915050565b602081526000611faf60208301848661375a565b600060208284031215613a1957600080fd5b815161271a81612fb556fea2646970667358221220c6ad4b2b56624cba321cec929c4bdd6329f5811c936f40e8ff5cfb92ef9b433f64736f6c63430008170033608060405234801561001057600080fd5b506101f3806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063570e1a3614610030575b600080fd5b61004361003e3660046100ec565b61005f565b6040516001600160a01b03909116815260200160405180910390f35b60008061006f601482858761015e565b61007891610188565b60601c9050600061008c846014818861015e565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525084519495509360209350849250905082850182875af190506000519350806100e357600093505b50505092915050565b600080602083850312156100ff57600080fd5b823567ffffffffffffffff8082111561011757600080fd5b818501915085601f83011261012b57600080fd5b81358181111561013a57600080fd5b86602082850101111561014c57600080fd5b60209290920196919550909350505050565b6000808585111561016e57600080fd5b8386111561017b57600080fd5b5050820193919092039150565b6bffffffffffffffffffffffff1981358181169160148510156101b55780818660140360031b1b83161692505b50509291505056fea2646970667358221220f5d91be997c659d0ef966f0c016a41e736500c794f93ad11197e128a54287a9964736f6c63430008170033" /* ========= SAFE RELATED ========= */ @@ -111,3 +111,8 @@ export const KERNEL_V07_FACTORY_CREATECALL: Hex = // Will deploy V0.7 KERNEL_FACTORY_ADDRESS to 0xd703aaE79538628d27099B8c4f621bE4CCd142d5 export const KERNEL_V07_META_FACTORY_CREATECALL: Hex = "0x0000000000000000000000000000000000000000000000000000000000000000608060405234801561001057600080fd5b5060405161080838038061080883398101604081905261002f9161007a565b6100388161003e565b506100aa565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b60006020828403121561008c57600080fd5b81516001600160a01b03811681146100a357600080fd5b9392505050565b61074f806100b96000396000f3fe6080604052600436106100c25760003560e01c8063b36f97051161007f578063d8b964e611610059578063d8b964e614610172578063f04e283e146101b2578063f2fde38b146101c5578063fee81cf4146101d857600080fd5b8063b36f970514610139578063c5265d5d1461014c578063c7e55f3e1461015f57600080fd5b806325692962146100c75780634a1ce599146100d157806354d1f13d146100e45780636e7dbabb146100ec578063715018a6146100ff5780638da5cb5b14610107575b600080fd5b6100cf610219565b005b6100cf6100df3660046105a7565b610269565b6100cf6102c7565b6100cf6100fa3660046105cb565b610303565b6100cf610336565b34801561011357600080fd5b50638b78c6d819545b6040516001600160a01b0390911681526020015b60405180910390f35b6100cf610147366004610609565b61034a565b61011c61015a366004610637565b6103b1565b6100cf61016d3660046106c2565b610466565b34801561017e57600080fd5b506101a261018d3660046105a7565b60006020819052908152604090205460ff1681565b6040519015158152602001610130565b6100cf6101c03660046105a7565b6104d2565b6100cf6101d33660046105a7565b610512565b3480156101e457600080fd5b5061020b6101f33660046105a7565b63389a75e1600c908152600091909152602090205490565b604051908152602001610130565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b610271610539565b806001600160a01b031663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156102ac57600080fd5b505af11580156102c0573d6000803e3d6000fd5b5050505050565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b61030b610539565b6001600160a01b03919091166000908152602081905260409020805460ff1916911515919091179055565b61033e610539565b6103486000610554565b565b610352610539565b60405163611d2e7560e11b81526001600160a01b03828116600483015283169063c23a5cea90602401600060405180830381600087803b15801561039557600080fd5b505af11580156103a9573d6000803e3d6000fd5b505050505050565b6001600160a01b03841660009081526020819052604081205460ff166103ea57604051633220d5f360e21b815260040160405180910390fd5b604051633a9b44eb60e21b81526001600160a01b0386169063ea6d13ac9061041a908790879087906004016106f9565b6020604051808303816000875af1158015610439573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045d9190610732565b95945050505050565b61046e610539565b604051621cb65b60e51b815263ffffffff821660048201526001600160a01b03831690630396cb609034906024016000604051808303818588803b1580156104b557600080fd5b505af11580156104c9573d6000803e3d6000fd5b50505050505050565b6104da610539565b63389a75e1600c52806000526020600c20805442111561050257636f5e88186000526004601cfd5b6000905561050f81610554565b50565b61051a610539565b8060601b61053057637448fbae6000526004601cfd5b61050f81610554565b638b78c6d819543314610348576382b429006000526004601cfd5b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b6001600160a01b038116811461050f57600080fd5b6000602082840312156105b957600080fd5b81356105c481610592565b9392505050565b600080604083850312156105de57600080fd5b82356105e981610592565b9150602083013580151581146105fe57600080fd5b809150509250929050565b6000806040838503121561061c57600080fd5b823561062781610592565b915060208301356105fe81610592565b6000806000806060858703121561064d57600080fd5b843561065881610592565b9350602085013567ffffffffffffffff8082111561067557600080fd5b818701915087601f83011261068957600080fd5b81358181111561069857600080fd5b8860208285010111156106aa57600080fd5b95986020929092019750949560400135945092505050565b600080604083850312156106d557600080fd5b82356106e081610592565b9150602083013563ffffffff811681146105fe57600080fd5b604081528260408201528284606083013760006060848301015260006060601f19601f8601168301019050826020830152949350505050565b60006020828403121561074457600080fd5b81516105c481610592560000000000000000000000009775137314fe595c943712b0b336327dfa80ae8a" + +/* ========= ALCHEMY LIGHT ACCOUNT RELATED ========= */ +// Will deploy the LightAccountFactory v1.1.0 to 0x00004EC70002a32400f8ae005A26081065620D20 +export const LIGHT_ACCOUNT_FACTORY_V110_CREATECALL: Hex = + "0x4e59b44847b379578588920ca78fbf26c0b4956c5528f3e2f146000008fabf7760a0346100cb576001600160401b0390601f6130cb38819003918201601f1916830191848311848410176100b5578084926020946040528339810103126100cb57516001600160a01b038116908190036100cb576040519161270590818401908111848210176100b55760209284926109c6843981520301906000f080156100a9576080526040516108f590816100d1823960805181818160e00152818161030601526103f70152f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fdfe608080604052600436101561001357600080fd5b600090813560e01c90816311464fbe14610096575080635fbfb9cf1461007c57638cb84e181461004257600080fd5b3461007957602061005b61005536610108565b90610363565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b80fd5b503461007957602061005b61009036610108565b90610274565b90503461010457817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101045760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5080fd5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126101595760043573ffffffffffffffffffffffffffffffffffffffff81168103610159579060243590565b600080fd5b6060810190811067ffffffffffffffff82111761017a57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761017a57604052565b60005b8381106101fd5750506000910152565b81810151838201526020016101ed565b90601f60609373ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0931684526040602085015261026d81518092816040880152602088880191016101ea565b0116010190565b9061027f8183610363565b803b610347575073ffffffffffffffffffffffffffffffffffffffff9182604051917fc4d66de8000000000000000000000000000000000000000000000000000000006020840152166024820152602481526102da8161015e565b6040519061042c8083019183831067ffffffffffffffff84111761017a57839261032c926104948539867f0000000000000000000000000000000000000000000000000000000000000000169061020d565b03906000f5801561033b571690565b6040513d6000823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff1692915050565b600b9060559261042c60209061046f61047b83604096875190610388838701836101a9565b85825282820195610494873961041d61044973ffffffffffffffffffffffffffffffffffffffff92838c51917fc4d66de80000000000000000000000000000000000000000000000000000000088840152166024820152602481526103ec8161015e565b8b51928391878301957f0000000000000000000000000000000000000000000000000000000000000000168661020d565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826101a9565b8951958693610460868601998a92519283916101ea565b840191518093868401906101ea565b010380845201826101a9565b5190208351938401528201523081520160ff8153209056fe60406080815261042c908138038061001681610218565b93843982019181818403126102135780516001600160a01b038116808203610213576020838101516001600160401b0394919391858211610213570186601f820112156102135780519061007161006c83610253565b610218565b918083528583019886828401011161021357888661008f930161026e565b813b156101b9577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b031916841790556000927fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a28051158015906101b2575b61010b575b855160e790816103458239f35b855194606086019081118682101761019e578697849283926101889952602788527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c87890152660819985a5b195960ca1b8a8901525190845af4913d15610194573d9061017a61006c83610253565b91825281943d92013e610291565b508038808080806100fe565b5060609250610291565b634e487b7160e01b84526041600452602484fd5b50826100f9565b855162461bcd60e51b815260048101859052602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608490fd5b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761023d57604052565b634e487b7160e01b600052604160045260246000fd5b6001600160401b03811161023d57601f01601f191660200190565b60005b8381106102815750506000910152565b8181015183820152602001610271565b919290156102f357508151156102a5575090565b3b156102ae5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156103065750805190602001fd5b6044604051809262461bcd60e51b825260206004830152610336815180928160248601526020868601910161026e565b601f01601f19168101030190fdfe60806040523615605f5773ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54166000808092368280378136915af43d82803e15605b573d90f35b3d90fd5b73ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54166000808092368280378136915af43d82803e15605b573d90f3fea26469706673582212205da2750cd2b0cadfd354d8a1ca4752ed7f22214c8069d852f7dc6b8e9e5ee66964736f6c63430008150033a26469706673582212205367f15fddc0d5cbb3b407c1f8fa018b2549200abc34a5978c9abd75b26a675a64736f6c6343000815003360e03462000160576001600160401b0390601f6200270538819003918201601f1916830191848311848410176200016557808492602094604052833981010312620001605751906001600160a01b03821682036200016057306080527f33e4b41198cc5b8053630ed667ea7c0c4c873f7fc8d9a478b5d7259cec0a4a00918260a05260c05281549060ff8260401c166200014e57808083160362000108575b60405161258990816200017c82396080518181816107b201528181610dbd0152610f99015260a0518161141d015260c0518181816109d701528181610bf501528181610cd4015281816111b001528181611387015281816115ff015281816122af01526124b50152f35b6001600160401b031990911681179091556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a13880806200009e565b60405163f92ee8a960e01b8152600490fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806223de291461019a57806301ffc9a7146101955780630a1028c414610190578063150b7a021461018b5780631626ba7e1461018657806318dfb3c7146101815780633659cfe61461017c5780633a871cdd1461017757806347e1da2a146101725780634a58db191461016d5780634d44560d146101685780634f1ef2861461016357806352d1902d1461015e5780638da5cb5b14610159578063a786cac914610154578063b0d691fe1461014f578063b61d27f61461014a578063bc197c8114610145578063c399ec8814610140578063c4d66de81461013b578063d087d28814610136578063f23a6e6114610131578063f2fde38b1461012c5763f698da250361000e5761184d565b6116f2565b611661565b611580565b6113e0565b61130f565b611248565b6111d4565b611165565b61113d565b61106e565b610f53565b610d4d565b610c76565b610bb3565b610ac3565b61096d565b61075e565b610672565b6105bb565b61052a565b610504565b61027b565b6101f0565b73ffffffffffffffffffffffffffffffffffffffff8116036101bd57565b600080fd5b9181601f840112156101bd5782359167ffffffffffffffff83116101bd57602083818601950101116101bd57565b346101bd5760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd5761022a60043561019f565b61023560243561019f565b61024060443561019f565b67ffffffffffffffff6084358181116101bd576102619036906004016101c2565b505060a4359081116101bd576100199036906004016101c2565b346101bd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036101bd57807f150b7a020000000000000000000000000000000000000000000000000000000060209214908115610341575b8115610317575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150143861030c565b7f4e2312e00000000000000000000000000000000000000000000000000000000081149150610305565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b67ffffffffffffffff81116103ae57604052565b61036b565b6020810190811067ffffffffffffffff8211176103ae57604052565b6060810190811067ffffffffffffffff8211176103ae57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103ae57604052565b67ffffffffffffffff81116103ae57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926104728261042c565b9161048060405193846103eb565b8294818452818301116101bd578281602093846000960137010152565b9080601f830112156101bd578160206104b893359101610466565b90565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101bd576004359067ffffffffffffffff82116101bd576104b89160040161049d565b346101bd57602061051c610517366104bb565b611ec8565b818151910120604051908152f35b346101bd5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd5761056460043561019f565b61056f60243561019f565b60643567ffffffffffffffff81116101bd5761058f9036906004016101c2565b505060206040517f150b7a02000000000000000000000000000000000000000000000000000000008152f35b346101bd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd5760243567ffffffffffffffff81116101bd5761061761060f602092369060040161049d565b600435611f6d565b7fffffffff0000000000000000000000000000000000000000000000000000000060405191168152f35b9181601f840112156101bd5782359167ffffffffffffffff83116101bd576020808501948460051b0101116101bd57565b346101bd5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd5767ffffffffffffffff6004358181116101bd576106c2903690600401610641565b916024359081116101bd576106db903690600401610641565b91906106e561249d565b8284036107345760005b8481106106f857005b8061072e6107096001938887611da0565b356107138161019f565b610728610721848988611e06565b3691610466565b90612514565b016106ef565b60046040517fa24a13a6000000000000000000000000000000000000000000000000000000008152fd5b346101bd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd576004356107998161019f565b73ffffffffffffffffffffffffffffffffffffffff90817f000000000000000000000000000000000000000000000000000000000000000016916107df833014156118d9565b61080e7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc938285541614611964565b61081661241c565b60405190610823826103b3565b600082527f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561085d5750506100199150611a7a565b6020600491604094939451928380927f52d1902d00000000000000000000000000000000000000000000000000000000825286165afa6000918161093d575b5061092a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608490fd5b0390fd5b6100199361093891146119ef565b611b66565b61095f91925060203d8111610966575b61095781836103eb565b81019061188e565b903861089c565b503d61094d565b346101bd577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6060813601126101bd576004359067ffffffffffffffff82116101bd576101609082360301126101bd5760443573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163303610a6557610a10610a28926024359060040161234d565b9080610a2c575b506040519081529081906020820190565b0390f35b600080808093337ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff150610a5e6118a9565b5038610a17565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152fd5b346101bd5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd5767ffffffffffffffff6004358181116101bd57610b13903690600401610641565b6024358381116101bd57610b2b903690600401610641565b936044359081116101bd57610b44903690600401610641565b92610b4d61249d565b838114801590610ba9575b6107345760005b818110610b6857005b80610ba3610b79600193858a611da0565b35610b838161019f565b610b8e838b89611da0565b35610b9d610721858b8a611e06565b9161253c565b01610b5f565b5085811415610b58565b6000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610c735773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681813b15610c7357602491604051928380927fb760faf900000000000000000000000000000000000000000000000000000000825230600483015234905af18015610c6e57610c62575080f35b610c6b9061039a565b80f35b61189d565b80fd5b346101bd57600060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610c7357600435610cb38161019f565b610cbb61241c565b8173ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001692833b15610d49576044908360405195869485937f205c287800000000000000000000000000000000000000000000000000000000855216600484015260243560248401525af18015610c6e57610c62575080f35b8280fd5b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd57600435610d838161019f565b60243567ffffffffffffffff81116101bd57610da390369060040161049d565b9073ffffffffffffffffffffffffffffffffffffffff91827f00000000000000000000000000000000000000000000000000000000000000001692610dea843014156118d9565b610e197f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc948286541614611964565b610e2161241c565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615610e575750506100199150611a7a565b6020600491604094939451928380927f52d1902d00000000000000000000000000000000000000000000000000000000825286165afa60009181610f33575b50610f20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f7420555550530000000000000000000000000000000000006064820152608490fd5b61001993610f2e91146119ef565b611c45565b610f4c91925060203d81116109665761095781836103eb565b9038610e96565b346101bd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd5773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163003610fea576040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152602090f35b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152fd5b346101bd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd57602073ffffffffffffffffffffffffffffffffffffffff7f691ec1a18226d004c07c9f8e5c4a6ff15a7b38db267cf7e3c945aef8be5122005416604051908152f35b919082519283825260005b8481106111295750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b6020818301810151848301820152016110ea565b346101bd57610a28611151610517366104bb565b6040519182916020835260208301906110df565b346101bd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101bd5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd5760043561120f8161019f565b6044359067ffffffffffffffff82116101bd5761123e6112366100199336906004016101c2565b61072161249d565b906024359061253c565b346101bd5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd5761128260043561019f565b61128d60243561019f565b67ffffffffffffffff6044358181116101bd576112ae903690600401610641565b50506064358181116101bd576112c8903690600401610641565b50506084359081116101bd576112e29036906004016101c2565b50506040517fbc197c81000000000000000000000000000000000000000000000000000000008152602090f35b346101bd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610c6e576020916000916113c3575b50604051908152f35b6113da9150823d81116109665761095781836103eb565b386113ba565b346101bd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd5760043561141b8161019f565b7f00000000000000000000000000000000000000000000000000000000000000009081549067ffffffffffffffff60ff8360401c1615921680159081611578575b600114908161156e575b159081611565575b5061153b5782547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001660011783556114aa908261150557612227565b6114b057005b80547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff169055604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b83547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000178455612227565b60046040517ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b9050153861146e565b303b159150611466565b83915061145c565b346101bd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd576040517f35567e1a0000000000000000000000000000000000000000000000000000000081523060048201526000602482015260208160448173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610c6e57610a289160009161164357506040519081529081906020820190565b61165b915060203d81116109665761095781836103eb565b38610a17565b346101bd5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd5761169b60043561019f565b6116a660243561019f565b60843567ffffffffffffffff81116101bd576116c69036906004016101c2565b505060206040517ff23a6e61000000000000000000000000000000000000000000000000000000008152f35b346101bd5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd5760043561172d8161019f565b61173561241c565b73ffffffffffffffffffffffffffffffffffffffff908181169182158015611844575b611813577f691ec1a18226d004c07c9f8e5c4a6ff15a7b38db267cf7e3c945aef8be512200541690818314611813576117ec9073ffffffffffffffffffffffffffffffffffffffff7f691ec1a18226d004c07c9f8e5c4a6ff15a7b38db267cf7e3c945aef8be51220091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b602483604051907fb20f76e30000000000000000000000000000000000000000000000000000000082526004820152fd5b50308314611758565b346101bd5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bd576020611886611e21565b604051908152f35b908160209103126101bd575190565b6040513d6000823e3d90fd5b3d156118d4573d906118ba8261042c565b916118c860405193846103eb565b82523d6000602084013e565b606090565b156118e057565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c00000000000000000000000000000000000000006064820152fd5b1561196b57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f787900000000000000000000000000000000000000006064820152fd5b156119f657565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c655555494400000000000000000000000000000000000000000000006064820152fd5b803b15611ae25773ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc91167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152fd5b90611b7082611a7a565b73ffffffffffffffffffffffffffffffffffffffff82167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115801590611c3d575b611bbf575050565b611c3a9160008060405193611bd3856103cf565b602785527f416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c60208601527f206661696c6564000000000000000000000000000000000000000000000000006040860152602081519101845af4611c346118a9565b91611ca5565b50565b506000611bb7565b90611c4f82611a7a565b73ffffffffffffffffffffffffffffffffffffffff82167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115801590611c9d57611bbf575050565b506001611bb7565b91929015611d205750815115611cb9575090565b3b15611cc25790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015611d335750805190602001fd5b610926906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906110df565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611db05760051b0190565b611d71565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101bd570180359067ffffffffffffffff82116101bd576020019181360383136101bd57565b90821015611db057611e1d9160051b810190611db5565b9091565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527fcbe29a6ace531c23849b5cdb1a6b991866eb7dc20deda15202ba6fd921ed2c0060408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815260c0810181811067ffffffffffffffff8211176103ae5760405251902090565b6020815191012060405160208101917f5e3baca2936049843f06038876a12f03627b5edc98025751ecf2ac75626401998352604082015260408152611f0c816103cf565b519020611f17611e21565b90604051917f1901000000000000000000000000000000000000000000000000000000000000602084015260228301526042820152604281526080810181811067ffffffffffffffff8211176103ae5760405290565b60405190602082015260208152604081019080821067ffffffffffffffff8311176103ae57611f9e91604052611ec8565b602081519101209073ffffffffffffffffffffffffffffffffffffffff91827f691ec1a18226d004c07c9f8e5c4a6ff15a7b38db267cf7e3c945aef8be5122005416611fea83836120a3565b600581969296101561207457159485612068575b50508315612056575b505050612032577fffffffff0000000000000000000000000000000000000000000000000000000090565b7f1626ba7e0000000000000000000000000000000000000000000000000000000090565b6120609350612166565b388080612007565b16811493503880611ffe565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9060418151146000146120cd57611e1d916020820151906060604084015193015160001a906120d7565b5050600090600290565b9291907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831161215a5791608094939160ff602094604051948552168484015260408301526060820152600093849182805260015afa15610c6e57815173ffffffffffffffffffffffffffffffffffffffff811615612154579190565b50600190565b50505050600090600390565b600091929082916040516121e3816121b760208201947f1626ba7e00000000000000000000000000000000000000000000000000000000998a875260248401526040604484015260648301906110df565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826103eb565b51915afa906121f06118a9565b82612219575b8261220057505090565b6122159192506020808251830101910161188e565b1490565b9150602082511015916121f6565b73ffffffffffffffffffffffffffffffffffffffff9081811691821561231c576122ad839273ffffffffffffffffffffffffffffffffffffffff7f691ec1a18226d004c07c9f8e5c4a6ff15a7b38db267cf7e3c945aef8be51220091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b7f0000000000000000000000000000000000000000000000000000000000000000167fec6a23b49d2c363d250c9dda15610e835d428207d15ddb36a6c230e37371ddf1600080a360007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3565b60246040517fb20f76e300000000000000000000000000000000000000000000000000000000815260006004820152fd5b73ffffffffffffffffffffffffffffffffffffffff91827f691ec1a18226d004c07c9f8e5c4a6ff15a7b38db267cf7e3c945aef8be51220054167f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005281601c526123d06123c9610721603c60002095610140810190611db5565b80946120a3565b600581969296101561207457159485612410575b505083156123fe575b5050506123f957600190565b600090565b6124089350612166565b3880806123ed565b168114935038806123e4565b303314158061245c575b61242c57565b60246040517f4a0bfec1000000000000000000000000000000000000000000000000000000008152336004820152fd5b5073ffffffffffffffffffffffffffffffffffffffff7f691ec1a18226d004c07c9f8e5c4a6ff15a7b38db267cf7e3c945aef8be5122005416331415612426565b73ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001633141590816124e6575b5061242c57565b90507f691ec1a18226d004c07c9f8e5c4a6ff15a7b38db267cf7e3c945aef8be5122005416331415386124df565b600091829182602083519301915af161252b6118a9565b90156125345750565b602081519101fd5b916000928392602083519301915af161252b6118a956fea2646970667358221220c5240b5a614209162da17798c4589910308036b820e321c267b03d8cedb5e48164736f6c634300081500330000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789" diff --git a/mock-alto-bundler/src/index.ts b/mock-alto-bundler/src/index.ts index acc4730..ffc058f 100644 --- a/mock-alto-bundler/src/index.ts +++ b/mock-alto-bundler/src/index.ts @@ -4,11 +4,11 @@ import { createPublicClient, createTestClient, createWalletClient, - parseEther, -} from "viem"; -import { mnemonicToAccount } from "viem/accounts"; -import { sendTransaction } from "viem/actions"; -import { foundry } from "viem/chains"; + parseEther +} from "viem" +import { mnemonicToAccount } from "viem/accounts" +import { sendTransaction } from "viem/actions" +import { foundry } from "viem/chains" import { BICONOMY_ACCOUNT_V2_LOGIC_CREATECALL, BICONOMY_DEFAULT_FALLBACK_HANDLER_CREATECALL, @@ -25,6 +25,7 @@ import { KERNEL_V07_ECDSA_VALIDATOR_V3_CREATECALL, KERNEL_V07_FACTORY_CREATECALL, KERNEL_V07_META_FACTORY_CREATECALL, + LIGHT_ACCOUNT_FACTORY_V110_CREATECALL, SAFE_MULTI_SEND_CALL_ONLY_CREATECALL, SAFE_MULTI_SEND_CREATECALL, SAFE_PROXY_FACTORY_CREATECALL, @@ -35,388 +36,389 @@ import { SAFE_V07_MODULE_CREATECALL, SAFE_V07_MODULE_SETUP_CREATECALL, SIMPLE_ACCOUNT_FACTORY_V06_CREATECALL, - SIMPLE_ACCOUNT_FACTORY_V07_CREATECALL, -} from "./constants"; + SIMPLE_ACCOUNT_FACTORY_V07_CREATECALL +} from "./constants" -const DETERMINISTIC_DEPLOYER = "0x4e59b44847b379578588920ca78fbf26c0b4956c"; -const SAFE_SINGLETON_FACTORY = "0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7"; -const BICONOMY_SINGLETON_FACTORY = "0x988C135a1049Ce61730724afD342fb7C56CD2776"; +const DETERMINISTIC_DEPLOYER = "0x4e59b44847b379578588920ca78fbf26c0b4956c" +const SAFE_SINGLETON_FACTORY = "0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7" +const BICONOMY_SINGLETON_FACTORY = "0x988C135a1049Ce61730724afD342fb7C56CD2776" const verifyDeployed = async (addresses: Address[]) => { for (const address of addresses) { const bytecode = await client.getBytecode({ - address, - }); + address + }) if (bytecode === undefined) { - console.log(`CONTRACT ${address} NOT DEPLOYED!!!`); - process.exit(1); + console.log(`CONTRACT ${address} NOT DEPLOYED!!!`) + process.exit(1) } } -}; +} const walletClient = createWalletClient({ account: mnemonicToAccount( - "test test test test test test test test test test test junk", + "test test test test test test test test test test test junk" ), chain: foundry, - transport: http(process.env.ANVIL_RPC), -}); + transport: http(process.env.ANVIL_RPC) +}) const anvilClient = createTestClient({ transport: http(process.env.ANVIL_RPC), - mode: "anvil", -}); + mode: "anvil" +}) const client = createPublicClient({ - transport: http(process.env.ANVIL_RPC), -}); + transport: http(process.env.ANVIL_RPC) +}) const main = async () => { - if (process.env.SKIP_DEPLOYMENTS) { - // set nonces to match onchain nonces - const promises = []; - - for (let i = 0; i < 100; i++) { - const wallet = createWalletClient({ - account: mnemonicToAccount( - "test test test test test test test test test test test junk", - { - addressIndex: i, - }, - ), - transport: http(process.env.ANVIL_RPC), - }); - - const noncePromise = client.getTransactionCount({ - address: wallet.account.address, - }); - - promises.push( - noncePromise.then((nonce) => { - anvilClient.setNonce({ - address: wallet.account.address, - nonce: nonce, - }); - }), - ); - - anvilClient.setBalance({ - address: wallet.account.address, - value: parseEther("1000"), - }); - } - - await Promise.all(promises); - process.exit(0); - } - - let nonce = 0; + let nonce = 0 walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: ENTRY_POINT_V07_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[V0.7 CORE] Deploying EntryPoint")); + .then(() => console.log("[V0.7 CORE] Deploying EntryPoint")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: SIMPLE_ACCOUNT_FACTORY_V07_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[V0.7 CORE] Deploying SimpleAccountFactory")); + .then(() => console.log("[V0.7 CORE] Deploying SimpleAccountFactory")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: ENTRY_POINT_SIMULATIONS_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[V0.7 CORE] Deploying EntryPointSimulations")); + .then(() => console.log("[V0.7 CORE] Deploying EntryPointSimulations")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: ENTRY_POINT_V06_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[V0.6 CORE] Deploying EntryPoint")); + .then(() => console.log("[V0.6 CORE] Deploying EntryPoint")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: SIMPLE_ACCOUNT_FACTORY_V06_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[V0.6 CORE] Deploying SimpleAccountFactory")); + .then(() => console.log("[V0.6 CORE] Deploying SimpleAccountFactory")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: SAFE_V06_MODULE_SETUP_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[SAFE V0.6] Deploying Safe Module Setup")); + .then(() => console.log("[SAFE V0.6] Deploying Safe Module Setup")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: SAFE_V06_MODULE_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[SAFE V0.6] Deploying Safe 4337 Module")); + .then(() => console.log("[SAFE V0.6] Deploying Safe 4337 Module")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: SAFE_V07_MODULE_SETUP_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[SAFE V0.7] Deploying Safe Module Setup")); + .then(() => console.log("[SAFE V0.7] Deploying Safe Module Setup")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: SAFE_V07_MODULE_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[SAFE V0.7] Deploying Safe 4337 Module")); + .then(() => console.log("[SAFE V0.7] Deploying Safe 4337 Module")) await anvilClient .setCode({ address: SAFE_SINGLETON_FACTORY, - bytecode: SAFE_SINGLETON_FACTORY_BYTECODE, + bytecode: SAFE_SINGLETON_FACTORY_BYTECODE }) - .then(() => console.log("[SAFE] Etched Safe Singleton Factory Bytecode")); + .then(() => + console.log("[SAFE] Etched Safe Singleton Factory Bytecode") + ) walletClient .sendTransaction({ to: SAFE_SINGLETON_FACTORY, data: SAFE_PROXY_FACTORY_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[SAFE] Deploying Safe Proxy Factory")); + .then(() => console.log("[SAFE] Deploying Safe Proxy Factory")) walletClient .sendTransaction({ to: SAFE_SINGLETON_FACTORY, data: SAFE_SINGLETON_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[SAFE] Deploying Safe Singleton")); + .then(() => console.log("[SAFE] Deploying Safe Singleton")) walletClient .sendTransaction({ to: SAFE_SINGLETON_FACTORY, data: SAFE_MULTI_SEND_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[SAFE] Deploying Safe Multi Send")); + .then(() => console.log("[SAFE] Deploying Safe Multi Send")) walletClient .sendTransaction({ to: SAFE_SINGLETON_FACTORY, data: SAFE_MULTI_SEND_CALL_ONLY_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[SAFE] Deploying Safe Multi Send Call Only")); + .then(() => console.log("[SAFE] Deploying Safe Multi Send Call Only")) await anvilClient .setCode({ address: BICONOMY_SINGLETON_FACTORY, - bytecode: BICONOMY_SINGLETON_FACTORY_BYTECODE, + bytecode: BICONOMY_SINGLETON_FACTORY_BYTECODE }) - .then(() => console.log("[BICONOMY] Etched Singleton Factory Bytecode")); + .then(() => console.log("[BICONOMY] Etched Singleton Factory Bytecode")) walletClient .sendTransaction({ to: BICONOMY_SINGLETON_FACTORY, data: BICONOMY_ECDSA_OWNERSHIP_REGISTRY_MOUDULE_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) .then(() => - console.log("[BICONOMY] Deployed ECDSA Ownership Registry Module"), - ); + console.log("[BICONOMY] Deployed ECDSA Ownership Registry Module") + ) walletClient .sendTransaction({ to: BICONOMY_SINGLETON_FACTORY, data: BICONOMY_ACCOUNT_V2_LOGIC_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[BICONOMY] Deploying Account V0.2 Logic")); + .then(() => console.log("[BICONOMY] Deploying Account V0.2 Logic")) walletClient .sendTransaction({ to: BICONOMY_SINGLETON_FACTORY, data: BICONOMY_FACTORY_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[BICONOMY] Deploying Factory")); + .then(() => console.log("[BICONOMY] Deploying Factory")) walletClient .sendTransaction({ to: BICONOMY_SINGLETON_FACTORY, data: BICONOMY_DEFAULT_FALLBACK_HANDLER_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[BICONOMY] Deploying Default Fallback Handler")); + .then(() => + console.log("[BICONOMY] Deploying Default Fallback Handler") + ) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: KERNEL_V06_ECDSA_VALIDATOR_V2_2_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[KERNEL] Deploying V0.6 ECDSA Validator")); + .then(() => console.log("[KERNEL] Deploying V0.6 ECDSA Validator")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: KERNEL_V06_ACCOUNT_V2_2_LOGIC_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[KERNEL] Deploying V0.6 Account V2 Logic")); + .then(() => console.log("[KERNEL] Deploying V0.6 Account V2 Logic")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: KERNEL_V06_FACTORY_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[KERNEL] Deploying V0.6 Factory")); + .then(() => console.log("[KERNEL] Deploying V0.6 Factory")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: KERNEL_V07_FACTORY_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[KERNEL] Deploying V0.7 Factory")); + .then(() => console.log("[KERNEL] Deploying V0.7 Factory")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: KERNEL_V07_ECDSA_VALIDATOR_V3_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[KERNEL] Deploying V0.7 ECDSA VALIDATOR")); + .then(() => console.log("[KERNEL] Deploying V0.7 ECDSA VALIDATOR")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: KERNEL_V07_ACCOUNT_V3_LOGIC_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[KERNEL] Deploying V0.7 ACCOUNT V3 LOGIC ")); + .then(() => console.log("[KERNEL] Deploying V0.7 ACCOUNT V3 LOGIC ")) walletClient .sendTransaction({ to: DETERMINISTIC_DEPLOYER, data: KERNEL_V07_META_FACTORY_CREATECALL, gas: 15_000_000n, - nonce: nonce++, + nonce: nonce++ }) - .then(() => console.log("[KERNEL] Deploying V0.7 META FACTORY")); + .then(() => console.log("[KERNEL] Deploying V0.7 META FACTORY")) - let onchainNonce = 0; + walletClient + .sendTransaction({ + to: DETERMINISTIC_DEPLOYER, + data: LIGHT_ACCOUNT_FACTORY_V110_CREATECALL, + gas: 15_000_000n, + nonce: nonce++ + }) + .then(() => + console.log("[LIGHT ACCOUNT] Deploying v1.1.0 LightAccount Factory") + ) + + let onchainNonce = 0 do { onchainNonce = await client.getTransactionCount({ - address: walletClient.account.address, - }); - await new Promise((resolve) => setTimeout(resolve, 500)); - } while (onchainNonce !== nonce); + address: walletClient.account.address + }) + await new Promise((resolve) => setTimeout(resolve, 500)) + } while (onchainNonce !== nonce) // ==== SETUP KERNEL V0.6 CONTRACTS ==== // - const kernelFactoryOwner = "0x9775137314fE595c943712B0b336327dfa80aE8A"; + const kernelFactoryOwner = "0x9775137314fE595c943712B0b336327dfa80aE8A" await anvilClient.setBalance({ address: kernelFactoryOwner, - value: parseEther("100"), - }); + value: parseEther("100") + }) await anvilClient.impersonateAccount({ - address: kernelFactoryOwner, - }); + address: kernelFactoryOwner + }) // register 0x0DA6a956B9488eD4dd761E59f52FDc6c8068E6B5 await sendTransaction(walletClient, { account: kernelFactoryOwner, to: "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3" /* kernel factory v0.6 */, - data: "0xbb30a9740000000000000000000000000da6a956b9488ed4dd761e59f52fdc6c8068e6b50000000000000000000000000000000000000000000000000000000000000001" /* setImplementation(address _implementation,bool _allow) */, - }); + data: "0xbb30a9740000000000000000000000000da6a956b9488ed4dd761e59f52fdc6c8068e6b50000000000000000000000000000000000000000000000000000000000000001" /* setImplementation(address _implementation,bool _allow) */ + }) // register 0x6723b44Abeec4E71eBE3232BD5B455805baDD22f await sendTransaction(walletClient, { account: kernelFactoryOwner, to: "0xd703aaE79538628d27099B8c4f621bE4CCd142d5" /* kernel factory v0.7 */, - data: "0x6e7dbabb0000000000000000000000006723b44abeec4e71ebe3232bd5b455805badd22f0000000000000000000000000000000000000000000000000000000000000001", - }); + data: "0x6e7dbabb0000000000000000000000006723b44abeec4e71ebe3232bd5b455805badd22f0000000000000000000000000000000000000000000000000000000000000001" + }) await sendTransaction(walletClient, { account: kernelFactoryOwner, to: "0xd703aaE79538628d27099B8c4f621bE4CCd142d5" /* kernel factory v0.7 */, - data: "0xc7e55f3e0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da0320000000000000000000000000000000000000000000000000000000000015180", - }); + data: "0xc7e55f3e0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da0320000000000000000000000000000000000000000000000000000000000015180" + }) await anvilClient.stopImpersonatingAccount({ - address: kernelFactoryOwner, - }); + address: kernelFactoryOwner + }) + + // ==== SETUP ALCHEMY LIGHT ACCOUNT CONTRACTS ==== // + const alchemyLightClientOwner = "0xDdF32240B4ca3184De7EC8f0D5Aba27dEc8B7A5C" + await anvilClient.setBalance({ + address: alchemyLightClientOwner, + value: parseEther("100") + }) + + await anvilClient.impersonateAccount({ + address: alchemyLightClientOwner + }) + + await sendTransaction(walletClient, { + account: alchemyLightClientOwner, + to: "0x0000000000400CdFef5E2714E63d8040b700BC24" /* light account v2.0.0 factory */, + data: "0xfbb1c3d40000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000016345785d8a0000", + value: parseEther("0.1") + }) + + await anvilClient.stopImpersonatingAccount({ + address: alchemyLightClientOwner + }) await verifyDeployed([ - "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7", - "0x988C135a1049Ce61730724afD342fb7C56CD2776", - "0x0000000071727De22E5E9d8BAf0edAc6f37da032", - "0x91E60e0613810449d098b0b5Ec8b51A0FE8c8985", - "0xb02456A0eC77837B22156CBA2FF53E662b326713", - "0x2dd68b007B46fBe91B9A7c3EDa5A7a1063cB5b47", - "0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226", - "0x8EcD4ec46D4D2a6B64fE960B3D64e8B94B2234eb", - "0xa581c4A4DB7175302464fF3C06380BC3270b4037", - "0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67", - "0x41675C099F32341bf84BFc5382aF534df5C7461a", - "0x38869bf66a61cF6bDB996A6aE40D5853Fd43B526", - "0x9641d764fc13c8B624c04430C7356C1C7C8102e2", - "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", - "0x9406Cc6185a346906296840746125a0E44976454", - "0x0000001c5b32F37F5beA87BDD5374eB2aC54eA8e", - "0x0000002512019Dafb59528B82CB92D3c5D2423ac", - "0x000000a56Aaca3e9a4C479ea6b6CD0DbcB6634F5", - "0x0bBa6d96BD616BedC6BFaa341742FD43c60b83C1", - "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", - "0x0DA6a956B9488eD4dd761E59f52FDc6c8068E6B5", - "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", - "0x8104e3Ad430EA6d354d013A6789fDFc71E671c43", - "0x94F097E1ebEB4ecA3AAE54cabb08905B239A7D27", - "0x6723b44Abeec4E71eBE3232BD5B455805baDD22f", - "0xd703aaE79538628d27099B8c4f621bE4CCd142d5", - ]); -}; - -main(); + "0x4e59b44847b379578588920ca78fbf26c0b4956c", // Determinstic deployer + "0x914d7Fec6aaC8cd542e72Bca78B30650d45643d7", // Safe Singleton Factory + "0x988C135a1049Ce61730724afD342fb7C56CD2776", // Biconomy Singleton Factory + "0x0000000071727De22E5E9d8BAf0edAc6f37da032", // EntryPoint v0.7 + "0x91E60e0613810449d098b0b5Ec8b51A0FE8c8985", // Simple Account Factory V0.7 + "0x74Cb5e4eE81b86e70f9045036a1C5477de69eE87", // EntryPoint Simulations (Needed for v0.7) + "0x2dd68b007B46fBe91B9A7c3EDa5A7a1063cB5b47", // Safe V0.7 Module Setup + "0x75cf11467937ce3F2f357CE24ffc3DBF8fD5c226", // Safe V0.7 4337 Module + "0x8EcD4ec46D4D2a6B64fE960B3D64e8B94B2234eb", // Safe V0.6 Module Setup + "0xa581c4A4DB7175302464fF3C06380BC3270b4037", // Safe V0.6 4337 Module + "0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67", // Safe Proxy Factory + "0x41675C099F32341bf84BFc5382aF534df5C7461a", // Safe Singleton + "0x38869bf66a61cF6bDB996A6aE40D5853Fd43B526", // Safe Multi Send + "0x9641d764fc13c8B624c04430C7356C1C7C8102e2", // Safe Multi Send Call Only + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", // EntryPoint V0.6 + "0x9406Cc6185a346906296840746125a0E44976454", // Simple Account Factory V0.6 + "0x0000001c5b32F37F5beA87BDD5374eB2aC54eA8e", // Biconomy ECDSA Ownership Registry Module + "0x0000002512019Dafb59528B82CB92D3c5D2423ac", // Biconomy Account Logic V0.2 + "0x000000a56Aaca3e9a4C479ea6b6CD0DbcB6634F5", // Biconomy Factory Address + "0x0bBa6d96BD616BedC6BFaa341742FD43c60b83C1", // Biconomy Default Fallback Handler + "0xd9AB5096a832b9ce79914329DAEE236f8Eea0390", // Kernel v0.2.2 ECDSA Valdiator + "0x0DA6a956B9488eD4dd761E59f52FDc6c8068E6B5", // Kernel v0.2.2 Account Logic + "0x5de4839a76cf55d0c90e2061ef4386d962E15ae3", // Kernel v0.2.2 Factory + "0x8104e3Ad430EA6d354d013A6789fDFc71E671c43", // Kernel v0.3.0 ECDSA Valdiator + "0x94F097E1ebEB4ecA3AAE54cabb08905B239A7D27", // Kernel v0.3.0 Account Logic + "0x6723b44Abeec4E71eBE3232BD5B455805baDD22f", // Kernel v0.3.0 Factory + "0xd703aaE79538628d27099B8c4f621bE4CCd142d5", // Kernel v0.3.0 Meta Factory + "0x00004EC70002a32400f8ae005A26081065620D20", // LightAccountFactory v1.1.0 + "0xae8c656ad28F2B59a196AB61815C16A0AE1c3cba" // LightAccount v1.1.0 implementation + ]) +} + +main() diff --git a/mock-verifying-paymaster/Dockerfile b/mock-verifying-paymaster/Dockerfile index 4e49020..7fe17d6 100644 --- a/mock-verifying-paymaster/Dockerfile +++ b/mock-verifying-paymaster/Dockerfile @@ -1,21 +1,21 @@ -# Production ready dockerfile that runs pnpm start +# production ready dockerfile that runs pnpm start FROM node:20-alpine -# Set working directory +# set working directory WORKDIR /app -# Install pnpm +# install pnpm RUN npm install -g pnpm -# Copy package.json +# copy package.json COPY package.json ./ -# Copy source code +# copy source code COPY ./src ./src -# Install dependencies +# install dependencies RUN pnpm fetch RUN pnpm install -# Start app +# start app ENTRYPOINT ["pnpm", "run", "start"] diff --git a/mock-verifying-paymaster/src/helpers/schema.ts b/mock-verifying-paymaster/src/helpers/schema.ts index 8995d7e..5bb1406 100644 --- a/mock-verifying-paymaster/src/helpers/schema.ts +++ b/mock-verifying-paymaster/src/helpers/schema.ts @@ -1,17 +1,10 @@ -import type { FastifyReply } from "fastify" import { type Hex, getAddress } from "viem" import { type infer as zodInfer, z } from "zod" -export const returnInvalidRequestParams = ( - reply: FastifyReply, - errorMsg: string -) => { - reply.status(400).send({ - jsonrpc: "2.0", - error: { - message: errorMsg - } - }) +export enum ValidationErrors { + InvalidFields = -32602, + InsufficientBalance = -32603, + UnsupportedEntryPoint = -32604 } export class InternalBundlerError extends Error { @@ -160,3 +153,4 @@ export const pmSponsorUserOperationParamsSchema = z.tuple([ export type UserOperationV7 = zodInfer export type UserOperationV6 = zodInfer +export type JsonRpcSchema = zodInfer diff --git a/mock-verifying-paymaster/src/helpers/utils.ts b/mock-verifying-paymaster/src/helpers/utils.ts index 914dc14..2487775 100644 --- a/mock-verifying-paymaster/src/helpers/utils.ts +++ b/mock-verifying-paymaster/src/helpers/utils.ts @@ -1,69 +1,21 @@ -import type { UserOperation } from "permissionless"; -import { - http, - createWalletClient, - createPublicClient, - defineChain, -} from "viem"; -import { mnemonicToAccount } from "viem/accounts"; -import type { UserOperationV6, UserOperationV7 } from "./schema"; - -// Type predicate to check if the UserOperation is V07. -export function isVersion07( - operation: UserOperationV6 | UserOperationV7, -): operation is UserOperation<"v0.7"> { - return ( - "factory" in operation || - "paymaster" in operation || - "factoryData" in operation - ); -} - -// Type predicate check if the UserOperation is V06. -export function isVersion06( - operation: UserOperationV6 | UserOperationV7, -): operation is UserOperation<"v0.6"> { - return "initCode" in operation || "paymasterAndData" in operation; +import { http, createWalletClient } from "viem" +import { mnemonicToAccount } from "viem/accounts" +import { foundry } from "viem/chains" + +export const getAnvilWalletClient = () => { + const account = mnemonicToAccount( + "test test test test test test test test test test test junk", + { + /* avoid nonce error with index 0 when deploying ep contracts. */ + addressIndex: 1 + } + ) + + const walletClient = createWalletClient({ + account, + chain: foundry, + transport: http(process.env.ANVIL_RPC) + }) + + return walletClient } - -export const getChain = async () => { - const tempClient = createPublicClient({ - transport: http(process.env.ANVIL_RPC), - }); - - const chain = defineChain({ - id: await tempClient.getChainId(), - name: "chain", - nativeCurrency: { - name: "ETH", - symbol: "ETH", - decimals: 18, - }, - rpcUrls: { - default: { - http: [], - webSocket: undefined, - }, - }, - }); - - return chain; -}; - -export const getAnvilWalletClient = async () => { - const account = mnemonicToAccount( - "test test test test test test test test test test test junk", - { - /* avoid nonce error with index 0 when deploying ep contracts. */ - addressIndex: 1, - }, - ); - - const walletClient = createWalletClient({ - account, - transport: http(process.env.ANVIL_RPC), - chain: await getChain(), - }); - - return walletClient; -}; diff --git a/mock-verifying-paymaster/src/helpers/verifyingPaymasters.ts b/mock-verifying-paymaster/src/helpers/verifyingPaymasters.ts index 8309941..e4172d5 100644 --- a/mock-verifying-paymaster/src/helpers/verifyingPaymasters.ts +++ b/mock-verifying-paymaster/src/helpers/verifyingPaymasters.ts @@ -1,120 +1,116 @@ import { - http, - type Account, - type Address, - type Chain, - type Hex, - type Transport, - type WalletClient, - concat, - createPublicClient, - getContract, - getContractAddress, - pad, - parseEther, - slice, -} from "viem"; -import { waitForTransactionReceipt } from "viem/actions"; -import { foundry } from "viem/chains"; -import { - VERIFYING_PAYMASTER_V06_ABI, - VERIFYING_PAYMASTER_V07_ABI, -} from "./abi"; -import { getChain } from "./utils"; - -const DETERMINISTIC_DEPLOYER = "0x4e59b44847b379578588920ca78fbf26c0b4956c"; + http, + type Account, + type Address, + type Chain, + type Hex, + type Transport, + type WalletClient, + concat, + createPublicClient, + getContract, + getContractAddress, + pad, + parseEther, + slice +} from "viem" +import { waitForTransactionReceipt } from "viem/actions" +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), - ]); + 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), - ]); + concat([ + "0x000000000000000000000000000000000000000000000000000000000000000060c06040523480156200001157600080fd5b5060405162001401380380620014018339810160408190526200003491620001ad565b81620000403362000066565b6001600160a01b03908116608052811660a0526200005e81620000b6565b5050620001ec565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000c062000139565b6001600160a01b0381166200012b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620001368162000066565b50565b6000546001600160a01b03163314620001955760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000122565b565b6001600160a01b03811681146200013657600080fd5b60008060408385031215620001c157600080fd5b8251620001ce8162000197565b6020840151909250620001e18162000197565b809150509250929050565b60805160a0516111b76200024a600039600081816101340152610a310152600081816102360152818161031a015281816103b1015281816104ac01528181610540015281816105b701528181610644015261083e01526111b76000f3fe6080604052600436106100e85760003560e01c8063a9a234091161008a578063c399ec8811610059578063c399ec881461028d578063d0e30db0146102a2578063f2fde38b146102aa578063f465c77e146102ca57600080fd5b8063a9a2340914610204578063b0d691fe14610224578063bb9fe6bf14610258578063c23a5cea1461026d57600080fd5b8063715018a6116100c6578063715018a6146101735780638da5cb5b1461018857806394d4ad60146101a657806394e1fc19146101d657600080fd5b80630396cb60146100ed578063205c28781461010257806323d9ac9b14610122575b600080fd5b6101006100fb366004610d63565b6102f8565b005b34801561010e57600080fd5b5061010061011d366004610da5565b610383565b34801561012e57600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561017f57600080fd5b506101006103f5565b34801561019457600080fd5b506000546001600160a01b0316610156565b3480156101b257600080fd5b506101c66101c1366004610e13565b610409565b60405161016a9493929190610e55565b3480156101e257600080fd5b506101f66101f1366004610ed5565b610446565b60405190815260200161016a565b34801561021057600080fd5b5061010061021f366004610f33565b610488565b34801561023057600080fd5b506101567f000000000000000000000000000000000000000000000000000000000000000081565b34801561026457600080fd5b506101006104a2565b34801561027957600080fd5b50610100610288366004610f93565b610519565b34801561029957600080fd5b506101f661059f565b61010061062f565b3480156102b657600080fd5b506101006102c5366004610f93565b610691565b3480156102d657600080fd5b506102ea6102e5366004610fb0565b61070f565b60405161016a929190611044565b610300610733565b604051621cb65b60e51b815263ffffffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630396cb609034906024016000604051808303818588803b15801561036757600080fd5b505af115801561037b573d6000803e3d6000fd5b505050505050565b61038b610733565b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063205c287890604401600060405180830381600087803b15801561036757600080fd5b6103fd610733565b610407600061078d565b565b600080368161041c605460148789611066565b8101906104299190611090565b909450925061043b8560548189611066565b949793965094505050565b6000610451846107dd565b463085856040516020016104699594939291906110c3565b6040516020818303038152906040528051906020012090509392505050565b610490610833565b61049c848484846108a3565b50505050565b6104aa610733565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561050557600080fd5b505af115801561049c573d6000803e3d6000fd5b610521610733565b60405163611d2e7560e11b81526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c23a5cea90602401600060405180830381600087803b15801561058457600080fd5b505af1158015610598573d6000803e3d6000fd5b5050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062a919061110b565b905090565b60405163b760faf960e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b760faf99034906024016000604051808303818588803b15801561058457600080fd5b610699610733565b6001600160a01b0381166107035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61070c8161078d565b50565b6060600061071b610833565b6107268585856108db565b915091505b935093915050565b6000546001600160a01b031633146104075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106fa565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60603660006107f0610120850185611124565b9150915083610120610180828503038082016040519650602081018701604052808752508183602088013780604083850101836020890101375050505050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104075760405162461bcd60e51b815260206004820152601560248201527414d95b99195c881b9bdd08115b9d1c9e541bda5b9d605a1b60448201526064016106fa565b60405162461bcd60e51b815260206004820152600d60248201526c6d757374206f7665727269646560981b60448201526064016106fa565b60606000808036816108f46101c16101208b018b611124565b92965090945092509050604081148061090d5750604181145b610981576040805162461bcd60e51b81526020600482015260248101919091527f566572696679696e675061796d61737465723a20696e76616c6964207369676e60448201527f6174757265206c656e67746820696e207061796d6173746572416e644461746160648201526084016106fa565b60006109e46109918b8787610446565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050610a268184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610ab492505050565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610a8957610a6a60018686610ad8565b604051806020016040528060008152509096509650505050505061072b565b610a9560008686610ad8565b6040805160208101909152600081529b909a5098505050505050505050565b6000806000610ac38585610b10565b91509150610ad081610b55565b509392505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610b00576000610b03565b60015b60ff161717949350505050565b6000808251604103610b465760208301516040840151606085015160001a610b3a87828585610c9f565b94509450505050610b4e565b506000905060025b9250929050565b6000816004811115610b6957610b6961116b565b03610b715750565b6001816004811115610b8557610b8561116b565b03610bd25760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106fa565b6002816004811115610be657610be661116b565b03610c335760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106fa565b6003816004811115610c4757610c4761116b565b0361070c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106fa565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610cd65750600090506003610d5a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610d2a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610d5357600060019250925050610d5a565b9150600090505b94509492505050565b600060208284031215610d7557600080fd5b813563ffffffff81168114610d8957600080fd5b9392505050565b6001600160a01b038116811461070c57600080fd5b60008060408385031215610db857600080fd5b8235610dc381610d90565b946020939093013593505050565b60008083601f840112610de357600080fd5b50813567ffffffffffffffff811115610dfb57600080fd5b602083019150836020828501011115610b4e57600080fd5b60008060208385031215610e2657600080fd5b823567ffffffffffffffff811115610e3d57600080fd5b610e4985828601610dd1565b90969095509350505050565b600065ffffffffffff808716835280861660208401525060606040830152826060830152828460808401376000608084840101526080601f19601f850116830101905095945050505050565b60006101608284031215610eb457600080fd5b50919050565b803565ffffffffffff81168114610ed057600080fd5b919050565b600080600060608486031215610eea57600080fd5b833567ffffffffffffffff811115610f0157600080fd5b610f0d86828701610ea1565b935050610f1c60208501610eba565b9150610f2a60408501610eba565b90509250925092565b60008060008060608587031215610f4957600080fd5b843560038110610f5857600080fd5b9350602085013567ffffffffffffffff811115610f7457600080fd5b610f8087828801610dd1565b9598909750949560400135949350505050565b600060208284031215610fa557600080fd5b8135610d8981610d90565b600080600060608486031215610fc557600080fd5b833567ffffffffffffffff811115610fdc57600080fd5b610fe886828701610ea1565b9660208601359650604090950135949350505050565b6000815180845260005b8181101561102457602081850181015186830182015201611008565b506000602082860101526020601f19601f83011685010191505092915050565b6040815260006110576040830185610ffe565b90508260208301529392505050565b6000808585111561107657600080fd5b8386111561108357600080fd5b5050820193919092039150565b600080604083850312156110a357600080fd5b6110ac83610eba565b91506110ba60208401610eba565b90509250929050565b60a0815260006110d660a0830188610ffe565b6020830196909652506001600160a01b0393909316604084015265ffffffffffff918216606084015216608090910152919050565b60006020828403121561111d57600080fd5b5051919050565b6000808335601e1984360301811261113b57600080fd5b83018035915067ffffffffffffffff82111561115657600080fd5b602001915036819003821315610b4e57600080fd5b634e487b7160e01b600052602160045260246000fdfea2646970667358221220bc69dcc52cd6c4ebdf52276b6a56f83b85831b738e3b681ab51ab0bbab6a03c164736f6c634300081100330000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789", + pad(owner) + ]) export const setupVerifyingPaymasterV07 = async ( - walletClient: WalletClient, + walletClient: WalletClient ) => { - const data = VERIFYING_PAYMASTER_V07_CALL(walletClient.account.address); - - const publicClient = createPublicClient({ - transport: http(process.env.ANVIL_RPC), - chain: await getChain(), - }); - - await walletClient - .sendTransaction({ - to: DETERMINISTIC_DEPLOYER, - data, - }) - .then((hash) => publicClient.waitForTransactionReceipt({ hash })) - .then(() => console.log("deployed VerifyingPaymaster v0.7")); - - 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"), - }) - .then(() => console.log("Funded VerifyingPaymaster V0.7")); - - return verifyingPaymaster; -}; + const data = VERIFYING_PAYMASTER_V07_CALL(walletClient.account.address) + + const publicClient = createPublicClient({ + transport: http(process.env.ANVIL_RPC), + chain: foundry + }) + + await walletClient + .sendTransaction({ + to: DETERMINISTIC_DEPLOYER, + data + }) + .then((hash) => publicClient.waitForTransactionReceipt({ hash })) + .then(() => console.log("deployed VerifyingPaymaster v0.7")) + + 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") + }) + .then(() => console.log("Funded VerifyingPaymaster V0.7")) + + return verifyingPaymaster +} export const setupVerifyingPaymasterV06 = async ( - walletClient: WalletClient, + walletClient: WalletClient ) => { - const data = VERIFYING_PAYMASTER_V06_CALL(walletClient.account.address); - - const publicClient = createPublicClient({ - transport: http(process.env.ANVIL_RPC), - chain: await getChain(), - }); - - await walletClient - .sendTransaction({ - to: DETERMINISTIC_DEPLOYER, - data, - }) - .then((hash) => publicClient.waitForTransactionReceipt({ hash })) - .then(() => console.log("deployed VerifyingPaymaster v0.6")); - - 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"), - }) - .then(() => console.log("Funded VerifyingPaymaster V0.6")); - - return verifyingPaymaster; -}; + const data = VERIFYING_PAYMASTER_V06_CALL(walletClient.account.address) + + const publicClient = createPublicClient({ + transport: http(process.env.ANVIL_RPC), + chain: foundry + }) + + await walletClient + .sendTransaction({ + to: DETERMINISTIC_DEPLOYER, + data + }) + .then((hash) => publicClient.waitForTransactionReceipt({ hash })) + .then(() => console.log("deployed VerifyingPaymaster v0.6")) + + 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") + }) + .then(() => console.log("Funded VerifyingPaymaster V0.6")) + + return verifyingPaymaster +} diff --git a/mock-verifying-paymaster/src/index.ts b/mock-verifying-paymaster/src/index.ts index 7d2f89f..de16703 100644 --- a/mock-verifying-paymaster/src/index.ts +++ b/mock-verifying-paymaster/src/index.ts @@ -1,53 +1,54 @@ -import cors from "@fastify/cors"; -import Fastify from "fastify"; -import { ENTRYPOINT_ADDRESS_V06, ENTRYPOINT_ADDRESS_V07 } from "permissionless"; -import { createPimlicoBundlerClient } from "permissionless/clients/pimlico"; -import { http } from "viem"; -import { getAnvilWalletClient, getChain } from "./helpers/utils"; +import cors from "@fastify/cors" +import Fastify from "fastify" +import { ENTRYPOINT_ADDRESS_V06, ENTRYPOINT_ADDRESS_V07 } from "permissionless" +import { createPimlicoBundlerClient } from "permissionless/clients/pimlico" +import { http } from "viem" +import { foundry } from "viem/chains" +import { getAnvilWalletClient } from "./helpers/utils" import { - setupVerifyingPaymasterV06, - setupVerifyingPaymasterV07, -} from "./helpers/verifyingPaymasters"; -import { createRpcHandler } from "./relay"; + setupVerifyingPaymasterV06, + setupVerifyingPaymasterV07 +} from "./helpers/verifyingPaymasters" +import { createRpcHandler } from "./relay" const main = async () => { - const walletClient = await getAnvilWalletClient(); - const verifyingPaymasterV07 = await setupVerifyingPaymasterV07(walletClient); - const verifyingPaymasterV06 = await setupVerifyingPaymasterV06(walletClient); - - const altoBundlerV07 = createPimlicoBundlerClient({ - chain: await getChain(), - transport: http(process.env.ALTO_RPC), - entryPoint: ENTRYPOINT_ADDRESS_V07, - }); - - const altoBundlerV06 = createPimlicoBundlerClient({ - chain: await getChain(), - transport: http(process.env.ALTO_RPC), - entryPoint: ENTRYPOINT_ADDRESS_V06, - }); - - const app = Fastify({}); - - app.register(cors, { - origin: "*", - methods: ["POST", "GET", "OPTIONS"], - }); - - const rpcHandler = createRpcHandler( - altoBundlerV07, - altoBundlerV06, - verifyingPaymasterV07, - verifyingPaymasterV06, - walletClient, - ); - app.post("/", {}, rpcHandler); - - app.get("/ping", async (_request, reply) => { - return reply.code(200).send({ message: "pong" }); - }); - - await app.listen({ host: "0.0.0.0", port: 3000 }); -}; - -main(); + const walletClient = getAnvilWalletClient() + const verifyingPaymasterV07 = await setupVerifyingPaymasterV07(walletClient) + const verifyingPaymasterV06 = await setupVerifyingPaymasterV06(walletClient) + + const altoBundlerV07 = createPimlicoBundlerClient({ + chain: foundry, + transport: http(process.env.ALTO_RPC), + entryPoint: ENTRYPOINT_ADDRESS_V07 + }) + + const altoBundlerV06 = createPimlicoBundlerClient({ + chain: foundry, + transport: http(process.env.ALTO_RPC), + entryPoint: ENTRYPOINT_ADDRESS_V06 + }) + + const app = Fastify({}) + + app.register(cors, { + origin: "*", + methods: ["POST", "GET", "OPTIONS"] + }) + + const rpcHandler = createRpcHandler( + altoBundlerV07, + altoBundlerV06, + verifyingPaymasterV07, + verifyingPaymasterV06, + walletClient + ) + app.post("/", {}, rpcHandler) + + app.get("/ping", async (_request, reply) => { + return reply.code(200).send({ message: "pong" }) + }) + + await app.listen({ host: "0.0.0.0", port: 3000 }) +} + +main() diff --git a/mock-verifying-paymaster/src/relay.ts b/mock-verifying-paymaster/src/relay.ts index 37e92c7..849c3dc 100644 --- a/mock-verifying-paymaster/src/relay.ts +++ b/mock-verifying-paymaster/src/relay.ts @@ -1,319 +1,343 @@ -import type { FastifyReply, FastifyRequest } from "fastify"; +import util from "node:util" +import type { FastifyReply, FastifyRequest } from "fastify" import { - ENTRYPOINT_ADDRESS_V07, - type EstimateUserOperationGasReturnType, - getPackedUserOperation, -} from "permissionless"; -import type { PimlicoBundlerClient } from "permissionless/clients/pimlico"; + ENTRYPOINT_ADDRESS_V07, + type EstimateUserOperationGasReturnType, + getPackedUserOperation +} from "permissionless" +import type { PimlicoBundlerClient } from "permissionless/clients/pimlico" import type { - ENTRYPOINT_ADDRESS_V06_TYPE, - ENTRYPOINT_ADDRESS_V07_TYPE, - UserOperation, -} from "permissionless/types"; -import { ENTRYPOINT_ADDRESS_V06 } from "permissionless/utils"; + ENTRYPOINT_ADDRESS_V06_TYPE, + ENTRYPOINT_ADDRESS_V07_TYPE, + UserOperation +} from "permissionless/types" +import { ENTRYPOINT_ADDRESS_V06 } from "permissionless/utils" import { - type Account, - type Chain, - type GetContractReturnType, - type Hex, - type PublicClient, - RpcRequestError, - type Transport, - type WalletClient, - concat, - encodeAbiParameters, - toHex, -} from "viem"; -import { fromZodError } from "zod-validation-error"; + type Account, + BaseError, + type Chain, + type GetContractReturnType, + type Hex, + type PublicClient, + type RpcRequestError, + type Transport, + type WalletClient, + concat, + encodeAbiParameters, + toHex +} from "viem" +import { fromZodError } from "zod-validation-error" import type { - VERIFYING_PAYMASTER_V06_ABI, - VERIFYING_PAYMASTER_V07_ABI, -} from "./helpers/abi"; + VERIFYING_PAYMASTER_V06_ABI, + VERIFYING_PAYMASTER_V07_ABI +} from "./helpers/abi" import { - InternalBundlerError, - RpcError, - jsonRpcSchema, - pmSponsorUserOperationParamsSchema, - returnInvalidRequestParams, -} from "./helpers/schema"; -import { isVersion06, isVersion07 } from "./helpers/utils"; + InternalBundlerError, + type JsonRpcSchema, + RpcError, + ValidationErrors, + jsonRpcSchema, + pmSponsorUserOperationParamsSchema +} from "./helpers/schema" const handleMethodV06 = async ( - userOperation: UserOperation<"v0.6">, - altoBundlerV06: PimlicoBundlerClient, - verifyingPaymasterV06: GetContractReturnType< - typeof VERIFYING_PAYMASTER_V06_ABI, - PublicClient - >, - walletClient: WalletClient, - reply: FastifyReply, - id: number, + userOperation: UserOperation<"v0.6">, + altoBundlerV06: PimlicoBundlerClient, + verifyingPaymasterV06: GetContractReturnType< + typeof VERIFYING_PAYMASTER_V06_ABI, + PublicClient + >, + walletClient: WalletClient ) => { - const opToSimulate = { - ...userOperation, - paymasterAndData: concat([ - verifyingPaymasterV06.address, - "0x000000000000000000000000000000000000000000000000000000006602f66a0000000000000000000000000000000000000000000000000000000000000000dba7a71bd49ae0174b1e4577b28f8b7c262d4085cfa192f1c19b516c85d2d1ef17eadeb549d71caf5d5f24fb6519088c1c13427343843131dd6ec19a3c6a350e1b", - ]), - }; + const opToSimulate = { + ...userOperation, + paymasterAndData: concat([ + verifyingPaymasterV06.address, + "0x000000000000000000000000000000000000000000000000000000006602f66a0000000000000000000000000000000000000000000000000000000000000000dba7a71bd49ae0174b1e4577b28f8b7c262d4085cfa192f1c19b516c85d2d1ef17eadeb549d71caf5d5f24fb6519088c1c13427343843131dd6ec19a3c6a350e1b" + ]) + } - let gasEstimates: - | EstimateUserOperationGasReturnType - | undefined = undefined; - try { - gasEstimates = await altoBundlerV06.estimateUserOperationGas({ - userOperation: opToSimulate, - }); - } catch (e: unknown) { - if (e instanceof RpcRequestError) { - reply.status(400).send(new RpcError(e.details, e.code)); - return; - } - reply.status(500).send(new InternalBundlerError()); - return; - } - const op = { - ...opToSimulate, - ...gasEstimates, - }; - const validAfter = 0; - const validUntil = 0; - op.paymasterAndData = concat([ - verifyingPaymasterV06.address, - encodeAbiParameters( - [ - { name: "validUntil", type: "uint48" }, - { name: "validAfter", type: "uint48" }, - ], - [validUntil, validAfter], - ), - toHex(0, { size: 65 }), - ]); - const hash = await verifyingPaymasterV06.read.getHash([ - op, - 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, - ]); + let gasEstimates: + | EstimateUserOperationGasReturnType + | undefined = undefined + try { + gasEstimates = await altoBundlerV06.estimateUserOperationGas({ + userOperation: opToSimulate + }) + } catch (e: unknown) { + if (!(e instanceof BaseError)) throw new InternalBundlerError() + const err = e.walk() as RpcRequestError + throw err + } - const { verificationGasLimit, preVerificationGas, callGasLimit } = - gasEstimates; + const op = { + ...opToSimulate, + ...gasEstimates + } + 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 verifyingPaymasterV06.read.getHash([ + op, + 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(preVerificationGas), - callGasLimit: toHex(callGasLimit), - verificationGasLimit: toHex(verificationGasLimit || 0), - paymasterAndData, - }; + const { verificationGasLimit, preVerificationGas, callGasLimit } = + gasEstimates - return { - jsonrpc: "2.0", - id, - result, - }; -}; + const result = { + preVerificationGas: toHex(preVerificationGas), + callGasLimit: toHex(callGasLimit), + verificationGasLimit: toHex(verificationGasLimit || 0), + paymasterAndData + } + + return result +} const handleMethodV07 = async ( - userOperation: UserOperation<"v0.7">, - altoBundlerV07: PimlicoBundlerClient, - verifyingPaymasterV07: GetContractReturnType< - typeof VERIFYING_PAYMASTER_V07_ABI, - PublicClient - >, - walletClient: WalletClient, - reply: FastifyReply, - id: number, + userOperation: UserOperation<"v0.7">, + altoBundlerV07: PimlicoBundlerClient, + verifyingPaymasterV07: GetContractReturnType< + typeof VERIFYING_PAYMASTER_V07_ABI, + PublicClient + >, + walletClient: WalletClient ) => { - const opToSimulate = { - ...userOperation, - paymaster: verifyingPaymasterV07.address, - paymasterData: - "0x000000000000000000000000000000000000000000000000000000006602f66a0000000000000000000000000000000000000000000000000000000000000000dba7a71bd49ae0174b1e4577b28f8b7c262d4085cfa192f1c19b516c85d2d1ef17eadeb549d71caf5d5f24fb6519088c1c13427343843131dd6ec19a3c6a350e1b" as Hex, - }; + const opToSimulate = { + ...userOperation, + paymaster: verifyingPaymasterV07.address, + paymasterData: + "0x000000000000000000000000000000000000000000000000000000006602f66a0000000000000000000000000000000000000000000000000000000000000000dba7a71bd49ae0174b1e4577b28f8b7c262d4085cfa192f1c19b516c85d2d1ef17eadeb549d71caf5d5f24fb6519088c1c13427343843131dd6ec19a3c6a350e1b" as Hex + } - let gasEstimates: - | EstimateUserOperationGasReturnType - | undefined = undefined; - try { - gasEstimates = await altoBundlerV07.estimateUserOperationGas({ - userOperation: opToSimulate, - }); - } catch (e: unknown) { - if (e instanceof RpcRequestError) { - reply.status(400).send(new RpcError(e.details, e.code)); - return; - } - reply.status(500).send(new InternalBundlerError()); - return; - } - const op = { - ...opToSimulate, - ...gasEstimates, - }; - 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 verifyingPaymasterV07.read.getHash([ - 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, - ]); + let gasEstimates: + | EstimateUserOperationGasReturnType + | undefined = undefined + try { + gasEstimates = await altoBundlerV07.estimateUserOperationGas({ + userOperation: opToSimulate + }) + } catch (e: unknown) { + if (!(e instanceof BaseError)) throw new InternalBundlerError() + const err = e.walk() as RpcRequestError + throw err + } - const { - paymasterVerificationGasLimit, - verificationGasLimit, - preVerificationGas, - callGasLimit, - paymasterPostOpGasLimit, - } = gasEstimates; + const op = { + ...opToSimulate, + ...gasEstimates + } + 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 verifyingPaymasterV07.read.getHash([ + 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(preVerificationGas), - callGasLimit: toHex(callGasLimit), - paymasterVerificationGasLimit: toHex(paymasterVerificationGasLimit || 0), - paymasterPostOpGasLimit: toHex(paymasterPostOpGasLimit || 0), - verificationGasLimit: toHex(verificationGasLimit || 0), - paymaster, - paymasterData, - }; + const { + paymasterVerificationGasLimit, + verificationGasLimit, + preVerificationGas, + callGasLimit, + paymasterPostOpGasLimit + } = gasEstimates - return { - jsonrpc: "2.0", - id, - result, - }; -}; + const result = { + preVerificationGas: toHex(preVerificationGas), + callGasLimit: toHex(callGasLimit), + paymasterVerificationGasLimit: toHex( + paymasterVerificationGasLimit || 0 + ), + paymasterPostOpGasLimit: toHex(paymasterPostOpGasLimit || 0), + verificationGasLimit: toHex(verificationGasLimit || 0), + paymaster, + paymasterData + } -export const createRpcHandler = ( - altoBundlerV07: PimlicoBundlerClient, - altoBundlerV06: PimlicoBundlerClient, - verifyingPaymasterV07: GetContractReturnType< - typeof VERIFYING_PAYMASTER_V07_ABI, - PublicClient - >, - verifyingPaymasterV06: GetContractReturnType< - typeof VERIFYING_PAYMASTER_V06_ABI, - PublicClient - >, - walletClient: WalletClient, + return result +} + +const handleMethod = async ( + altoBundlerV07: PimlicoBundlerClient, + altoBundlerV06: PimlicoBundlerClient, + verifyingPaymasterV07: GetContractReturnType< + typeof VERIFYING_PAYMASTER_V07_ABI, + PublicClient + >, + verifyingPaymasterV06: GetContractReturnType< + typeof VERIFYING_PAYMASTER_V06_ABI, + PublicClient + >, + walletClient: WalletClient, + parsedBody: JsonRpcSchema ) => { - return async (request: FastifyRequest, reply: FastifyReply) => { - console.log(`received request: ${JSON.stringify(request.body)}`); + if (parsedBody.method === "pm_sponsorUserOperation") { + const params = pmSponsorUserOperationParamsSchema.safeParse( + parsedBody.params + ) + + if (!params.success) { + throw new RpcError( + fromZodError(params.error).message, + ValidationErrors.InvalidFields + ) + } - const body = request.body; - const parsedBody = jsonRpcSchema.safeParse(body); - if (!parsedBody.success) { - returnInvalidRequestParams(reply, fromZodError(parsedBody.error).message); - return; - } + const [userOperation, entryPoint] = params.data - if (parsedBody.data.method === "pm_sponsorUserOperation") { - const params = pmSponsorUserOperationParamsSchema.safeParse( - parsedBody.data.params, - ); + if (entryPoint === ENTRYPOINT_ADDRESS_V07) { + return await handleMethodV07( + userOperation as UserOperation<"v0.7">, + altoBundlerV07, + verifyingPaymasterV07, + walletClient + ) + } - if (!params.success) { - returnInvalidRequestParams(reply, fromZodError(params.error).message); - return; - } + if (entryPoint === ENTRYPOINT_ADDRESS_V06) { + return await handleMethodV06( + userOperation as UserOperation<"v0.6">, + altoBundlerV06, + verifyingPaymasterV06, + walletClient + ) + } - const [userOperation, entryPoint] = params.data; + throw new RpcError( + "EntryPoint not supported", + ValidationErrors.InvalidFields + ) + } - if ( - entryPoint !== ENTRYPOINT_ADDRESS_V06 && - entryPoint !== ENTRYPOINT_ADDRESS_V07 - ) { - returnInvalidRequestParams(reply, "Unsupported EntryPoint"); - return; - } + if (parsedBody.method === "pm_validateSponsorshipPolicies") { + return [ + { + sponsorshipPolicyId: "sp_crazy_kangaroo", + data: { + name: "Free ops for devs", + author: "foo", + icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==", + description: "Free userOps :)" + } + } + ] + } - if (isVersion07(userOperation)) { - return await handleMethodV07( - userOperation, - altoBundlerV07, - verifyingPaymasterV07, - walletClient, - reply, - parsedBody.data.id, - ); - } + throw new RpcError( + "Attempted to call an unknown method", + ValidationErrors.InvalidFields + ) +} + +export const createRpcHandler = ( + altoBundlerV07: PimlicoBundlerClient, + altoBundlerV06: PimlicoBundlerClient, + verifyingPaymasterV07: GetContractReturnType< + typeof VERIFYING_PAYMASTER_V07_ABI, + PublicClient + >, + verifyingPaymasterV06: GetContractReturnType< + typeof VERIFYING_PAYMASTER_V06_ABI, + PublicClient + >, + walletClient: WalletClient +) => { + return async (request: FastifyRequest, _reply: FastifyReply) => { + console.log(`received request: ${JSON.stringify(request.body)}`) - if (isVersion06(userOperation)) { - return await handleMethodV06( - userOperation, - altoBundlerV06, - verifyingPaymasterV06, - walletClient, - reply, - parsedBody.data.id, - ); - } + const body = request.body + const parsedBody = jsonRpcSchema.safeParse(body) + if (!parsedBody.success) { + throw new RpcError( + fromZodError(parsedBody.error).message, + ValidationErrors.InvalidFields + ) + } - reply - .status(400) - .send(new RpcError("Failed pm_sponsorUserOperation", 404)); + try { + const result = await handleMethod( + altoBundlerV07, + altoBundlerV06, + verifyingPaymasterV07, + verifyingPaymasterV06, + walletClient, + parsedBody.data + ) - return; - } + return { + jsonrpc: "2.0", + id: parsedBody.data.id, + result + } + } catch (err: unknown) { + console.log(`JSON.stringify(err): ${util.inspect(err)}`) - if (parsedBody.data.method === "pm_validateSponsorshipPolicies") { - return { - jsonrpc: parsedBody.data.jsonrpc, - id: parsedBody.data.id, - result: [ - { - sponsorshipPolicyId: "sp_crazy_kangaroo", - data: { - name: "Linea Christmas Week", - author: "Linea", - icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==", - description: - "Linea is sponsoring the first 10 transactions for existing users between Christmas and New Year's Eve.", - }, - }, - ], - }; - } + const error = { + // biome-ignore lint/suspicious/noExplicitAny: + message: (err as any).message, + // biome-ignore lint/suspicious/noExplicitAny: + data: (err as any).data, + // biome-ignore lint/suspicious/noExplicitAny: + code: (err as any).code ?? -32603 + } - // Endpoint not supported - console.log("Endpoint not supported"); - reply.status(400).send(new RpcError("Endpoint not supported", 404)); - }; -}; + return { + jsonrpc: "2.0", + id: parsedBody.data.id, + error + } + } + } +}