From 397bd07b5010a35f3ba7328a6544e33fe56ed8f4 Mon Sep 17 00:00:00 2001 From: WhiteOakKong Date: Mon, 30 Oct 2023 10:53:01 -0500 Subject: [PATCH 1/7] add yarn aabenchmark --- .gitmodules | 6 ++ foundry.toml | 3 + package.json | 3 +- .../utils/AABenchmarkArtifacts.sol | 14 ++++ .../smart-wallet/utils/AABenchmarkPrepare.sol | 82 +++++++++++++++++++ .../smart-wallet/utils/AABenchmarkTest.t.sol | 44 ++++++++++ 6 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 src/test/smart-wallet/utils/AABenchmarkArtifacts.sol create mode 100644 src/test/smart-wallet/utils/AABenchmarkPrepare.sol create mode 100644 src/test/smart-wallet/utils/AABenchmarkTest.t.sol diff --git a/.gitmodules b/.gitmodules index 6e01eb969..5839cb25a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -24,3 +24,9 @@ [submodule "lib/dynamic-contracts"] path = lib/dynamic-contracts url = https://github.com/thirdweb-dev/dynamic-contracts +[submodule "lib/aa-benchmark"] + path = lib/aa-benchmark + url = https://github.com/zerodevapp/aa-benchmark +[submodule "lib/solady"] + path = lib/solady + url = https://github.com/Vectorized/solady diff --git a/foundry.toml b/foundry.toml index aa51c2565..eb676173f 100644 --- a/foundry.toml +++ b/foundry.toml @@ -39,7 +39,10 @@ remappings = [ 'erc721a/=lib/ERC721A/', '@thirdweb-dev/dynamic-contracts/=lib/dynamic-contracts/', 'lib/sstore2=lib/dynamic-contracts/lib/sstore2/' + 'aa-benchmark/=lib/aa-benchmark/', + 'solady/=lib/solady/src/' ] +fs_permissions = [{ access = "read-write", path = "./src/test/smart-wallet/utils"}] src = 'contracts' test = 'src/test' verbosity = 0 diff --git a/package.json b/package.json index 2cc66d2a6..01dce3054 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,8 @@ "forge:build": "forge build", "forge:test": "forge test", "gas": "forge test --mc Benchmark --gas-report > gasreport.txt", - "forge:snapshot": "forge snapshot --check" + "forge:snapshot": "forge snapshot --check", + "aabenchmark": "forge test --mc AABenchmarkPrepare && forge test --mc ProfileThirdwebAccount -vvv" }, "dependencies": {} } diff --git a/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol new file mode 100644 index 000000000..c63e61855 --- /dev/null +++ b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol @@ -0,0 +1,14 @@ + +pragma solidity ^0.8.0; +interface ThirdwebAccountFactory { + function createAccount(address _admin, bytes calldata _data) external returns (address); + function getAddress(address _adminSigner, bytes calldata _data) external view returns (address); +} +interface ThirdwebAccount { + function execute(address _target, uint256 _value, bytes calldata _calldata) external; +} +address constant THIRDWEB_ACCOUNT_FACTORY_ADDRESS = 0x2e234DAe75C793f67A35089C9d99245E1C58470b; +address constant THIRDWEB_ACCOUNT_IMPL_ADDRESS = 0xffD4505B3452Dc22f8473616d50503bA9E1710Ac; +bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"608060405234801561001057600080fd5b50600436106101125760003560e01c806308e93d0a146101175780630db33003146101355780630e6254fd1461014a57806311464fbe1461015d578063248a9ca3146101915780632f2ff15d146101b257806336568abe146101c557806367793cc6146101d85780638878ed33146101eb5780639010d07c146101fe57806391d1485414610211578063938e3d7b146102345780639ddbb9d814610247578063a217fddf1461025a578063a32fa5b314610262578063a65d69d414610275578063ac9650d81461029c578063c3c5a547146102bc578063ca15c873146102cf578063d547741f146102e2578063d8fd8f44146102f5578063e8a3d48514610308575b600080fd5b61011f61031d565b60405161012c91906117d7565b60405180910390f35b6101486101433660046118eb565b61032e565b005b61011f610158366004611948565b6103d1565b6101847f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac81565b60405161012c9190611963565b6101a461019f366004611977565b6103fb565b60405190815260200161012c565b6101486101c0366004611990565b610419565b6101486101d3366004611990565b6104c3565b6101486101e63660046119bc565b610522565b6101846101f9366004611a09565b610576565b61018461020c366004611a8b565b6105f0565b61022461021f366004611990565b6106ff565b604051901515815260200161012c565b610148610242366004611aad565b610733565b6101486102553660046118eb565b610784565b6101a4600081565b610224610270366004611990565b61081d565b6101847f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278981565b6102af6102aa366004611afd565b610880565b60405161012c9190611bcd565b6102246102ca366004611948565b610974565b6101a46102dd366004611977565b610980565b6101486102f0366004611990565b610a1d565b610184610303366004611a09565b610a28565b610310610b73565b60405161012c9190611c2f565b60606103296000610cfa565b905090565b3361033a818484610d07565b61035f5760405162461bcd60e51b815260040161035690611c42565b60405180910390fd5b6001600160a01b03841660009081526002602052604081206103819083610d5b565b905080156103ca57846001600160a01b0316826001600160a01b03167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a35b5050505050565b6001600160a01b03811660009081526002602052604090206060906103f590610cfa565b92915050565b6000610405610d70565b600092835260010160205250604090205490565b61043d610424610d70565b6000848152600191909101602052604090205433610d7a565b610445610d70565b6000838152602091825260408082206001600160a01b0385168352909252205460ff16156104b55760405162461bcd60e51b815260206004820152601d60248201527f43616e206f6e6c79206772616e7420746f206e6f6e20686f6c646572730000006044820152606401610356565b6104bf8282610dff565b5050565b336001600160a01b038216146105185760405162461bcd60e51b815260206004820152601a60248201527921b0b71037b7363c903932b737bab731b2903337b91039b2b63360311b6044820152606401610356565b6104bf8282610e13565b3361052e818484610d07565b61054a5760405162461bcd60e51b815260040161035690611c42565b610555600082610e27565b6105715760405162461bcd60e51b815260040161035690611c79565b505050565b6000806105b98585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e3c92505050565b90506105e57f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac82610e6d565b9150505b9392505050565b6000806105fb610ecd565b600085815260209190915260408120549150805b828110156106f6576000610621610ecd565b60008881526020918252604080822085835260010190925220546001600160a01b03161461069a578482141561068857610659610ecd565b600087815260209182526040808220938252600190930190915220546001600160a01b031692506103f5915050565b610693600183611cd9565b91506106e4565b6106a58660006106ff565b80156106d157506106b4610ecd565b600087815260209182526040808220828052600201909252205481145b156106e4576106e1600183611cd9565b91505b6106ef600182611cd9565b905061060f565b50505092915050565b6000610709610d70565b6000938452602090815260408085206001600160a01b039490941685529290525090205460ff1690565b61073b610ed7565b6107785760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401610356565b61078181610ee3565b50565b33610790818484610d07565b6107ac5760405162461bcd60e51b815260040161035690611c42565b6001600160a01b03841660009081526002602052604081206107ce9083610e27565b905080156103ca57846001600160a01b0316826001600160a01b03167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35050505050565b6000610827610d70565b600084815260209182526040808220828052909252205460ff166108775761084d610d70565b6000848152602091825260408082206001600160a01b0386168352909252205460ff1690506103f5565b50600192915050565b6060816001600160401b0381111561089a5761089a611840565b6040519080825280602002602001820160405280156108cd57816020015b60608152602001906001900390816108b85790505b50905060005b8281101561096d5761093d308585848181106108f1576108f1611cf1565b90506020028101906109039190611d07565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fce92505050565b82828151811061094f5761094f611cf1565b6020026020010181905250808061096590611d54565b9150506108d3565b5092915050565b60006103f58183610ff3565b60008061098b610ecd565b6000848152602091909152604081205491505b818110156109f85760006109b0610ecd565b60008681526020918252604080822085835260010190925220546001600160a01b0316146109e6576109e3600184611cd9565b92505b6109f1600182611cd9565b905061099e565b50610a048360006106ff565b15610a1757610a14600183611cd9565b91505b50919050565b610518610424610d70565b6000807f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac90506000610a908686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e3c92505050565b90506000610a9e8383610e6d565b90506001600160a01b0381163b15610aba5792506105e9915050565b610ac48383611015565b9050336001600160a01b037f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27891614610b1d57610b01600082610e27565b610b1d5760405162461bcd60e51b815260040161035690611c79565b610b29818888886110ac565b866001600160a01b0316816001600160a01b03167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a39695505050505050565b6060610b7d611114565b8054610b8890611d6f565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb490611d6f565b8015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b5050505050905090565b6001610c15610d70565b6000848152602091825260408082206001600160a01b0386168084529352808220805460ff1916941515949094179093559151339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b7f0a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e50090565b60008060ff19610cc960017f0c4ba382c0009cf238e4c1ca1a52f51c61e6248a70bdfb34e5ed49d5578a5c0c611da4565b604051602001610cdb91815260200190565b60408051601f1981840301815291905280516020909101201692915050565b606060006105e983611138565b600080610d148484610e3c565b90506000610d427f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac83610e6d565b6001600160a01b03878116911614925050509392505050565b60006105e9836001600160a01b038416611194565b6000610329610c74565b610d82610d70565b6000838152602091825260408082206001600160a01b0385168352909252205460ff166104bf57610dbd816001600160a01b03166014611287565b610dc8836020611287565b604051602001610dd9929190611dbb565b60408051601f198184030181529082905262461bcd60e51b825261035691600401611c2f565b610e098282610c0b565b6104bf8282611422565b610e1d82826114e1565b6104bf828261154a565b60006105e9836001600160a01b0384166115d9565b600082604051602001610e4f9190611963565b60405160208183030381529060405280519060200120905092915050565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff602482015260148101839052733d602d80600a3d3981f3363d3d373d3d3d363d738152605881018290526037600c820120607882015260556043909101206000906105e9565b6000610329610c98565b600061032981336106ff565b6000610eed611114565b8054610ef890611d6f565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2490611d6f565b8015610f715780601f10610f4657610100808354040283529160200191610f71565b820191906000526020600020905b815481529060010190602001808311610f5457829003601f168201915b5050505050905081610f81611114565b8151610f90926020019061173e565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051610fc2929190611e28565b60405180910390a15050565b60606105e98383604051806060016040528060278152602001611ef660279139611628565b6001600160a01b038116600090815260018301602052604081205415156105e9565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166103f55760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610356565b60405163347d5e2560e21b81526001600160a01b0385169063d1f57894906110dc90869086908690600401611e4d565b600060405180830381600087803b1580156110f657600080fd5b505af115801561110a573d6000803e3d6000fd5b5050505050505050565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b60608160000180548060200260200160405190810160405280929190818152602001828054801561118857602002820191906000526020600020905b815481526020019060010190808311611174575b50505050509050919050565b6000818152600183016020526040812054801561127d5760006111b8600183611da4565b85549091506000906111cc90600190611da4565b90508181146112315760008660000182815481106111ec576111ec611cf1565b906000526020600020015490508087600001848154811061120f5761120f611cf1565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061124257611242611e8d565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506103f5565b60009150506103f5565b60606000611296836002611ea3565b6112a1906002611cd9565b6001600160401b038111156112b8576112b8611840565b6040519080825280601f01601f1916602001820160405280156112e2576020820181803683370190505b509050600360fc1b816000815181106112fd576112fd611cf1565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061132c5761132c611cf1565b60200101906001600160f81b031916908160001a9053506000611350846002611ea3565b61135b906001611cd9565b90505b60018111156113d3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061138f5761138f611cf1565b1a60f81b8282815181106113a5576113a5611cf1565b60200101906001600160f81b031916908160001a90535060049490941c936113cc81611ec2565b905061135e565b5083156105e95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610356565b600061142c610ecd565b6000848152602091909152604090205490506001611448610ecd565b6000858152602091909152604081208054909190611467908490611cd9565b90915550829050611476610ecd565b6000858152602091825260408082208583526001019092522080546001600160a01b0319166001600160a01b0392909216919091179055806114b6610ecd565b6000948552602090815260408086206001600160a01b03909516865260029094019052919092205550565b6114eb8282610d7a565b6114f3610d70565b6000838152602091825260408082206001600160a01b0385168084529352808220805460ff191690555133929185917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000611554610ecd565b6000848152602091825260408082206001600160a01b038616835260020190925220549050611581610ecd565b6000848152602091825260408082208483526001019092522080546001600160a01b03191690556115b0610ecd565b6000938452602090815260408085206001600160a01b0390941685526002909301905250812055565b6000818152600183016020526040812054611620575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556103f5565b5060006103f5565b60606001600160a01b0384163b6116905760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610356565b600080856001600160a01b0316856040516116ab9190611ed9565b600060405180830381855af49150503d80600081146116e6576040519150601f19603f3d011682016040523d82523d6000602084013e6116eb565b606091505b50915091506116fb828286611705565b9695505050505050565b606083156117145750816105e9565b8251156117245782518084602001fd5b8160405162461bcd60e51b81526004016103569190611c2f565b82805461174a90611d6f565b90600052602060002090601f01602090048101928261176c57600085556117b2565b82601f1061178557805160ff19168380011785556117b2565b828001600101855582156117b2579182015b828111156117b2578251825591602001919060010190611797565b506117be9291506117c2565b5090565b5b808211156117be57600081556001016117c3565b6020808252825182820181905260009190848201906040850190845b818110156118185783516001600160a01b0316835292840192918401916001016117f3565b50909695505050505050565b80356001600160a01b038116811461183b57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561187057611870611840565b604051601f8501601f19908116603f0116810190828211818310171561189857611898611840565b816040528093508581528686860111156118b157600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126118dc57600080fd5b6105e983833560208501611856565b60008060006060848603121561190057600080fd5b61190984611824565b925061191760208501611824565b915060408401356001600160401b0381111561193257600080fd5b61193e868287016118cb565b9150509250925092565b60006020828403121561195a57600080fd5b6105e982611824565b6001600160a01b0391909116815260200190565b60006020828403121561198957600080fd5b5035919050565b600080604083850312156119a357600080fd5b823591506119b360208401611824565b90509250929050565b600080604083850312156119cf57600080fd5b6119d883611824565b915060208301356001600160401b038111156119f357600080fd5b6119ff858286016118cb565b9150509250929050565b600080600060408486031215611a1e57600080fd5b611a2784611824565b925060208401356001600160401b0380821115611a4357600080fd5b818601915086601f830112611a5757600080fd5b813581811115611a6657600080fd5b876020828501011115611a7857600080fd5b6020830194508093505050509250925092565b60008060408385031215611a9e57600080fd5b50508035926020909101359150565b600060208284031215611abf57600080fd5b81356001600160401b03811115611ad557600080fd5b8201601f81018413611ae657600080fd5b611af584823560208401611856565b949350505050565b60008060208385031215611b1057600080fd5b82356001600160401b0380821115611b2757600080fd5b818501915085601f830112611b3b57600080fd5b813581811115611b4a57600080fd5b8660208260051b8501011115611b5f57600080fd5b60209290920196919550909350505050565b60005b83811015611b8c578181015183820152602001611b74565b83811115611b9b576000848401525b50505050565b60008151808452611bb9816020860160208601611b71565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611c2257603f19888603018452611c10858351611ba1565b94509285019290850190600101611bf4565b5092979650505050505050565b6020815260006105e96020830184611ba1565b6020808252601f908201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e00604082015260600190565b6020808252602a908201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206040820152691c9959da5cdd195c995960b21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611cec57611cec611cc3565b500190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611d1e57600080fd5b8301803591506001600160401b03821115611d3857600080fd5b602001915036819003821315611d4d57600080fd5b9250929050565b6000600019821415611d6857611d68611cc3565b5060010190565b600181811c90821680611d8357607f821691505b60208210811415610a1757634e487b7160e01b600052602260045260246000fd5b600082821015611db657611db6611cc3565b500390565b7402832b936b4b9b9b4b7b7399d1030b1b1b7bab73a1605d1b815260008351611deb816015850160208801611b71565b7001034b99036b4b9b9b4b733903937b6329607d1b6015918401918201528351611e1c816026840160208801611b71565b01602601949350505050565b604081526000611e3b6040830185611ba1565b82810360208401526105e58185611ba1565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b634e487b7160e01b600052603160045260246000fd5b6000816000190483118215151615611ebd57611ebd611cc3565b500290565b600081611ed157611ed1611cc3565b506000190190565b60008251611eeb818460208701611b71565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212205d3e29505e958fbe45e9de9dcaceef129bcbdeb4391a97796b4016eda66dfb4764736f6c634300080c0033"; +bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"6080604052600436106101405760003560e01c806301ffc9a71461014c578063150b7a02146101815780631626ba7e146101c55780631dd756c5146101e557806324d7806c146102055780633a871cdd1461022557806347e1da2a146102535780634a58db19146102755780634d44560d1461027d5780635892e2361461029d5780637dff5a79146102bd5780638b52d723146102dd578063938e3d7b146102ff578063a9082d841461031f578063ac9650d81461035e578063b0d691fe1461038b578063b61d27f6146103ad578063b76464d5146103cd578063bc197c81146103ed578063c45a015514610419578063d087d2881461044d578063d1f5789414610462578063d42f2f3514610482578063e8a3d48514610497578063e9523c97146104b9578063f15d424e146104db578063f23a6e611461050857600080fd5b3661014757005b600080fd5b34801561015857600080fd5b5061016c610167366004612cd5565b610534565b60405190151581526020015b60405180910390f35b34801561018d57600080fd5b506101ac61019c366004612de1565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610178565b3480156101d157600080fd5b506101ac6101e0366004612e4c565b61057a565b3480156101f157600080fd5b5061016c610200366004612eab565b610689565b34801561021157600080fd5b5061016c610220366004612ef0565b610963565b34801561023157600080fd5b50610245610240366004612f0d565b610992565b604051908152602001610178565b34801561025f57600080fd5b5061027361026e366004612f9e565b6109b8565b005b610273610b29565b34801561028957600080fd5b50610273610298366004613037565b610b91565b3480156102a957600080fd5b506102736102b83660046130a4565b610c0a565b3480156102c957600080fd5b5061016c6102d8366004612ef0565b610fc7565b3480156102e957600080fd5b506102f2611080565b60405161017891906131b7565b34801561030b57600080fd5b5061027361031a366004613219565b6112c7565b34801561032b57600080fd5b5061033f61033a3660046130a4565b611318565b6040805192151583526001600160a01b03909116602083015201610178565b34801561036a57600080fd5b5061037e610379366004613261565b61136f565b60405161017891906132fe565b34801561039757600080fd5b506103a0611463565b6040516101789190613353565b3480156103b957600080fd5b506102736103c8366004613367565b6114ac565b3480156103d957600080fd5b506102736103e8366004612ef0565b61153c565b3480156103f957600080fd5b506101ac610408366004613450565b63bc197c8160e01b95945050505050565b34801561042557600080fd5b506103a07f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b81565b34801561045957600080fd5b5061024561156e565b34801561046e57600080fd5b5061027361047d3660046134fd565b6115ee565b34801561048e57600080fd5b506102f2611787565b3480156104a357600080fd5b506104ac6118f8565b6040516101789190613544565b3480156104c557600080fd5b506104ce611990565b6040516101789190613557565b3480156104e757600080fd5b506104fb6104f6366004612ef0565b6119a2565b60405161017891906135a4565b34801561051457600080fd5b506101ac6105233660046135b7565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b148061056557506001600160e01b03198216630a85bd0160e11b145b80610574575061057482611a9e565b92915050565b6000806105878484611ad3565b905061059281610963565b156105a75750630b135d3f60e11b9050610574565b3360006105b2611af7565b6001600160a01b03841660009081526006919091016020526040902090506105da8183611b1b565b8061060a57506105e981611b3d565b600114801561060a575060006105ff8282611b47565b6001600160a01b0316145b6106675760405162461bcd60e51b8152602060048201526024808201527f4163636f756e743a2063616c6c6572206e6f7420617070726f7665642074617260448201526333b2ba1760e11b60648201526084015b60405180910390fd5b61067083610fc7565b1561068057630b135d3f60e11b93505b50505092915050565b6000610693611af7565b6001600160a01b0384166000908152600491909101602052604090205460ff16156106c057506001610574565b60006106ca611af7565b6001600160a01b0385166000908152600591909101602090815260408083208151606081018352815481526001909101546001600160801b0380821694830194909452600160801b9004909216908201529150610725611af7565b6006016000866001600160a01b03166001600160a01b0316815260200190815260200160002090504282602001516001600160801b03161180610775575081604001516001600160801b03164210155b80610786575061078481611b3d565b155b1561079657600092505050610574565b60006107ad6107a8606087018761361f565b611b53565b905060006107ba83611b3d565b60011480156107db575060006107d08482611b47565b6001600160a01b0316145b90506001600160e01b03198216635b0e93fb60e11b14156108535760008061080e61080960608a018a61361f565b611b8d565b9150915082610834576108218583611b1b565b6108345760009650505050505050610574565b855181111561084c5760009650505050505050610574565b5050610956565b6001600160e01b031982166323f0ed1560e11b14156109495760008061088461087f60608a018a61361f565b611bf2565b5091509150826108ee5760005b82518110156108ec576108c68382815181106108af576108af613665565b602002602001015187611b1b90919063ffffffff16565b6108da576000975050505050505050610574565b806108e481613691565b915050610891565b505b60005b82518110156109415781818151811061090c5761090c613665565b60200260200101518760000151101561092f576000975050505050505050610574565b8061093981613691565b9150506108f1565b505050610956565b6000945050505050610574565b5060019695505050505050565b600061096d611af7565b6001600160a01b03909216600090815260049290920160205250604090205460ff1690565b600061099c611c3f565b6109a68484611ca8565b90506109b182611ded565b9392505050565b6109c0611463565b6001600160a01b0316336001600160a01b031614806109e357506109e333610963565b6109ff5760405162461bcd60e51b815260040161065e906136ac565b610a07611e3a565b8481148015610a1557508483145b610a615760405162461bcd60e51b815260206004820152601d60248201527f4163636f756e743a2077726f6e67206172726179206c656e677468732e000000604482015260640161065e565b60005b85811015610b2057610b0d878783818110610a8157610a81613665565b9050602002016020810190610a969190612ef0565b868684818110610aa857610aa8613665565b90506020020135858585818110610ac157610ac1613665565b9050602002810190610ad3919061361f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f3792505050565b5080610b1881613691565b915050610a64565b50505050505050565b610b31611463565b6001600160a01b031663b760faf934306040518363ffffffff1660e01b8152600401610b5d9190613353565b6000604051808303818588803b158015610b7657600080fd5b505af1158015610b8a573d6000803e3d6000fd5b5050505050565b610b99611fa8565b610ba1611463565b60405163040b850f60e31b81526001600160a01b03848116600483015260248201849052919091169063205c2878906044015b600060405180830381600087803b158015610bee57600080fd5b505af1158015610c02573d6000803e3d6000fd5b505050505050565b6000610c196020850185612ef0565b905042610c2c60e0860160c08701613704565b6001600160801b031611158015610c5b5750610c4f610100850160e08601613704565b6001600160801b031642105b610c915760405162461bcd60e51b8152602060048201526007602482015266085c195c9a5bd960ca1b604482015260640161065e565b600080610c9f868686611318565b9150915081610cd95760405162461bcd60e51b815260040161065e906020808252600490820152632173696760e01b604082015260600190565b6001610ce3611af7565b610100880135600090815260079190910160209081526040808320805460ff1916941515949094179093559091610d1f91908901908901613730565b60ff161115610d4c576000610d3a6040880160208901613730565b60ff166001149050610b208482611fe6565b610d5583610963565b15610d8a5760405162461bcd60e51b815260206004820152600560248201526430b236b4b760d91b604482015260640161065e565b610d9f83610d96611af7565b600201906120c9565b50604051806060016040528087606001358152602001876080016020810190610dc89190613704565b6001600160801b03168152602001610de660c0890160a08a01613704565b6001600160801b03169052610df9611af7565b6001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b02931692909217600190920191909155610e6f610e4e611af7565b6001600160a01b0386166000908152600691909101602052604090206120de565b805190915060005b81811015610ed957610ec6838281518110610e9457610e94613665565b6020026020010151610ea4611af7565b6001600160a01b038916600090815260069190910160205260409020906120eb565b50610ed260018261374b565b9050610e77565b50610ee76040890189613763565b9050905060005b81811015610f6857610f55610f0660408b018b613763565b83818110610f1657610f16613665565b9050602002016020810190610f2b9190612ef0565b610f33611af7565b6001600160a01b038916600090815260069190910160205260409020906120c9565b50610f6160018261374b565b9050610eee565b50610f7288612100565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a604051610fb5919061383d565b60405180910390a35050505050505050565b600080610fd2611af7565b6001600160a01b038416600090815260059190910160209081526040918290208251606081018452815481526001909101546001600160801b03808216938301849052600160801b90910416928101929092529091504210801590611043575080604001516001600160801b031642105b80156109b157506000611078611057611af7565b6001600160a01b038616600090815260069190910160205260409020611b3d565b119392505050565b6060600061109761108f611af7565b6002016120de565b80519091506000805b82811015611128576110ca8482815181106110bd576110bd613665565b6020026020010151610fc7565b156110e157816110d981613691565b925050611116565b60008482815181106110f5576110f5613665565b60200260200101906001600160a01b031690816001600160a01b0316815250505b61112160018261374b565b90506110a0565b50806001600160401b0381111561114157611141612d24565b60405190808252806020026020018201604052801561117a57816020015b611167612bf2565b81526020019060019003908161115f5790505b5093506000805b838110156112bf5760006001600160a01b03168582815181106111a6576111a6613665565b60200260200101516001600160a01b0316146112ad5760008582815181106111d0576111d0613665565b6020026020010151905060006111e4611af7565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a08101909452918352909250810161124e610e4e611af7565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b031681525088858061128d90613691565b96508151811061129f5761129f613665565b602002602001018190525050505b6112b860018261374b565b9050611181565b505050505090565b6112cf6121a3565b61130c5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b604482015260640161065e565b611315816121bb565b50565b60008061132e611327866122a6565b85856123ea565b9050611338611af7565b6101008601356000908152600791909101602052604090205460ff16158015611365575061136581610963565b9150935093915050565b6060816001600160401b0381111561138957611389612d24565b6040519080825280602002602001820160405280156113bc57816020015b60608152602001906001900390816113a75790505b50905060005b8281101561145c5761142c308585848181106113e0576113e0613665565b90506020028101906113f2919061361f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061244492505050565b82828151811061143e5761143e613665565b6020026020010181905250808061145490613691565b9150506113c2565b5092915050565b60008061146e612469565b546001600160a01b03169050801561148557919050565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278991505090565b6114b4611463565b6001600160a01b0316336001600160a01b031614806114d757506114d733610963565b6114f35760405162461bcd60e51b815260040161065e906136ac565b6114fb611e3a565b610b8a848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f3792505050565b611544611fa8565b8061154d612469565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6000611578611463565b604051631aab3f0d60e11b8152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e99190613928565b905090565b60006115f861248d565b5460ff169050600061160861248d565b54610100900460ff1690508015808015611625575060018360ff16105b80611644575061163430612497565b15801561164457508260ff166001145b6116a75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065e565b60016116b161248d565b805460ff191660ff9290921691909117905580156116ea5760016116d361248d565b80549115156101000261ff00199092169190911790555b856116f3612469565b60010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611725866001611fe6565b8015610c0257600061173561248d565b80549115156101000261ff0019909216919091179055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b6060600061179661108f611af7565b8051909150806001600160401b038111156117b3576117b3612d24565b6040519080825280602002602001820160405280156117ec57816020015b6117d9612bf2565b8152602001906001900390816117d15790505b50925060005b818110156118f257600083828151811061180e5761180e613665565b602002602001015190506000611822611af7565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a08101909452918352909250810161188c610e4e611af7565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b03168152508684815181106118d1576118d1613665565b602002602001018190525050506001816118eb919061374b565b90506117f2565b50505090565b60606119026124a6565b805461190d90613941565b80601f016020809104026020016040519081016040528092919081815260200182805461193990613941565b80156119865780601f1061195b57610100808354040283529160200191611986565b820191906000526020600020905b81548152906001019060200180831161196957829003601f168201915b5050505050905090565b60606115e961199d611af7565b6120de565b6119aa612bf2565b60006119b4611af7565b6001600160a01b038416600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611a3f611a1e611af7565b6001600160a01b0387166000908152600691909101602052604090206120de565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030090565b60006001600160e01b03198216630271189760e51b148061057457506301ffc9a760e01b6001600160e01b0319831614610574565b6000806000611ae285856124ca565b91509150611aef81612510565b509392505050565b7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0090565b6001600160a01b038116600090815260018301602052604081205415156109b1565b6000610574825490565b60006109b18383612659565b60006004821015611b765760405162461bcd60e51b815260040161065e90613976565b611b84600460008486613995565b6109b1916139bf565b6000806044831015611bb15760405162461bcd60e51b815260040161065e90613976565b611bbf602460048587613995565b810190611bcc9190612ef0565b9150611bdc604460248587613995565b810190611be991906139ef565b90509250929050565b606080806064841015611c175760405162461bcd60e51b815260040161065e90613976565b611c248460048188613995565b810190611c319190613a87565b919790965090945092505050565b611c47611463565b6001600160a01b0316336001600160a01b031614611ca65760405162461bcd60e51b815260206004820152601c60248201527b1858d8dbdd5b9d0e881b9bdd08199c9bdb48115b9d1c9e541bda5b9d60221b604482015260640161065e565b565b7b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6000908152601c829052603c81206000611d26611ce961014087018761361f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050611ad39050565b9050611d328186610689565b611d4157600192505050610574565b6000611d4b611af7565b6001600160a01b03929092166000908152600590920160209081526040808420815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845295825265ffffffffffff8087169483019490945292831691015260d09290921b6001600160d01b03191660a09290921b65ffffffffffff60a01b169190911795945050505050565b801561131557604051600090339060001990849084818181858888f193505050503d8060008114610b8a576040519150601f19603f3d011682016040523d82523d6000602084013e610b8a565b60405163c3c5a54760e01b81527f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b906001600160a01b0382169063c3c5a54790611e88903090600401613353565b602060405180830381865afa158015611ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec99190613b6c565b61131557806001600160a01b03166367793cc6611ee4612469565b600101546040805160e084901b6001600160e01b03191681526001600160a01b0390921660048301526024820152600060448201526064015b600060405180830381600087803b158015610b7657600080fd5b60606000846001600160a01b03168484604051611f549190613b8e565b60006040518083038185875af1925050503d8060008114611f91576040519150601f19603f3d011682016040523d82523d6000602084013e611f96565b606091505b509250905080611aef57815160208301fd5b611fb133610963565b611ca65760405162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015260640161065e565b611ff08282612683565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b156120c557801561208d577f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316639ddbb9d88361205e612469565b600101546040516001600160e01b031960e085901b168152610bd492916001600160a01b031690600401613baa565b7f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316630db330038361205e612469565b5050565b60006109b1836001600160a01b038416612732565b606060006109b183612781565b60006109b1836001600160a01b0384166127dd565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b15611315576001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b16639ddbb9d861216c6020840184612ef0565b612174612469565b600101546040516001600160e01b031960e085901b168152611f1d92916001600160a01b031690600401613baa565b60006121ae33610963565b806115e957505030331490565b60006121c56124a6565b80546121d090613941565b80601f01602080910402602001604051908101604052809291908181526020018280546121fc90613941565b80156122495780601f1061221e57610100808354040283529160200191612249565b820191906000526020600020905b81548152906001019060200180831161222c57829003601f168201915b50505050509050816122596124a6565b81516122689260200190612c3c565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a16818360405161229a929190613bd3565b60405180910390a15050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e96122d66020840184612ef0565b6122e66040850160208601613730565b6122f36040860186613763565b604051602001612304929190613c01565b60408051601f198184030181529190528051602090910120606086013561233160a0880160808901613704565b61234160c0890160a08a01613704565b61235160e08a0160c08b01613704565b6123626101008b0160e08c01613704565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b600061243c83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505087516020890120612436925090506128d0565b90611ad3565b949350505050565b60606109b18383604051806060016040528060278152602001613c87602791396128fd565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830090565b60006115e9611a7a565b6001600160a01b03163b151590565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b6000808251604114156125015760208301516040840151606085015160001a6124f5878285856129d8565b94509450505050612509565b506000905060025b9250929050565b600081600481111561252457612524613c43565b141561252d5750565b600181600481111561254157612541613c43565b141561258a5760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015260640161065e565b600281600481111561259e5761259e613c43565b14156125ec5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161065e565b600381600481111561260057612600613c43565b14156113155760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161065e565b600082600001828154811061267057612670613665565b9060005260206000200154905092915050565b8061268c611af7565b6001600160a01b038416600090815260049190910160205260409020805460ff191691151591909117905580156126d5576126cf826126c9611af7565b906120c9565b506126e9565b6126e7826126e1611af7565b906120eb565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a1113382604051612726911515815260200190565b60405180910390a25050565b600081815260018301602052604081205461277957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610574565b506000610574565b6060816000018054806020026020016040519081016040528092919081815260200182805480156127d157602002820191906000526020600020905b8154815260200190600101908083116127bd575b50505050509050919050565b600081815260018301602052604081205480156128c6576000612801600183613c59565b855490915060009061281590600190613c59565b905081811461287a57600086600001828154811061283557612835613665565b906000526020600020015490508087600001848154811061285857612858613665565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061288b5761288b613c70565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610574565b6000915050610574565b60006105746128dd612a92565b8360405161190160f01b8152600281019290925260228201526042902090565b606061290884612497565b6129635760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161065e565b600080856001600160a01b03168560405161297e9190613b8e565b600060405180830381855af49150503d80600081146129b9576040519150601f19603f3d011682016040523d82523d6000602084013e6129be565b606091505b50915091506129ce828286612bb9565b9695505050505050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612a055750600090506003612a89565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612a59573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a8257600060019250925050612a89565b9150600090505b94509492505050565b6000306001600160a01b037f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac16148015612aeb57507f0000000000000000000000000000000000000000000000000000000000007a6946145b15612b1557507fbcdadf6444930a967ffda04923d78c49b3dd65df3ed39abb04a1e3eb1190553790565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527ff0729608244859f656d32ae4cbc6b0367695d68d8e941a28f5e2d33c6d5182dd828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b60608315612bc85750816109b1565b825115612bd85782518084602001fd5b8160405162461bcd60e51b815260040161065e9190613544565b6040518060a0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160801b0316815260200160006001600160801b031681525090565b828054612c4890613941565b90600052602060002090601f016020900481019282612c6a5760008555612cb0565b82601f10612c8357805160ff1916838001178555612cb0565b82800160010185558215612cb0579182015b82811115612cb0578251825591602001919060010190612c95565b50612cbc929150612cc0565b5090565b5b80821115612cbc5760008155600101612cc1565b600060208284031215612ce757600080fd5b81356001600160e01b0319811681146109b157600080fd5b6001600160a01b038116811461131557600080fd5b8035612d1f81612cff565b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612d6257612d62612d24565b604052919050565b60006001600160401b03831115612d8357612d83612d24565b612d96601f8401601f1916602001612d3a565b9050828152838383011115612daa57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612dd257600080fd5b6109b183833560208501612d6a565b60008060008060808587031215612df757600080fd5b8435612e0281612cff565b93506020850135612e1281612cff565b92506040850135915060608501356001600160401b03811115612e3457600080fd5b612e4087828801612dc1565b91505092959194509250565b60008060408385031215612e5f57600080fd5b8235915060208301356001600160401b03811115612e7c57600080fd5b612e8885828601612dc1565b9150509250929050565b60006101608284031215612ea557600080fd5b50919050565b60008060408385031215612ebe57600080fd5b8235612ec981612cff565b915060208301356001600160401b03811115612ee457600080fd5b612e8885828601612e92565b600060208284031215612f0257600080fd5b81356109b181612cff565b600080600060608486031215612f2257600080fd5b83356001600160401b03811115612f3857600080fd5b612f4486828701612e92565b9660208601359650604090950135949350505050565b60008083601f840112612f6c57600080fd5b5081356001600160401b03811115612f8357600080fd5b6020830191508360208260051b850101111561250957600080fd5b60008060008060008060608789031215612fb757600080fd5b86356001600160401b0380821115612fce57600080fd5b612fda8a838b01612f5a565b90985096506020890135915080821115612ff357600080fd5b612fff8a838b01612f5a565b9096509450604089013591508082111561301857600080fd5b5061302589828a01612f5a565b979a9699509497509295939492505050565b6000806040838503121561304a57600080fd5b823561305581612cff565b946020939093013593505050565b60008083601f84011261307557600080fd5b5081356001600160401b0381111561308c57600080fd5b60208301915083602082850101111561250957600080fd5b6000806000604084860312156130b957600080fd5b83356001600160401b03808211156130d057600080fd5b9085019061012082880312156130e557600080fd5b909350602085013590808211156130fb57600080fd5b5061310886828701613063565b9497909650939450505050565b6001600160801b03169052565b80516001600160a01b03908116835260208083015160a082860181905281519086018190526000939183019290849060c08801905b8083101561317957855185168252948301946001929092019190830190613157565b5060408701516040890152606087015194506131986060890186613115565b608087015194506131ac6080890186613115565b979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561320c57603f198886030184526131fa858351613122565b945092850192908501906001016131de565b5092979650505050505050565b60006020828403121561322b57600080fd5b81356001600160401b0381111561324157600080fd5b8201601f8101841361325257600080fd5b61243c84823560208401612d6a565b6000806020838503121561327457600080fd5b82356001600160401b0381111561328a57600080fd5b61329685828601612f5a565b90969095509350505050565b60005b838110156132bd5781810151838201526020016132a5565b838111156132cc576000848401525b50505050565b600081518084526132ea8160208601602086016132a2565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561320c57603f198886030184526133418583516132d2565b94509285019290850190600101613325565b6001600160a01b0391909116815260200190565b6000806000806060858703121561337d57600080fd5b843561338881612cff565b93506020850135925060408501356001600160401b038111156133aa57600080fd5b6133b687828801613063565b95989497509550505050565b60006001600160401b038211156133db576133db612d24565b5060051b60200190565b600082601f8301126133f657600080fd5b8135602061340b613406836133c2565b612d3a565b82815260059290921b8401810191818101908684111561342a57600080fd5b8286015b84811015613445578035835291830191830161342e565b509695505050505050565b600080600080600060a0868803121561346857600080fd5b853561347381612cff565b9450602086013561348381612cff565b935060408601356001600160401b038082111561349f57600080fd5b6134ab89838a016133e5565b945060608801359150808211156134c157600080fd5b6134cd89838a016133e5565b935060808801359150808211156134e357600080fd5b506134f088828901612dc1565b9150509295509295909350565b60008060006040848603121561351257600080fd5b833561351d81612cff565b925060208401356001600160401b0381111561353857600080fd5b61310886828701613063565b6020815260006109b160208301846132d2565b6020808252825182820181905260009190848201906040850190845b818110156135985783516001600160a01b031683529284019291840191600101613573565b50909695505050505050565b6020815260006109b16020830184613122565b600080600080600060a086880312156135cf57600080fd5b85356135da81612cff565b945060208601356135ea81612cff565b9350604086013592506060860135915060808601356001600160401b0381111561361357600080fd5b6134f088828901612dc1565b6000808335601e1984360301811261363657600080fd5b8301803591506001600160401b0382111561365057600080fd5b60200191503681900382131561250957600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156136a5576136a561367b565b5060010190565b60208082526021908201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746040820152601760f91b606082015260800190565b80356001600160801b0381168114612d1f57600080fd5b60006020828403121561371657600080fd5b6109b1826136ed565b803560ff81168114612d1f57600080fd5b60006020828403121561374257600080fd5b6109b18261371f565b6000821982111561375e5761375e61367b565b500190565b6000808335601e1984360301811261377a57600080fd5b8301803591506001600160401b0382111561379457600080fd5b6020019150600581901b360382131561250957600080fd5b6000808335601e198436030181126137c357600080fd5b83016020810192503590506001600160401b038111156137e257600080fd5b8060051b360383131561250957600080fd5b8183526000602080850194508260005b8581101561383257813561381781612cff565b6001600160a01b031687529582019590820190600101613804565b509495945050505050565b6020815261385e6020820161385184612d14565b6001600160a01b03169052565b600061386c6020840161371f565b60ff811660408401525061388360408401846137ac565b61012080606086015261389b610140860183856137f4565b9250606086013560808601526138b3608087016136ed565b91506138c260a0860183613115565b6138ce60a087016136ed565b91506138dd60c0860183613115565b6138e960c087016136ed565b91506138f860e0860183613115565b61390460e087016136ed565b915061010061391581870184613115565b9590950135939094019290925250919050565b60006020828403121561393a57600080fd5b5051919050565b600181811c9082168061395557607f821691505b60208210811415612ea557634e487b7160e01b600052602260045260246000fd5b602080825260059082015264214461746160d81b604082015260600190565b600080858511156139a557600080fd5b838611156139b257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156139e75780818660040360031b1b83161692505b505092915050565b600060208284031215613a0157600080fd5b5035919050565b600082601f830112613a1957600080fd5b81356020613a29613406836133c2565b82815260059290921b84018101918181019086841115613a4857600080fd5b8286015b848110156134455780356001600160401b03811115613a6b5760008081fd5b613a798986838b0101612dc1565b845250918301918301613a4c565b600080600060608486031215613a9c57600080fd5b83356001600160401b0380821115613ab357600080fd5b818601915086601f830112613ac757600080fd5b81356020613ad7613406836133c2565b82815260059290921b8401810191818101908a841115613af657600080fd5b948201945b83861015613b1d578535613b0e81612cff565b82529482019490820190613afb565b97505087013592505080821115613b3357600080fd5b613b3f878388016133e5565b93506040860135915080821115613b5557600080fd5b50613b6286828701613a08565b9150509250925092565b600060208284031215613b7e57600080fd5b815180151581146109b157600080fd5b60008251613ba08184602087016132a2565b9190910192915050565b6001600160a01b0392831681529116602082015260606040820181905260009082015260800190565b604081526000613be660408301856132d2565b8281036020840152613bf881856132d2565b95945050505050565b60008184825b85811015613c38578135613c1a81612cff565b6001600160a01b031683526020928301929190910190600101613c07565b509095945050505050565b634e487b7160e01b600052602160045260246000fd5b600082821015613c6b57613c6b61367b565b500390565b634e487b7160e01b600052603160045260246000fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220488fca858cea32ff9345eebbb45b5bf07cf886a8608e53ce6abe287edb408a8264736f6c634300080c0033"; + diff --git a/src/test/smart-wallet/utils/AABenchmarkPrepare.sol b/src/test/smart-wallet/utils/AABenchmarkPrepare.sol new file mode 100644 index 000000000..8a8e709d6 --- /dev/null +++ b/src/test/smart-wallet/utils/AABenchmarkPrepare.sol @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +// Test utils +import "../../utils/BaseTest.sol"; + +// Account Abstraction setup for smart wallets. +import { IEntryPoint } from "contracts/prebuilts/account/utils/Entrypoint.sol"; + +import { AccountFactory } from "contracts/prebuilts/account/non-upgradeable/AccountFactory.sol"; + +import "solady/utils/LibString.sol"; + +import "forge-std/Test.sol"; + +contract AABenchmarkPrepare is BaseTest { + AccountFactory private accountFactory; + + function setUp() public override { + super.setUp(); + accountFactory = new AccountFactory(IEntryPoint(payable(address(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789)))); + } + + function test_prepareBenchmarkFile() public { + address accountFactoryAddress = address(accountFactory); + bytes memory accountFactoryBytecode = accountFactoryAddress.code; + + address accountImplAddress = accountFactory.accountImplementation(); + bytes memory accountImplBytecode = accountImplAddress.code; + + string memory accountFactoryAddressString = string.concat( + "address constant THIRDWEB_ACCOUNT_FACTORY_ADDRESS = ", + LibString.toHexStringChecksummed(accountFactoryAddress), + ";" + ); + string memory accountFactoryBytecodeString = string.concat( + 'bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"', + LibString.toHexStringNoPrefix(accountFactoryBytecode), + '"', + ";" + ); + + string memory accountImplAddressString = string.concat( + "address constant THIRDWEB_ACCOUNT_IMPL_ADDRESS = ", + LibString.toHexStringChecksummed(accountImplAddress), + ";" + ); + string memory accountImplBytecodeString = string.concat( + 'bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"', + LibString.toHexStringNoPrefix(accountImplBytecode), + '"', + ";" + ); + + string memory path = "src/test/smart-wallet/utils/AABenchmarkArtifacts.sol"; + + vm.removeFile(path); + + vm.writeLine(path, ""); + vm.writeLine(path, "pragma solidity ^0.8.0;"); + vm.writeLine(path, "interface ThirdwebAccountFactory {"); + vm.writeLine( + path, + " function createAccount(address _admin, bytes calldata _data) external returns (address);" + ); + vm.writeLine( + path, + " function getAddress(address _adminSigner, bytes calldata _data) external view returns (address);" + ); + vm.writeLine(path, "}"); + + vm.writeLine(path, "interface ThirdwebAccount {"); + vm.writeLine(path, " function execute(address _target, uint256 _value, bytes calldata _calldata) external;"); + vm.writeLine(path, "}"); + vm.writeLine(path, accountFactoryAddressString); + vm.writeLine(path, accountImplAddressString); + vm.writeLine(path, accountFactoryBytecodeString); + vm.writeLine(path, accountImplBytecodeString); + + vm.writeLine(path, ""); + } +} diff --git a/src/test/smart-wallet/utils/AABenchmarkTest.t.sol b/src/test/smart-wallet/utils/AABenchmarkTest.t.sol new file mode 100644 index 000000000..36d863c41 --- /dev/null +++ b/src/test/smart-wallet/utils/AABenchmarkTest.t.sol @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.0; + +import "aa-benchmark/src/TestBase.sol"; +import { ThirdwebAccountFactory, ThirdwebAccount, THIRDWEB_ACCOUNT_FACTORY_ADDRESS, THIRDWEB_ACCOUNT_IMPL_ADDRESS, THIRDWEB_ACCOUNT_FACTORY_BYTECODE, THIRDWEB_ACCOUNT_IMPL_BYTECODE } from "./AABenchmarkArtifacts.sol"; + +contract ProfileThirdwebAccount is AAGasProfileBase { + ThirdwebAccountFactory factory; + + function setUp() external { + initializeTest("thirdwebAccount"); + factory = ThirdwebAccountFactory(THIRDWEB_ACCOUNT_FACTORY_ADDRESS); + vm.etch(address(factory), THIRDWEB_ACCOUNT_FACTORY_BYTECODE); + vm.etch(THIRDWEB_ACCOUNT_IMPL_ADDRESS, THIRDWEB_ACCOUNT_IMPL_BYTECODE); + setAccount(); + } + + function fillData(address _to, uint256 _value, bytes memory _data) internal view override returns (bytes memory) { + return abi.encodeWithSelector(ThirdwebAccount.execute.selector, _to, _value, _data); + } + + function getSignature(UserOperation memory _op) internal view override returns (bytes memory) { + return signUserOpHash(key, _op); + } + + function createAccount(address _owner) internal override { + // if (address(account).code.length == 0) { + factory.createAccount(_owner, ""); + // } + } + + function getAccountAddr(address _owner) internal view override returns (IAccount) { + return IAccount(factory.getAddress(_owner, "")); + } + + function getInitCode(address _owner) internal view override returns (bytes memory) { + return abi.encodePacked(address(factory), abi.encodeWithSelector(factory.createAccount.selector, _owner, "")); + } + + function getDummySig(UserOperation memory _op) internal pure override returns (bytes memory) { + return + hex"fffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c"; + } +} From eab689e1311562388ed6b9edfca6219734451c63 Mon Sep 17 00:00:00 2001 From: WhiteOakKong Date: Mon, 30 Oct 2023 13:20:13 -0500 Subject: [PATCH 2/7] lint/prettier --- lib/aa-benchmark | 1 + lib/solady | 1 + src/test/smart-wallet/utils/AABenchmarkArtifacts.sol | 11 ++++++++--- src/test/smart-wallet/utils/AABenchmarkTest.t.sol | 6 +++++- 4 files changed, 15 insertions(+), 4 deletions(-) create mode 160000 lib/aa-benchmark create mode 160000 lib/solady diff --git a/lib/aa-benchmark b/lib/aa-benchmark new file mode 160000 index 000000000..4b8e548ef --- /dev/null +++ b/lib/aa-benchmark @@ -0,0 +1 @@ +Subproject commit 4b8e548ef6b004069cff599347a2afb9ac837e54 diff --git a/lib/solady b/lib/solady new file mode 160000 index 000000000..77809c18e --- /dev/null +++ b/lib/solady @@ -0,0 +1 @@ +Subproject commit 77809c18e010b914dde9518956a4ae7cb507d383 diff --git a/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol index c63e61855..7deecb587 100644 --- a/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol +++ b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol @@ -1,14 +1,19 @@ - pragma solidity ^0.8.0; + interface ThirdwebAccountFactory { function createAccount(address _admin, bytes calldata _data) external returns (address); + function getAddress(address _adminSigner, bytes calldata _data) external view returns (address); } + interface ThirdwebAccount { - function execute(address _target, uint256 _value, bytes calldata _calldata) external; + function execute( + address _target, + uint256 _value, + bytes calldata _calldata + ) external; } address constant THIRDWEB_ACCOUNT_FACTORY_ADDRESS = 0x2e234DAe75C793f67A35089C9d99245E1C58470b; address constant THIRDWEB_ACCOUNT_IMPL_ADDRESS = 0xffD4505B3452Dc22f8473616d50503bA9E1710Ac; bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"608060405234801561001057600080fd5b50600436106101125760003560e01c806308e93d0a146101175780630db33003146101355780630e6254fd1461014a57806311464fbe1461015d578063248a9ca3146101915780632f2ff15d146101b257806336568abe146101c557806367793cc6146101d85780638878ed33146101eb5780639010d07c146101fe57806391d1485414610211578063938e3d7b146102345780639ddbb9d814610247578063a217fddf1461025a578063a32fa5b314610262578063a65d69d414610275578063ac9650d81461029c578063c3c5a547146102bc578063ca15c873146102cf578063d547741f146102e2578063d8fd8f44146102f5578063e8a3d48514610308575b600080fd5b61011f61031d565b60405161012c91906117d7565b60405180910390f35b6101486101433660046118eb565b61032e565b005b61011f610158366004611948565b6103d1565b6101847f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac81565b60405161012c9190611963565b6101a461019f366004611977565b6103fb565b60405190815260200161012c565b6101486101c0366004611990565b610419565b6101486101d3366004611990565b6104c3565b6101486101e63660046119bc565b610522565b6101846101f9366004611a09565b610576565b61018461020c366004611a8b565b6105f0565b61022461021f366004611990565b6106ff565b604051901515815260200161012c565b610148610242366004611aad565b610733565b6101486102553660046118eb565b610784565b6101a4600081565b610224610270366004611990565b61081d565b6101847f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278981565b6102af6102aa366004611afd565b610880565b60405161012c9190611bcd565b6102246102ca366004611948565b610974565b6101a46102dd366004611977565b610980565b6101486102f0366004611990565b610a1d565b610184610303366004611a09565b610a28565b610310610b73565b60405161012c9190611c2f565b60606103296000610cfa565b905090565b3361033a818484610d07565b61035f5760405162461bcd60e51b815260040161035690611c42565b60405180910390fd5b6001600160a01b03841660009081526002602052604081206103819083610d5b565b905080156103ca57846001600160a01b0316826001600160a01b03167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a35b5050505050565b6001600160a01b03811660009081526002602052604090206060906103f590610cfa565b92915050565b6000610405610d70565b600092835260010160205250604090205490565b61043d610424610d70565b6000848152600191909101602052604090205433610d7a565b610445610d70565b6000838152602091825260408082206001600160a01b0385168352909252205460ff16156104b55760405162461bcd60e51b815260206004820152601d60248201527f43616e206f6e6c79206772616e7420746f206e6f6e20686f6c646572730000006044820152606401610356565b6104bf8282610dff565b5050565b336001600160a01b038216146105185760405162461bcd60e51b815260206004820152601a60248201527921b0b71037b7363c903932b737bab731b2903337b91039b2b63360311b6044820152606401610356565b6104bf8282610e13565b3361052e818484610d07565b61054a5760405162461bcd60e51b815260040161035690611c42565b610555600082610e27565b6105715760405162461bcd60e51b815260040161035690611c79565b505050565b6000806105b98585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e3c92505050565b90506105e57f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac82610e6d565b9150505b9392505050565b6000806105fb610ecd565b600085815260209190915260408120549150805b828110156106f6576000610621610ecd565b60008881526020918252604080822085835260010190925220546001600160a01b03161461069a578482141561068857610659610ecd565b600087815260209182526040808220938252600190930190915220546001600160a01b031692506103f5915050565b610693600183611cd9565b91506106e4565b6106a58660006106ff565b80156106d157506106b4610ecd565b600087815260209182526040808220828052600201909252205481145b156106e4576106e1600183611cd9565b91505b6106ef600182611cd9565b905061060f565b50505092915050565b6000610709610d70565b6000938452602090815260408085206001600160a01b039490941685529290525090205460ff1690565b61073b610ed7565b6107785760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401610356565b61078181610ee3565b50565b33610790818484610d07565b6107ac5760405162461bcd60e51b815260040161035690611c42565b6001600160a01b03841660009081526002602052604081206107ce9083610e27565b905080156103ca57846001600160a01b0316826001600160a01b03167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35050505050565b6000610827610d70565b600084815260209182526040808220828052909252205460ff166108775761084d610d70565b6000848152602091825260408082206001600160a01b0386168352909252205460ff1690506103f5565b50600192915050565b6060816001600160401b0381111561089a5761089a611840565b6040519080825280602002602001820160405280156108cd57816020015b60608152602001906001900390816108b85790505b50905060005b8281101561096d5761093d308585848181106108f1576108f1611cf1565b90506020028101906109039190611d07565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fce92505050565b82828151811061094f5761094f611cf1565b6020026020010181905250808061096590611d54565b9150506108d3565b5092915050565b60006103f58183610ff3565b60008061098b610ecd565b6000848152602091909152604081205491505b818110156109f85760006109b0610ecd565b60008681526020918252604080822085835260010190925220546001600160a01b0316146109e6576109e3600184611cd9565b92505b6109f1600182611cd9565b905061099e565b50610a048360006106ff565b15610a1757610a14600183611cd9565b91505b50919050565b610518610424610d70565b6000807f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac90506000610a908686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e3c92505050565b90506000610a9e8383610e6d565b90506001600160a01b0381163b15610aba5792506105e9915050565b610ac48383611015565b9050336001600160a01b037f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27891614610b1d57610b01600082610e27565b610b1d5760405162461bcd60e51b815260040161035690611c79565b610b29818888886110ac565b866001600160a01b0316816001600160a01b03167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a39695505050505050565b6060610b7d611114565b8054610b8890611d6f565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb490611d6f565b8015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b5050505050905090565b6001610c15610d70565b6000848152602091825260408082206001600160a01b0386168084529352808220805460ff1916941515949094179093559151339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b7f0a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e50090565b60008060ff19610cc960017f0c4ba382c0009cf238e4c1ca1a52f51c61e6248a70bdfb34e5ed49d5578a5c0c611da4565b604051602001610cdb91815260200190565b60408051601f1981840301815291905280516020909101201692915050565b606060006105e983611138565b600080610d148484610e3c565b90506000610d427f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac83610e6d565b6001600160a01b03878116911614925050509392505050565b60006105e9836001600160a01b038416611194565b6000610329610c74565b610d82610d70565b6000838152602091825260408082206001600160a01b0385168352909252205460ff166104bf57610dbd816001600160a01b03166014611287565b610dc8836020611287565b604051602001610dd9929190611dbb565b60408051601f198184030181529082905262461bcd60e51b825261035691600401611c2f565b610e098282610c0b565b6104bf8282611422565b610e1d82826114e1565b6104bf828261154a565b60006105e9836001600160a01b0384166115d9565b600082604051602001610e4f9190611963565b60405160208183030381529060405280519060200120905092915050565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff602482015260148101839052733d602d80600a3d3981f3363d3d373d3d3d363d738152605881018290526037600c820120607882015260556043909101206000906105e9565b6000610329610c98565b600061032981336106ff565b6000610eed611114565b8054610ef890611d6f565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2490611d6f565b8015610f715780601f10610f4657610100808354040283529160200191610f71565b820191906000526020600020905b815481529060010190602001808311610f5457829003601f168201915b5050505050905081610f81611114565b8151610f90926020019061173e565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051610fc2929190611e28565b60405180910390a15050565b60606105e98383604051806060016040528060278152602001611ef660279139611628565b6001600160a01b038116600090815260018301602052604081205415156105e9565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166103f55760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610356565b60405163347d5e2560e21b81526001600160a01b0385169063d1f57894906110dc90869086908690600401611e4d565b600060405180830381600087803b1580156110f657600080fd5b505af115801561110a573d6000803e3d6000fd5b5050505050505050565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b60608160000180548060200260200160405190810160405280929190818152602001828054801561118857602002820191906000526020600020905b815481526020019060010190808311611174575b50505050509050919050565b6000818152600183016020526040812054801561127d5760006111b8600183611da4565b85549091506000906111cc90600190611da4565b90508181146112315760008660000182815481106111ec576111ec611cf1565b906000526020600020015490508087600001848154811061120f5761120f611cf1565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061124257611242611e8d565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506103f5565b60009150506103f5565b60606000611296836002611ea3565b6112a1906002611cd9565b6001600160401b038111156112b8576112b8611840565b6040519080825280601f01601f1916602001820160405280156112e2576020820181803683370190505b509050600360fc1b816000815181106112fd576112fd611cf1565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061132c5761132c611cf1565b60200101906001600160f81b031916908160001a9053506000611350846002611ea3565b61135b906001611cd9565b90505b60018111156113d3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061138f5761138f611cf1565b1a60f81b8282815181106113a5576113a5611cf1565b60200101906001600160f81b031916908160001a90535060049490941c936113cc81611ec2565b905061135e565b5083156105e95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610356565b600061142c610ecd565b6000848152602091909152604090205490506001611448610ecd565b6000858152602091909152604081208054909190611467908490611cd9565b90915550829050611476610ecd565b6000858152602091825260408082208583526001019092522080546001600160a01b0319166001600160a01b0392909216919091179055806114b6610ecd565b6000948552602090815260408086206001600160a01b03909516865260029094019052919092205550565b6114eb8282610d7a565b6114f3610d70565b6000838152602091825260408082206001600160a01b0385168084529352808220805460ff191690555133929185917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000611554610ecd565b6000848152602091825260408082206001600160a01b038616835260020190925220549050611581610ecd565b6000848152602091825260408082208483526001019092522080546001600160a01b03191690556115b0610ecd565b6000938452602090815260408085206001600160a01b0390941685526002909301905250812055565b6000818152600183016020526040812054611620575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556103f5565b5060006103f5565b60606001600160a01b0384163b6116905760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610356565b600080856001600160a01b0316856040516116ab9190611ed9565b600060405180830381855af49150503d80600081146116e6576040519150601f19603f3d011682016040523d82523d6000602084013e6116eb565b606091505b50915091506116fb828286611705565b9695505050505050565b606083156117145750816105e9565b8251156117245782518084602001fd5b8160405162461bcd60e51b81526004016103569190611c2f565b82805461174a90611d6f565b90600052602060002090601f01602090048101928261176c57600085556117b2565b82601f1061178557805160ff19168380011785556117b2565b828001600101855582156117b2579182015b828111156117b2578251825591602001919060010190611797565b506117be9291506117c2565b5090565b5b808211156117be57600081556001016117c3565b6020808252825182820181905260009190848201906040850190845b818110156118185783516001600160a01b0316835292840192918401916001016117f3565b50909695505050505050565b80356001600160a01b038116811461183b57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561187057611870611840565b604051601f8501601f19908116603f0116810190828211818310171561189857611898611840565b816040528093508581528686860111156118b157600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126118dc57600080fd5b6105e983833560208501611856565b60008060006060848603121561190057600080fd5b61190984611824565b925061191760208501611824565b915060408401356001600160401b0381111561193257600080fd5b61193e868287016118cb565b9150509250925092565b60006020828403121561195a57600080fd5b6105e982611824565b6001600160a01b0391909116815260200190565b60006020828403121561198957600080fd5b5035919050565b600080604083850312156119a357600080fd5b823591506119b360208401611824565b90509250929050565b600080604083850312156119cf57600080fd5b6119d883611824565b915060208301356001600160401b038111156119f357600080fd5b6119ff858286016118cb565b9150509250929050565b600080600060408486031215611a1e57600080fd5b611a2784611824565b925060208401356001600160401b0380821115611a4357600080fd5b818601915086601f830112611a5757600080fd5b813581811115611a6657600080fd5b876020828501011115611a7857600080fd5b6020830194508093505050509250925092565b60008060408385031215611a9e57600080fd5b50508035926020909101359150565b600060208284031215611abf57600080fd5b81356001600160401b03811115611ad557600080fd5b8201601f81018413611ae657600080fd5b611af584823560208401611856565b949350505050565b60008060208385031215611b1057600080fd5b82356001600160401b0380821115611b2757600080fd5b818501915085601f830112611b3b57600080fd5b813581811115611b4a57600080fd5b8660208260051b8501011115611b5f57600080fd5b60209290920196919550909350505050565b60005b83811015611b8c578181015183820152602001611b74565b83811115611b9b576000848401525b50505050565b60008151808452611bb9816020860160208601611b71565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611c2257603f19888603018452611c10858351611ba1565b94509285019290850190600101611bf4565b5092979650505050505050565b6020815260006105e96020830184611ba1565b6020808252601f908201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e00604082015260600190565b6020808252602a908201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206040820152691c9959da5cdd195c995960b21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611cec57611cec611cc3565b500190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611d1e57600080fd5b8301803591506001600160401b03821115611d3857600080fd5b602001915036819003821315611d4d57600080fd5b9250929050565b6000600019821415611d6857611d68611cc3565b5060010190565b600181811c90821680611d8357607f821691505b60208210811415610a1757634e487b7160e01b600052602260045260246000fd5b600082821015611db657611db6611cc3565b500390565b7402832b936b4b9b9b4b7b7399d1030b1b1b7bab73a1605d1b815260008351611deb816015850160208801611b71565b7001034b99036b4b9b9b4b733903937b6329607d1b6015918401918201528351611e1c816026840160208801611b71565b01602601949350505050565b604081526000611e3b6040830185611ba1565b82810360208401526105e58185611ba1565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b634e487b7160e01b600052603160045260246000fd5b6000816000190483118215151615611ebd57611ebd611cc3565b500290565b600081611ed157611ed1611cc3565b506000190190565b60008251611eeb818460208701611b71565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212205d3e29505e958fbe45e9de9dcaceef129bcbdeb4391a97796b4016eda66dfb4764736f6c634300080c0033"; bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"6080604052600436106101405760003560e01c806301ffc9a71461014c578063150b7a02146101815780631626ba7e146101c55780631dd756c5146101e557806324d7806c146102055780633a871cdd1461022557806347e1da2a146102535780634a58db19146102755780634d44560d1461027d5780635892e2361461029d5780637dff5a79146102bd5780638b52d723146102dd578063938e3d7b146102ff578063a9082d841461031f578063ac9650d81461035e578063b0d691fe1461038b578063b61d27f6146103ad578063b76464d5146103cd578063bc197c81146103ed578063c45a015514610419578063d087d2881461044d578063d1f5789414610462578063d42f2f3514610482578063e8a3d48514610497578063e9523c97146104b9578063f15d424e146104db578063f23a6e611461050857600080fd5b3661014757005b600080fd5b34801561015857600080fd5b5061016c610167366004612cd5565b610534565b60405190151581526020015b60405180910390f35b34801561018d57600080fd5b506101ac61019c366004612de1565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610178565b3480156101d157600080fd5b506101ac6101e0366004612e4c565b61057a565b3480156101f157600080fd5b5061016c610200366004612eab565b610689565b34801561021157600080fd5b5061016c610220366004612ef0565b610963565b34801561023157600080fd5b50610245610240366004612f0d565b610992565b604051908152602001610178565b34801561025f57600080fd5b5061027361026e366004612f9e565b6109b8565b005b610273610b29565b34801561028957600080fd5b50610273610298366004613037565b610b91565b3480156102a957600080fd5b506102736102b83660046130a4565b610c0a565b3480156102c957600080fd5b5061016c6102d8366004612ef0565b610fc7565b3480156102e957600080fd5b506102f2611080565b60405161017891906131b7565b34801561030b57600080fd5b5061027361031a366004613219565b6112c7565b34801561032b57600080fd5b5061033f61033a3660046130a4565b611318565b6040805192151583526001600160a01b03909116602083015201610178565b34801561036a57600080fd5b5061037e610379366004613261565b61136f565b60405161017891906132fe565b34801561039757600080fd5b506103a0611463565b6040516101789190613353565b3480156103b957600080fd5b506102736103c8366004613367565b6114ac565b3480156103d957600080fd5b506102736103e8366004612ef0565b61153c565b3480156103f957600080fd5b506101ac610408366004613450565b63bc197c8160e01b95945050505050565b34801561042557600080fd5b506103a07f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b81565b34801561045957600080fd5b5061024561156e565b34801561046e57600080fd5b5061027361047d3660046134fd565b6115ee565b34801561048e57600080fd5b506102f2611787565b3480156104a357600080fd5b506104ac6118f8565b6040516101789190613544565b3480156104c557600080fd5b506104ce611990565b6040516101789190613557565b3480156104e757600080fd5b506104fb6104f6366004612ef0565b6119a2565b60405161017891906135a4565b34801561051457600080fd5b506101ac6105233660046135b7565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b148061056557506001600160e01b03198216630a85bd0160e11b145b80610574575061057482611a9e565b92915050565b6000806105878484611ad3565b905061059281610963565b156105a75750630b135d3f60e11b9050610574565b3360006105b2611af7565b6001600160a01b03841660009081526006919091016020526040902090506105da8183611b1b565b8061060a57506105e981611b3d565b600114801561060a575060006105ff8282611b47565b6001600160a01b0316145b6106675760405162461bcd60e51b8152602060048201526024808201527f4163636f756e743a2063616c6c6572206e6f7420617070726f7665642074617260448201526333b2ba1760e11b60648201526084015b60405180910390fd5b61067083610fc7565b1561068057630b135d3f60e11b93505b50505092915050565b6000610693611af7565b6001600160a01b0384166000908152600491909101602052604090205460ff16156106c057506001610574565b60006106ca611af7565b6001600160a01b0385166000908152600591909101602090815260408083208151606081018352815481526001909101546001600160801b0380821694830194909452600160801b9004909216908201529150610725611af7565b6006016000866001600160a01b03166001600160a01b0316815260200190815260200160002090504282602001516001600160801b03161180610775575081604001516001600160801b03164210155b80610786575061078481611b3d565b155b1561079657600092505050610574565b60006107ad6107a8606087018761361f565b611b53565b905060006107ba83611b3d565b60011480156107db575060006107d08482611b47565b6001600160a01b0316145b90506001600160e01b03198216635b0e93fb60e11b14156108535760008061080e61080960608a018a61361f565b611b8d565b9150915082610834576108218583611b1b565b6108345760009650505050505050610574565b855181111561084c5760009650505050505050610574565b5050610956565b6001600160e01b031982166323f0ed1560e11b14156109495760008061088461087f60608a018a61361f565b611bf2565b5091509150826108ee5760005b82518110156108ec576108c68382815181106108af576108af613665565b602002602001015187611b1b90919063ffffffff16565b6108da576000975050505050505050610574565b806108e481613691565b915050610891565b505b60005b82518110156109415781818151811061090c5761090c613665565b60200260200101518760000151101561092f576000975050505050505050610574565b8061093981613691565b9150506108f1565b505050610956565b6000945050505050610574565b5060019695505050505050565b600061096d611af7565b6001600160a01b03909216600090815260049290920160205250604090205460ff1690565b600061099c611c3f565b6109a68484611ca8565b90506109b182611ded565b9392505050565b6109c0611463565b6001600160a01b0316336001600160a01b031614806109e357506109e333610963565b6109ff5760405162461bcd60e51b815260040161065e906136ac565b610a07611e3a565b8481148015610a1557508483145b610a615760405162461bcd60e51b815260206004820152601d60248201527f4163636f756e743a2077726f6e67206172726179206c656e677468732e000000604482015260640161065e565b60005b85811015610b2057610b0d878783818110610a8157610a81613665565b9050602002016020810190610a969190612ef0565b868684818110610aa857610aa8613665565b90506020020135858585818110610ac157610ac1613665565b9050602002810190610ad3919061361f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f3792505050565b5080610b1881613691565b915050610a64565b50505050505050565b610b31611463565b6001600160a01b031663b760faf934306040518363ffffffff1660e01b8152600401610b5d9190613353565b6000604051808303818588803b158015610b7657600080fd5b505af1158015610b8a573d6000803e3d6000fd5b5050505050565b610b99611fa8565b610ba1611463565b60405163040b850f60e31b81526001600160a01b03848116600483015260248201849052919091169063205c2878906044015b600060405180830381600087803b158015610bee57600080fd5b505af1158015610c02573d6000803e3d6000fd5b505050505050565b6000610c196020850185612ef0565b905042610c2c60e0860160c08701613704565b6001600160801b031611158015610c5b5750610c4f610100850160e08601613704565b6001600160801b031642105b610c915760405162461bcd60e51b8152602060048201526007602482015266085c195c9a5bd960ca1b604482015260640161065e565b600080610c9f868686611318565b9150915081610cd95760405162461bcd60e51b815260040161065e906020808252600490820152632173696760e01b604082015260600190565b6001610ce3611af7565b610100880135600090815260079190910160209081526040808320805460ff1916941515949094179093559091610d1f91908901908901613730565b60ff161115610d4c576000610d3a6040880160208901613730565b60ff166001149050610b208482611fe6565b610d5583610963565b15610d8a5760405162461bcd60e51b815260206004820152600560248201526430b236b4b760d91b604482015260640161065e565b610d9f83610d96611af7565b600201906120c9565b50604051806060016040528087606001358152602001876080016020810190610dc89190613704565b6001600160801b03168152602001610de660c0890160a08a01613704565b6001600160801b03169052610df9611af7565b6001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b02931692909217600190920191909155610e6f610e4e611af7565b6001600160a01b0386166000908152600691909101602052604090206120de565b805190915060005b81811015610ed957610ec6838281518110610e9457610e94613665565b6020026020010151610ea4611af7565b6001600160a01b038916600090815260069190910160205260409020906120eb565b50610ed260018261374b565b9050610e77565b50610ee76040890189613763565b9050905060005b81811015610f6857610f55610f0660408b018b613763565b83818110610f1657610f16613665565b9050602002016020810190610f2b9190612ef0565b610f33611af7565b6001600160a01b038916600090815260069190910160205260409020906120c9565b50610f6160018261374b565b9050610eee565b50610f7288612100565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a604051610fb5919061383d565b60405180910390a35050505050505050565b600080610fd2611af7565b6001600160a01b038416600090815260059190910160209081526040918290208251606081018452815481526001909101546001600160801b03808216938301849052600160801b90910416928101929092529091504210801590611043575080604001516001600160801b031642105b80156109b157506000611078611057611af7565b6001600160a01b038616600090815260069190910160205260409020611b3d565b119392505050565b6060600061109761108f611af7565b6002016120de565b80519091506000805b82811015611128576110ca8482815181106110bd576110bd613665565b6020026020010151610fc7565b156110e157816110d981613691565b925050611116565b60008482815181106110f5576110f5613665565b60200260200101906001600160a01b031690816001600160a01b0316815250505b61112160018261374b565b90506110a0565b50806001600160401b0381111561114157611141612d24565b60405190808252806020026020018201604052801561117a57816020015b611167612bf2565b81526020019060019003908161115f5790505b5093506000805b838110156112bf5760006001600160a01b03168582815181106111a6576111a6613665565b60200260200101516001600160a01b0316146112ad5760008582815181106111d0576111d0613665565b6020026020010151905060006111e4611af7565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a08101909452918352909250810161124e610e4e611af7565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b031681525088858061128d90613691565b96508151811061129f5761129f613665565b602002602001018190525050505b6112b860018261374b565b9050611181565b505050505090565b6112cf6121a3565b61130c5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b604482015260640161065e565b611315816121bb565b50565b60008061132e611327866122a6565b85856123ea565b9050611338611af7565b6101008601356000908152600791909101602052604090205460ff16158015611365575061136581610963565b9150935093915050565b6060816001600160401b0381111561138957611389612d24565b6040519080825280602002602001820160405280156113bc57816020015b60608152602001906001900390816113a75790505b50905060005b8281101561145c5761142c308585848181106113e0576113e0613665565b90506020028101906113f2919061361f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061244492505050565b82828151811061143e5761143e613665565b6020026020010181905250808061145490613691565b9150506113c2565b5092915050565b60008061146e612469565b546001600160a01b03169050801561148557919050565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278991505090565b6114b4611463565b6001600160a01b0316336001600160a01b031614806114d757506114d733610963565b6114f35760405162461bcd60e51b815260040161065e906136ac565b6114fb611e3a565b610b8a848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f3792505050565b611544611fa8565b8061154d612469565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6000611578611463565b604051631aab3f0d60e11b8152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e99190613928565b905090565b60006115f861248d565b5460ff169050600061160861248d565b54610100900460ff1690508015808015611625575060018360ff16105b80611644575061163430612497565b15801561164457508260ff166001145b6116a75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065e565b60016116b161248d565b805460ff191660ff9290921691909117905580156116ea5760016116d361248d565b80549115156101000261ff00199092169190911790555b856116f3612469565b60010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611725866001611fe6565b8015610c0257600061173561248d565b80549115156101000261ff0019909216919091179055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b6060600061179661108f611af7565b8051909150806001600160401b038111156117b3576117b3612d24565b6040519080825280602002602001820160405280156117ec57816020015b6117d9612bf2565b8152602001906001900390816117d15790505b50925060005b818110156118f257600083828151811061180e5761180e613665565b602002602001015190506000611822611af7565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a08101909452918352909250810161188c610e4e611af7565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b03168152508684815181106118d1576118d1613665565b602002602001018190525050506001816118eb919061374b565b90506117f2565b50505090565b60606119026124a6565b805461190d90613941565b80601f016020809104026020016040519081016040528092919081815260200182805461193990613941565b80156119865780601f1061195b57610100808354040283529160200191611986565b820191906000526020600020905b81548152906001019060200180831161196957829003601f168201915b5050505050905090565b60606115e961199d611af7565b6120de565b6119aa612bf2565b60006119b4611af7565b6001600160a01b038416600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611a3f611a1e611af7565b6001600160a01b0387166000908152600691909101602052604090206120de565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030090565b60006001600160e01b03198216630271189760e51b148061057457506301ffc9a760e01b6001600160e01b0319831614610574565b6000806000611ae285856124ca565b91509150611aef81612510565b509392505050565b7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0090565b6001600160a01b038116600090815260018301602052604081205415156109b1565b6000610574825490565b60006109b18383612659565b60006004821015611b765760405162461bcd60e51b815260040161065e90613976565b611b84600460008486613995565b6109b1916139bf565b6000806044831015611bb15760405162461bcd60e51b815260040161065e90613976565b611bbf602460048587613995565b810190611bcc9190612ef0565b9150611bdc604460248587613995565b810190611be991906139ef565b90509250929050565b606080806064841015611c175760405162461bcd60e51b815260040161065e90613976565b611c248460048188613995565b810190611c319190613a87565b919790965090945092505050565b611c47611463565b6001600160a01b0316336001600160a01b031614611ca65760405162461bcd60e51b815260206004820152601c60248201527b1858d8dbdd5b9d0e881b9bdd08199c9bdb48115b9d1c9e541bda5b9d60221b604482015260640161065e565b565b7b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6000908152601c829052603c81206000611d26611ce961014087018761361f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050611ad39050565b9050611d328186610689565b611d4157600192505050610574565b6000611d4b611af7565b6001600160a01b03929092166000908152600590920160209081526040808420815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845295825265ffffffffffff8087169483019490945292831691015260d09290921b6001600160d01b03191660a09290921b65ffffffffffff60a01b169190911795945050505050565b801561131557604051600090339060001990849084818181858888f193505050503d8060008114610b8a576040519150601f19603f3d011682016040523d82523d6000602084013e610b8a565b60405163c3c5a54760e01b81527f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b906001600160a01b0382169063c3c5a54790611e88903090600401613353565b602060405180830381865afa158015611ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec99190613b6c565b61131557806001600160a01b03166367793cc6611ee4612469565b600101546040805160e084901b6001600160e01b03191681526001600160a01b0390921660048301526024820152600060448201526064015b600060405180830381600087803b158015610b7657600080fd5b60606000846001600160a01b03168484604051611f549190613b8e565b60006040518083038185875af1925050503d8060008114611f91576040519150601f19603f3d011682016040523d82523d6000602084013e611f96565b606091505b509250905080611aef57815160208301fd5b611fb133610963565b611ca65760405162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015260640161065e565b611ff08282612683565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b156120c557801561208d577f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316639ddbb9d88361205e612469565b600101546040516001600160e01b031960e085901b168152610bd492916001600160a01b031690600401613baa565b7f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316630db330038361205e612469565b5050565b60006109b1836001600160a01b038416612732565b606060006109b183612781565b60006109b1836001600160a01b0384166127dd565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b15611315576001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b16639ddbb9d861216c6020840184612ef0565b612174612469565b600101546040516001600160e01b031960e085901b168152611f1d92916001600160a01b031690600401613baa565b60006121ae33610963565b806115e957505030331490565b60006121c56124a6565b80546121d090613941565b80601f01602080910402602001604051908101604052809291908181526020018280546121fc90613941565b80156122495780601f1061221e57610100808354040283529160200191612249565b820191906000526020600020905b81548152906001019060200180831161222c57829003601f168201915b50505050509050816122596124a6565b81516122689260200190612c3c565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a16818360405161229a929190613bd3565b60405180910390a15050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e96122d66020840184612ef0565b6122e66040850160208601613730565b6122f36040860186613763565b604051602001612304929190613c01565b60408051601f198184030181529190528051602090910120606086013561233160a0880160808901613704565b61234160c0890160a08a01613704565b61235160e08a0160c08b01613704565b6123626101008b0160e08c01613704565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b600061243c83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505087516020890120612436925090506128d0565b90611ad3565b949350505050565b60606109b18383604051806060016040528060278152602001613c87602791396128fd565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830090565b60006115e9611a7a565b6001600160a01b03163b151590565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b6000808251604114156125015760208301516040840151606085015160001a6124f5878285856129d8565b94509450505050612509565b506000905060025b9250929050565b600081600481111561252457612524613c43565b141561252d5750565b600181600481111561254157612541613c43565b141561258a5760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015260640161065e565b600281600481111561259e5761259e613c43565b14156125ec5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161065e565b600381600481111561260057612600613c43565b14156113155760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161065e565b600082600001828154811061267057612670613665565b9060005260206000200154905092915050565b8061268c611af7565b6001600160a01b038416600090815260049190910160205260409020805460ff191691151591909117905580156126d5576126cf826126c9611af7565b906120c9565b506126e9565b6126e7826126e1611af7565b906120eb565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a1113382604051612726911515815260200190565b60405180910390a25050565b600081815260018301602052604081205461277957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610574565b506000610574565b6060816000018054806020026020016040519081016040528092919081815260200182805480156127d157602002820191906000526020600020905b8154815260200190600101908083116127bd575b50505050509050919050565b600081815260018301602052604081205480156128c6576000612801600183613c59565b855490915060009061281590600190613c59565b905081811461287a57600086600001828154811061283557612835613665565b906000526020600020015490508087600001848154811061285857612858613665565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061288b5761288b613c70565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610574565b6000915050610574565b60006105746128dd612a92565b8360405161190160f01b8152600281019290925260228201526042902090565b606061290884612497565b6129635760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161065e565b600080856001600160a01b03168560405161297e9190613b8e565b600060405180830381855af49150503d80600081146129b9576040519150601f19603f3d011682016040523d82523d6000602084013e6129be565b606091505b50915091506129ce828286612bb9565b9695505050505050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612a055750600090506003612a89565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612a59573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a8257600060019250925050612a89565b9150600090505b94509492505050565b6000306001600160a01b037f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac16148015612aeb57507f0000000000000000000000000000000000000000000000000000000000007a6946145b15612b1557507fbcdadf6444930a967ffda04923d78c49b3dd65df3ed39abb04a1e3eb1190553790565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527ff0729608244859f656d32ae4cbc6b0367695d68d8e941a28f5e2d33c6d5182dd828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b60608315612bc85750816109b1565b825115612bd85782518084602001fd5b8160405162461bcd60e51b815260040161065e9190613544565b6040518060a0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160801b0316815260200160006001600160801b031681525090565b828054612c4890613941565b90600052602060002090601f016020900481019282612c6a5760008555612cb0565b82601f10612c8357805160ff1916838001178555612cb0565b82800160010185558215612cb0579182015b82811115612cb0578251825591602001919060010190612c95565b50612cbc929150612cc0565b5090565b5b80821115612cbc5760008155600101612cc1565b600060208284031215612ce757600080fd5b81356001600160e01b0319811681146109b157600080fd5b6001600160a01b038116811461131557600080fd5b8035612d1f81612cff565b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612d6257612d62612d24565b604052919050565b60006001600160401b03831115612d8357612d83612d24565b612d96601f8401601f1916602001612d3a565b9050828152838383011115612daa57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612dd257600080fd5b6109b183833560208501612d6a565b60008060008060808587031215612df757600080fd5b8435612e0281612cff565b93506020850135612e1281612cff565b92506040850135915060608501356001600160401b03811115612e3457600080fd5b612e4087828801612dc1565b91505092959194509250565b60008060408385031215612e5f57600080fd5b8235915060208301356001600160401b03811115612e7c57600080fd5b612e8885828601612dc1565b9150509250929050565b60006101608284031215612ea557600080fd5b50919050565b60008060408385031215612ebe57600080fd5b8235612ec981612cff565b915060208301356001600160401b03811115612ee457600080fd5b612e8885828601612e92565b600060208284031215612f0257600080fd5b81356109b181612cff565b600080600060608486031215612f2257600080fd5b83356001600160401b03811115612f3857600080fd5b612f4486828701612e92565b9660208601359650604090950135949350505050565b60008083601f840112612f6c57600080fd5b5081356001600160401b03811115612f8357600080fd5b6020830191508360208260051b850101111561250957600080fd5b60008060008060008060608789031215612fb757600080fd5b86356001600160401b0380821115612fce57600080fd5b612fda8a838b01612f5a565b90985096506020890135915080821115612ff357600080fd5b612fff8a838b01612f5a565b9096509450604089013591508082111561301857600080fd5b5061302589828a01612f5a565b979a9699509497509295939492505050565b6000806040838503121561304a57600080fd5b823561305581612cff565b946020939093013593505050565b60008083601f84011261307557600080fd5b5081356001600160401b0381111561308c57600080fd5b60208301915083602082850101111561250957600080fd5b6000806000604084860312156130b957600080fd5b83356001600160401b03808211156130d057600080fd5b9085019061012082880312156130e557600080fd5b909350602085013590808211156130fb57600080fd5b5061310886828701613063565b9497909650939450505050565b6001600160801b03169052565b80516001600160a01b03908116835260208083015160a082860181905281519086018190526000939183019290849060c08801905b8083101561317957855185168252948301946001929092019190830190613157565b5060408701516040890152606087015194506131986060890186613115565b608087015194506131ac6080890186613115565b979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561320c57603f198886030184526131fa858351613122565b945092850192908501906001016131de565b5092979650505050505050565b60006020828403121561322b57600080fd5b81356001600160401b0381111561324157600080fd5b8201601f8101841361325257600080fd5b61243c84823560208401612d6a565b6000806020838503121561327457600080fd5b82356001600160401b0381111561328a57600080fd5b61329685828601612f5a565b90969095509350505050565b60005b838110156132bd5781810151838201526020016132a5565b838111156132cc576000848401525b50505050565b600081518084526132ea8160208601602086016132a2565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561320c57603f198886030184526133418583516132d2565b94509285019290850190600101613325565b6001600160a01b0391909116815260200190565b6000806000806060858703121561337d57600080fd5b843561338881612cff565b93506020850135925060408501356001600160401b038111156133aa57600080fd5b6133b687828801613063565b95989497509550505050565b60006001600160401b038211156133db576133db612d24565b5060051b60200190565b600082601f8301126133f657600080fd5b8135602061340b613406836133c2565b612d3a565b82815260059290921b8401810191818101908684111561342a57600080fd5b8286015b84811015613445578035835291830191830161342e565b509695505050505050565b600080600080600060a0868803121561346857600080fd5b853561347381612cff565b9450602086013561348381612cff565b935060408601356001600160401b038082111561349f57600080fd5b6134ab89838a016133e5565b945060608801359150808211156134c157600080fd5b6134cd89838a016133e5565b935060808801359150808211156134e357600080fd5b506134f088828901612dc1565b9150509295509295909350565b60008060006040848603121561351257600080fd5b833561351d81612cff565b925060208401356001600160401b0381111561353857600080fd5b61310886828701613063565b6020815260006109b160208301846132d2565b6020808252825182820181905260009190848201906040850190845b818110156135985783516001600160a01b031683529284019291840191600101613573565b50909695505050505050565b6020815260006109b16020830184613122565b600080600080600060a086880312156135cf57600080fd5b85356135da81612cff565b945060208601356135ea81612cff565b9350604086013592506060860135915060808601356001600160401b0381111561361357600080fd5b6134f088828901612dc1565b6000808335601e1984360301811261363657600080fd5b8301803591506001600160401b0382111561365057600080fd5b60200191503681900382131561250957600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156136a5576136a561367b565b5060010190565b60208082526021908201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746040820152601760f91b606082015260800190565b80356001600160801b0381168114612d1f57600080fd5b60006020828403121561371657600080fd5b6109b1826136ed565b803560ff81168114612d1f57600080fd5b60006020828403121561374257600080fd5b6109b18261371f565b6000821982111561375e5761375e61367b565b500190565b6000808335601e1984360301811261377a57600080fd5b8301803591506001600160401b0382111561379457600080fd5b6020019150600581901b360382131561250957600080fd5b6000808335601e198436030181126137c357600080fd5b83016020810192503590506001600160401b038111156137e257600080fd5b8060051b360383131561250957600080fd5b8183526000602080850194508260005b8581101561383257813561381781612cff565b6001600160a01b031687529582019590820190600101613804565b509495945050505050565b6020815261385e6020820161385184612d14565b6001600160a01b03169052565b600061386c6020840161371f565b60ff811660408401525061388360408401846137ac565b61012080606086015261389b610140860183856137f4565b9250606086013560808601526138b3608087016136ed565b91506138c260a0860183613115565b6138ce60a087016136ed565b91506138dd60c0860183613115565b6138e960c087016136ed565b91506138f860e0860183613115565b61390460e087016136ed565b915061010061391581870184613115565b9590950135939094019290925250919050565b60006020828403121561393a57600080fd5b5051919050565b600181811c9082168061395557607f821691505b60208210811415612ea557634e487b7160e01b600052602260045260246000fd5b602080825260059082015264214461746160d81b604082015260600190565b600080858511156139a557600080fd5b838611156139b257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156139e75780818660040360031b1b83161692505b505092915050565b600060208284031215613a0157600080fd5b5035919050565b600082601f830112613a1957600080fd5b81356020613a29613406836133c2565b82815260059290921b84018101918181019086841115613a4857600080fd5b8286015b848110156134455780356001600160401b03811115613a6b5760008081fd5b613a798986838b0101612dc1565b845250918301918301613a4c565b600080600060608486031215613a9c57600080fd5b83356001600160401b0380821115613ab357600080fd5b818601915086601f830112613ac757600080fd5b81356020613ad7613406836133c2565b82815260059290921b8401810191818101908a841115613af657600080fd5b948201945b83861015613b1d578535613b0e81612cff565b82529482019490820190613afb565b97505087013592505080821115613b3357600080fd5b613b3f878388016133e5565b93506040860135915080821115613b5557600080fd5b50613b6286828701613a08565b9150509250925092565b600060208284031215613b7e57600080fd5b815180151581146109b157600080fd5b60008251613ba08184602087016132a2565b9190910192915050565b6001600160a01b0392831681529116602082015260606040820181905260009082015260800190565b604081526000613be660408301856132d2565b8281036020840152613bf881856132d2565b95945050505050565b60008184825b85811015613c38578135613c1a81612cff565b6001600160a01b031683526020928301929190910190600101613c07565b509095945050505050565b634e487b7160e01b600052602160045260246000fd5b600082821015613c6b57613c6b61367b565b500390565b634e487b7160e01b600052603160045260246000fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220488fca858cea32ff9345eebbb45b5bf07cf886a8608e53ce6abe287edb408a8264736f6c634300080c0033"; - diff --git a/src/test/smart-wallet/utils/AABenchmarkTest.t.sol b/src/test/smart-wallet/utils/AABenchmarkTest.t.sol index 36d863c41..36dd5cc0c 100644 --- a/src/test/smart-wallet/utils/AABenchmarkTest.t.sol +++ b/src/test/smart-wallet/utils/AABenchmarkTest.t.sol @@ -15,7 +15,11 @@ contract ProfileThirdwebAccount is AAGasProfileBase { setAccount(); } - function fillData(address _to, uint256 _value, bytes memory _data) internal view override returns (bytes memory) { + function fillData( + address _to, + uint256 _value, + bytes memory _data + ) internal view override returns (bytes memory) { return abi.encodeWithSelector(ThirdwebAccount.execute.selector, _to, _value, _data); } From b43a546b77aa4be1f14cdd7f726db6f9a0ac16e0 Mon Sep 17 00:00:00 2001 From: WhiteOakKong Date: Thu, 2 Nov 2023 14:52:40 -0500 Subject: [PATCH 3/7] fix foundry.toml --- foundry.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/foundry.toml b/foundry.toml index eb676173f..a45aa3935 100644 --- a/foundry.toml +++ b/foundry.toml @@ -38,7 +38,7 @@ remappings = [ 'erc721a-upgradeable/=lib/ERC721A-Upgradeable/', 'erc721a/=lib/ERC721A/', '@thirdweb-dev/dynamic-contracts/=lib/dynamic-contracts/', - 'lib/sstore2=lib/dynamic-contracts/lib/sstore2/' + 'lib/sstore2=lib/dynamic-contracts/lib/sstore2/', 'aa-benchmark/=lib/aa-benchmark/', 'solady/=lib/solady/src/' ] From 0b89514935c847d0deb043a67711cfdd1d1a84cc Mon Sep 17 00:00:00 2001 From: Krishang Date: Mon, 20 Nov 2023 23:39:22 +0530 Subject: [PATCH 4/7] format --- src/test/smart-wallet/utils/AABenchmarkArtifacts.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol index 7deecb587..f2b829146 100644 --- a/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol +++ b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol @@ -15,5 +15,5 @@ interface ThirdwebAccount { } address constant THIRDWEB_ACCOUNT_FACTORY_ADDRESS = 0x2e234DAe75C793f67A35089C9d99245E1C58470b; address constant THIRDWEB_ACCOUNT_IMPL_ADDRESS = 0xffD4505B3452Dc22f8473616d50503bA9E1710Ac; -bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"608060405234801561001057600080fd5b50600436106101125760003560e01c806308e93d0a146101175780630db33003146101355780630e6254fd1461014a57806311464fbe1461015d578063248a9ca3146101915780632f2ff15d146101b257806336568abe146101c557806367793cc6146101d85780638878ed33146101eb5780639010d07c146101fe57806391d1485414610211578063938e3d7b146102345780639ddbb9d814610247578063a217fddf1461025a578063a32fa5b314610262578063a65d69d414610275578063ac9650d81461029c578063c3c5a547146102bc578063ca15c873146102cf578063d547741f146102e2578063d8fd8f44146102f5578063e8a3d48514610308575b600080fd5b61011f61031d565b60405161012c91906117d7565b60405180910390f35b6101486101433660046118eb565b61032e565b005b61011f610158366004611948565b6103d1565b6101847f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac81565b60405161012c9190611963565b6101a461019f366004611977565b6103fb565b60405190815260200161012c565b6101486101c0366004611990565b610419565b6101486101d3366004611990565b6104c3565b6101486101e63660046119bc565b610522565b6101846101f9366004611a09565b610576565b61018461020c366004611a8b565b6105f0565b61022461021f366004611990565b6106ff565b604051901515815260200161012c565b610148610242366004611aad565b610733565b6101486102553660046118eb565b610784565b6101a4600081565b610224610270366004611990565b61081d565b6101847f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278981565b6102af6102aa366004611afd565b610880565b60405161012c9190611bcd565b6102246102ca366004611948565b610974565b6101a46102dd366004611977565b610980565b6101486102f0366004611990565b610a1d565b610184610303366004611a09565b610a28565b610310610b73565b60405161012c9190611c2f565b60606103296000610cfa565b905090565b3361033a818484610d07565b61035f5760405162461bcd60e51b815260040161035690611c42565b60405180910390fd5b6001600160a01b03841660009081526002602052604081206103819083610d5b565b905080156103ca57846001600160a01b0316826001600160a01b03167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a35b5050505050565b6001600160a01b03811660009081526002602052604090206060906103f590610cfa565b92915050565b6000610405610d70565b600092835260010160205250604090205490565b61043d610424610d70565b6000848152600191909101602052604090205433610d7a565b610445610d70565b6000838152602091825260408082206001600160a01b0385168352909252205460ff16156104b55760405162461bcd60e51b815260206004820152601d60248201527f43616e206f6e6c79206772616e7420746f206e6f6e20686f6c646572730000006044820152606401610356565b6104bf8282610dff565b5050565b336001600160a01b038216146105185760405162461bcd60e51b815260206004820152601a60248201527921b0b71037b7363c903932b737bab731b2903337b91039b2b63360311b6044820152606401610356565b6104bf8282610e13565b3361052e818484610d07565b61054a5760405162461bcd60e51b815260040161035690611c42565b610555600082610e27565b6105715760405162461bcd60e51b815260040161035690611c79565b505050565b6000806105b98585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e3c92505050565b90506105e57f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac82610e6d565b9150505b9392505050565b6000806105fb610ecd565b600085815260209190915260408120549150805b828110156106f6576000610621610ecd565b60008881526020918252604080822085835260010190925220546001600160a01b03161461069a578482141561068857610659610ecd565b600087815260209182526040808220938252600190930190915220546001600160a01b031692506103f5915050565b610693600183611cd9565b91506106e4565b6106a58660006106ff565b80156106d157506106b4610ecd565b600087815260209182526040808220828052600201909252205481145b156106e4576106e1600183611cd9565b91505b6106ef600182611cd9565b905061060f565b50505092915050565b6000610709610d70565b6000938452602090815260408085206001600160a01b039490941685529290525090205460ff1690565b61073b610ed7565b6107785760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b6044820152606401610356565b61078181610ee3565b50565b33610790818484610d07565b6107ac5760405162461bcd60e51b815260040161035690611c42565b6001600160a01b03841660009081526002602052604081206107ce9083610e27565b905080156103ca57846001600160a01b0316826001600160a01b03167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35050505050565b6000610827610d70565b600084815260209182526040808220828052909252205460ff166108775761084d610d70565b6000848152602091825260408082206001600160a01b0386168352909252205460ff1690506103f5565b50600192915050565b6060816001600160401b0381111561089a5761089a611840565b6040519080825280602002602001820160405280156108cd57816020015b60608152602001906001900390816108b85790505b50905060005b8281101561096d5761093d308585848181106108f1576108f1611cf1565b90506020028101906109039190611d07565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fce92505050565b82828151811061094f5761094f611cf1565b6020026020010181905250808061096590611d54565b9150506108d3565b5092915050565b60006103f58183610ff3565b60008061098b610ecd565b6000848152602091909152604081205491505b818110156109f85760006109b0610ecd565b60008681526020918252604080822085835260010190925220546001600160a01b0316146109e6576109e3600184611cd9565b92505b6109f1600182611cd9565b905061099e565b50610a048360006106ff565b15610a1757610a14600183611cd9565b91505b50919050565b610518610424610d70565b6000807f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac90506000610a908686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e3c92505050565b90506000610a9e8383610e6d565b90506001600160a01b0381163b15610aba5792506105e9915050565b610ac48383611015565b9050336001600160a01b037f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27891614610b1d57610b01600082610e27565b610b1d5760405162461bcd60e51b815260040161035690611c79565b610b29818888886110ac565b866001600160a01b0316816001600160a01b03167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a39695505050505050565b6060610b7d611114565b8054610b8890611d6f565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb490611d6f565b8015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b5050505050905090565b6001610c15610d70565b6000848152602091825260408082206001600160a01b0386168084529352808220805460ff1916941515949094179093559151339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b7f0a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e50090565b60008060ff19610cc960017f0c4ba382c0009cf238e4c1ca1a52f51c61e6248a70bdfb34e5ed49d5578a5c0c611da4565b604051602001610cdb91815260200190565b60408051601f1981840301815291905280516020909101201692915050565b606060006105e983611138565b600080610d148484610e3c565b90506000610d427f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac83610e6d565b6001600160a01b03878116911614925050509392505050565b60006105e9836001600160a01b038416611194565b6000610329610c74565b610d82610d70565b6000838152602091825260408082206001600160a01b0385168352909252205460ff166104bf57610dbd816001600160a01b03166014611287565b610dc8836020611287565b604051602001610dd9929190611dbb565b60408051601f198184030181529082905262461bcd60e51b825261035691600401611c2f565b610e098282610c0b565b6104bf8282611422565b610e1d82826114e1565b6104bf828261154a565b60006105e9836001600160a01b0384166115d9565b600082604051602001610e4f9190611963565b60405160208183030381529060405280519060200120905092915050565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff602482015260148101839052733d602d80600a3d3981f3363d3d373d3d3d363d738152605881018290526037600c820120607882015260556043909101206000906105e9565b6000610329610c98565b600061032981336106ff565b6000610eed611114565b8054610ef890611d6f565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2490611d6f565b8015610f715780601f10610f4657610100808354040283529160200191610f71565b820191906000526020600020905b815481529060010190602001808311610f5457829003601f168201915b5050505050905081610f81611114565b8151610f90926020019061173e565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051610fc2929190611e28565b60405180910390a15050565b60606105e98383604051806060016040528060278152602001611ef660279139611628565b6001600160a01b038116600090815260018301602052604081205415156105e9565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166103f55760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b6044820152606401610356565b60405163347d5e2560e21b81526001600160a01b0385169063d1f57894906110dc90869086908690600401611e4d565b600060405180830381600087803b1580156110f657600080fd5b505af115801561110a573d6000803e3d6000fd5b5050505050505050565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b60608160000180548060200260200160405190810160405280929190818152602001828054801561118857602002820191906000526020600020905b815481526020019060010190808311611174575b50505050509050919050565b6000818152600183016020526040812054801561127d5760006111b8600183611da4565b85549091506000906111cc90600190611da4565b90508181146112315760008660000182815481106111ec576111ec611cf1565b906000526020600020015490508087600001848154811061120f5761120f611cf1565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061124257611242611e8d565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506103f5565b60009150506103f5565b60606000611296836002611ea3565b6112a1906002611cd9565b6001600160401b038111156112b8576112b8611840565b6040519080825280601f01601f1916602001820160405280156112e2576020820181803683370190505b509050600360fc1b816000815181106112fd576112fd611cf1565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061132c5761132c611cf1565b60200101906001600160f81b031916908160001a9053506000611350846002611ea3565b61135b906001611cd9565b90505b60018111156113d3576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061138f5761138f611cf1565b1a60f81b8282815181106113a5576113a5611cf1565b60200101906001600160f81b031916908160001a90535060049490941c936113cc81611ec2565b905061135e565b5083156105e95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610356565b600061142c610ecd565b6000848152602091909152604090205490506001611448610ecd565b6000858152602091909152604081208054909190611467908490611cd9565b90915550829050611476610ecd565b6000858152602091825260408082208583526001019092522080546001600160a01b0319166001600160a01b0392909216919091179055806114b6610ecd565b6000948552602090815260408086206001600160a01b03909516865260029094019052919092205550565b6114eb8282610d7a565b6114f3610d70565b6000838152602091825260408082206001600160a01b0385168084529352808220805460ff191690555133929185917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000611554610ecd565b6000848152602091825260408082206001600160a01b038616835260020190925220549050611581610ecd565b6000848152602091825260408082208483526001019092522080546001600160a01b03191690556115b0610ecd565b6000938452602090815260408085206001600160a01b0390941685526002909301905250812055565b6000818152600183016020526040812054611620575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556103f5565b5060006103f5565b60606001600160a01b0384163b6116905760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610356565b600080856001600160a01b0316856040516116ab9190611ed9565b600060405180830381855af49150503d80600081146116e6576040519150601f19603f3d011682016040523d82523d6000602084013e6116eb565b606091505b50915091506116fb828286611705565b9695505050505050565b606083156117145750816105e9565b8251156117245782518084602001fd5b8160405162461bcd60e51b81526004016103569190611c2f565b82805461174a90611d6f565b90600052602060002090601f01602090048101928261176c57600085556117b2565b82601f1061178557805160ff19168380011785556117b2565b828001600101855582156117b2579182015b828111156117b2578251825591602001919060010190611797565b506117be9291506117c2565b5090565b5b808211156117be57600081556001016117c3565b6020808252825182820181905260009190848201906040850190845b818110156118185783516001600160a01b0316835292840192918401916001016117f3565b50909695505050505050565b80356001600160a01b038116811461183b57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561187057611870611840565b604051601f8501601f19908116603f0116810190828211818310171561189857611898611840565b816040528093508581528686860111156118b157600080fd5b858560208301376000602087830101525050509392505050565b600082601f8301126118dc57600080fd5b6105e983833560208501611856565b60008060006060848603121561190057600080fd5b61190984611824565b925061191760208501611824565b915060408401356001600160401b0381111561193257600080fd5b61193e868287016118cb565b9150509250925092565b60006020828403121561195a57600080fd5b6105e982611824565b6001600160a01b0391909116815260200190565b60006020828403121561198957600080fd5b5035919050565b600080604083850312156119a357600080fd5b823591506119b360208401611824565b90509250929050565b600080604083850312156119cf57600080fd5b6119d883611824565b915060208301356001600160401b038111156119f357600080fd5b6119ff858286016118cb565b9150509250929050565b600080600060408486031215611a1e57600080fd5b611a2784611824565b925060208401356001600160401b0380821115611a4357600080fd5b818601915086601f830112611a5757600080fd5b813581811115611a6657600080fd5b876020828501011115611a7857600080fd5b6020830194508093505050509250925092565b60008060408385031215611a9e57600080fd5b50508035926020909101359150565b600060208284031215611abf57600080fd5b81356001600160401b03811115611ad557600080fd5b8201601f81018413611ae657600080fd5b611af584823560208401611856565b949350505050565b60008060208385031215611b1057600080fd5b82356001600160401b0380821115611b2757600080fd5b818501915085601f830112611b3b57600080fd5b813581811115611b4a57600080fd5b8660208260051b8501011115611b5f57600080fd5b60209290920196919550909350505050565b60005b83811015611b8c578181015183820152602001611b74565b83811115611b9b576000848401525b50505050565b60008151808452611bb9816020860160208601611b71565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611c2257603f19888603018452611c10858351611ba1565b94509285019290850190600101611bf4565b5092979650505050505050565b6020815260006105e96020830184611ba1565b6020808252601f908201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e00604082015260600190565b6020808252602a908201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206040820152691c9959da5cdd195c995960b21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611cec57611cec611cc3565b500190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611d1e57600080fd5b8301803591506001600160401b03821115611d3857600080fd5b602001915036819003821315611d4d57600080fd5b9250929050565b6000600019821415611d6857611d68611cc3565b5060010190565b600181811c90821680611d8357607f821691505b60208210811415610a1757634e487b7160e01b600052602260045260246000fd5b600082821015611db657611db6611cc3565b500390565b7402832b936b4b9b9b4b7b7399d1030b1b1b7bab73a1605d1b815260008351611deb816015850160208801611b71565b7001034b99036b4b9b9b4b733903937b6329607d1b6015918401918201528351611e1c816026840160208801611b71565b01602601949350505050565b604081526000611e3b6040830185611ba1565b82810360208401526105e58185611ba1565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b634e487b7160e01b600052603160045260246000fd5b6000816000190483118215151615611ebd57611ebd611cc3565b500290565b600081611ed157611ed1611cc3565b506000190190565b60008251611eeb818460208701611b71565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212205d3e29505e958fbe45e9de9dcaceef129bcbdeb4391a97796b4016eda66dfb4764736f6c634300080c0033"; -bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"6080604052600436106101405760003560e01c806301ffc9a71461014c578063150b7a02146101815780631626ba7e146101c55780631dd756c5146101e557806324d7806c146102055780633a871cdd1461022557806347e1da2a146102535780634a58db19146102755780634d44560d1461027d5780635892e2361461029d5780637dff5a79146102bd5780638b52d723146102dd578063938e3d7b146102ff578063a9082d841461031f578063ac9650d81461035e578063b0d691fe1461038b578063b61d27f6146103ad578063b76464d5146103cd578063bc197c81146103ed578063c45a015514610419578063d087d2881461044d578063d1f5789414610462578063d42f2f3514610482578063e8a3d48514610497578063e9523c97146104b9578063f15d424e146104db578063f23a6e611461050857600080fd5b3661014757005b600080fd5b34801561015857600080fd5b5061016c610167366004612cd5565b610534565b60405190151581526020015b60405180910390f35b34801561018d57600080fd5b506101ac61019c366004612de1565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610178565b3480156101d157600080fd5b506101ac6101e0366004612e4c565b61057a565b3480156101f157600080fd5b5061016c610200366004612eab565b610689565b34801561021157600080fd5b5061016c610220366004612ef0565b610963565b34801561023157600080fd5b50610245610240366004612f0d565b610992565b604051908152602001610178565b34801561025f57600080fd5b5061027361026e366004612f9e565b6109b8565b005b610273610b29565b34801561028957600080fd5b50610273610298366004613037565b610b91565b3480156102a957600080fd5b506102736102b83660046130a4565b610c0a565b3480156102c957600080fd5b5061016c6102d8366004612ef0565b610fc7565b3480156102e957600080fd5b506102f2611080565b60405161017891906131b7565b34801561030b57600080fd5b5061027361031a366004613219565b6112c7565b34801561032b57600080fd5b5061033f61033a3660046130a4565b611318565b6040805192151583526001600160a01b03909116602083015201610178565b34801561036a57600080fd5b5061037e610379366004613261565b61136f565b60405161017891906132fe565b34801561039757600080fd5b506103a0611463565b6040516101789190613353565b3480156103b957600080fd5b506102736103c8366004613367565b6114ac565b3480156103d957600080fd5b506102736103e8366004612ef0565b61153c565b3480156103f957600080fd5b506101ac610408366004613450565b63bc197c8160e01b95945050505050565b34801561042557600080fd5b506103a07f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b81565b34801561045957600080fd5b5061024561156e565b34801561046e57600080fd5b5061027361047d3660046134fd565b6115ee565b34801561048e57600080fd5b506102f2611787565b3480156104a357600080fd5b506104ac6118f8565b6040516101789190613544565b3480156104c557600080fd5b506104ce611990565b6040516101789190613557565b3480156104e757600080fd5b506104fb6104f6366004612ef0565b6119a2565b60405161017891906135a4565b34801561051457600080fd5b506101ac6105233660046135b7565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b148061056557506001600160e01b03198216630a85bd0160e11b145b80610574575061057482611a9e565b92915050565b6000806105878484611ad3565b905061059281610963565b156105a75750630b135d3f60e11b9050610574565b3360006105b2611af7565b6001600160a01b03841660009081526006919091016020526040902090506105da8183611b1b565b8061060a57506105e981611b3d565b600114801561060a575060006105ff8282611b47565b6001600160a01b0316145b6106675760405162461bcd60e51b8152602060048201526024808201527f4163636f756e743a2063616c6c6572206e6f7420617070726f7665642074617260448201526333b2ba1760e11b60648201526084015b60405180910390fd5b61067083610fc7565b1561068057630b135d3f60e11b93505b50505092915050565b6000610693611af7565b6001600160a01b0384166000908152600491909101602052604090205460ff16156106c057506001610574565b60006106ca611af7565b6001600160a01b0385166000908152600591909101602090815260408083208151606081018352815481526001909101546001600160801b0380821694830194909452600160801b9004909216908201529150610725611af7565b6006016000866001600160a01b03166001600160a01b0316815260200190815260200160002090504282602001516001600160801b03161180610775575081604001516001600160801b03164210155b80610786575061078481611b3d565b155b1561079657600092505050610574565b60006107ad6107a8606087018761361f565b611b53565b905060006107ba83611b3d565b60011480156107db575060006107d08482611b47565b6001600160a01b0316145b90506001600160e01b03198216635b0e93fb60e11b14156108535760008061080e61080960608a018a61361f565b611b8d565b9150915082610834576108218583611b1b565b6108345760009650505050505050610574565b855181111561084c5760009650505050505050610574565b5050610956565b6001600160e01b031982166323f0ed1560e11b14156109495760008061088461087f60608a018a61361f565b611bf2565b5091509150826108ee5760005b82518110156108ec576108c68382815181106108af576108af613665565b602002602001015187611b1b90919063ffffffff16565b6108da576000975050505050505050610574565b806108e481613691565b915050610891565b505b60005b82518110156109415781818151811061090c5761090c613665565b60200260200101518760000151101561092f576000975050505050505050610574565b8061093981613691565b9150506108f1565b505050610956565b6000945050505050610574565b5060019695505050505050565b600061096d611af7565b6001600160a01b03909216600090815260049290920160205250604090205460ff1690565b600061099c611c3f565b6109a68484611ca8565b90506109b182611ded565b9392505050565b6109c0611463565b6001600160a01b0316336001600160a01b031614806109e357506109e333610963565b6109ff5760405162461bcd60e51b815260040161065e906136ac565b610a07611e3a565b8481148015610a1557508483145b610a615760405162461bcd60e51b815260206004820152601d60248201527f4163636f756e743a2077726f6e67206172726179206c656e677468732e000000604482015260640161065e565b60005b85811015610b2057610b0d878783818110610a8157610a81613665565b9050602002016020810190610a969190612ef0565b868684818110610aa857610aa8613665565b90506020020135858585818110610ac157610ac1613665565b9050602002810190610ad3919061361f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f3792505050565b5080610b1881613691565b915050610a64565b50505050505050565b610b31611463565b6001600160a01b031663b760faf934306040518363ffffffff1660e01b8152600401610b5d9190613353565b6000604051808303818588803b158015610b7657600080fd5b505af1158015610b8a573d6000803e3d6000fd5b5050505050565b610b99611fa8565b610ba1611463565b60405163040b850f60e31b81526001600160a01b03848116600483015260248201849052919091169063205c2878906044015b600060405180830381600087803b158015610bee57600080fd5b505af1158015610c02573d6000803e3d6000fd5b505050505050565b6000610c196020850185612ef0565b905042610c2c60e0860160c08701613704565b6001600160801b031611158015610c5b5750610c4f610100850160e08601613704565b6001600160801b031642105b610c915760405162461bcd60e51b8152602060048201526007602482015266085c195c9a5bd960ca1b604482015260640161065e565b600080610c9f868686611318565b9150915081610cd95760405162461bcd60e51b815260040161065e906020808252600490820152632173696760e01b604082015260600190565b6001610ce3611af7565b610100880135600090815260079190910160209081526040808320805460ff1916941515949094179093559091610d1f91908901908901613730565b60ff161115610d4c576000610d3a6040880160208901613730565b60ff166001149050610b208482611fe6565b610d5583610963565b15610d8a5760405162461bcd60e51b815260206004820152600560248201526430b236b4b760d91b604482015260640161065e565b610d9f83610d96611af7565b600201906120c9565b50604051806060016040528087606001358152602001876080016020810190610dc89190613704565b6001600160801b03168152602001610de660c0890160a08a01613704565b6001600160801b03169052610df9611af7565b6001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b02931692909217600190920191909155610e6f610e4e611af7565b6001600160a01b0386166000908152600691909101602052604090206120de565b805190915060005b81811015610ed957610ec6838281518110610e9457610e94613665565b6020026020010151610ea4611af7565b6001600160a01b038916600090815260069190910160205260409020906120eb565b50610ed260018261374b565b9050610e77565b50610ee76040890189613763565b9050905060005b81811015610f6857610f55610f0660408b018b613763565b83818110610f1657610f16613665565b9050602002016020810190610f2b9190612ef0565b610f33611af7565b6001600160a01b038916600090815260069190910160205260409020906120c9565b50610f6160018261374b565b9050610eee565b50610f7288612100565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a604051610fb5919061383d565b60405180910390a35050505050505050565b600080610fd2611af7565b6001600160a01b038416600090815260059190910160209081526040918290208251606081018452815481526001909101546001600160801b03808216938301849052600160801b90910416928101929092529091504210801590611043575080604001516001600160801b031642105b80156109b157506000611078611057611af7565b6001600160a01b038616600090815260069190910160205260409020611b3d565b119392505050565b6060600061109761108f611af7565b6002016120de565b80519091506000805b82811015611128576110ca8482815181106110bd576110bd613665565b6020026020010151610fc7565b156110e157816110d981613691565b925050611116565b60008482815181106110f5576110f5613665565b60200260200101906001600160a01b031690816001600160a01b0316815250505b61112160018261374b565b90506110a0565b50806001600160401b0381111561114157611141612d24565b60405190808252806020026020018201604052801561117a57816020015b611167612bf2565b81526020019060019003908161115f5790505b5093506000805b838110156112bf5760006001600160a01b03168582815181106111a6576111a6613665565b60200260200101516001600160a01b0316146112ad5760008582815181106111d0576111d0613665565b6020026020010151905060006111e4611af7565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a08101909452918352909250810161124e610e4e611af7565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b031681525088858061128d90613691565b96508151811061129f5761129f613665565b602002602001018190525050505b6112b860018261374b565b9050611181565b505050505090565b6112cf6121a3565b61130c5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b604482015260640161065e565b611315816121bb565b50565b60008061132e611327866122a6565b85856123ea565b9050611338611af7565b6101008601356000908152600791909101602052604090205460ff16158015611365575061136581610963565b9150935093915050565b6060816001600160401b0381111561138957611389612d24565b6040519080825280602002602001820160405280156113bc57816020015b60608152602001906001900390816113a75790505b50905060005b8281101561145c5761142c308585848181106113e0576113e0613665565b90506020028101906113f2919061361f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061244492505050565b82828151811061143e5761143e613665565b6020026020010181905250808061145490613691565b9150506113c2565b5092915050565b60008061146e612469565b546001600160a01b03169050801561148557919050565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278991505090565b6114b4611463565b6001600160a01b0316336001600160a01b031614806114d757506114d733610963565b6114f35760405162461bcd60e51b815260040161065e906136ac565b6114fb611e3a565b610b8a848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f3792505050565b611544611fa8565b8061154d612469565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6000611578611463565b604051631aab3f0d60e11b8152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e99190613928565b905090565b60006115f861248d565b5460ff169050600061160861248d565b54610100900460ff1690508015808015611625575060018360ff16105b80611644575061163430612497565b15801561164457508260ff166001145b6116a75760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065e565b60016116b161248d565b805460ff191660ff9290921691909117905580156116ea5760016116d361248d565b80549115156101000261ff00199092169190911790555b856116f3612469565b60010160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550611725866001611fe6565b8015610c0257600061173561248d565b80549115156101000261ff0019909216919091179055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050565b6060600061179661108f611af7565b8051909150806001600160401b038111156117b3576117b3612d24565b6040519080825280602002602001820160405280156117ec57816020015b6117d9612bf2565b8152602001906001900390816117d15790505b50925060005b818110156118f257600083828151811061180e5761180e613665565b602002602001015190506000611822611af7565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a08101909452918352909250810161188c610e4e611af7565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b03168152508684815181106118d1576118d1613665565b602002602001018190525050506001816118eb919061374b565b90506117f2565b50505090565b60606119026124a6565b805461190d90613941565b80601f016020809104026020016040519081016040528092919081815260200182805461193990613941565b80156119865780601f1061195b57610100808354040283529160200191611986565b820191906000526020600020905b81548152906001019060200180831161196957829003601f168201915b5050505050905090565b60606115e961199d611af7565b6120de565b6119aa612bf2565b60006119b4611af7565b6001600160a01b038416600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611a3f611a1e611af7565b6001600160a01b0387166000908152600691909101602052604090206120de565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030090565b60006001600160e01b03198216630271189760e51b148061057457506301ffc9a760e01b6001600160e01b0319831614610574565b6000806000611ae285856124ca565b91509150611aef81612510565b509392505050565b7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0090565b6001600160a01b038116600090815260018301602052604081205415156109b1565b6000610574825490565b60006109b18383612659565b60006004821015611b765760405162461bcd60e51b815260040161065e90613976565b611b84600460008486613995565b6109b1916139bf565b6000806044831015611bb15760405162461bcd60e51b815260040161065e90613976565b611bbf602460048587613995565b810190611bcc9190612ef0565b9150611bdc604460248587613995565b810190611be991906139ef565b90509250929050565b606080806064841015611c175760405162461bcd60e51b815260040161065e90613976565b611c248460048188613995565b810190611c319190613a87565b919790965090945092505050565b611c47611463565b6001600160a01b0316336001600160a01b031614611ca65760405162461bcd60e51b815260206004820152601c60248201527b1858d8dbdd5b9d0e881b9bdd08199c9bdb48115b9d1c9e541bda5b9d60221b604482015260640161065e565b565b7b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6000908152601c829052603c81206000611d26611ce961014087018761361f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050611ad39050565b9050611d328186610689565b611d4157600192505050610574565b6000611d4b611af7565b6001600160a01b03929092166000908152600590920160209081526040808420815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845295825265ffffffffffff8087169483019490945292831691015260d09290921b6001600160d01b03191660a09290921b65ffffffffffff60a01b169190911795945050505050565b801561131557604051600090339060001990849084818181858888f193505050503d8060008114610b8a576040519150601f19603f3d011682016040523d82523d6000602084013e610b8a565b60405163c3c5a54760e01b81527f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b906001600160a01b0382169063c3c5a54790611e88903090600401613353565b602060405180830381865afa158015611ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec99190613b6c565b61131557806001600160a01b03166367793cc6611ee4612469565b600101546040805160e084901b6001600160e01b03191681526001600160a01b0390921660048301526024820152600060448201526064015b600060405180830381600087803b158015610b7657600080fd5b60606000846001600160a01b03168484604051611f549190613b8e565b60006040518083038185875af1925050503d8060008114611f91576040519150601f19603f3d011682016040523d82523d6000602084013e611f96565b606091505b509250905080611aef57815160208301fd5b611fb133610963565b611ca65760405162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015260640161065e565b611ff08282612683565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b156120c557801561208d577f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316639ddbb9d88361205e612469565b600101546040516001600160e01b031960e085901b168152610bd492916001600160a01b031690600401613baa565b7f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b6001600160a01b0316630db330038361205e612469565b5050565b60006109b1836001600160a01b038416612732565b606060006109b183612781565b60006109b1836001600160a01b0384166127dd565b6001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b163b15611315576001600160a01b037f0000000000000000000000002e234dae75c793f67a35089c9d99245e1c58470b16639ddbb9d861216c6020840184612ef0565b612174612469565b600101546040516001600160e01b031960e085901b168152611f1d92916001600160a01b031690600401613baa565b60006121ae33610963565b806115e957505030331490565b60006121c56124a6565b80546121d090613941565b80601f01602080910402602001604051908101604052809291908181526020018280546121fc90613941565b80156122495780601f1061221e57610100808354040283529160200191612249565b820191906000526020600020905b81548152906001019060200180831161222c57829003601f168201915b50505050509050816122596124a6565b81516122689260200190612c3c565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a16818360405161229a929190613bd3565b60405180910390a15050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e96122d66020840184612ef0565b6122e66040850160208601613730565b6122f36040860186613763565b604051602001612304929190613c01565b60408051601f198184030181529190528051602090910120606086013561233160a0880160808901613704565b61234160c0890160a08a01613704565b61235160e08a0160c08b01613704565b6123626101008b0160e08c01613704565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b600061243c83838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505087516020890120612436925090506128d0565b90611ad3565b949350505050565b60606109b18383604051806060016040528060278152602001613c87602791396128fd565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830090565b60006115e9611a7a565b6001600160a01b03163b151590565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b6000808251604114156125015760208301516040840151606085015160001a6124f5878285856129d8565b94509450505050612509565b506000905060025b9250929050565b600081600481111561252457612524613c43565b141561252d5750565b600181600481111561254157612541613c43565b141561258a5760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015260640161065e565b600281600481111561259e5761259e613c43565b14156125ec5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161065e565b600381600481111561260057612600613c43565b14156113155760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161065e565b600082600001828154811061267057612670613665565b9060005260206000200154905092915050565b8061268c611af7565b6001600160a01b038416600090815260049190910160205260409020805460ff191691151591909117905580156126d5576126cf826126c9611af7565b906120c9565b506126e9565b6126e7826126e1611af7565b906120eb565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a1113382604051612726911515815260200190565b60405180910390a25050565b600081815260018301602052604081205461277957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610574565b506000610574565b6060816000018054806020026020016040519081016040528092919081815260200182805480156127d157602002820191906000526020600020905b8154815260200190600101908083116127bd575b50505050509050919050565b600081815260018301602052604081205480156128c6576000612801600183613c59565b855490915060009061281590600190613c59565b905081811461287a57600086600001828154811061283557612835613665565b906000526020600020015490508087600001848154811061285857612858613665565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061288b5761288b613c70565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610574565b6000915050610574565b60006105746128dd612a92565b8360405161190160f01b8152600281019290925260228201526042902090565b606061290884612497565b6129635760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161065e565b600080856001600160a01b03168560405161297e9190613b8e565b600060405180830381855af49150503d80600081146129b9576040519150601f19603f3d011682016040523d82523d6000602084013e6129be565b606091505b50915091506129ce828286612bb9565b9695505050505050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612a055750600090506003612a89565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612a59573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612a8257600060019250925050612a89565b9150600090505b94509492505050565b6000306001600160a01b037f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac16148015612aeb57507f0000000000000000000000000000000000000000000000000000000000007a6946145b15612b1557507fbcdadf6444930a967ffda04923d78c49b3dd65df3ed39abb04a1e3eb1190553790565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527ff0729608244859f656d32ae4cbc6b0367695d68d8e941a28f5e2d33c6d5182dd828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b60608315612bc85750816109b1565b825115612bd85782518084602001fd5b8160405162461bcd60e51b815260040161065e9190613544565b6040518060a0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160801b0316815260200160006001600160801b031681525090565b828054612c4890613941565b90600052602060002090601f016020900481019282612c6a5760008555612cb0565b82601f10612c8357805160ff1916838001178555612cb0565b82800160010185558215612cb0579182015b82811115612cb0578251825591602001919060010190612c95565b50612cbc929150612cc0565b5090565b5b80821115612cbc5760008155600101612cc1565b600060208284031215612ce757600080fd5b81356001600160e01b0319811681146109b157600080fd5b6001600160a01b038116811461131557600080fd5b8035612d1f81612cff565b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612d6257612d62612d24565b604052919050565b60006001600160401b03831115612d8357612d83612d24565b612d96601f8401601f1916602001612d3a565b9050828152838383011115612daa57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612dd257600080fd5b6109b183833560208501612d6a565b60008060008060808587031215612df757600080fd5b8435612e0281612cff565b93506020850135612e1281612cff565b92506040850135915060608501356001600160401b03811115612e3457600080fd5b612e4087828801612dc1565b91505092959194509250565b60008060408385031215612e5f57600080fd5b8235915060208301356001600160401b03811115612e7c57600080fd5b612e8885828601612dc1565b9150509250929050565b60006101608284031215612ea557600080fd5b50919050565b60008060408385031215612ebe57600080fd5b8235612ec981612cff565b915060208301356001600160401b03811115612ee457600080fd5b612e8885828601612e92565b600060208284031215612f0257600080fd5b81356109b181612cff565b600080600060608486031215612f2257600080fd5b83356001600160401b03811115612f3857600080fd5b612f4486828701612e92565b9660208601359650604090950135949350505050565b60008083601f840112612f6c57600080fd5b5081356001600160401b03811115612f8357600080fd5b6020830191508360208260051b850101111561250957600080fd5b60008060008060008060608789031215612fb757600080fd5b86356001600160401b0380821115612fce57600080fd5b612fda8a838b01612f5a565b90985096506020890135915080821115612ff357600080fd5b612fff8a838b01612f5a565b9096509450604089013591508082111561301857600080fd5b5061302589828a01612f5a565b979a9699509497509295939492505050565b6000806040838503121561304a57600080fd5b823561305581612cff565b946020939093013593505050565b60008083601f84011261307557600080fd5b5081356001600160401b0381111561308c57600080fd5b60208301915083602082850101111561250957600080fd5b6000806000604084860312156130b957600080fd5b83356001600160401b03808211156130d057600080fd5b9085019061012082880312156130e557600080fd5b909350602085013590808211156130fb57600080fd5b5061310886828701613063565b9497909650939450505050565b6001600160801b03169052565b80516001600160a01b03908116835260208083015160a082860181905281519086018190526000939183019290849060c08801905b8083101561317957855185168252948301946001929092019190830190613157565b5060408701516040890152606087015194506131986060890186613115565b608087015194506131ac6080890186613115565b979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561320c57603f198886030184526131fa858351613122565b945092850192908501906001016131de565b5092979650505050505050565b60006020828403121561322b57600080fd5b81356001600160401b0381111561324157600080fd5b8201601f8101841361325257600080fd5b61243c84823560208401612d6a565b6000806020838503121561327457600080fd5b82356001600160401b0381111561328a57600080fd5b61329685828601612f5a565b90969095509350505050565b60005b838110156132bd5781810151838201526020016132a5565b838111156132cc576000848401525b50505050565b600081518084526132ea8160208601602086016132a2565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561320c57603f198886030184526133418583516132d2565b94509285019290850190600101613325565b6001600160a01b0391909116815260200190565b6000806000806060858703121561337d57600080fd5b843561338881612cff565b93506020850135925060408501356001600160401b038111156133aa57600080fd5b6133b687828801613063565b95989497509550505050565b60006001600160401b038211156133db576133db612d24565b5060051b60200190565b600082601f8301126133f657600080fd5b8135602061340b613406836133c2565b612d3a565b82815260059290921b8401810191818101908684111561342a57600080fd5b8286015b84811015613445578035835291830191830161342e565b509695505050505050565b600080600080600060a0868803121561346857600080fd5b853561347381612cff565b9450602086013561348381612cff565b935060408601356001600160401b038082111561349f57600080fd5b6134ab89838a016133e5565b945060608801359150808211156134c157600080fd5b6134cd89838a016133e5565b935060808801359150808211156134e357600080fd5b506134f088828901612dc1565b9150509295509295909350565b60008060006040848603121561351257600080fd5b833561351d81612cff565b925060208401356001600160401b0381111561353857600080fd5b61310886828701613063565b6020815260006109b160208301846132d2565b6020808252825182820181905260009190848201906040850190845b818110156135985783516001600160a01b031683529284019291840191600101613573565b50909695505050505050565b6020815260006109b16020830184613122565b600080600080600060a086880312156135cf57600080fd5b85356135da81612cff565b945060208601356135ea81612cff565b9350604086013592506060860135915060808601356001600160401b0381111561361357600080fd5b6134f088828901612dc1565b6000808335601e1984360301811261363657600080fd5b8301803591506001600160401b0382111561365057600080fd5b60200191503681900382131561250957600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156136a5576136a561367b565b5060010190565b60208082526021908201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746040820152601760f91b606082015260800190565b80356001600160801b0381168114612d1f57600080fd5b60006020828403121561371657600080fd5b6109b1826136ed565b803560ff81168114612d1f57600080fd5b60006020828403121561374257600080fd5b6109b18261371f565b6000821982111561375e5761375e61367b565b500190565b6000808335601e1984360301811261377a57600080fd5b8301803591506001600160401b0382111561379457600080fd5b6020019150600581901b360382131561250957600080fd5b6000808335601e198436030181126137c357600080fd5b83016020810192503590506001600160401b038111156137e257600080fd5b8060051b360383131561250957600080fd5b8183526000602080850194508260005b8581101561383257813561381781612cff565b6001600160a01b031687529582019590820190600101613804565b509495945050505050565b6020815261385e6020820161385184612d14565b6001600160a01b03169052565b600061386c6020840161371f565b60ff811660408401525061388360408401846137ac565b61012080606086015261389b610140860183856137f4565b9250606086013560808601526138b3608087016136ed565b91506138c260a0860183613115565b6138ce60a087016136ed565b91506138dd60c0860183613115565b6138e960c087016136ed565b91506138f860e0860183613115565b61390460e087016136ed565b915061010061391581870184613115565b9590950135939094019290925250919050565b60006020828403121561393a57600080fd5b5051919050565b600181811c9082168061395557607f821691505b60208210811415612ea557634e487b7160e01b600052602260045260246000fd5b602080825260059082015264214461746160d81b604082015260600190565b600080858511156139a557600080fd5b838611156139b257600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156139e75780818660040360031b1b83161692505b505092915050565b600060208284031215613a0157600080fd5b5035919050565b600082601f830112613a1957600080fd5b81356020613a29613406836133c2565b82815260059290921b84018101918181019086841115613a4857600080fd5b8286015b848110156134455780356001600160401b03811115613a6b5760008081fd5b613a798986838b0101612dc1565b845250918301918301613a4c565b600080600060608486031215613a9c57600080fd5b83356001600160401b0380821115613ab357600080fd5b818601915086601f830112613ac757600080fd5b81356020613ad7613406836133c2565b82815260059290921b8401810191818101908a841115613af657600080fd5b948201945b83861015613b1d578535613b0e81612cff565b82529482019490820190613afb565b97505087013592505080821115613b3357600080fd5b613b3f878388016133e5565b93506040860135915080821115613b5557600080fd5b50613b6286828701613a08565b9150509250925092565b600060208284031215613b7e57600080fd5b815180151581146109b157600080fd5b60008251613ba08184602087016132a2565b9190910192915050565b6001600160a01b0392831681529116602082015260606040820181905260009082015260800190565b604081526000613be660408301856132d2565b8281036020840152613bf881856132d2565b95945050505050565b60008184825b85811015613c38578135613c1a81612cff565b6001600160a01b031683526020928301929190910190600101613c07565b509095945050505050565b634e487b7160e01b600052602160045260246000fd5b600082821015613c6b57613c6b61367b565b500390565b634e487b7160e01b600052603160045260246000fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220488fca858cea32ff9345eebbb45b5bf07cf886a8608e53ce6abe287edb408a8264736f6c634300080c0033"; +bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"608060405234801561001057600080fd5b50600436106101335760003560e01c806308e93d0a146101385780630b61e12b146101565780630e6254fd1461016b57806311464fbe1461017e578063248a9ca3146101bd5780632f2ff15d146101de57806336568abe146101f157806358451f971461020457806383a03f8c1461020c5780638878ed331461021f5780639010d07c1461023257806391d14854146102455780639387a38014610268578063938e3d7b1461027b578063a217fddf1461028e578063a32fa5b314610296578063a65d69d4146102a9578063ac9650d8146102d0578063c3c5a547146102f0578063ca15c87314610303578063d547741f14610316578063d8fd8f4414610329578063e68a7c3b1461033c578063e8a3d4851461034f578063f399e22e14610364575b600080fd5b610140610377565b60405161014d9190611ba8565b60405180910390f35b610169610164366004611c11565b61038e565b005b610140610179366004611c3b565b61043d565b6101a57f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac81565b6040516001600160a01b03909116815260200161014d565b6101d06101cb366004611c56565b610471565b60405190815260200161014d565b6101696101ec366004611c6f565b61048f565b6101696101ff366004611c6f565b610539565b6101d0610598565b61016961021a366004611c56565b6105aa565b6101a561022d366004611c9b565b6105ff565b6101a5610240366004611d1d565b610679565b610258610253366004611c6f565b610788565b604051901515815260200161014d565b610169610276366004611c11565b6107bc565b610169610289366004611de1565b610861565b6101d0600081565b6102586102a4366004611c6f565b6108b2565b6101a57f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278981565b6102e36102de366004611e1d565b610915565b60405161014d9190611ee9565b6102586102fe366004611c3b565b610a09565b6101d0610311366004611c56565b610a1d565b610169610324366004611c6f565b610aba565b6101a5610337366004611c9b565b610ac5565b61014061034a366004611d1d565b610c11565b610357610d49565b60405161014d9190611f4b565b610169610372366004611f5e565b610de1565b6060610389610384610f77565b610f9b565b905090565b336103998183610fa8565b6103be5760405162461bcd60e51b81526004016103b590611fab565b60405180910390fd5b60006103ee826103cc610f77565b6001600160a01b03871660009081526002919091016020526040902090610fec565b9050801561043757836001600160a01b0316826001600160a01b03167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35b50505050565b606061046b61044a610f77565b6001600160a01b038416600090815260029190910160205260409020610f9b565b92915050565b600061047b611001565b600092835260010160205250604090205490565b6104b361049a611001565b6000848152600191909101602052604090205433611025565b6104bb611001565b6000838152602091825260408082206001600160a01b0385168352909252205460ff161561052b5760405162461bcd60e51b815260206004820152601d60248201527f43616e206f6e6c79206772616e7420746f206e6f6e20686f6c6465727300000060448201526064016103b5565b61053582826110aa565b5050565b336001600160a01b0382161461058e5760405162461bcd60e51b815260206004820152601a60248201527921b0b71037b7363c903932b737bab731b2903337b91039b2b63360311b60448201526064016103b5565b61053582826110be565b60006103896105a5610f77565b6110d2565b336105b58183610fa8565b6105d15760405162461bcd60e51b81526004016103b590611fab565b6105e3816105dd610f77565b90610fec565b6105355760405162461bcd60e51b81526004016103b590611fe2565b6000806106428585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110dc92505050565b905061066e7f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac8261110f565b9150505b9392505050565b60008061068461116f565b600085815260209190915260408120549150805b8281101561077f5760006106aa61116f565b60008881526020918252604080822085835260010190925220546001600160a01b0316146107235784821415610711576106e261116f565b600087815260209182526040808220938252600190930190915220546001600160a01b0316925061046b915050565b61071c600183612042565b915061076d565b61072e866000610788565b801561075a575061073d61116f565b600087815260209182526040808220828052600201909252205481145b1561076d5761076a600183612042565b91505b610778600182612042565b9050610698565b50505092915050565b6000610792611001565b6000938452602090815260408085206001600160a01b039490941685529290525090205460ff1690565b336107c78183610fa8565b6107e35760405162461bcd60e51b81526004016103b590611fab565b6000610813826107f1610f77565b6001600160a01b03871660009081526002919091016020526040902090611179565b9050801561043757836001600160a01b0316826001600160a01b03167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a350505050565b61086961118e565b6108a65760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b60448201526064016103b5565b6108af8161119a565b50565b60006108bc611001565b600084815260209182526040808220828052909252205460ff1661090c576108e2611001565b6000848152602091825260408082206001600160a01b0386168352909252205460ff16905061046b565b50600192915050565b6060816001600160401b0381111561092f5761092f611d3f565b60405190808252806020026020018201604052801561096257816020015b606081526020019060019003908161094d5790505b50905060005b82811015610a02576109d2308585848181106109865761098661205a565b90506020028101906109989190612070565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061128592505050565b8282815181106109e4576109e461205a565b602002602001018190525080806109fa906120bd565b915050610968565b5092915050565b600061046b82610a17610f77565b906112aa565b600080610a2861116f565b6000848152602091909152604081205491505b81811015610a95576000610a4d61116f565b60008681526020918252604080822085835260010190925220546001600160a01b031614610a8357610a80600184612042565b92505b610a8e600182612042565b9050610a3b565b50610aa1836000610788565b15610ab457610ab1600183612042565b91505b50919050565b61058e61049a611001565b6000807f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac90506000610b2d8686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110dc92505050565b90506000610b3b838361110f565b90506001600160a01b0381163b15610b57579250610672915050565b610b6183836112cc565b9050336001600160a01b037f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27891614610bbb57610b9f816105dd610f77565b610bbb5760405162461bcd60e51b81526004016103b590611fe2565b610bc781888888611363565b866001600160a01b0316816001600160a01b03167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a39695505050505050565b60608183108015610c2c5750610c286105a5610f77565b8211155b610c845760405162461bcd60e51b815260206004820152602360248201527f426173654163636f756e74466163746f72793a20696e76616c696420696e646960448201526263657360e81b60648201526084016103b5565b6000610c9084846120d8565b9050610c9c84846120d8565b6001600160401b03811115610cb357610cb3611d3f565b604051908082528060200260200182016040528015610cdc578160200160208202803683370190505b50915060005b81811015610d4157610d05610cf78683612042565b610cff610f77565b906113cd565b838281518110610d1757610d1761205a565b6001600160a01b0390921660209283029190910190910152610d3a600182612042565b9050610ce2565b505092915050565b6060610d536113d9565b8054610d5e906120ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8a906120ef565b8015610dd75780601f10610dac57610100808354040283529160200191610dd7565b820191906000526020600020905b815481529060010190602001808311610dba57829003601f168201915b5050505050905090565b6000610deb6113fd565b5460ff1690506000610dfb6113fd565b54610100900460ff1690508015808015610e18575060018360ff16105b80610e375750610e2730611407565b158015610e3757508260ff166001145b610e9a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b5565b6001610ea46113fd565b805460ff191660ff929092169190911790558015610edd576001610ec66113fd565b80549115156101000261ff00199092169190911790555b610ee86000866110aa565b610ef18461119a565b8015610f4c576000610f016113fd565b80549115156101000261ff0019909216919091179055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030090565b7f82f5b3e5f5ca1c04b70bced106a2c3b72d9cb53ebbafb3cad0740983db74290090565b6060600061067283611416565b600080610fd57f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac8461110f565b6001600160a01b0385811691161491505092915050565b6000610672836001600160a01b038416611472565b7f0a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e50090565b61102d611001565b6000838152602091825260408082206001600160a01b0385168352909252205460ff1661053557611068816001600160a01b031660146114c1565b6110738360206114c1565b604051602001611084929190612124565b60408051601f198184030181529082905262461bcd60e51b82526103b591600401611f4b565b6110b4828261165c565b61053582826116c5565b6110c88282611784565b61053582826117ed565b600061046b825490565b600082826040516020016110f1929190612191565b60405160208183030381529060405280519060200120905092915050565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff602482015260148101839052733d602d80600a3d3981f3363d3d373d3d3d363d738152605881018290526037600c82012060788201526055604390910120600090610672565b600061038961187c565b6000610672836001600160a01b0384166118de565b60006103898133610788565b60006111a46113d9565b80546111af906120ef565b80601f01602080910402602001604051908101604052809291908181526020018280546111db906120ef565b80156112285780601f106111fd57610100808354040283529160200191611228565b820191906000526020600020905b81548152906001019060200180831161120b57829003601f168201915b50505050509050816112386113d9565b81516112479260200190611b0f565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516112799291906121b5565b60405180910390a15050565b6060610672838360405180606001604052806027815260200161228f602791396119d1565b6001600160a01b03811660009081526001830160205260408120541515610672565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b03811661046b5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016103b5565b60405163cf7a1d7760e01b81526001600160a01b0385169063cf7a1d77906113959086903090879087906004016121da565b600060405180830381600087803b1580156113af57600080fd5b505af11580156113c3573d6000803e3d6000fd5b5050505050505050565b60006106728383611aac565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b6000610389610f53565b6001600160a01b03163b151590565b60608160000180548060200260200160405190810160405280929190818152602001828054801561146657602002820191906000526020600020905b815481526020019060010190808311611452575b50505050509050919050565b60008181526001830160205260408120546114b95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561046b565b50600061046b565b606060006114d0836002612226565b6114db906002612042565b6001600160401b038111156114f2576114f2611d3f565b6040519080825280601f01601f19166020018201604052801561151c576020820181803683370190505b509050600360fc1b816000815181106115375761153761205a565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106115665761156661205a565b60200101906001600160f81b031916908160001a905350600061158a846002612226565b611595906001612042565b90505b600181111561160d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106115c9576115c961205a565b1a60f81b8282815181106115df576115df61205a565b60200101906001600160f81b031916908160001a90535060049490941c9361160681612245565b9050611598565b5083156106725760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016103b5565b6001611666611001565b6000848152602091825260408082206001600160a01b0386168084529352808220805460ff1916941515949094179093559151339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b60006116cf61116f565b60008481526020919091526040902054905060016116eb61116f565b600085815260209190915260408120805490919061170a908490612042565b9091555082905061171961116f565b6000858152602091825260408082208583526001019092522080546001600160a01b0319166001600160a01b03929092169190911790558061175961116f565b6000948552602090815260408086206001600160a01b03909516865260029094019052919092205550565b61178e8282611025565b611796611001565b6000838152602091825260408082206001600160a01b0385168084529352808220805460ff191690555133929185917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006117f761116f565b6000848152602091825260408082206001600160a01b03861683526002019092522054905061182461116f565b6000848152602091825260408082208483526001019092522080546001600160a01b031916905561185361116f565b6000938452602090815260408085206001600160a01b0390941685526002909301905250812055565b60008060ff196118ad60017f0c4ba382c0009cf238e4c1ca1a52f51c61e6248a70bdfb34e5ed49d5578a5c0c6120d8565b6040516020016118bf91815260200190565b60408051601f1981840301815291905280516020909101201692915050565b600081815260018301602052604081205480156119c75760006119026001836120d8565b8554909150600090611916906001906120d8565b905081811461197b5760008660000182815481106119365761193661205a565b90600052602060002001549050808760000184815481106119595761195961205a565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061198c5761198c61225c565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061046b565b600091505061046b565b60606119dc84611407565b611a375760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016103b5565b600080856001600160a01b031685604051611a529190612272565b600060405180830381855af49150503d8060008114611a8d576040519150601f19603f3d011682016040523d82523d6000602084013e611a92565b606091505b5091509150611aa2828286611ad6565b9695505050505050565b6000826000018281548110611ac357611ac361205a565b9060005260206000200154905092915050565b60608315611ae5575081610672565b825115611af55782518084602001fd5b8160405162461bcd60e51b81526004016103b59190611f4b565b828054611b1b906120ef565b90600052602060002090601f016020900481019282611b3d5760008555611b83565b82601f10611b5657805160ff1916838001178555611b83565b82800160010185558215611b83579182015b82811115611b83578251825591602001919060010190611b68565b50611b8f929150611b93565b5090565b5b80821115611b8f5760008155600101611b94565b6020808252825182820181905260009190848201906040850190845b81811015611be95783516001600160a01b031683529284019291840191600101611bc4565b50909695505050505050565b80356001600160a01b0381168114611c0c57600080fd5b919050565b60008060408385031215611c2457600080fd5b611c2d83611bf5565b946020939093013593505050565b600060208284031215611c4d57600080fd5b61067282611bf5565b600060208284031215611c6857600080fd5b5035919050565b60008060408385031215611c8257600080fd5b82359150611c9260208401611bf5565b90509250929050565b600080600060408486031215611cb057600080fd5b611cb984611bf5565b925060208401356001600160401b0380821115611cd557600080fd5b818601915086601f830112611ce957600080fd5b813581811115611cf857600080fd5b876020828501011115611d0a57600080fd5b6020830194508093505050509250925092565b60008060408385031215611d3057600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611d6657600080fd5b81356001600160401b0380821115611d8057611d80611d3f565b604051601f8301601f19908116603f01168101908282118183101715611da857611da8611d3f565b81604052838152866020858801011115611dc157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611df357600080fd5b81356001600160401b03811115611e0957600080fd5b611e1584828501611d55565b949350505050565b60008060208385031215611e3057600080fd5b82356001600160401b0380821115611e4757600080fd5b818501915085601f830112611e5b57600080fd5b813581811115611e6a57600080fd5b8660208260051b8501011115611e7f57600080fd5b60209290920196919550909350505050565b60005b83811015611eac578181015183820152602001611e94565b838111156104375750506000910152565b60008151808452611ed5816020860160208601611e91565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611f3e57603f19888603018452611f2c858351611ebd565b94509285019290850190600101611f10565b5092979650505050505050565b6020815260006106726020830184611ebd565b60008060408385031215611f7157600080fd5b611f7a83611bf5565b915060208301356001600160401b03811115611f9557600080fd5b611fa185828601611d55565b9150509250929050565b6020808252601f908201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e00604082015260600190565b6020808252602a908201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206040820152691c9959da5cdd195c995960b21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156120555761205561202c565b500190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261208757600080fd5b8301803591506001600160401b038211156120a157600080fd5b6020019150368190038213156120b657600080fd5b9250929050565b60006000198214156120d1576120d161202c565b5060010190565b6000828210156120ea576120ea61202c565b500390565b600181811c9082168061210357607f821691505b60208210811415610ab457634e487b7160e01b600052602260045260246000fd5b7402832b936b4b9b9b4b7b7399d1030b1b1b7bab73a1605d1b815260008351612154816015850160208801611e91565b7001034b99036b4b9b9b4b733903937b6329607d1b6015918401918201528351612185816026840160208801611e91565b01602601949350505050565b6001600160a01b0383168152604060208201819052600090611e1590830184611ebd565b6040815260006121c86040830185611ebd565b828103602084015261066e8185611ebd565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b60008160001904831182151516156122405761224061202c565b500290565b6000816122545761225461202c565b506000190190565b634e487b7160e01b600052603160045260246000fd5b60008251612284818460208701611e91565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220fe07c4a73775ad7299b9fd4a7888fb5875521e9c5a88502fa0f1225123f1e85564736f6c634300080c0033"; +bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"60806040526004361061014b5760003560e01c806301ffc9a7146101575780630a1028c41461018c578063150b7a02146101ba5780631626ba7e146101fe5780631dd756c51461021e57806324d7806c1461023e5780633a871cdd1461025e57806347e1da2a1461027e5780634a58db19146102a05780634d44560d146102a85780635892e236146102c85780637dff5a79146102e85780638b52d72314610308578063938e3d7b1461032a578063a9082d841461034a578063ac9650d814610389578063b0d691fe146103b6578063b61d27f6146103d8578063b76464d5146103f8578063bc197c8114610418578063c45a015514610444578063cf7a1d7714610459578063d087d28814610479578063d42f2f351461048e578063e8a3d485146104a3578063e9523c97146104c5578063f15d424e146104e7578063f23a6e611461051457600080fd5b3661015257005b600080fd5b34801561016357600080fd5b50610177610172366004612db4565b610540565b60405190151581526020015b60405180910390f35b34801561019857600080fd5b506101ac6101a7366004612e9b565b610586565b604051908152602001610183565b3480156101c657600080fd5b506101e56101d5366004612ef4565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610183565b34801561020a57600080fd5b506101e5610219366004612f5f565b61062a565b34801561022a57600080fd5b50610177610239366004612fbe565b61076a565b34801561024a57600080fd5b50610177610259366004613003565b610a44565b34801561026a57600080fd5b506101ac610279366004613020565b610a73565b34801561028a57600080fd5b5061029e6102993660046130b1565b610a99565b005b61029e610c0a565b3480156102b457600080fd5b5061029e6102c336600461314a565b610c72565b3480156102d457600080fd5b5061029e6102e33660046131b7565b610ce5565b3480156102f457600080fd5b50610177610303366004613003565b6110a2565b34801561031457600080fd5b5061031d61115b565b60405161018391906132ca565b34801561033657600080fd5b5061029e61034536600461332c565b6113a2565b34801561035657600080fd5b5061036a6103653660046131b7565b6113f3565b6040805192151583526001600160a01b03909116602083015201610183565b34801561039557600080fd5b506103a96103a4366004613374565b61144a565b6040516101839190613411565b3480156103c257600080fd5b506103cb61153e565b6040516101839190613466565b3480156103e457600080fd5b5061029e6103f336600461347a565b611587565b34801561040457600080fd5b5061029e610413366004613003565b611617565b34801561042457600080fd5b506101e5610433366004613563565b63bc197c8160e01b95945050505050565b34801561045057600080fd5b506103cb611649565b34801561046557600080fd5b5061029e610474366004613610565b611665565b34801561048557600080fd5b506101ac61184b565b34801561049a57600080fd5b5061031d6118cb565b3480156104af57600080fd5b506104b8611a3c565b604051610183919061365c565b3480156104d157600080fd5b506104da611ad4565b604051610183919061366f565b3480156104f357600080fd5b50610507610502366004613003565b611ae6565b60405161018391906136bc565b34801561052057600080fd5b506101e561052f3660046136cf565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b148061057157506001600160e01b03198216630a85bd0160e11b145b80610580575061058082611be2565b92915050565b6000807f82cac545155fcbf147f2a9013809613677ac7d65498556e6d19ce43bcbf6c28483805190602001206040516020016105cc929190918252602082015260400190565b6040516020818303038152906040528051906020012090506105ec611c17565b60405161190160f01b602082015260228101919091526042810182905260620160405160208183030381529060405280519060200120915050919050565b6000806106578460405160200161064391815260200190565b604051602081830303815290604052610586565b905060006106658285611d3e565b905061067081610a44565b156106875750630b135d3f60e11b91506105809050565b336000610692611d62565b6001600160a01b03841660009081526006919091016020526040902090506106ba8183611d86565b806106ea57506106c981611da8565b60011480156106ea575060006106df8282611db2565b6001600160a01b0316145b6107475760405162461bcd60e51b8152602060048201526024808201527f4163636f756e743a2063616c6c6572206e6f7420617070726f7665642074617260448201526333b2ba1760e11b60648201526084015b60405180910390fd5b610750836110a2565b1561076057630b135d3f60e11b94505b5050505092915050565b6000610774611d62565b6001600160a01b0384166000908152600491909101602052604090205460ff16156107a157506001610580565b60006107ab611d62565b6001600160a01b0385166000908152600591909101602090815260408083208151606081018352815481526001909101546001600160801b0380821694830194909452600160801b9004909216908201529150610806611d62565b6006016000866001600160a01b03166001600160a01b0316815260200190815260200160002090504282602001516001600160801b03161180610856575081604001516001600160801b03164210155b80610867575061086581611da8565b155b1561087757600092505050610580565b600061088e6108896060870187613737565b611dbe565b9050600061089b83611da8565b60011480156108bc575060006108b18482611db2565b6001600160a01b0316145b90506001600160e01b03198216635b0e93fb60e11b1415610934576000806108ef6108ea60608a018a613737565b611df8565b9150915082610915576109028583611d86565b6109155760009650505050505050610580565b855181111561092d5760009650505050505050610580565b5050610a37565b6001600160e01b031982166323f0ed1560e11b1415610a2a5760008061096561096060608a018a613737565b611e5d565b5091509150826109cf5760005b82518110156109cd576109a78382815181106109905761099061377d565b602002602001015187611d8690919063ffffffff16565b6109bb576000975050505050505050610580565b806109c5816137a9565b915050610972565b505b60005b8251811015610a22578181815181106109ed576109ed61377d565b602002602001015187600001511015610a10576000975050505050505050610580565b80610a1a816137a9565b9150506109d2565b505050610a37565b6000945050505050610580565b5060019695505050505050565b6000610a4e611d62565b6001600160a01b03909216600090815260049290920160205250604090205460ff1690565b6000610a7d611eaa565b610a878484611f13565b9050610a9282612058565b9392505050565b610aa161153e565b6001600160a01b0316336001600160a01b03161480610ac45750610ac433610a44565b610ae05760405162461bcd60e51b815260040161073e906137c4565b610ae86120a5565b8481148015610af657508483145b610b425760405162461bcd60e51b815260206004820152601d60248201527f4163636f756e743a2077726f6e67206172726179206c656e677468732e000000604482015260640161073e565b60005b85811015610c0157610bee878783818110610b6257610b6261377d565b9050602002016020810190610b779190613003565b868684818110610b8957610b8961377d565b90506020020135858585818110610ba257610ba261377d565b9050602002810190610bb49190613737565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061217b92505050565b5080610bf9816137a9565b915050610b45565b50505050505050565b610c1261153e565b6001600160a01b031663b760faf934306040518363ffffffff1660e01b8152600401610c3e9190613466565b6000604051808303818588803b158015610c5757600080fd5b505af1158015610c6b573d6000803e3d6000fd5b5050505050565b610c7a6121ec565b610c8261153e565b6001600160a01b031663205c287883836040518363ffffffff1660e01b8152600401610caf929190613805565b600060405180830381600087803b158015610cc957600080fd5b505af1158015610cdd573d6000803e3d6000fd5b505050505050565b6000610cf46020850185613003565b905042610d0760e0860160c08701613835565b6001600160801b031611158015610d365750610d2a610100850160e08601613835565b6001600160801b031642105b610d6c5760405162461bcd60e51b8152602060048201526007602482015266085c195c9a5bd960ca1b604482015260640161073e565b600080610d7a8686866113f3565b9150915081610db45760405162461bcd60e51b815260040161073e906020808252600490820152632173696760e01b604082015260600190565b6001610dbe611d62565b610100880135600090815260079190910160209081526040808320805460ff1916941515949094179093559091610dfa91908901908901613861565b60ff161115610e27576000610e156040880160208901613861565b60ff166001149050610c01848261222a565b610e3083610a44565b15610e655760405162461bcd60e51b815260206004820152600560248201526430b236b4b760d91b604482015260640161073e565b610e7a83610e71611d62565b600201906122da565b50604051806060016040528087606001358152602001876080016020810190610ea39190613835565b6001600160801b03168152602001610ec160c0890160a08a01613835565b6001600160801b03169052610ed4611d62565b6001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b02931692909217600190920191909155610f4a610f29611d62565b6001600160a01b0386166000908152600691909101602052604090206122ef565b805190915060005b81811015610fb457610fa1838281518110610f6f57610f6f61377d565b6020026020010151610f7f611d62565b6001600160a01b038916600090815260069190910160205260409020906122fc565b50610fad60018261387c565b9050610f52565b50610fc26040890189613894565b9050905060005b8181101561104357611030610fe160408b018b613894565b83818110610ff157610ff161377d565b90506020020160208101906110069190613003565b61100e611d62565b6001600160a01b038916600090815260069190910160205260409020906122da565b5061103c60018261387c565b9050610fc9565b5061104d88612311565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a604051611090919061396e565b60405180910390a35050505050505050565b6000806110ad611d62565b6001600160a01b038416600090815260059190910160209081526040918290208251606081018452815481526001909101546001600160801b03808216938301849052600160801b9091041692810192909252909150421080159061111e575080604001516001600160801b031642105b8015610a9257506000611153611132611d62565b6001600160a01b038616600090815260069190910160205260409020611da8565b119392505050565b6060600061117261116a611d62565b6002016122ef565b80519091506000805b82811015611203576111a58482815181106111985761119861377d565b60200260200101516110a2565b156111bc57816111b4816137a9565b9250506111f1565b60008482815181106111d0576111d061377d565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6111fc60018261387c565b905061117b565b50806001600160401b0381111561121c5761121c612dde565b60405190808252806020026020018201604052801561125557816020015b611242612cd1565b81526020019060019003908161123a5790505b5093506000805b8381101561139a5760006001600160a01b03168582815181106112815761128161377d565b60200260200101516001600160a01b0316146113885760008582815181106112ab576112ab61377d565b6020026020010151905060006112bf611d62565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611329610f29611d62565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250888580611368906137a9565b96508151811061137a5761137a61377d565b602002602001018190525050505b61139360018261387c565b905061125c565b505050505090565b6113aa612376565b6113e75760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b604482015260640161073e565b6113f08161238e565b50565b60008061140961140286612479565b85856125bd565b9050611413611d62565b6101008601356000908152600791909101602052604090205460ff16158015611440575061144081610a44565b9150935093915050565b6060816001600160401b0381111561146457611464612dde565b60405190808252806020026020018201604052801561149757816020015b60608152602001906001900390816114825790505b50905060005b8281101561153757611507308585848181106114bb576114bb61377d565b90506020028101906114cd9190613737565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061261792505050565b8282815181106115195761151961377d565b6020026020010181905250808061152f906137a9565b91505061149d565b5092915050565b60008061154961263c565b546001600160a01b03169050801561156057919050565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278991505090565b61158f61153e565b6001600160a01b0316336001600160a01b031614806115b257506115b233610a44565b6115ce5760405162461bcd60e51b815260040161073e906137c4565b6115d66120a5565b610c6b848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061217b92505050565b61161f6121ec565b8061162861263c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b600061165361263c565b600101546001600160a01b0316919050565b600061166f612660565b5460ff169050600061167f612660565b54610100900460ff169050801580801561169c575060018360ff16105b806116bb57506116ab3061266a565b1580156116bb57508260ff166001145b61171e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161073e565b6001611728612660565b805460ff191660ff92909216919091179055801561176157600161174a612660565b80549115156101000261ff00199092169190911790555b6117a18786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061267992505050565b6117a961263c565b60020155856117b661263c565b60010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506117e887600161222a565b8015610c015760006117f8612660565b80549115156101000261ff0019909216919091179055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b600061185561153e565b604051631aab3f0d60e11b8152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa1580156118a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c69190613a59565b905090565b606060006118da61116a611d62565b8051909150806001600160401b038111156118f7576118f7612dde565b60405190808252806020026020018201604052801561193057816020015b61191d612cd1565b8152602001906001900390816119155790505b50925060005b81811015611a365760008382815181106119525761195261377d565b602002602001015190506000611966611d62565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a0810190945291835290925081016119d0610f29611d62565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250868481518110611a1557611a1561377d565b60200260200101819052505050600181611a2f919061387c565b9050611936565b50505090565b6060611a466126ac565b8054611a5190613a72565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7d90613a72565b8015611aca5780601f10611a9f57610100808354040283529160200191611aca565b820191906000526020600020905b815481529060010190602001808311611aad57829003601f168201915b5050505050905090565b60606118c6611ae1611d62565b6122ef565b611aee612cd1565b6000611af8611d62565b6001600160a01b038416600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611b83611b62611d62565b6001600160a01b0387166000908152600691909101602052604090206122ef565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030090565b60006001600160e01b03198216630271189760e51b148061058057506301ffc9a760e01b6001600160e01b0319831614610580565b6000306001600160a01b037f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac16148015611c7057507f0000000000000000000000000000000000000000000000000000000000007a6946145b15611c9a57507fbcdadf6444930a967ffda04923d78c49b3dd65df3ed39abb04a1e3eb1190553790565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527ff0729608244859f656d32ae4cbc6b0367695d68d8e941a28f5e2d33c6d5182dd828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000806000611d4d85856126d0565b91509150611d5a81612716565b509392505050565b7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0090565b6001600160a01b03811660009081526001830160205260408120541515610a92565b6000610580825490565b6000610a92838361285f565b60006004821015611de15760405162461bcd60e51b815260040161073e90613aa7565b611def600460008486613ac6565b610a9291613af0565b6000806044831015611e1c5760405162461bcd60e51b815260040161073e90613aa7565b611e2a602460048587613ac6565b810190611e379190613003565b9150611e47604460248587613ac6565b810190611e549190613b20565b90509250929050565b606080806064841015611e825760405162461bcd60e51b815260040161073e90613aa7565b611e8f8460048188613ac6565b810190611e9c9190613bb8565b919790965090945092505050565b611eb261153e565b6001600160a01b0316336001600160a01b031614611f115760405162461bcd60e51b815260206004820152601c60248201527b1858d8dbdd5b9d0e881b9bdd08199c9bdb48115b9d1c9e541bda5b9d60221b604482015260640161073e565b565b7b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6000908152601c829052603c81206000611f91611f54610140870187613737565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050611d3e9050565b9050611f9d818661076a565b611fac57600192505050610580565b6000611fb6611d62565b6001600160a01b03929092166000908152600590920160209081526040808420815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845295825265ffffffffffff8087169483019490945292831691015260d09290921b6001600160d01b03191660a09290921b65ffffffffffff60a01b169190911795945050505050565b80156113f057604051600090339060001990849084818181858888f193505050503d8060008114610c6b576040519150601f19603f3d011682016040523d82523d6000602084013e610c6b565b60006120af61263c565b6001015460405163c3c5a54760e01b81526001600160a01b039091169150819063c3c5a547906120e3903090600401613466565b602060405180830381865afa158015612100573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121249190613c9d565b6113f057806001600160a01b03166383a03f8c61213f61263c565b600201546040518263ffffffff1660e01b815260040161216191815260200190565b600060405180830381600087803b158015610c5757600080fd5b60606000846001600160a01b031684846040516121989190613cbf565b60006040518083038185875af1925050503d80600081146121d5576040519150601f19603f3d011682016040523d82523d6000602084013e6121da565b606091505b509250905080611d5a57815160208301fd5b6121f533610a44565b611f115760405162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015260640161073e565b6122348282612889565b600061223e611649565b90506001600160a01b0381163b156122d55781156122bd57806001600160a01b0316630b61e12b8461226e61263c565b600201546040518363ffffffff1660e01b815260040161228f929190613805565b600060405180830381600087803b1580156122a957600080fd5b505af1158015610c01573d6000803e3d6000fd5b806001600160a01b0316639387a3808461226e61263c565b505050565b6000610a92836001600160a01b038416612938565b60606000610a9283612987565b6000610a92836001600160a01b0384166129e3565b600061231b611649565b90506001600160a01b0381163b15612372576001600160a01b038116630b61e12b6123496020850185613003565b61235161263c565b600201546040518363ffffffff1660e01b8152600401610caf929190613805565b5050565b600061238133610a44565b806118c657505030331490565b60006123986126ac565b80546123a390613a72565b80601f01602080910402602001604051908101604052809291908181526020018280546123cf90613a72565b801561241c5780601f106123f15761010080835404028352916020019161241c565b820191906000526020600020905b8154815290600101906020018083116123ff57829003601f168201915b505050505090508161242c6126ac565b815161243b9260200190612d1b565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a16818360405161246d929190613cdb565b60405180910390a15050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e96124a96020840184613003565b6124b96040850160208601613861565b6124c66040860186613894565b6040516020016124d7929190613d09565b60408051601f198184030181529190528051602090910120606086013561250460a0880160808901613835565b61251460c0890160a08a01613835565b61252460e08a0160c08b01613835565b6125356101008b0160e08c01613835565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b600061260f83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508751602089012061260992509050612ad6565b90611d3e565b949350505050565b6060610a928383604051806060016040528060278152602001613db360279139612b03565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830090565b60006118c6611bbe565b6001600160a01b03163b151590565b6000828260405160200161268e929190613d4b565b60405160208183030381529060405280519060200120905092915050565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b6000808251604114156127075760208301516040840151606085015160001a6126fb87828585612bde565b9450945050505061270f565b506000905060025b9250929050565b600081600481111561272a5761272a613d6f565b14156127335750565b600181600481111561274757612747613d6f565b14156127905760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015260640161073e565b60028160048111156127a4576127a4613d6f565b14156127f25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161073e565b600381600481111561280657612806613d6f565b14156113f05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161073e565b60008260000182815481106128765761287661377d565b9060005260206000200154905092915050565b80612892611d62565b6001600160a01b038416600090815260049190910160205260409020805460ff191691151591909117905580156128db576128d5826128cf611d62565b906122da565b506128ef565b6128ed826128e7611d62565b906122fc565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a111338260405161292c911515815260200190565b60405180910390a25050565b600081815260018301602052604081205461297f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610580565b506000610580565b6060816000018054806020026020016040519081016040528092919081815260200182805480156129d757602002820191906000526020600020905b8154815260200190600101908083116129c3575b50505050509050919050565b60008181526001830160205260408120548015612acc576000612a07600183613d85565b8554909150600090612a1b90600190613d85565b9050818114612a80576000866000018281548110612a3b57612a3b61377d565b9060005260206000200154905080876000018481548110612a5e57612a5e61377d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612a9157612a91613d9c565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610580565b6000915050610580565b6000610580612ae3611c17565b8360405161190160f01b8152600281019290925260228201526042902090565b6060612b0e8461266a565b612b695760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161073e565b600080856001600160a01b031685604051612b849190613cbf565b600060405180830381855af49150503d8060008114612bbf576040519150601f19603f3d011682016040523d82523d6000602084013e612bc4565b606091505b5091509150612bd4828286612c98565b9695505050505050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612c0b5750600090506003612c8f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c5f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c8857600060019250925050612c8f565b9150600090505b94509492505050565b60608315612ca7575081610a92565b825115612cb75782518084602001fd5b8160405162461bcd60e51b815260040161073e919061365c565b6040518060a0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160801b0316815260200160006001600160801b031681525090565b828054612d2790613a72565b90600052602060002090601f016020900481019282612d495760008555612d8f565b82601f10612d6257805160ff1916838001178555612d8f565b82800160010185558215612d8f579182015b82811115612d8f578251825591602001919060010190612d74565b50612d9b929150612d9f565b5090565b5b80821115612d9b5760008155600101612da0565b600060208284031215612dc657600080fd5b81356001600160e01b031981168114610a9257600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612e1c57612e1c612dde565b604052919050565b60006001600160401b03831115612e3d57612e3d612dde565b612e50601f8401601f1916602001612df4565b9050828152838383011115612e6457600080fd5b828260208301376000602084830101529392505050565b600082601f830112612e8c57600080fd5b610a9283833560208501612e24565b600060208284031215612ead57600080fd5b81356001600160401b03811115612ec357600080fd5b61260f84828501612e7b565b6001600160a01b03811681146113f057600080fd5b8035612eef81612ecf565b919050565b60008060008060808587031215612f0a57600080fd5b8435612f1581612ecf565b93506020850135612f2581612ecf565b92506040850135915060608501356001600160401b03811115612f4757600080fd5b612f5387828801612e7b565b91505092959194509250565b60008060408385031215612f7257600080fd5b8235915060208301356001600160401b03811115612f8f57600080fd5b612f9b85828601612e7b565b9150509250929050565b60006101608284031215612fb857600080fd5b50919050565b60008060408385031215612fd157600080fd5b8235612fdc81612ecf565b915060208301356001600160401b03811115612ff757600080fd5b612f9b85828601612fa5565b60006020828403121561301557600080fd5b8135610a9281612ecf565b60008060006060848603121561303557600080fd5b83356001600160401b0381111561304b57600080fd5b61305786828701612fa5565b9660208601359650604090950135949350505050565b60008083601f84011261307f57600080fd5b5081356001600160401b0381111561309657600080fd5b6020830191508360208260051b850101111561270f57600080fd5b600080600080600080606087890312156130ca57600080fd5b86356001600160401b03808211156130e157600080fd5b6130ed8a838b0161306d565b9098509650602089013591508082111561310657600080fd5b6131128a838b0161306d565b9096509450604089013591508082111561312b57600080fd5b5061313889828a0161306d565b979a9699509497509295939492505050565b6000806040838503121561315d57600080fd5b823561316881612ecf565b946020939093013593505050565b60008083601f84011261318857600080fd5b5081356001600160401b0381111561319f57600080fd5b60208301915083602082850101111561270f57600080fd5b6000806000604084860312156131cc57600080fd5b83356001600160401b03808211156131e357600080fd5b9085019061012082880312156131f857600080fd5b9093506020850135908082111561320e57600080fd5b5061321b86828701613176565b9497909650939450505050565b6001600160801b03169052565b80516001600160a01b03908116835260208083015160a082860181905281519086018190526000939183019290849060c08801905b8083101561328c5785518516825294830194600192909201919083019061326a565b5060408701516040890152606087015194506132ab6060890186613228565b608087015194506132bf6080890186613228565b979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561331f57603f1988860301845261330d858351613235565b945092850192908501906001016132f1565b5092979650505050505050565b60006020828403121561333e57600080fd5b81356001600160401b0381111561335457600080fd5b8201601f8101841361336557600080fd5b61260f84823560208401612e24565b6000806020838503121561338757600080fd5b82356001600160401b0381111561339d57600080fd5b6133a98582860161306d565b90969095509350505050565b60005b838110156133d05781810151838201526020016133b8565b838111156133df576000848401525b50505050565b600081518084526133fd8160208601602086016133b5565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561331f57603f198886030184526134548583516133e5565b94509285019290850190600101613438565b6001600160a01b0391909116815260200190565b6000806000806060858703121561349057600080fd5b843561349b81612ecf565b93506020850135925060408501356001600160401b038111156134bd57600080fd5b6134c987828801613176565b95989497509550505050565b60006001600160401b038211156134ee576134ee612dde565b5060051b60200190565b600082601f83011261350957600080fd5b8135602061351e613519836134d5565b612df4565b82815260059290921b8401810191818101908684111561353d57600080fd5b8286015b848110156135585780358352918301918301613541565b509695505050505050565b600080600080600060a0868803121561357b57600080fd5b853561358681612ecf565b9450602086013561359681612ecf565b935060408601356001600160401b03808211156135b257600080fd5b6135be89838a016134f8565b945060608801359150808211156135d457600080fd5b6135e089838a016134f8565b935060808801359150808211156135f657600080fd5b5061360388828901612e7b565b9150509295509295909350565b6000806000806060858703121561362657600080fd5b843561363181612ecf565b9350602085013561364181612ecf565b925060408501356001600160401b038111156134bd57600080fd5b602081526000610a9260208301846133e5565b6020808252825182820181905260009190848201906040850190845b818110156136b05783516001600160a01b03168352928401929184019160010161368b565b50909695505050505050565b602081526000610a926020830184613235565b600080600080600060a086880312156136e757600080fd5b85356136f281612ecf565b9450602086013561370281612ecf565b9350604086013592506060860135915060808601356001600160401b0381111561372b57600080fd5b61360388828901612e7b565b6000808335601e1984360301811261374e57600080fd5b8301803591506001600160401b0382111561376857600080fd5b60200191503681900382131561270f57600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156137bd576137bd613793565b5060010190565b60208082526021908201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746040820152601760f91b606082015260800190565b6001600160a01b03929092168252602082015260400190565b80356001600160801b0381168114612eef57600080fd5b60006020828403121561384757600080fd5b610a928261381e565b803560ff81168114612eef57600080fd5b60006020828403121561387357600080fd5b610a9282613850565b6000821982111561388f5761388f613793565b500190565b6000808335601e198436030181126138ab57600080fd5b8301803591506001600160401b038211156138c557600080fd5b6020019150600581901b360382131561270f57600080fd5b6000808335601e198436030181126138f457600080fd5b83016020810192503590506001600160401b0381111561391357600080fd5b8060051b360383131561270f57600080fd5b8183526000602080850194508260005b8581101561396357813561394881612ecf565b6001600160a01b031687529582019590820190600101613935565b509495945050505050565b6020815261398f6020820161398284612ee4565b6001600160a01b03169052565b600061399d60208401613850565b60ff81166040840152506139b460408401846138dd565b6101208060608601526139cc61014086018385613925565b9250606086013560808601526139e46080870161381e565b91506139f360a0860183613228565b6139ff60a0870161381e565b9150613a0e60c0860183613228565b613a1a60c0870161381e565b9150613a2960e0860183613228565b613a3560e0870161381e565b9150610100613a4681870184613228565b9590950135939094019290925250919050565b600060208284031215613a6b57600080fd5b5051919050565b600181811c90821680613a8657607f821691505b60208210811415612fb857634e487b7160e01b600052602260045260246000fd5b602080825260059082015264214461746160d81b604082015260600190565b60008085851115613ad657600080fd5b83861115613ae357600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b185780818660040360031b1b83161692505b505092915050565b600060208284031215613b3257600080fd5b5035919050565b600082601f830112613b4a57600080fd5b81356020613b5a613519836134d5565b82815260059290921b84018101918181019086841115613b7957600080fd5b8286015b848110156135585780356001600160401b03811115613b9c5760008081fd5b613baa8986838b0101612e7b565b845250918301918301613b7d565b600080600060608486031215613bcd57600080fd5b83356001600160401b0380821115613be457600080fd5b818601915086601f830112613bf857600080fd5b81356020613c08613519836134d5565b82815260059290921b8401810191818101908a841115613c2757600080fd5b948201945b83861015613c4e578535613c3f81612ecf565b82529482019490820190613c2c565b97505087013592505080821115613c6457600080fd5b613c70878388016134f8565b93506040860135915080821115613c8657600080fd5b50613c9386828701613b39565b9150509250925092565b600060208284031215613caf57600080fd5b81518015158114610a9257600080fd5b60008251613cd18184602087016133b5565b9190910192915050565b604081526000613cee60408301856133e5565b8281036020840152613d0081856133e5565b95945050505050565b60008184825b85811015613d40578135613d2281612ecf565b6001600160a01b031683526020928301929190910190600101613d0f565b509095945050505050565b6001600160a01b038316815260406020820181905260009061260f908301846133e5565b634e487b7160e01b600052602160045260246000fd5b600082821015613d9757613d97613793565b500390565b634e487b7160e01b600052603160045260246000fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122063420609b43104a3126682cb43841aa6e05cec6ab10a28529e06158e94a7032364736f6c634300080c0033"; From 3365f9188bd9a5905c1e35cd137ca533790fef89 Mon Sep 17 00:00:00 2001 From: Krishang Date: Tue, 21 Nov 2023 01:05:01 +0530 Subject: [PATCH 5/7] remove libs incompatible with forge coverage --- .gitmodules | 6 - contracts/lib/TWStrings.sol | 128 ++++++++ foundry.toml | 2 - lib/aa-benchmark | 1 - lib/solady | 1 - .../utils/AABenchmarkArtifacts.sol | 15 +- .../smart-wallet/utils/AABenchmarkPrepare.sol | 11 +- .../smart-wallet/utils/AABenchmarkTest.t.sol | 2 +- .../smart-wallet/utils/AATestArtifacts.sol | 9 + src/test/smart-wallet/utils/AATestBase.sol | 285 ++++++++++++++++++ 10 files changed, 433 insertions(+), 27 deletions(-) delete mode 160000 lib/aa-benchmark delete mode 160000 lib/solady create mode 100644 src/test/smart-wallet/utils/AATestArtifacts.sol create mode 100644 src/test/smart-wallet/utils/AATestBase.sol diff --git a/.gitmodules b/.gitmodules index 5839cb25a..6e01eb969 100644 --- a/.gitmodules +++ b/.gitmodules @@ -24,9 +24,3 @@ [submodule "lib/dynamic-contracts"] path = lib/dynamic-contracts url = https://github.com/thirdweb-dev/dynamic-contracts -[submodule "lib/aa-benchmark"] - path = lib/aa-benchmark - url = https://github.com/zerodevapp/aa-benchmark -[submodule "lib/solady"] - path = lib/solady - url = https://github.com/Vectorized/solady diff --git a/contracts/lib/TWStrings.sol b/contracts/lib/TWStrings.sol index b04e5f05a..0b48fac3e 100644 --- a/contracts/lib/TWStrings.sol +++ b/contracts/lib/TWStrings.sol @@ -64,4 +64,132 @@ library TWStrings { require(value == 0, "Strings: hex length insufficient"); return string(buffer); } + + /// @dev Returns the hexadecimal representation of `value`. + /// The output is prefixed with "0x", encoded using 2 hexadecimal digits per byte, + /// and the alphabets are capitalized conditionally according to + /// https://eips.ethereum.org/EIPS/eip-55 + function toHexStringChecksummed(address value) internal pure returns (string memory str) { + str = toHexString(value); + /// @solidity memory-safe-assembly + assembly { + let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...` + let o := add(str, 0x22) + let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... ` + let t := shl(240, 136) // `0b10001000 << 240` + for { + let i := 0 + } 1 { + + } { + mstore(add(i, i), mul(t, byte(i, hashed))) + i := add(i, 1) + if eq(i, 20) { + break + } + } + mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask))))) + o := add(o, 0x20) + mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask))))) + } + } + + /// @dev Returns the hexadecimal representation of `value`. + /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. + function toHexString(address value) internal pure returns (string memory str) { + str = toHexStringNoPrefix(value); + /// @solidity memory-safe-assembly + assembly { + let strLength := add(mload(str), 2) // Compute the length. + mstore(str, 0x3078) // Write the "0x" prefix. + str := sub(str, 2) // Move the pointer. + mstore(str, strLength) // Write the length. + } + } + + /// @dev Returns the hexadecimal representation of `value`. + /// The output is encoded using 2 hexadecimal digits per byte. + function toHexStringNoPrefix(address value) internal pure returns (string memory str) { + /// @solidity memory-safe-assembly + assembly { + str := mload(0x40) + + // Allocate the memory. + // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length, + // 0x02 bytes for the prefix, and 0x28 bytes for the digits. + // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80. + mstore(0x40, add(str, 0x80)) + + // Store "0123456789abcdef" in scratch space. + mstore(0x0f, 0x30313233343536373839616263646566) + + str := add(str, 2) + mstore(str, 40) + + let o := add(str, 0x20) + mstore(add(o, 40), 0) + + value := shl(96, value) + + // We write the string from rightmost digit to leftmost digit. + // The following is essentially a do-while loop that also handles the zero case. + for { + let i := 0 + } 1 { + + } { + let p := add(o, add(i, i)) + let temp := byte(i, value) + mstore8(add(p, 1), mload(and(temp, 15))) + mstore8(p, mload(shr(4, temp))) + i := add(i, 1) + if eq(i, 20) { + break + } + } + } + } + + /// @dev Returns the hex encoded string from the raw bytes. + /// The output is encoded using 2 hexadecimal digits per byte. + function toHexString(bytes memory raw) internal pure returns (string memory str) { + str = toHexStringNoPrefix(raw); + /// @solidity memory-safe-assembly + assembly { + let strLength := add(mload(str), 2) // Compute the length. + mstore(str, 0x3078) // Write the "0x" prefix. + str := sub(str, 2) // Move the pointer. + mstore(str, strLength) // Write the length. + } + } + + /// @dev Returns the hex encoded string from the raw bytes. + /// The output is encoded using 2 hexadecimal digits per byte. + function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory str) { + /// @solidity memory-safe-assembly + assembly { + let length := mload(raw) + str := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix. + mstore(str, add(length, length)) // Store the length of the output. + + // Store "0123456789abcdef" in scratch space. + mstore(0x0f, 0x30313233343536373839616263646566) + + let o := add(str, 0x20) + let end := add(raw, length) + + for { + + } iszero(eq(raw, end)) { + + } { + raw := add(raw, 1) + mstore8(add(o, 1), mload(and(mload(raw), 15))) + mstore8(o, mload(and(shr(4, mload(raw)), 15))) + o := add(o, 2) + } + mstore(o, 0) // Zeroize the slot after the string. + mstore(0x40, add(o, 0x20)) // Allocate the memory. + } + } } diff --git a/foundry.toml b/foundry.toml index a45aa3935..d24113933 100644 --- a/foundry.toml +++ b/foundry.toml @@ -39,8 +39,6 @@ remappings = [ 'erc721a/=lib/ERC721A/', '@thirdweb-dev/dynamic-contracts/=lib/dynamic-contracts/', 'lib/sstore2=lib/dynamic-contracts/lib/sstore2/', - 'aa-benchmark/=lib/aa-benchmark/', - 'solady/=lib/solady/src/' ] fs_permissions = [{ access = "read-write", path = "./src/test/smart-wallet/utils"}] src = 'contracts' diff --git a/lib/aa-benchmark b/lib/aa-benchmark deleted file mode 160000 index 4b8e548ef..000000000 --- a/lib/aa-benchmark +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4b8e548ef6b004069cff599347a2afb9ac837e54 diff --git a/lib/solady b/lib/solady deleted file mode 160000 index 77809c18e..000000000 --- a/lib/solady +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 77809c18e010b914dde9518956a4ae7cb507d383 diff --git a/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol index f2b829146..1a59f5bea 100644 --- a/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol +++ b/src/test/smart-wallet/utils/AABenchmarkArtifacts.sol @@ -1,19 +1,14 @@ -pragma solidity ^0.8.0; +pragma solidity ^0.8.0; interface ThirdwebAccountFactory { function createAccount(address _admin, bytes calldata _data) external returns (address); - function getAddress(address _adminSigner, bytes calldata _data) external view returns (address); } - interface ThirdwebAccount { - function execute( - address _target, - uint256 _value, - bytes calldata _calldata - ) external; + function execute(address _target, uint256 _value, bytes calldata _calldata) external; } address constant THIRDWEB_ACCOUNT_FACTORY_ADDRESS = 0x2e234DAe75C793f67A35089C9d99245E1C58470b; address constant THIRDWEB_ACCOUNT_IMPL_ADDRESS = 0xffD4505B3452Dc22f8473616d50503bA9E1710Ac; -bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"608060405234801561001057600080fd5b50600436106101335760003560e01c806308e93d0a146101385780630b61e12b146101565780630e6254fd1461016b57806311464fbe1461017e578063248a9ca3146101bd5780632f2ff15d146101de57806336568abe146101f157806358451f971461020457806383a03f8c1461020c5780638878ed331461021f5780639010d07c1461023257806391d14854146102455780639387a38014610268578063938e3d7b1461027b578063a217fddf1461028e578063a32fa5b314610296578063a65d69d4146102a9578063ac9650d8146102d0578063c3c5a547146102f0578063ca15c87314610303578063d547741f14610316578063d8fd8f4414610329578063e68a7c3b1461033c578063e8a3d4851461034f578063f399e22e14610364575b600080fd5b610140610377565b60405161014d9190611ba8565b60405180910390f35b610169610164366004611c11565b61038e565b005b610140610179366004611c3b565b61043d565b6101a57f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac81565b6040516001600160a01b03909116815260200161014d565b6101d06101cb366004611c56565b610471565b60405190815260200161014d565b6101696101ec366004611c6f565b61048f565b6101696101ff366004611c6f565b610539565b6101d0610598565b61016961021a366004611c56565b6105aa565b6101a561022d366004611c9b565b6105ff565b6101a5610240366004611d1d565b610679565b610258610253366004611c6f565b610788565b604051901515815260200161014d565b610169610276366004611c11565b6107bc565b610169610289366004611de1565b610861565b6101d0600081565b6102586102a4366004611c6f565b6108b2565b6101a57f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278981565b6102e36102de366004611e1d565b610915565b60405161014d9190611ee9565b6102586102fe366004611c3b565b610a09565b6101d0610311366004611c56565b610a1d565b610169610324366004611c6f565b610aba565b6101a5610337366004611c9b565b610ac5565b61014061034a366004611d1d565b610c11565b610357610d49565b60405161014d9190611f4b565b610169610372366004611f5e565b610de1565b6060610389610384610f77565b610f9b565b905090565b336103998183610fa8565b6103be5760405162461bcd60e51b81526004016103b590611fab565b60405180910390fd5b60006103ee826103cc610f77565b6001600160a01b03871660009081526002919091016020526040902090610fec565b9050801561043757836001600160a01b0316826001600160a01b03167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35b50505050565b606061046b61044a610f77565b6001600160a01b038416600090815260029190910160205260409020610f9b565b92915050565b600061047b611001565b600092835260010160205250604090205490565b6104b361049a611001565b6000848152600191909101602052604090205433611025565b6104bb611001565b6000838152602091825260408082206001600160a01b0385168352909252205460ff161561052b5760405162461bcd60e51b815260206004820152601d60248201527f43616e206f6e6c79206772616e7420746f206e6f6e20686f6c6465727300000060448201526064016103b5565b61053582826110aa565b5050565b336001600160a01b0382161461058e5760405162461bcd60e51b815260206004820152601a60248201527921b0b71037b7363c903932b737bab731b2903337b91039b2b63360311b60448201526064016103b5565b61053582826110be565b60006103896105a5610f77565b6110d2565b336105b58183610fa8565b6105d15760405162461bcd60e51b81526004016103b590611fab565b6105e3816105dd610f77565b90610fec565b6105355760405162461bcd60e51b81526004016103b590611fe2565b6000806106428585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110dc92505050565b905061066e7f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac8261110f565b9150505b9392505050565b60008061068461116f565b600085815260209190915260408120549150805b8281101561077f5760006106aa61116f565b60008881526020918252604080822085835260010190925220546001600160a01b0316146107235784821415610711576106e261116f565b600087815260209182526040808220938252600190930190915220546001600160a01b0316925061046b915050565b61071c600183612042565b915061076d565b61072e866000610788565b801561075a575061073d61116f565b600087815260209182526040808220828052600201909252205481145b1561076d5761076a600183612042565b91505b610778600182612042565b9050610698565b50505092915050565b6000610792611001565b6000938452602090815260408085206001600160a01b039490941685529290525090205460ff1690565b336107c78183610fa8565b6107e35760405162461bcd60e51b81526004016103b590611fab565b6000610813826107f1610f77565b6001600160a01b03871660009081526002919091016020526040902090611179565b9050801561043757836001600160a01b0316826001600160a01b03167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a350505050565b61086961118e565b6108a65760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b60448201526064016103b5565b6108af8161119a565b50565b60006108bc611001565b600084815260209182526040808220828052909252205460ff1661090c576108e2611001565b6000848152602091825260408082206001600160a01b0386168352909252205460ff16905061046b565b50600192915050565b6060816001600160401b0381111561092f5761092f611d3f565b60405190808252806020026020018201604052801561096257816020015b606081526020019060019003908161094d5790505b50905060005b82811015610a02576109d2308585848181106109865761098661205a565b90506020028101906109989190612070565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061128592505050565b8282815181106109e4576109e461205a565b602002602001018190525080806109fa906120bd565b915050610968565b5092915050565b600061046b82610a17610f77565b906112aa565b600080610a2861116f565b6000848152602091909152604081205491505b81811015610a95576000610a4d61116f565b60008681526020918252604080822085835260010190925220546001600160a01b031614610a8357610a80600184612042565b92505b610a8e600182612042565b9050610a3b565b50610aa1836000610788565b15610ab457610ab1600183612042565b91505b50919050565b61058e61049a611001565b6000807f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac90506000610b2d8686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110dc92505050565b90506000610b3b838361110f565b90506001600160a01b0381163b15610b57579250610672915050565b610b6183836112cc565b9050336001600160a01b037f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27891614610bbb57610b9f816105dd610f77565b610bbb5760405162461bcd60e51b81526004016103b590611fe2565b610bc781888888611363565b866001600160a01b0316816001600160a01b03167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a39695505050505050565b60608183108015610c2c5750610c286105a5610f77565b8211155b610c845760405162461bcd60e51b815260206004820152602360248201527f426173654163636f756e74466163746f72793a20696e76616c696420696e646960448201526263657360e81b60648201526084016103b5565b6000610c9084846120d8565b9050610c9c84846120d8565b6001600160401b03811115610cb357610cb3611d3f565b604051908082528060200260200182016040528015610cdc578160200160208202803683370190505b50915060005b81811015610d4157610d05610cf78683612042565b610cff610f77565b906113cd565b838281518110610d1757610d1761205a565b6001600160a01b0390921660209283029190910190910152610d3a600182612042565b9050610ce2565b505092915050565b6060610d536113d9565b8054610d5e906120ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610d8a906120ef565b8015610dd75780601f10610dac57610100808354040283529160200191610dd7565b820191906000526020600020905b815481529060010190602001808311610dba57829003601f168201915b5050505050905090565b6000610deb6113fd565b5460ff1690506000610dfb6113fd565b54610100900460ff1690508015808015610e18575060018360ff16105b80610e375750610e2730611407565b158015610e3757508260ff166001145b610e9a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b5565b6001610ea46113fd565b805460ff191660ff929092169190911790558015610edd576001610ec66113fd565b80549115156101000261ff00199092169190911790555b610ee86000866110aa565b610ef18461119a565b8015610f4c576000610f016113fd565b80549115156101000261ff0019909216919091179055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030090565b7f82f5b3e5f5ca1c04b70bced106a2c3b72d9cb53ebbafb3cad0740983db74290090565b6060600061067283611416565b600080610fd57f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac8461110f565b6001600160a01b0385811691161491505092915050565b6000610672836001600160a01b038416611472565b7f0a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e50090565b61102d611001565b6000838152602091825260408082206001600160a01b0385168352909252205460ff1661053557611068816001600160a01b031660146114c1565b6110738360206114c1565b604051602001611084929190612124565b60408051601f198184030181529082905262461bcd60e51b82526103b591600401611f4b565b6110b4828261165c565b61053582826116c5565b6110c88282611784565b61053582826117ed565b600061046b825490565b600082826040516020016110f1929190612191565b60405160208183030381529060405280519060200120905092915050565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff602482015260148101839052733d602d80600a3d3981f3363d3d373d3d3d363d738152605881018290526037600c82012060788201526055604390910120600090610672565b600061038961187c565b6000610672836001600160a01b0384166118de565b60006103898133610788565b60006111a46113d9565b80546111af906120ef565b80601f01602080910402602001604051908101604052809291908181526020018280546111db906120ef565b80156112285780601f106111fd57610100808354040283529160200191611228565b820191906000526020600020905b81548152906001019060200180831161120b57829003601f168201915b50505050509050816112386113d9565b81516112479260200190611b0f565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516112799291906121b5565b60405180910390a15050565b6060610672838360405180606001604052806027815260200161228f602791396119d1565b6001600160a01b03811660009081526001830160205260408120541515610672565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b03811661046b5760405162461bcd60e51b8152602060048201526017602482015276115490cc4c4d8dce8818dc99585d194c8819985a5b1959604a1b60448201526064016103b5565b60405163cf7a1d7760e01b81526001600160a01b0385169063cf7a1d77906113959086903090879087906004016121da565b600060405180830381600087803b1580156113af57600080fd5b505af11580156113c3573d6000803e3d6000fd5b5050505050505050565b60006106728383611aac565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b6000610389610f53565b6001600160a01b03163b151590565b60608160000180548060200260200160405190810160405280929190818152602001828054801561146657602002820191906000526020600020905b815481526020019060010190808311611452575b50505050509050919050565b60008181526001830160205260408120546114b95750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561046b565b50600061046b565b606060006114d0836002612226565b6114db906002612042565b6001600160401b038111156114f2576114f2611d3f565b6040519080825280601f01601f19166020018201604052801561151c576020820181803683370190505b509050600360fc1b816000815181106115375761153761205a565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106115665761156661205a565b60200101906001600160f81b031916908160001a905350600061158a846002612226565b611595906001612042565b90505b600181111561160d576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106115c9576115c961205a565b1a60f81b8282815181106115df576115df61205a565b60200101906001600160f81b031916908160001a90535060049490941c9361160681612245565b9050611598565b5083156106725760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016103b5565b6001611666611001565b6000848152602091825260408082206001600160a01b0386168084529352808220805460ff1916941515949094179093559151339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b60006116cf61116f565b60008481526020919091526040902054905060016116eb61116f565b600085815260209190915260408120805490919061170a908490612042565b9091555082905061171961116f565b6000858152602091825260408082208583526001019092522080546001600160a01b0319166001600160a01b03929092169190911790558061175961116f565b6000948552602090815260408086206001600160a01b03909516865260029094019052919092205550565b61178e8282611025565b611796611001565b6000838152602091825260408082206001600160a01b0385168084529352808220805460ff191690555133929185917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006117f761116f565b6000848152602091825260408082206001600160a01b03861683526002019092522054905061182461116f565b6000848152602091825260408082208483526001019092522080546001600160a01b031916905561185361116f565b6000938452602090815260408085206001600160a01b0390941685526002909301905250812055565b60008060ff196118ad60017f0c4ba382c0009cf238e4c1ca1a52f51c61e6248a70bdfb34e5ed49d5578a5c0c6120d8565b6040516020016118bf91815260200190565b60408051601f1981840301815291905280516020909101201692915050565b600081815260018301602052604081205480156119c75760006119026001836120d8565b8554909150600090611916906001906120d8565b905081811461197b5760008660000182815481106119365761193661205a565b90600052602060002001549050808760000184815481106119595761195961205a565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061198c5761198c61225c565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061046b565b600091505061046b565b60606119dc84611407565b611a375760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016103b5565b600080856001600160a01b031685604051611a529190612272565b600060405180830381855af49150503d8060008114611a8d576040519150601f19603f3d011682016040523d82523d6000602084013e611a92565b606091505b5091509150611aa2828286611ad6565b9695505050505050565b6000826000018281548110611ac357611ac361205a565b9060005260206000200154905092915050565b60608315611ae5575081610672565b825115611af55782518084602001fd5b8160405162461bcd60e51b81526004016103b59190611f4b565b828054611b1b906120ef565b90600052602060002090601f016020900481019282611b3d5760008555611b83565b82601f10611b5657805160ff1916838001178555611b83565b82800160010185558215611b83579182015b82811115611b83578251825591602001919060010190611b68565b50611b8f929150611b93565b5090565b5b80821115611b8f5760008155600101611b94565b6020808252825182820181905260009190848201906040850190845b81811015611be95783516001600160a01b031683529284019291840191600101611bc4565b50909695505050505050565b80356001600160a01b0381168114611c0c57600080fd5b919050565b60008060408385031215611c2457600080fd5b611c2d83611bf5565b946020939093013593505050565b600060208284031215611c4d57600080fd5b61067282611bf5565b600060208284031215611c6857600080fd5b5035919050565b60008060408385031215611c8257600080fd5b82359150611c9260208401611bf5565b90509250929050565b600080600060408486031215611cb057600080fd5b611cb984611bf5565b925060208401356001600160401b0380821115611cd557600080fd5b818601915086601f830112611ce957600080fd5b813581811115611cf857600080fd5b876020828501011115611d0a57600080fd5b6020830194508093505050509250925092565b60008060408385031215611d3057600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611d6657600080fd5b81356001600160401b0380821115611d8057611d80611d3f565b604051601f8301601f19908116603f01168101908282118183101715611da857611da8611d3f565b81604052838152866020858801011115611dc157600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611df357600080fd5b81356001600160401b03811115611e0957600080fd5b611e1584828501611d55565b949350505050565b60008060208385031215611e3057600080fd5b82356001600160401b0380821115611e4757600080fd5b818501915085601f830112611e5b57600080fd5b813581811115611e6a57600080fd5b8660208260051b8501011115611e7f57600080fd5b60209290920196919550909350505050565b60005b83811015611eac578181015183820152602001611e94565b838111156104375750506000910152565b60008151808452611ed5816020860160208601611e91565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611f3e57603f19888603018452611f2c858351611ebd565b94509285019290850190600101611f10565b5092979650505050505050565b6020815260006106726020830184611ebd565b60008060408385031215611f7157600080fd5b611f7a83611bf5565b915060208301356001600160401b03811115611f9557600080fd5b611fa185828601611d55565b9150509250929050565b6020808252601f908201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e00604082015260600190565b6020808252602a908201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206040820152691c9959da5cdd195c995960b21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156120555761205561202c565b500190565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261208757600080fd5b8301803591506001600160401b038211156120a157600080fd5b6020019150368190038213156120b657600080fd5b9250929050565b60006000198214156120d1576120d161202c565b5060010190565b6000828210156120ea576120ea61202c565b500390565b600181811c9082168061210357607f821691505b60208210811415610ab457634e487b7160e01b600052602260045260246000fd5b7402832b936b4b9b9b4b7b7399d1030b1b1b7bab73a1605d1b815260008351612154816015850160208801611e91565b7001034b99036b4b9b9b4b733903937b6329607d1b6015918401918201528351612185816026840160208801611e91565b01602601949350505050565b6001600160a01b0383168152604060208201819052600090611e1590830184611ebd565b6040815260006121c86040830185611ebd565b828103602084015261066e8185611ebd565b6001600160a01b0385811682528416602082015260606040820181905281018290526000828460808401376000608084840101526080601f19601f850116830101905095945050505050565b60008160001904831182151516156122405761224061202c565b500290565b6000816122545761225461202c565b506000190190565b634e487b7160e01b600052603160045260246000fd5b60008251612284818460208701611e91565b919091019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220fe07c4a73775ad7299b9fd4a7888fb5875521e9c5a88502fa0f1225123f1e85564736f6c634300080c0033"; -bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"60806040526004361061014b5760003560e01c806301ffc9a7146101575780630a1028c41461018c578063150b7a02146101ba5780631626ba7e146101fe5780631dd756c51461021e57806324d7806c1461023e5780633a871cdd1461025e57806347e1da2a1461027e5780634a58db19146102a05780634d44560d146102a85780635892e236146102c85780637dff5a79146102e85780638b52d72314610308578063938e3d7b1461032a578063a9082d841461034a578063ac9650d814610389578063b0d691fe146103b6578063b61d27f6146103d8578063b76464d5146103f8578063bc197c8114610418578063c45a015514610444578063cf7a1d7714610459578063d087d28814610479578063d42f2f351461048e578063e8a3d485146104a3578063e9523c97146104c5578063f15d424e146104e7578063f23a6e611461051457600080fd5b3661015257005b600080fd5b34801561016357600080fd5b50610177610172366004612db4565b610540565b60405190151581526020015b60405180910390f35b34801561019857600080fd5b506101ac6101a7366004612e9b565b610586565b604051908152602001610183565b3480156101c657600080fd5b506101e56101d5366004612ef4565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610183565b34801561020a57600080fd5b506101e5610219366004612f5f565b61062a565b34801561022a57600080fd5b50610177610239366004612fbe565b61076a565b34801561024a57600080fd5b50610177610259366004613003565b610a44565b34801561026a57600080fd5b506101ac610279366004613020565b610a73565b34801561028a57600080fd5b5061029e6102993660046130b1565b610a99565b005b61029e610c0a565b3480156102b457600080fd5b5061029e6102c336600461314a565b610c72565b3480156102d457600080fd5b5061029e6102e33660046131b7565b610ce5565b3480156102f457600080fd5b50610177610303366004613003565b6110a2565b34801561031457600080fd5b5061031d61115b565b60405161018391906132ca565b34801561033657600080fd5b5061029e61034536600461332c565b6113a2565b34801561035657600080fd5b5061036a6103653660046131b7565b6113f3565b6040805192151583526001600160a01b03909116602083015201610183565b34801561039557600080fd5b506103a96103a4366004613374565b61144a565b6040516101839190613411565b3480156103c257600080fd5b506103cb61153e565b6040516101839190613466565b3480156103e457600080fd5b5061029e6103f336600461347a565b611587565b34801561040457600080fd5b5061029e610413366004613003565b611617565b34801561042457600080fd5b506101e5610433366004613563565b63bc197c8160e01b95945050505050565b34801561045057600080fd5b506103cb611649565b34801561046557600080fd5b5061029e610474366004613610565b611665565b34801561048557600080fd5b506101ac61184b565b34801561049a57600080fd5b5061031d6118cb565b3480156104af57600080fd5b506104b8611a3c565b604051610183919061365c565b3480156104d157600080fd5b506104da611ad4565b604051610183919061366f565b3480156104f357600080fd5b50610507610502366004613003565b611ae6565b60405161018391906136bc565b34801561052057600080fd5b506101e561052f3660046136cf565b63f23a6e6160e01b95945050505050565b60006001600160e01b03198216630271189760e51b148061057157506001600160e01b03198216630a85bd0160e11b145b80610580575061058082611be2565b92915050565b6000807f82cac545155fcbf147f2a9013809613677ac7d65498556e6d19ce43bcbf6c28483805190602001206040516020016105cc929190918252602082015260400190565b6040516020818303038152906040528051906020012090506105ec611c17565b60405161190160f01b602082015260228101919091526042810182905260620160405160208183030381529060405280519060200120915050919050565b6000806106578460405160200161064391815260200190565b604051602081830303815290604052610586565b905060006106658285611d3e565b905061067081610a44565b156106875750630b135d3f60e11b91506105809050565b336000610692611d62565b6001600160a01b03841660009081526006919091016020526040902090506106ba8183611d86565b806106ea57506106c981611da8565b60011480156106ea575060006106df8282611db2565b6001600160a01b0316145b6107475760405162461bcd60e51b8152602060048201526024808201527f4163636f756e743a2063616c6c6572206e6f7420617070726f7665642074617260448201526333b2ba1760e11b60648201526084015b60405180910390fd5b610750836110a2565b1561076057630b135d3f60e11b94505b5050505092915050565b6000610774611d62565b6001600160a01b0384166000908152600491909101602052604090205460ff16156107a157506001610580565b60006107ab611d62565b6001600160a01b0385166000908152600591909101602090815260408083208151606081018352815481526001909101546001600160801b0380821694830194909452600160801b9004909216908201529150610806611d62565b6006016000866001600160a01b03166001600160a01b0316815260200190815260200160002090504282602001516001600160801b03161180610856575081604001516001600160801b03164210155b80610867575061086581611da8565b155b1561087757600092505050610580565b600061088e6108896060870187613737565b611dbe565b9050600061089b83611da8565b60011480156108bc575060006108b18482611db2565b6001600160a01b0316145b90506001600160e01b03198216635b0e93fb60e11b1415610934576000806108ef6108ea60608a018a613737565b611df8565b9150915082610915576109028583611d86565b6109155760009650505050505050610580565b855181111561092d5760009650505050505050610580565b5050610a37565b6001600160e01b031982166323f0ed1560e11b1415610a2a5760008061096561096060608a018a613737565b611e5d565b5091509150826109cf5760005b82518110156109cd576109a78382815181106109905761099061377d565b602002602001015187611d8690919063ffffffff16565b6109bb576000975050505050505050610580565b806109c5816137a9565b915050610972565b505b60005b8251811015610a22578181815181106109ed576109ed61377d565b602002602001015187600001511015610a10576000975050505050505050610580565b80610a1a816137a9565b9150506109d2565b505050610a37565b6000945050505050610580565b5060019695505050505050565b6000610a4e611d62565b6001600160a01b03909216600090815260049290920160205250604090205460ff1690565b6000610a7d611eaa565b610a878484611f13565b9050610a9282612058565b9392505050565b610aa161153e565b6001600160a01b0316336001600160a01b03161480610ac45750610ac433610a44565b610ae05760405162461bcd60e51b815260040161073e906137c4565b610ae86120a5565b8481148015610af657508483145b610b425760405162461bcd60e51b815260206004820152601d60248201527f4163636f756e743a2077726f6e67206172726179206c656e677468732e000000604482015260640161073e565b60005b85811015610c0157610bee878783818110610b6257610b6261377d565b9050602002016020810190610b779190613003565b868684818110610b8957610b8961377d565b90506020020135858585818110610ba257610ba261377d565b9050602002810190610bb49190613737565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061217b92505050565b5080610bf9816137a9565b915050610b45565b50505050505050565b610c1261153e565b6001600160a01b031663b760faf934306040518363ffffffff1660e01b8152600401610c3e9190613466565b6000604051808303818588803b158015610c5757600080fd5b505af1158015610c6b573d6000803e3d6000fd5b5050505050565b610c7a6121ec565b610c8261153e565b6001600160a01b031663205c287883836040518363ffffffff1660e01b8152600401610caf929190613805565b600060405180830381600087803b158015610cc957600080fd5b505af1158015610cdd573d6000803e3d6000fd5b505050505050565b6000610cf46020850185613003565b905042610d0760e0860160c08701613835565b6001600160801b031611158015610d365750610d2a610100850160e08601613835565b6001600160801b031642105b610d6c5760405162461bcd60e51b8152602060048201526007602482015266085c195c9a5bd960ca1b604482015260640161073e565b600080610d7a8686866113f3565b9150915081610db45760405162461bcd60e51b815260040161073e906020808252600490820152632173696760e01b604082015260600190565b6001610dbe611d62565b610100880135600090815260079190910160209081526040808320805460ff1916941515949094179093559091610dfa91908901908901613861565b60ff161115610e27576000610e156040880160208901613861565b60ff166001149050610c01848261222a565b610e3083610a44565b15610e655760405162461bcd60e51b815260206004820152600560248201526430b236b4b760d91b604482015260640161073e565b610e7a83610e71611d62565b600201906122da565b50604051806060016040528087606001358152602001876080016020810190610ea39190613835565b6001600160801b03168152602001610ec160c0890160a08a01613835565b6001600160801b03169052610ed4611d62565b6001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b02931692909217600190920191909155610f4a610f29611d62565b6001600160a01b0386166000908152600691909101602052604090206122ef565b805190915060005b81811015610fb457610fa1838281518110610f6f57610f6f61377d565b6020026020010151610f7f611d62565b6001600160a01b038916600090815260069190910160205260409020906122fc565b50610fad60018261387c565b9050610f52565b50610fc26040890189613894565b9050905060005b8181101561104357611030610fe160408b018b613894565b83818110610ff157610ff161377d565b90506020020160208101906110069190613003565b61100e611d62565b6001600160a01b038916600090815260069190910160205260409020906122da565b5061103c60018261387c565b9050610fc9565b5061104d88612311565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a604051611090919061396e565b60405180910390a35050505050505050565b6000806110ad611d62565b6001600160a01b038416600090815260059190910160209081526040918290208251606081018452815481526001909101546001600160801b03808216938301849052600160801b9091041692810192909252909150421080159061111e575080604001516001600160801b031642105b8015610a9257506000611153611132611d62565b6001600160a01b038616600090815260069190910160205260409020611da8565b119392505050565b6060600061117261116a611d62565b6002016122ef565b80519091506000805b82811015611203576111a58482815181106111985761119861377d565b60200260200101516110a2565b156111bc57816111b4816137a9565b9250506111f1565b60008482815181106111d0576111d061377d565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6111fc60018261387c565b905061117b565b50806001600160401b0381111561121c5761121c612dde565b60405190808252806020026020018201604052801561125557816020015b611242612cd1565b81526020019060019003908161123a5790505b5093506000805b8381101561139a5760006001600160a01b03168582815181106112815761128161377d565b60200260200101516001600160a01b0316146113885760008582815181106112ab576112ab61377d565b6020026020010151905060006112bf611d62565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611329610f29611d62565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250888580611368906137a9565b96508151811061137a5761137a61377d565b602002602001018190525050505b61139360018261387c565b905061125c565b505050505090565b6113aa612376565b6113e75760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b604482015260640161073e565b6113f08161238e565b50565b60008061140961140286612479565b85856125bd565b9050611413611d62565b6101008601356000908152600791909101602052604090205460ff16158015611440575061144081610a44565b9150935093915050565b6060816001600160401b0381111561146457611464612dde565b60405190808252806020026020018201604052801561149757816020015b60608152602001906001900390816114825790505b50905060005b8281101561153757611507308585848181106114bb576114bb61377d565b90506020028101906114cd9190613737565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061261792505050565b8282815181106115195761151961377d565b6020026020010181905250808061152f906137a9565b91505061149d565b5092915050565b60008061154961263c565b546001600160a01b03169050801561156057919050565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278991505090565b61158f61153e565b6001600160a01b0316336001600160a01b031614806115b257506115b233610a44565b6115ce5760405162461bcd60e51b815260040161073e906137c4565b6115d66120a5565b610c6b848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061217b92505050565b61161f6121ec565b8061162861263c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b600061165361263c565b600101546001600160a01b0316919050565b600061166f612660565b5460ff169050600061167f612660565b54610100900460ff169050801580801561169c575060018360ff16105b806116bb57506116ab3061266a565b1580156116bb57508260ff166001145b61171e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161073e565b6001611728612660565b805460ff191660ff92909216919091179055801561176157600161174a612660565b80549115156101000261ff00199092169190911790555b6117a18786868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061267992505050565b6117a961263c565b60020155856117b661263c565b60010160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506117e887600161222a565b8015610c015760006117f8612660565b80549115156101000261ff0019909216919091179055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b600061185561153e565b604051631aab3f0d60e11b8152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa1580156118a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c69190613a59565b905090565b606060006118da61116a611d62565b8051909150806001600160401b038111156118f7576118f7612dde565b60405190808252806020026020018201604052801561193057816020015b61191d612cd1565b8152602001906001900390816119155790505b50925060005b81811015611a365760008382815181106119525761195261377d565b602002602001015190506000611966611d62565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a0810190945291835290925081016119d0610f29611d62565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250868481518110611a1557611a1561377d565b60200260200101819052505050600181611a2f919061387c565b9050611936565b50505090565b6060611a466126ac565b8054611a5190613a72565b80601f0160208091040260200160405190810160405280929190818152602001828054611a7d90613a72565b8015611aca5780601f10611a9f57610100808354040283529160200191611aca565b820191906000526020600020905b815481529060010190602001808311611aad57829003601f168201915b5050505050905090565b60606118c6611ae1611d62565b6122ef565b611aee612cd1565b6000611af8611d62565b6001600160a01b038416600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611b83611b62611d62565b6001600160a01b0387166000908152600691909101602052604090206122ef565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030090565b60006001600160e01b03198216630271189760e51b148061058057506301ffc9a760e01b6001600160e01b0319831614610580565b6000306001600160a01b037f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac16148015611c7057507f0000000000000000000000000000000000000000000000000000000000007a6946145b15611c9a57507fbcdadf6444930a967ffda04923d78c49b3dd65df3ed39abb04a1e3eb1190553790565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527ff0729608244859f656d32ae4cbc6b0367695d68d8e941a28f5e2d33c6d5182dd828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b6000806000611d4d85856126d0565b91509150611d5a81612716565b509392505050565b7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0090565b6001600160a01b03811660009081526001830160205260408120541515610a92565b6000610580825490565b6000610a92838361285f565b60006004821015611de15760405162461bcd60e51b815260040161073e90613aa7565b611def600460008486613ac6565b610a9291613af0565b6000806044831015611e1c5760405162461bcd60e51b815260040161073e90613aa7565b611e2a602460048587613ac6565b810190611e379190613003565b9150611e47604460248587613ac6565b810190611e549190613b20565b90509250929050565b606080806064841015611e825760405162461bcd60e51b815260040161073e90613aa7565b611e8f8460048188613ac6565b810190611e9c9190613bb8565b919790965090945092505050565b611eb261153e565b6001600160a01b0316336001600160a01b031614611f115760405162461bcd60e51b815260206004820152601c60248201527b1858d8dbdd5b9d0e881b9bdd08199c9bdb48115b9d1c9e541bda5b9d60221b604482015260640161073e565b565b7b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b6000908152601c829052603c81206000611f91611f54610140870187613737565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050611d3e9050565b9050611f9d818661076a565b611fac57600192505050610580565b6000611fb6611d62565b6001600160a01b03929092166000908152600590920160209081526040808420815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845295825265ffffffffffff8087169483019490945292831691015260d09290921b6001600160d01b03191660a09290921b65ffffffffffff60a01b169190911795945050505050565b80156113f057604051600090339060001990849084818181858888f193505050503d8060008114610c6b576040519150601f19603f3d011682016040523d82523d6000602084013e610c6b565b60006120af61263c565b6001015460405163c3c5a54760e01b81526001600160a01b039091169150819063c3c5a547906120e3903090600401613466565b602060405180830381865afa158015612100573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121249190613c9d565b6113f057806001600160a01b03166383a03f8c61213f61263c565b600201546040518263ffffffff1660e01b815260040161216191815260200190565b600060405180830381600087803b158015610c5757600080fd5b60606000846001600160a01b031684846040516121989190613cbf565b60006040518083038185875af1925050503d80600081146121d5576040519150601f19603f3d011682016040523d82523d6000602084013e6121da565b606091505b509250905080611d5a57815160208301fd5b6121f533610a44565b611f115760405162461bcd60e51b815260206004820152600660248201526510b0b236b4b760d11b604482015260640161073e565b6122348282612889565b600061223e611649565b90506001600160a01b0381163b156122d55781156122bd57806001600160a01b0316630b61e12b8461226e61263c565b600201546040518363ffffffff1660e01b815260040161228f929190613805565b600060405180830381600087803b1580156122a957600080fd5b505af1158015610c01573d6000803e3d6000fd5b806001600160a01b0316639387a3808461226e61263c565b505050565b6000610a92836001600160a01b038416612938565b60606000610a9283612987565b6000610a92836001600160a01b0384166129e3565b600061231b611649565b90506001600160a01b0381163b15612372576001600160a01b038116630b61e12b6123496020850185613003565b61235161263c565b600201546040518363ffffffff1660e01b8152600401610caf929190613805565b5050565b600061238133610a44565b806118c657505030331490565b60006123986126ac565b80546123a390613a72565b80601f01602080910402602001604051908101604052809291908181526020018280546123cf90613a72565b801561241c5780601f106123f15761010080835404028352916020019161241c565b820191906000526020600020905b8154815290600101906020018083116123ff57829003601f168201915b505050505090508161242c6126ac565b815161243b9260200190612d1b565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a16818360405161246d929190613cdb565b60405180910390a15050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e96124a96020840184613003565b6124b96040850160208601613861565b6124c66040860186613894565b6040516020016124d7929190613d09565b60408051601f198184030181529190528051602090910120606086013561250460a0880160808901613835565b61251460c0890160a08a01613835565b61252460e08a0160c08b01613835565b6125356101008b0160e08c01613835565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b600061260f83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508751602089012061260992509050612ad6565b90611d3e565b949350505050565b6060610a928383604051806060016040528060278152602001613db360279139612b03565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830090565b60006118c6611bbe565b6001600160a01b03163b151590565b6000828260405160200161268e929190613d4b565b60405160208183030381529060405280519060200120905092915050565b7f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90090565b6000808251604114156127075760208301516040840151606085015160001a6126fb87828585612bde565b9450945050505061270f565b506000905060025b9250929050565b600081600481111561272a5761272a613d6f565b14156127335750565b600181600481111561274757612747613d6f565b14156127905760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b604482015260640161073e565b60028160048111156127a4576127a4613d6f565b14156127f25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161073e565b600381600481111561280657612806613d6f565b14156113f05760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161073e565b60008260000182815481106128765761287661377d565b9060005260206000200154905092915050565b80612892611d62565b6001600160a01b038416600090815260049190910160205260409020805460ff191691151591909117905580156128db576128d5826128cf611d62565b906122da565b506128ef565b6128ed826128e7611d62565b906122fc565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a111338260405161292c911515815260200190565b60405180910390a25050565b600081815260018301602052604081205461297f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610580565b506000610580565b6060816000018054806020026020016040519081016040528092919081815260200182805480156129d757602002820191906000526020600020905b8154815260200190600101908083116129c3575b50505050509050919050565b60008181526001830160205260408120548015612acc576000612a07600183613d85565b8554909150600090612a1b90600190613d85565b9050818114612a80576000866000018281548110612a3b57612a3b61377d565b9060005260206000200154905080876000018481548110612a5e57612a5e61377d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612a9157612a91613d9c565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610580565b6000915050610580565b6000610580612ae3611c17565b8360405161190160f01b8152600281019290925260228201526042902090565b6060612b0e8461266a565b612b695760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b606482015260840161073e565b600080856001600160a01b031685604051612b849190613cbf565b600060405180830381855af49150503d8060008114612bbf576040519150601f19603f3d011682016040523d82523d6000602084013e612bc4565b606091505b5091509150612bd4828286612c98565b9695505050505050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612c0b5750600090506003612c8f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c5f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c8857600060019250925050612c8f565b9150600090505b94509492505050565b60608315612ca7575081610a92565b825115612cb75782518084602001fd5b8160405162461bcd60e51b815260040161073e919061365c565b6040518060a0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160801b0316815260200160006001600160801b031681525090565b828054612d2790613a72565b90600052602060002090601f016020900481019282612d495760008555612d8f565b82601f10612d6257805160ff1916838001178555612d8f565b82800160010185558215612d8f579182015b82811115612d8f578251825591602001919060010190612d74565b50612d9b929150612d9f565b5090565b5b80821115612d9b5760008155600101612da0565b600060208284031215612dc657600080fd5b81356001600160e01b031981168114610a9257600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612e1c57612e1c612dde565b604052919050565b60006001600160401b03831115612e3d57612e3d612dde565b612e50601f8401601f1916602001612df4565b9050828152838383011115612e6457600080fd5b828260208301376000602084830101529392505050565b600082601f830112612e8c57600080fd5b610a9283833560208501612e24565b600060208284031215612ead57600080fd5b81356001600160401b03811115612ec357600080fd5b61260f84828501612e7b565b6001600160a01b03811681146113f057600080fd5b8035612eef81612ecf565b919050565b60008060008060808587031215612f0a57600080fd5b8435612f1581612ecf565b93506020850135612f2581612ecf565b92506040850135915060608501356001600160401b03811115612f4757600080fd5b612f5387828801612e7b565b91505092959194509250565b60008060408385031215612f7257600080fd5b8235915060208301356001600160401b03811115612f8f57600080fd5b612f9b85828601612e7b565b9150509250929050565b60006101608284031215612fb857600080fd5b50919050565b60008060408385031215612fd157600080fd5b8235612fdc81612ecf565b915060208301356001600160401b03811115612ff757600080fd5b612f9b85828601612fa5565b60006020828403121561301557600080fd5b8135610a9281612ecf565b60008060006060848603121561303557600080fd5b83356001600160401b0381111561304b57600080fd5b61305786828701612fa5565b9660208601359650604090950135949350505050565b60008083601f84011261307f57600080fd5b5081356001600160401b0381111561309657600080fd5b6020830191508360208260051b850101111561270f57600080fd5b600080600080600080606087890312156130ca57600080fd5b86356001600160401b03808211156130e157600080fd5b6130ed8a838b0161306d565b9098509650602089013591508082111561310657600080fd5b6131128a838b0161306d565b9096509450604089013591508082111561312b57600080fd5b5061313889828a0161306d565b979a9699509497509295939492505050565b6000806040838503121561315d57600080fd5b823561316881612ecf565b946020939093013593505050565b60008083601f84011261318857600080fd5b5081356001600160401b0381111561319f57600080fd5b60208301915083602082850101111561270f57600080fd5b6000806000604084860312156131cc57600080fd5b83356001600160401b03808211156131e357600080fd5b9085019061012082880312156131f857600080fd5b9093506020850135908082111561320e57600080fd5b5061321b86828701613176565b9497909650939450505050565b6001600160801b03169052565b80516001600160a01b03908116835260208083015160a082860181905281519086018190526000939183019290849060c08801905b8083101561328c5785518516825294830194600192909201919083019061326a565b5060408701516040890152606087015194506132ab6060890186613228565b608087015194506132bf6080890186613228565b979650505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561331f57603f1988860301845261330d858351613235565b945092850192908501906001016132f1565b5092979650505050505050565b60006020828403121561333e57600080fd5b81356001600160401b0381111561335457600080fd5b8201601f8101841361336557600080fd5b61260f84823560208401612e24565b6000806020838503121561338757600080fd5b82356001600160401b0381111561339d57600080fd5b6133a98582860161306d565b90969095509350505050565b60005b838110156133d05781810151838201526020016133b8565b838111156133df576000848401525b50505050565b600081518084526133fd8160208601602086016133b5565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561331f57603f198886030184526134548583516133e5565b94509285019290850190600101613438565b6001600160a01b0391909116815260200190565b6000806000806060858703121561349057600080fd5b843561349b81612ecf565b93506020850135925060408501356001600160401b038111156134bd57600080fd5b6134c987828801613176565b95989497509550505050565b60006001600160401b038211156134ee576134ee612dde565b5060051b60200190565b600082601f83011261350957600080fd5b8135602061351e613519836134d5565b612df4565b82815260059290921b8401810191818101908684111561353d57600080fd5b8286015b848110156135585780358352918301918301613541565b509695505050505050565b600080600080600060a0868803121561357b57600080fd5b853561358681612ecf565b9450602086013561359681612ecf565b935060408601356001600160401b03808211156135b257600080fd5b6135be89838a016134f8565b945060608801359150808211156135d457600080fd5b6135e089838a016134f8565b935060808801359150808211156135f657600080fd5b5061360388828901612e7b565b9150509295509295909350565b6000806000806060858703121561362657600080fd5b843561363181612ecf565b9350602085013561364181612ecf565b925060408501356001600160401b038111156134bd57600080fd5b602081526000610a9260208301846133e5565b6020808252825182820181905260009190848201906040850190845b818110156136b05783516001600160a01b03168352928401929184019160010161368b565b50909695505050505050565b602081526000610a926020830184613235565b600080600080600060a086880312156136e757600080fd5b85356136f281612ecf565b9450602086013561370281612ecf565b9350604086013592506060860135915060808601356001600160401b0381111561372b57600080fd5b61360388828901612e7b565b6000808335601e1984360301811261374e57600080fd5b8301803591506001600160401b0382111561376857600080fd5b60200191503681900382131561270f57600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156137bd576137bd613793565b5060010190565b60208082526021908201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746040820152601760f91b606082015260800190565b6001600160a01b03929092168252602082015260400190565b80356001600160801b0381168114612eef57600080fd5b60006020828403121561384757600080fd5b610a928261381e565b803560ff81168114612eef57600080fd5b60006020828403121561387357600080fd5b610a9282613850565b6000821982111561388f5761388f613793565b500190565b6000808335601e198436030181126138ab57600080fd5b8301803591506001600160401b038211156138c557600080fd5b6020019150600581901b360382131561270f57600080fd5b6000808335601e198436030181126138f457600080fd5b83016020810192503590506001600160401b0381111561391357600080fd5b8060051b360383131561270f57600080fd5b8183526000602080850194508260005b8581101561396357813561394881612ecf565b6001600160a01b031687529582019590820190600101613935565b509495945050505050565b6020815261398f6020820161398284612ee4565b6001600160a01b03169052565b600061399d60208401613850565b60ff81166040840152506139b460408401846138dd565b6101208060608601526139cc61014086018385613925565b9250606086013560808601526139e46080870161381e565b91506139f360a0860183613228565b6139ff60a0870161381e565b9150613a0e60c0860183613228565b613a1a60c0870161381e565b9150613a2960e0860183613228565b613a3560e0870161381e565b9150610100613a4681870184613228565b9590950135939094019290925250919050565b600060208284031215613a6b57600080fd5b5051919050565b600181811c90821680613a8657607f821691505b60208210811415612fb857634e487b7160e01b600052602260045260246000fd5b602080825260059082015264214461746160d81b604082015260600190565b60008085851115613ad657600080fd5b83861115613ae357600080fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015613b185780818660040360031b1b83161692505b505092915050565b600060208284031215613b3257600080fd5b5035919050565b600082601f830112613b4a57600080fd5b81356020613b5a613519836134d5565b82815260059290921b84018101918181019086841115613b7957600080fd5b8286015b848110156135585780356001600160401b03811115613b9c5760008081fd5b613baa8986838b0101612e7b565b845250918301918301613b7d565b600080600060608486031215613bcd57600080fd5b83356001600160401b0380821115613be457600080fd5b818601915086601f830112613bf857600080fd5b81356020613c08613519836134d5565b82815260059290921b8401810191818101908a841115613c2757600080fd5b948201945b83861015613c4e578535613c3f81612ecf565b82529482019490820190613c2c565b97505087013592505080821115613c6457600080fd5b613c70878388016134f8565b93506040860135915080821115613c8657600080fd5b50613c9386828701613b39565b9150509250925092565b600060208284031215613caf57600080fd5b81518015158114610a9257600080fd5b60008251613cd18184602087016133b5565b9190910192915050565b604081526000613cee60408301856133e5565b8281036020840152613d0081856133e5565b95945050505050565b60008184825b85811015613d40578135613d2281612ecf565b6001600160a01b031683526020928301929190910190600101613d0f565b509095945050505050565b6001600160a01b038316815260406020820181905260009061260f908301846133e5565b634e487b7160e01b600052602160045260246000fd5b600082821015613d9757613d97613793565b500390565b634e487b7160e01b600052603160045260246000fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122063420609b43104a3126682cb43841aa6e05cec6ab10a28529e06158e94a7032364736f6c634300080c0033"; +bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"608060405234801561001057600080fd5b50600436106101735760003560e01c80639387a380116100de578063c3c5a54711610097578063d8fd8f4411610071578063d8fd8f4414610482578063e68a7c3b146104b2578063e8a3d485146104e2578063f399e22e1461050057610173565b8063c3c5a54714610406578063ca15c87314610436578063d547741f1461046657610173565b80639387a38014610332578063938e3d7b1461034e578063a217fddf1461036a578063a32fa5b314610388578063a65d69d4146103b8578063ac9650d8146103d657610173565b806336568abe1161013057806336568abe1461024c57806358451f971461026857806383a03f8c146102865780638878ed33146102a25780639010d07c146102d257806391d148541461030257610173565b806308e93d0a146101785780630b61e12b146101965780630e6254fd146101b257806311464fbe146101e2578063248a9ca3146102005780632f2ff15d14610230575b600080fd5b61018061051c565b60405161018d9190612888565b60405180910390f35b6101b060048036038101906101ab9190612920565b610536565b005b6101cc60048036038101906101c79190612960565b610649565b6040516101d99190612888565b60405180910390f35b6101ea6106a2565b6040516101f7919061299c565b60405180910390f35b61021a600480360381019061021591906129b7565b6106c6565b60405161022791906129f3565b60405180910390f35b61024a60048036038101906102459190612a0e565b6106ec565b005b61026660048036038101906102619190612a0e565b6107ce565b005b610270610851565b60405161027d9190612a67565b60405180910390f35b6102a0600480360381019061029b91906129b7565b61086b565b005b6102bc60048036038101906102b79190612ae7565b610919565b6040516102c9919061299c565b60405180910390f35b6102ec60048036038101906102e79190612b73565b6109a0565b6040516102f9919061299c565b60405180910390f35b61031c60048036038101906103179190612a0e565b610b76565b6040516103299190612bce565b60405180910390f35b61034c60048036038101906103479190612920565b610be7565b005b61036860048036038101906103639190612d2a565b610cfa565b005b610372610d4d565b60405161037f91906129f3565b60405180910390f35b6103a2600480360381019061039d9190612a0e565b610d54565b6040516103af9190612bce565b60405180910390f35b6103c0610e3a565b6040516103cd919061299c565b60405180910390f35b6103f060048036038101906103eb9190612dc9565b610e5e565b6040516103fd9190612f60565b60405180910390f35b610420600480360381019061041b9190612960565b610f6a565b60405161042d9190612bce565b60405180910390f35b610450600480360381019061044b91906129b7565b610f90565b60405161045d9190612a67565b60405180910390f35b610480600480360381019061047b9190612a0e565b61108f565b005b61049c60048036038101906104979190612ae7565b6110ca565b6040516104a9919061299c565b60405180910390f35b6104cc60048036038101906104c79190612f82565b6112ab565b6040516104d99190612888565b60405180910390f35b6104ea61140f565b6040516104f79190613017565b60405180910390f35b61051a60048036038101906105159190613039565b6114aa565b005b6060610531610529611659565b600001611668565b905090565b60003390506105458183611689565b610584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057b906130e1565b60405180910390fd5b60006105e082610592611659565b60020160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206116f090919063ffffffff16565b90508015610643578373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35b50505050565b606061069b610656611659565b60020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611668565b9050919050565b7f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac81565b60006106d0611720565b6001016000838152602001908152602001600020549050919050565b6107196106f7611720565b60010160008481526020019081526020016000205461071461172f565b611737565b610721611720565b600001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156107c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b79061314d565b60405180910390fd5b6107ca8282611831565b5050565b8073ffffffffffffffffffffffffffffffffffffffff166107ed61172f565b73ffffffffffffffffffffffffffffffffffffffff1614610843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161083a906131b9565b60405180910390fd5b61084d8282611849565b5050565b600061086661085e611659565b600001611861565b905090565b600033905061087a8183611689565b6108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b0906130e1565b60405180910390fd5b6108d6816108c5611659565b6000016116f090919063ffffffff16565b610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090c9061324b565b60405180910390fd5b5050565b60008061096a8585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611876565b90506109967f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac826118a9565b9150509392505050565b6000806109ab6118be565b6000016000858152602001908152602001600020600001549050600080600090505b82811015610b6c57600073ffffffffffffffffffffffffffffffffffffffff166109f56118be565b6000016000888152602001908152602001600020600101600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ad05784821415610abc57610a696118be565b6000016000878152602001908152602001600020600101600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169350505050610b70565b600182610ac9919061329a565b9150610b58565b610adb866000610b76565b8015610b425750610aea6118be565b600001600087815260200190815260200160002060020160008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481145b15610b5757600182610b54919061329a565b91505b5b600181610b65919061329a565b90506109cd565b5050505b92915050565b6000610b80611720565b600001600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000339050610bf68183611689565b610c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2c906130e1565b60405180910390fd5b6000610c9182610c43611659565b60020160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206118cd90919063ffffffff16565b90508015610cf4578373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a35b50505050565b610d026118fd565b610d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d389061333c565b60405180910390fd5b610d4a81611911565b50565b6000801b81565b6000610d5e611720565b600001600084815260200190815260200160002060008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e2f57610dc9611720565b600001600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050610e34565b600190505b92915050565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278981565b60608282905067ffffffffffffffff811115610e7d57610e7c612bff565b5b604051908082528060200260200182016040528015610eb057816020015b6060815260200190600190039081610e9b5790505b50905060005b83839050811015610f6357610f3230858584818110610ed857610ed761335c565b5b9050602002810190610eea919061339a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611a06565b828281518110610f4557610f4461335c565b5b60200260200101819052508080610f5b906133fd565b915050610eb6565b5092915050565b6000610f8982610f78611659565b600001611a3390919063ffffffff16565b9050919050565b600080610f9b6118be565b600001600084815260200190815260200160002060000154905060005b8181101561106857600073ffffffffffffffffffffffffffffffffffffffff16610fe06118be565b6000016000868152602001908152602001600020600101600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461105457600183611051919061329a565b92505b600181611061919061329a565b9050610fb8565b50611074836000610b76565b1561108957600182611086919061329a565b91505b50919050565b6110bc61109a611720565b6001016000848152602001908152602001600020546110b761172f565b611737565b6110c68282611849565b5050565b6000807f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac905060006111408686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611876565b9050600061114e83836118a9565b905060008173ffffffffffffffffffffffffffffffffffffffff163b111561117b578093505050506112a4565b6111858383611a63565b90507f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611237576111f7816111e6611659565b6000016116f090919063ffffffff16565b611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d9061324b565b60405180910390fd5b5b61124381888888611b20565b8673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a38093505050505b9392505050565b606081831080156112ce57506112ca6112c2611659565b600001611861565b8211155b61130d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611304906134b8565b60405180910390fd5b6000838361131b91906134d8565b9050838361132991906134d8565b67ffffffffffffffff81111561134257611341612bff565b5b6040519080825280602002602001820160405280156113705781602001602082028036833780820191505090505b50915060005b81811015611407576113a6858261138d919061329a565b611395611659565b600001611b9790919063ffffffff16565b8382815181106113b9576113b861335c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600181611400919061329a565b9050611376565b505092915050565b6060611419611bb1565b60000180546114279061353b565b80601f01602080910402602001604051908101604052809291908181526020018280546114539061353b565b80156114a05780601f10611475576101008083540402835291602001916114a0565b820191906000526020600020905b81548152906001019060200180831161148357829003601f168201915b5050505050905090565b60006114b4611bc0565b60000160009054906101000a900460ff16905060006114d1611bc0565b60000160019054906101000a900460ff1690506000811590508080156114fa575060018360ff16105b8061151a575061150930611bcf565b158015611519575060018360ff16145b5b611559576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611550906135df565b60405180910390fd5b6001611563611bc0565b60000160006101000a81548160ff021916908360ff16021790555080156115a957600161158e611bc0565b60000160016101000a81548160ff0219169083151502179055505b6115b66000801b86611831565b6115bf84611911565b80156116225760006115cf611bc0565b60000160016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249860016040516116199190613651565b60405180910390a15b5050505050565b6000807f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030060001b90508091505090565b6000611663611bf2565b905090565b6060600061167883600001611c22565b905060608190508092505050919050565b6000806116b67f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac846118a9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161491505092915050565b6000611718836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611c7e565b905092915050565b600061172a611cee565b905090565b600033905090565b61173f611720565b600001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661182d576117c38173ffffffffffffffffffffffffffffffffffffffff166014611d1e565b6117d18360001c6020611d1e565b6040516020016117e2929190613740565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118249190613017565b60405180910390fd5b5050565b61183b8282611f5a565b6118458282612032565b5050565b6118538282612162565b61185d828261223b565b5050565b600061186f82600001612354565b9050919050565b6000828260405160200161188b9291906137c4565b60405160208183030381529060405280519060200120905092915050565b60006118b6838330612365565b905092915050565b60006118c86123c6565b905090565b60006118f5836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61242f565b905092915050565b600061190c6000801b33610b76565b905090565b600061191b611bb1565b60000180546119299061353b565b80601f01602080910402602001604051908101604052809291908181526020018280546119559061353b565b80156119a25780601f10611977576101008083540402835291602001916119a2565b820191906000526020600020905b81548152906001019060200180831161198557829003601f168201915b50505050509050816119b2611bb1565b60000190805190602001906119c89291906126f5565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516119fa9291906137f4565b60405180910390a15050565b6060611a2b8383604051806060016040528060278152602001613b0960279139612543565b905092915050565b6000611a5b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612610565b905092915050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f59050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1190613877565b60405180910390fd5b92915050565b8373ffffffffffffffffffffffffffffffffffffffff1663cf7a1d77843085856040518563ffffffff1660e01b8152600401611b5f94939291906138c4565b600060405180830381600087803b158015611b7957600080fd5b505af1158015611b8d573d6000803e3d6000fd5b5050505050505050565b6000611ba68360000183612633565b60001c905092915050565b6000611bbb61265e565b905090565b6000611bca611629565b905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f82f5b3e5f5ca1c04b70bced106a2c3b72d9cb53ebbafb3cad0740983db74290060001b90508091505090565b606081600001805480602002602001604051908101604052809291908181526020018280548015611c7257602002820191906000526020600020905b815481526020019060010190808311611c5e575b50505050509050919050565b6000611c8a8383612610565b611ce3578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611ce8565b600090505b92915050565b6000807f0a7b0f5c59907924802379ebe98cdc23e2ee7820f63d30126e10b3752010e50060001b90508091505090565b606060006002836002611d319190613904565b611d3b919061329a565b67ffffffffffffffff811115611d5457611d53612bff565b5b6040519080825280601f01601f191660200182016040528015611d865781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611dbe57611dbd61335c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611e2257611e2161335c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611e629190613904565b611e6c919061329a565b90505b6001811115611f0c577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611eae57611ead61335c565b5b1a60f81b828281518110611ec557611ec461335c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611f059061395e565b9050611e6f565b5060008414611f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f47906139d4565b60405180910390fd5b8091505092915050565b6001611f64611720565b600001600084815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fd461172f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600061203c6118be565b600001600084815260200190815260200160002060000154905060016120606118be565b60000160008581526020019081526020016000206000016000828254612086919061329a565b92505081905550816120966118be565b6000016000858152602001908152602001600020600101600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806121056118be565b600001600085815260200190815260200160002060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050565b61216c8282611737565b612174611720565b600001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff02191690556121dd61172f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60006122456118be565b600001600084815260200190815260200160002060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506122a46118be565b6000016000848152602001908152602001600020600101600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556122f76118be565b600001600084815260200190815260200160002060020160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009055505050565b600081600001805490509050919050565b60006040518260388201526f5af43d82803e903d91602b57fd5bf3ff6024820152846014820152733d602d80600a3d3981f3363d3d373d3d3d363d7381528360588201526037600c8201206078820152605560438201209150509392505050565b60008060ff60001b1960017f0c4ba382c0009cf238e4c1ca1a52f51c61e6248a70bdfb34e5ed49d5578a5c0c60001c6123ff91906134d8565b60405160200161240f9190612a67565b604051602081830303815290604052805190602001201690508091505090565b6000808360010160008481526020019081526020016000205490506000811461253757600060018261246191906134d8565b905060006001866000018054905061247991906134d8565b90508181146124e857600086600001828154811061249a5761249961335c565b5b90600052602060002001549050808760000184815481106124be576124bd61335c565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806124fc576124fb6139f4565b5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061253d565b60009150505b92915050565b606061254e84611bcf565b61258d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258490613a95565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff16856040516125b59190613af1565b600060405180830381855af49150503d80600081146125f0576040519150601f19603f3d011682016040523d82523d6000602084013e6125f5565b606091505b509150915061260582828661268e565b925050509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600082600001828154811061264b5761264a61335c565b5b9060005260206000200154905092915050565b6000807f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90060001b90508091505090565b6060831561269e578290506126ee565b6000835111156126b15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e59190613017565b60405180910390fd5b9392505050565b8280546127019061353b565b90600052602060002090601f016020900481019282612723576000855561276a565b82601f1061273c57805160ff191683800117855561276a565b8280016001018555821561276a579182015b8281111561276957825182559160200191906001019061274e565b5b509050612777919061277b565b5090565b5b8082111561279457600081600090555060010161277c565b5090565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127ef826127c4565b9050919050565b6127ff816127e4565b82525050565b600061281183836127f6565b60208301905092915050565b6000602082019050919050565b600061283582612798565b61283f81856127a3565b935061284a836127b4565b8060005b8381101561287b5781516128628882612805565b975061286d8361281d565b92505060018101905061284e565b5085935050505092915050565b600060208201905081810360008301526128a2818461282a565b905092915050565b6000604051905090565b600080fd5b600080fd5b6128c7816127e4565b81146128d257600080fd5b50565b6000813590506128e4816128be565b92915050565b6000819050919050565b6128fd816128ea565b811461290857600080fd5b50565b60008135905061291a816128f4565b92915050565b60008060408385031215612937576129366128b4565b5b6000612945858286016128d5565b92505060206129568582860161290b565b9150509250929050565b600060208284031215612976576129756128b4565b5b6000612984848285016128d5565b91505092915050565b612996816127e4565b82525050565b60006020820190506129b1600083018461298d565b92915050565b6000602082840312156129cd576129cc6128b4565b5b60006129db8482850161290b565b91505092915050565b6129ed816128ea565b82525050565b6000602082019050612a0860008301846129e4565b92915050565b60008060408385031215612a2557612a246128b4565b5b6000612a338582860161290b565b9250506020612a44858286016128d5565b9150509250929050565b6000819050919050565b612a6181612a4e565b82525050565b6000602082019050612a7c6000830184612a58565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612aa757612aa6612a82565b5b8235905067ffffffffffffffff811115612ac457612ac3612a87565b5b602083019150836001820283011115612ae057612adf612a8c565b5b9250929050565b600080600060408486031215612b0057612aff6128b4565b5b6000612b0e868287016128d5565b935050602084013567ffffffffffffffff811115612b2f57612b2e6128b9565b5b612b3b86828701612a91565b92509250509250925092565b612b5081612a4e565b8114612b5b57600080fd5b50565b600081359050612b6d81612b47565b92915050565b60008060408385031215612b8a57612b896128b4565b5b6000612b988582860161290b565b9250506020612ba985828601612b5e565b9150509250929050565b60008115159050919050565b612bc881612bb3565b82525050565b6000602082019050612be36000830184612bbf565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612c3782612bee565b810181811067ffffffffffffffff82111715612c5657612c55612bff565b5b80604052505050565b6000612c696128aa565b9050612c758282612c2e565b919050565b600067ffffffffffffffff821115612c9557612c94612bff565b5b612c9e82612bee565b9050602081019050919050565b82818337600083830152505050565b6000612ccd612cc884612c7a565b612c5f565b905082815260208101848484011115612ce957612ce8612be9565b5b612cf4848285612cab565b509392505050565b600082601f830112612d1157612d10612a82565b5b8135612d21848260208601612cba565b91505092915050565b600060208284031215612d4057612d3f6128b4565b5b600082013567ffffffffffffffff811115612d5e57612d5d6128b9565b5b612d6a84828501612cfc565b91505092915050565b60008083601f840112612d8957612d88612a82565b5b8235905067ffffffffffffffff811115612da657612da5612a87565b5b602083019150836020820283011115612dc257612dc1612a8c565b5b9250929050565b60008060208385031215612de057612ddf6128b4565b5b600083013567ffffffffffffffff811115612dfe57612dfd6128b9565b5b612e0a85828601612d73565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e7c578082015181840152602081019050612e61565b83811115612e8b576000848401525b50505050565b6000612e9c82612e42565b612ea68185612e4d565b9350612eb6818560208601612e5e565b612ebf81612bee565b840191505092915050565b6000612ed68383612e91565b905092915050565b6000602082019050919050565b6000612ef682612e16565b612f008185612e21565b935083602082028501612f1285612e32565b8060005b85811015612f4e5784840389528151612f2f8582612eca565b9450612f3a83612ede565b925060208a01995050600181019050612f16565b50829750879550505050505092915050565b60006020820190508181036000830152612f7a8184612eeb565b905092915050565b60008060408385031215612f9957612f986128b4565b5b6000612fa785828601612b5e565b9250506020612fb885828601612b5e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000612fe982612fc2565b612ff38185612fcd565b9350613003818560208601612e5e565b61300c81612bee565b840191505092915050565b600060208201905081810360008301526130318184612fde565b905092915050565b600080604083850312156130505761304f6128b4565b5b600061305e858286016128d5565b925050602083013567ffffffffffffffff81111561307f5761307e6128b9565b5b61308b85828601612cfc565b9150509250929050565b7f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e00600082015250565b60006130cb601f83612fcd565b91506130d682613095565b602082019050919050565b600060208201905081810360008301526130fa816130be565b9050919050565b7f43616e206f6e6c79206772616e7420746f206e6f6e20686f6c64657273000000600082015250565b6000613137601d83612fcd565b915061314282613101565b602082019050919050565b600060208201905081810360008301526131668161312a565b9050919050565b7f43616e206f6e6c792072656e6f756e636520666f722073656c66000000000000600082015250565b60006131a3601a83612fcd565b91506131ae8261316d565b602082019050919050565b600060208201905081810360008301526131d281613196565b9050919050565b7f4163636f756e74466163746f72793a206163636f756e7420616c72656164792060008201527f7265676973746572656400000000000000000000000000000000000000000000602082015250565b6000613235602a83612fcd565b9150613240826131d9565b604082019050919050565b6000602082019050818103600083015261326481613228565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006132a582612a4e565b91506132b083612a4e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156132e5576132e461326b565b5b828201905092915050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000613326600e83612fcd565b9150613331826132f0565b602082019050919050565b6000602082019050818103600083015261335581613319565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126133b7576133b661338b565b5b80840192508235915067ffffffffffffffff8211156133d9576133d8613390565b5b6020830192506001820236038313156133f5576133f4613395565b5b509250929050565b600061340882612a4e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561343b5761343a61326b565b5b600182019050919050565b7f426173654163636f756e74466163746f72793a20696e76616c696420696e646960008201527f6365730000000000000000000000000000000000000000000000000000000000602082015250565b60006134a2602383612fcd565b91506134ad82613446565b604082019050919050565b600060208201905081810360008301526134d181613495565b9050919050565b60006134e382612a4e565b91506134ee83612a4e565b9250828210156135015761350061326b565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061355357607f821691505b602082108114156135675761356661350c565b5b50919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006135c9602e83612fcd565b91506135d48261356d565b604082019050919050565b600060208201905081810360008301526135f8816135bc565b9050919050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b600061363b613636613631846135ff565b613616565b613609565b9050919050565b61364b81613620565b82525050565b60006020820190506136666000830184613642565b92915050565b600081905092915050565b7f5065726d697373696f6e733a206163636f756e74200000000000000000000000600082015250565b60006136ad60158361366c565b91506136b882613677565b601582019050919050565b60006136ce82612fc2565b6136d8818561366c565b93506136e8818560208601612e5e565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b600061372a60118361366c565b9150613735826136f4565b601182019050919050565b600061374b826136a0565b915061375782856136c3565b91506137628261371d565b915061376e82846136c3565b91508190509392505050565b600082825260208201905092915050565b600061379682612e42565b6137a0818561377a565b93506137b0818560208601612e5e565b6137b981612bee565b840191505092915050565b60006040820190506137d9600083018561298d565b81810360208301526137eb818461378b565b90509392505050565b6000604082019050818103600083015261380e8185612fde565b905081810360208301526138228184612fde565b90509392505050565b7f455243313136373a2063726561746532206661696c6564000000000000000000600082015250565b6000613861601783612fcd565b915061386c8261382b565b602082019050919050565b6000602082019050818103600083015261389081613854565b9050919050565b60006138a3838561377a565b93506138b0838584612cab565b6138b983612bee565b840190509392505050565b60006060820190506138d9600083018761298d565b6138e6602083018661298d565b81810360408301526138f9818486613897565b905095945050505050565b600061390f82612a4e565b915061391a83612a4e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139535761395261326b565b5b828202905092915050565b600061396982612a4e565b9150600082141561397d5761397c61326b565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006139be602083612fcd565b91506139c982613988565b602082019050919050565b600060208201905081810360008301526139ed816139b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b6000613a7f602683612fcd565b9150613a8a82613a23565b604082019050919050565b60006020820190508181036000830152613aae81613a72565b9050919050565b600081905092915050565b6000613acb82612e42565b613ad58185613ab5565b9350613ae5818560208601612e5e565b80840191505092915050565b6000613afd8284613ac0565b91508190509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c0ef9945b017bc21a75c7486c027607288c2e1f8c96abf80075e371b5012e59164736f6c634300080c0033"; +bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"6080604052600436106101bb5760003560e01c8063a9082d84116100ec578063cf7a1d771161008a578063e8a3d48511610064578063e8a3d48514610667578063e9523c9714610692578063f15d424e146106bd578063f23a6e61146106fa576101c2565b8063cf7a1d77146105e8578063d087d28814610611578063d42f2f351461063c576101c2565b8063b61d27f6116100c6578063b61d27f61461052e578063b76464d514610557578063bc197c8114610580578063c45a0155146105bd576101c2565b8063a9082d8414610488578063ac9650d8146104c6578063b0d691fe14610503576101c2565b806347e1da2a116101595780635892e236116101335780635892e236146103ce5780637dff5a79146103f75780638b52d72314610434578063938e3d7b1461045f576101c2565b806347e1da2a146103725780634a58db191461039b5780634d44560d146103a5576101c2565b80631626ba7e116101955780631626ba7e1461027e5780631dd756c5146102bb57806324d7806c146102f85780633a871cdd14610335576101c2565b806301ffc9a7146101c75780630a1028c414610204578063150b7a0214610241576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e9919061415d565b610737565b6040516101fb91906141a5565b60405180910390f35b34801561021057600080fd5b5061022b60048036038101906102269190614306565b610819565b6040516102389190614368565b60405180910390f35b34801561024d57600080fd5b5061026860048036038101906102639190614417565b6108a6565b60405161027591906144a9565b60405180910390f35b34801561028a57600080fd5b506102a560048036038101906102a091906144f0565b6108ba565b6040516102b291906144a9565b60405180910390f35b3480156102c757600080fd5b506102e260048036038101906102dd9190614571565b610a42565b6040516102ef91906141a5565b60405180910390f35b34801561030457600080fd5b5061031f600480360381019061031a91906145cd565b610ec5565b60405161032c91906141a5565b60405180910390f35b34801561034157600080fd5b5061035c600480360381019061035791906145fa565b610f24565b6040516103699190614678565b60405180910390f35b34801561037e57600080fd5b506103996004803603810190610394919061479f565b610f57565b005b6103a361111a565b005b3480156103b157600080fd5b506103cc60048036038101906103c79190614891565b61118f565b005b3480156103da57600080fd5b506103f560048036038101906103f09190614947565b61120f565b005b34801561040357600080fd5b5061041e600480360381019061041991906145cd565b611763565b60405161042b91906141a5565b60405180910390f35b34801561044057600080fd5b506104496118f7565b6040516104569190614bf3565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190614cb6565b611c8b565b005b34801561049457600080fd5b506104af60048036038101906104aa9190614947565b611cde565b6040516104bd929190614d0e565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e89190614d37565b611d41565b6040516104fa9190614ece565b60405180910390f35b34801561050f57600080fd5b50610518611e4d565b6040516105259190614f4f565b60405180910390f35b34801561053a57600080fd5b5061055560048036038101906105509190614f6a565b611ee3565b005b34801561056357600080fd5b5061057e6004803603810190610579919061501c565b611fc6565b005b34801561058c57600080fd5b506105a760048036038101906105a2919061510c565b61201b565b6040516105b491906144a9565b60405180910390f35b3480156105c957600080fd5b506105d2612030565b6040516105df91906151db565b60405180910390f35b3480156105f457600080fd5b5061060f600480360381019061060a91906151f6565b612063565b005b34801561061d57600080fd5b50610626612280565b6040516106339190614678565b60405180910390f35b34801561064857600080fd5b5061065161230b565b60405161065e9190614bf3565b60405180910390f35b34801561067357600080fd5b5061067c612595565b60405161068991906152bf565b60405180910390f35b34801561069e57600080fd5b506106a7612630565b6040516106b49190615350565b60405180910390f35b3480156106c957600080fd5b506106e460048036038101906106df91906145cd565b61264a565b6040516106f191906153e8565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c919061540a565b61280b565b60405161072e91906144a9565b60405180910390f35b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080257507f150b7a02000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610812575061081182612850565b5b9050919050565b6000807f82cac545155fcbf147f2a9013809613677ac7d65498556e6d19ce43bcbf6c28483805190602001206040516020016108569291906154a1565b6040516020818303038152906040528051906020012090506108766128ca565b81604051602001610888929190615542565b60405160208183030381529060405280519060200120915050919050565b600063150b7a0260e01b9050949350505050565b6000806108e5846040516020016108d19190614368565b604051602081830303815290604052610819565b905060006108fc84836129e490919063ffffffff16565b905061090781610ec5565b1561091d57631626ba7e60e01b92505050610a3c565b6000339050600061092c612a0b565b60060160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506109818282612a1a90919063ffffffff16565b806109df5750600161099282612a4a565b1480156109de5750600073ffffffffffffffffffffffffffffffffffffffff166109c6600083612a5f90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16145b5b610a1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a15906155eb565b60405180910390fd5b610a2783611763565b15610a3757631626ba7e60e01b94505b505050505b92915050565b6000610a4c612a0b565b60040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610aa85760019050610ebf565b6000610ab2612a0b565b60050160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506000610ba7612a0b565b60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090504282602001516fffffffffffffffffffffffffffffffff161180610c23575081604001516fffffffffffffffffffffffffffffffff164210155b80610c3657506000610c3482612a4a565b145b15610c4657600092505050610ebf565b6000610c60858060600190610c5b919061561a565b612a79565b905060006001610c6f84612a4a565b148015610cbb5750600073ffffffffffffffffffffffffffffffffffffffff16610ca3600085612a5f90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16145b905063b61d27f660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610d7757600080610d25888060600190610d20919061561a565b612ae9565b9150915082610d5557610d418286612a1a90919063ffffffff16565b610d545760009650505050505050610ebf565b5b8086600001511015610d705760009650505050505050610ebf565b5050610eb6565b6347e1da2a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ea857600080610ddf888060600190610dda919061561a565b612b80565b509150915082610e4b5760005b8251811015610e4957610e22838281518110610e0b57610e0a61567d565b5b602002602001015187612a1a90919063ffffffff16565b610e36576000975050505050505050610ebf565b8080610e41906156db565b915050610dec565b505b60005b8251811015610ea057818181518110610e6a57610e6961567d565b5b602002602001015187600001511015610e8d576000975050505050505050610ebf565b8080610e98906156db565b915050610e4e565b505050610eb5565b6000945050505050610ebf565b5b60019450505050505b92915050565b6000610ecf612a0b565b60040160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610f2e612bff565b610f388484612c76565b9050610f478460200135612e66565b610f5082612e69565b9392505050565b610f5f611e4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f9d5750610f9c33610ec5565b5b610fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd390615796565b60405180910390fd5b610fe4612f05565b8181905086869050148015610ffe57508383905086869050145b61103d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103490615802565b60405180910390fd5b60005b86869050811015611111576110fd8787838181106110615761106061567d565b5b905060200201602081019061107691906145cd565b8686848181106110895761108861567d565b5b905060200201358585858181106110a3576110a261567d565b5b90506020028101906110b5919061561a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061302d565b508080611109906156db565b915050611040565b50505050505050565b611122611e4d565b73ffffffffffffffffffffffffffffffffffffffff1663b760faf934306040518363ffffffff1660e01b815260040161115b91906151db565b6000604051808303818588803b15801561117457600080fd5b505af1158015611188573d6000803e3d6000fd5b5050505050565b6111976130b7565b61119f611e4d565b73ffffffffffffffffffffffffffffffffffffffff1663205c287883836040518363ffffffff1660e01b81526004016111d9929190615831565b600060405180830381600087803b1580156111f357600080fd5b505af1158015611207573d6000803e3d6000fd5b505050505050565b600083600001602081019061122491906145cd565b9050428460c001602081019061123a9190615886565b6fffffffffffffffffffffffffffffffff161115801561127d57508360e00160208101906112689190615886565b6fffffffffffffffffffffffffffffffff1642105b6112bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b3906158ff565b60405180910390fd5b6000806112ca868686611cde565b915091508161130e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113059061596b565b60405180910390fd5b6001611318612a0b565b6007016000886101000135815260200190815260200160002060006101000a81548160ff021916908315150217905550600086602001602081019061135d91906159c4565b60ff161115611396576000600187602001602081019061137d91906159c4565b60ff1614905061138d8482613101565b5050505061175e565b61139f83610ec5565b156113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d690615a3d565b60405180910390fd5b6113fc836113eb612a0b565b60020161323990919063ffffffff16565b506040518060600160405280876060013581526020018760800160208101906114259190615886565b6fffffffffffffffffffffffffffffffff1681526020018760a001602081019061144f9190615886565b6fffffffffffffffffffffffffffffffff1681525061146c612a0b565b60050160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055509050506000611589611544612a0b565b60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613269565b905060008151905060005b81811015611625576116108382815181106115b2576115b161567d565b5b60200260200101516115c2612a0b565b60060160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061328a90919063ffffffff16565b5060018161161e9190615a5d565b9050611594565b508780604001906116369190615ab3565b9050905060005b818110156116e9576116d48980604001906116589190615ab3565b838181106116695761166861567d565b5b905060200201602081019061167e91906145cd565b611686612a0b565b60060160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061323990919063ffffffff16565b506001816116e29190615a5d565b905061163d565b506116f3886132ba565b8473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a6040516117509190615d9c565b60405180910390a350505050505b505050565b60008061176e612a0b565b60050160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090504281602001516fffffffffffffffffffffffffffffffff1611158015611894575080604001516fffffffffffffffffffffffffffffffff1642105b80156118ef575060006118ed6118a8612a0b565b60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612a4a565b115b915050919050565b6060600061190e611906612a0b565b600201613269565b90506000815190506000805b828110156119c1576119458482815181106119385761193761567d565b5b6020026020010151611763565b1561195d578180611955906156db565b9250506119ad565b60008482815181106119725761197161567d565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b6001816119ba9190615a5d565b905061191a565b508067ffffffffffffffff8111156119dc576119db6141db565b5b604051908082528060200260200182016040528015611a1557816020015b611a02613fe5565b8152602001906001900390816119fa5790505b5093506000805b83811015611c8357600073ffffffffffffffffffffffffffffffffffffffff16858281518110611a4f57611a4e61567d565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614611c6f576000858281518110611a8757611a8661567d565b5b602002602001015190506000611a9b612a0b565b60050160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060a001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001611bfd611bb8612a0b565b60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613269565b81526020018260000151815260200182602001516fffffffffffffffffffffffffffffffff16815260200182604001516fffffffffffffffffffffffffffffffff16815250888580611c4e906156db565b965081518110611c6157611c6061567d565b5b602002602001018190525050505b600181611c7c9190615a5d565b9050611a1c565b505050505090565b611c93613375565b611cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc990615e0a565b60405180910390fd5b611cdb816133bb565b50565b600080611cf4611ced866134b0565b85856135b6565b9050611cfe612a0b565b6007016000866101000135815260200190815260200160002060009054906101000a900460ff16158015611d375750611d3681610ec5565b5b9150935093915050565b60608282905067ffffffffffffffff811115611d6057611d5f6141db565b5b604051908082528060200260200182016040528015611d9357816020015b6060815260200190600190039081611d7e5790505b50905060005b83839050811015611e4657611e1530858584818110611dbb57611dba61567d565b5b9050602002810190611dcd919061561a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050613627565b828281518110611e2857611e2761567d565b5b60200260200101819052508080611e3e906156db565b915050611d99565b5092915050565b600080611e58613654565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ebb5780915050611ee0565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27899150505b90565b611eeb611e4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f295750611f2833610ec5565b5b611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90615796565b60405180910390fd5b611f70612f05565b611fbf848484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061302d565b5050505050565b611fce6130b7565b80611fd7613654565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600063bc197c8160e01b905095945050505050565b600061203a613654565b60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061206d613684565b60000160009054906101000a900460ff169050600061208a613684565b60000160019054906101000a900460ff1690506000811590508080156120b3575060018360ff16105b806120d357506120c230613693565b1580156120d2575060018360ff16145b5b612112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210990615e9c565b60405180910390fd5b600161211c613684565b60000160006101000a81548160ff021916908360ff1602179055508015612162576001612147613684565b60000160016101000a81548160ff0219169083151502179055505b6121b08786868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506136b6565b6121b8613654565b60020181905550856121c8613654565b60010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612214876001613101565b8015612277576000612224613684565b60000160016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498600160405161226e9190615ef7565b60405180910390a15b50505050505050565b600061228a611e4d565b73ffffffffffffffffffffffffffffffffffffffff166335567e1a3060006040518363ffffffff1660e01b81526004016122c5929190615f71565b602060405180830381865afa1580156122e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123069190615faf565b905090565b6060600061232261231a612a0b565b600201613269565b90506000815190508067ffffffffffffffff811115612344576123436141db565b5b60405190808252806020026020018201604052801561237d57816020015b61236a613fe5565b8152602001906001900390816123625790505b50925060005b8181101561258f5760008382815181106123a05761239f61567d565b5b6020026020010151905060006123b4612a0b565b60050160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060a001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020016125166124d1612a0b565b60060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613269565b81526020018260000151815260200182602001516fffffffffffffffffffffffffffffffff16815260200182604001516fffffffffffffffffffffffffffffffff1681525086848151811061256e5761256d61567d565b5b602002602001018190525050506001816125889190615a5d565b9050612383565b50505090565b606061259f6136e9565b60000180546125ad9061600b565b80601f01602080910402602001604051908101604052809291908181526020018280546125d99061600b565b80156126265780601f106125fb57610100808354040283529160200191612626565b820191906000526020600020905b81548152906001019060200180831161260957829003601f168201915b5050505050905090565b606061264561263d612a0b565b600001613269565b905090565b612652613fe5565b600061265c612a0b565b60050160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060a001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020016127be612779612a0b565b60060160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613269565b81526020018260000151815260200182602001516fffffffffffffffffffffffffffffffff16815260200182604001516fffffffffffffffffffffffffffffffff16815250915050919050565b600063f23a6e6160e01b905095945050505050565b6000807f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee030060001b90508091505090565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806128c357506128c2826136f8565b5b9050919050565b60007f000000000000000000000000ffd4505b3452dc22f8473616d50503ba9e1710ac73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561294657507f0000000000000000000000000000000000000000000000000000000000007a6946145b15612973577fbcdadf6444930a967ffda04923d78c49b3dd65df3ed39abb04a1e3eb1190553790506129e1565b6129de7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7ff0729608244859f656d32ae4cbc6b0367695d68d8e941a28f5e2d33c6d5182dd7fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6613762565b90505b90565b60008060006129f3858561379c565b91509150612a00816137ee565b819250505092915050565b6000612a1561395c565b905090565b6000612a42836000018373ffffffffffffffffffffffffffffffffffffffff1660001b61398c565b905092915050565b6000612a58826000016139af565b9050919050565b6000612a6e83600001836139c0565b60001c905092915050565b60006004838390501015612ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab990616089565b60405180910390fd5b8282600090600492612ad6939291906160b3565b90612ae19190616106565b905092915050565b6000806044848490501015612b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b2a90616089565b60405180910390fd5b8383600490602492612b47939291906160b3565b810190612b549190616165565b91508383602490604492612b6a939291906160b3565b810190612b779190616192565b90509250929050565b60608060606064858590501015612bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc390616089565b60405180910390fd5b84846004908092612bdf939291906160b3565b810190612bec9190616363565b8093508194508295505050509250925092565b612c07611e4d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6b90616456565b60405180910390fd5b565b600080612c82836139eb565b90506000612cec85806101400190612c9a919061561a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050836129e490919063ffffffff16565b9050612cf88186610a42565b612d0757600192505050612e60565b6000612d11612a0b565b60050160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016001820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050600081602001519050600082604001519050612e586040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020018465ffffffffffff1681526020018365ffffffffffff16815250613a21565b955050505050505b92915050565b50565b60008114612f025760003373ffffffffffffffffffffffffffffffffffffffff16827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90604051612eb9906164a7565b600060405180830381858888f193505050503d8060008114612ef7576040519150601f19603f3d011682016040523d82523d6000602084013e612efc565b606091505b50509050505b50565b6000612f0f613654565b60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663c3c5a547306040518263ffffffff1660e01b8152600401612f6e91906151db565b602060405180830381865afa158015612f8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612faf91906164e8565b61302a578073ffffffffffffffffffffffffffffffffffffffff166383a03f8c612fd7613654565b600201546040518263ffffffff1660e01b8152600401612ff79190614368565b600060405180830381600087803b15801561301157600080fd5b505af1158015613025573d6000803e3d6000fd5b505050505b50565b606060008473ffffffffffffffffffffffffffffffffffffffff1684846040516130579190616546565b60006040518083038185875af1925050503d8060008114613094576040519150601f19603f3d011682016040523d82523d6000602084013e613099565b606091505b508093508192505050806130af57815160208301fd5b509392505050565b6130c033610ec5565b6130ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f6906165a9565b60405180910390fd5b565b61310b8282613a69565b6000613115612030565b905060008173ffffffffffffffffffffffffffffffffffffffff163b11156132345781156131ba578073ffffffffffffffffffffffffffffffffffffffff16630b61e12b84613162613654565b600201546040518363ffffffff1660e01b81526004016131839291906165c9565b600060405180830381600087803b15801561319d57600080fd5b505af11580156131b1573d6000803e3d6000fd5b50505050613233565b8073ffffffffffffffffffffffffffffffffffffffff16639387a380846131df613654565b600201546040518363ffffffff1660e01b81526004016132009291906165c9565b600060405180830381600087803b15801561321a57600080fd5b505af115801561322e573d6000803e3d6000fd5b505050505b5b505050565b6000613261836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613b63565b905092915050565b6060600061327983600001613bd3565b905060608190508092505050919050565b60006132b2836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613c2f565b905092915050565b60006132c4612030565b905060008173ffffffffffffffffffffffffffffffffffffffff163b1115613371578073ffffffffffffffffffffffffffffffffffffffff16630b61e12b83600001602081019061331591906145cd565b61331d613654565b600201546040518363ffffffff1660e01b815260040161333e9291906165c9565b600060405180830381600087803b15801561335857600080fd5b505af115801561336c573d6000803e3d6000fd5b505050505b5050565b600061338033610ec5565b806133b657503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b905090565b60006133c56136e9565b60000180546133d39061600b565b80601f01602080910402602001604051908101604052809291908181526020018280546133ff9061600b565b801561344c5780601f106134215761010080835404028352916020019161344c565b820191906000526020600020905b81548152906001019060200180831161342f57829003601f168201915b505050505090508161345c6136e9565b600001908051906020019061347292919061404e565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a1681836040516134a49291906165f2565b60405180910390a15050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e98260000160208101906134e691906145cd565b8360200160208101906134f991906159c4565b8480604001906135099190615ab3565b60405160200161351a9291906166b8565b6040516020818303038152906040528051906020012085606001358660800160208101906135489190615886565b8760a001602081019061355b9190615886565b8860c001602081019061356e9190615886565b8960e00160208101906135819190615886565b8a61010001356040516020016135a09a999897969594939291906166ef565b6040516020818303038152906040529050919050565b600061361e83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506136108680519060200120613d43565b6129e490919063ffffffff16565b90509392505050565b606061364c8383604051806060016040528060278152602001616b2c60279139613d5d565b905092915050565b6000807f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830060001b90508091505090565b600061368e612820565b905090565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082826040516020016136cb9291906167d5565b60405160208183030381529060405280519060200120905092915050565b60006136f3613e2a565b905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000838383463060405160200161377d959493929190616805565b6040516020818303038152906040528051906020012090509392505050565b6000806041835114156137de5760008060006020860151925060408601519150606086015160001a90506137d287828585613e5a565b945094505050506137e7565b60006002915091505b9250929050565b6000600481111561380257613801616858565b5b81600481111561381557613814616858565b5b141561382057613959565b6001600481111561383457613833616858565b5b81600481111561384757613846616858565b5b1415613888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161387f906168d3565b60405180910390fd5b6002600481111561389c5761389b616858565b5b8160048111156138af576138ae616858565b5b14156138f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138e79061693f565b60405180910390fd5b6003600481111561390457613903616858565b5b81600481111561391757613916616858565b5b1415613958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161394f906169d1565b60405180910390fd5b5b50565b6000807f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0060001b90508091505090565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b60008260000182815481106139d8576139d761567d565b5b9060005260206000200154905092915050565b60007f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005281601c52603c6000209050919050565b600060d0826020015165ffffffffffff16901b60a0836040015165ffffffffffff16901b836000015173ffffffffffffffffffffffffffffffffffffffff1617179050919050565b80613a72612a0b565b60040160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015613af257613aec82613adb612a0b565b60000161323990919063ffffffff16565b50613b11565b613b0f82613afe612a0b565b60000161328a90919063ffffffff16565b505b8173ffffffffffffffffffffffffffffffffffffffff167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a1113382604051613b5791906141a5565b60405180910390a25050565b6000613b6f838361398c565b613bc8578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613bcd565b600090505b92915050565b606081600001805480602002602001604051908101604052809291908181526020018280548015613c2357602002820191906000526020600020905b815481526020019060010190808311613c0f575b50505050509050919050565b60008083600101600084815260200190815260200160002054905060008114613d37576000600182613c6191906169f1565b9050600060018660000180549050613c7991906169f1565b9050818114613ce8576000866000018281548110613c9a57613c9961567d565b5b9060005260206000200154905080876000018481548110613cbe57613cbd61567d565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613cfc57613cfb616a25565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050613d3d565b60009150505b92915050565b6000613d56613d506128ca565b83613f3d565b9050919050565b6060613d6884613693565b613da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d9e90616ac6565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1685604051613dcf9190616546565b600060405180830381855af49150503d8060008114613e0a576040519150601f19603f3d011682016040523d82523d6000602084013e613e0f565b606091505b5091509150613e1f828286613f7e565b925050509392505050565b6000807f4bc804ba64359c0e35e5ed5d90ee596ecaa49a3a930ddcb1470ea0dd625da90060001b90508091505090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613e95576000600391509150613f34565b600060018787878760405160008152602001604052604051613eba9493929190616ae6565b6020604051602081039080840390855afa158015613edc573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613f2b57600060019250925050613f34565b80600092509250505b94509492505050565b60006040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b60608315613f8e57829050613fde565b600083511115613fa15782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613fd591906152bf565b60405180910390fd5b9392505050565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001606081526020016000815260200160006fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff1681525090565b82805461405a9061600b565b90600052602060002090601f01602090048101928261407c57600085556140c3565b82601f1061409557805160ff19168380011785556140c3565b828001600101855582156140c3579182015b828111156140c25782518255916020019190600101906140a7565b5b5090506140d091906140d4565b5090565b5b808211156140ed5760008160009055506001016140d5565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61413a81614105565b811461414557600080fd5b50565b60008135905061415781614131565b92915050565b600060208284031215614173576141726140fb565b5b600061418184828501614148565b91505092915050565b60008115159050919050565b61419f8161418a565b82525050565b60006020820190506141ba6000830184614196565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614213826141ca565b810181811067ffffffffffffffff82111715614232576142316141db565b5b80604052505050565b60006142456140f1565b9050614251828261420a565b919050565b600067ffffffffffffffff821115614271576142706141db565b5b61427a826141ca565b9050602081019050919050565b82818337600083830152505050565b60006142a96142a484614256565b61423b565b9050828152602081018484840111156142c5576142c46141c5565b5b6142d0848285614287565b509392505050565b600082601f8301126142ed576142ec6141c0565b5b81356142fd848260208601614296565b91505092915050565b60006020828403121561431c5761431b6140fb565b5b600082013567ffffffffffffffff81111561433a57614339614100565b5b614346848285016142d8565b91505092915050565b6000819050919050565b6143628161434f565b82525050565b600060208201905061437d6000830184614359565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143ae82614383565b9050919050565b6143be816143a3565b81146143c957600080fd5b50565b6000813590506143db816143b5565b92915050565b6000819050919050565b6143f4816143e1565b81146143ff57600080fd5b50565b600081359050614411816143eb565b92915050565b60008060008060808587031215614431576144306140fb565b5b600061443f878288016143cc565b9450506020614450878288016143cc565b935050604061446187828801614402565b925050606085013567ffffffffffffffff81111561448257614481614100565b5b61448e878288016142d8565b91505092959194509250565b6144a381614105565b82525050565b60006020820190506144be600083018461449a565b92915050565b6144cd8161434f565b81146144d857600080fd5b50565b6000813590506144ea816144c4565b92915050565b60008060408385031215614507576145066140fb565b5b6000614515858286016144db565b925050602083013567ffffffffffffffff81111561453657614535614100565b5b614542858286016142d8565b9150509250929050565b600080fd5b600061016082840312156145685761456761454c565b5b81905092915050565b60008060408385031215614588576145876140fb565b5b6000614596858286016143cc565b925050602083013567ffffffffffffffff8111156145b7576145b6614100565b5b6145c385828601614551565b9150509250929050565b6000602082840312156145e3576145e26140fb565b5b60006145f1848285016143cc565b91505092915050565b600080600060608486031215614613576146126140fb565b5b600084013567ffffffffffffffff81111561463157614630614100565b5b61463d86828701614551565b935050602061464e868287016144db565b925050604061465f86828701614402565b9150509250925092565b614672816143e1565b82525050565b600060208201905061468d6000830184614669565b92915050565b600080fd5b600080fd5b60008083601f8401126146b3576146b26141c0565b5b8235905067ffffffffffffffff8111156146d0576146cf614693565b5b6020830191508360208202830111156146ec576146eb614698565b5b9250929050565b60008083601f840112614709576147086141c0565b5b8235905067ffffffffffffffff81111561472657614725614693565b5b60208301915083602082028301111561474257614741614698565b5b9250929050565b60008083601f84011261475f5761475e6141c0565b5b8235905067ffffffffffffffff81111561477c5761477b614693565b5b60208301915083602082028301111561479857614797614698565b5b9250929050565b600080600080600080606087890312156147bc576147bb6140fb565b5b600087013567ffffffffffffffff8111156147da576147d9614100565b5b6147e689828a0161469d565b9650965050602087013567ffffffffffffffff81111561480957614808614100565b5b61481589828a016146f3565b9450945050604087013567ffffffffffffffff81111561483857614837614100565b5b61484489828a01614749565b92509250509295509295509295565b600061485e82614383565b9050919050565b61486e81614853565b811461487957600080fd5b50565b60008135905061488b81614865565b92915050565b600080604083850312156148a8576148a76140fb565b5b60006148b68582860161487c565b92505060206148c785828601614402565b9150509250929050565b600061012082840312156148e8576148e761454c565b5b81905092915050565b60008083601f840112614907576149066141c0565b5b8235905067ffffffffffffffff81111561492457614923614693565b5b6020830191508360018202830111156149405761493f614698565b5b9250929050565b6000806000604084860312156149605761495f6140fb565b5b600084013567ffffffffffffffff81111561497e5761497d614100565b5b61498a868287016148d1565b935050602084013567ffffffffffffffff8111156149ab576149aa614100565b5b6149b7868287016148f1565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6149f8816143a3565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6000614a3683836149ef565b60208301905092915050565b6000602082019050919050565b6000614a5a826149fe565b614a648185614a09565b9350614a6f83614a1a565b8060005b83811015614aa0578151614a878882614a2a565b9750614a9283614a42565b925050600181019050614a73565b5085935050505092915050565b614ab6816143e1565b82525050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614ae181614abc565b82525050565b600060a083016000830151614aff60008601826149ef565b5060208301518482036020860152614b178282614a4f565b9150506040830151614b2c6040860182614aad565b506060830151614b3f6060860182614ad8565b506080830151614b526080860182614ad8565b508091505092915050565b6000614b698383614ae7565b905092915050565b6000602082019050919050565b6000614b89826149c3565b614b9381856149ce565b935083602082028501614ba5856149df565b8060005b85811015614be15784840389528151614bc28582614b5d565b9450614bcd83614b71565b925060208a01995050600181019050614ba9565b50829750879550505050505092915050565b60006020820190508181036000830152614c0d8184614b7e565b905092915050565b600067ffffffffffffffff821115614c3057614c2f6141db565b5b614c39826141ca565b9050602081019050919050565b6000614c59614c5484614c15565b61423b565b905082815260208101848484011115614c7557614c746141c5565b5b614c80848285614287565b509392505050565b600082601f830112614c9d57614c9c6141c0565b5b8135614cad848260208601614c46565b91505092915050565b600060208284031215614ccc57614ccb6140fb565b5b600082013567ffffffffffffffff811115614cea57614ce9614100565b5b614cf684828501614c88565b91505092915050565b614d08816143a3565b82525050565b6000604082019050614d236000830185614196565b614d306020830184614cff565b9392505050565b60008060208385031215614d4e57614d4d6140fb565b5b600083013567ffffffffffffffff811115614d6c57614d6b614100565b5b614d7885828601614749565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614dea578082015181840152602081019050614dcf565b83811115614df9576000848401525b50505050565b6000614e0a82614db0565b614e148185614dbb565b9350614e24818560208601614dcc565b614e2d816141ca565b840191505092915050565b6000614e448383614dff565b905092915050565b6000602082019050919050565b6000614e6482614d84565b614e6e8185614d8f565b935083602082028501614e8085614da0565b8060005b85811015614ebc5784840389528151614e9d8582614e38565b9450614ea883614e4c565b925060208a01995050600181019050614e84565b50829750879550505050505092915050565b60006020820190508181036000830152614ee88184614e59565b905092915050565b6000819050919050565b6000614f15614f10614f0b84614383565b614ef0565b614383565b9050919050565b6000614f2782614efa565b9050919050565b6000614f3982614f1c565b9050919050565b614f4981614f2e565b82525050565b6000602082019050614f646000830184614f40565b92915050565b60008060008060608587031215614f8457614f836140fb565b5b6000614f92878288016143cc565b9450506020614fa387828801614402565b935050604085013567ffffffffffffffff811115614fc457614fc3614100565b5b614fd0878288016148f1565b925092505092959194509250565b6000614fe9826143a3565b9050919050565b614ff981614fde565b811461500457600080fd5b50565b60008135905061501681614ff0565b92915050565b600060208284031215615032576150316140fb565b5b600061504084828501615007565b91505092915050565b600067ffffffffffffffff821115615064576150636141db565b5b602082029050602081019050919050565b600061508861508384615049565b61423b565b905080838252602082019050602084028301858111156150ab576150aa614698565b5b835b818110156150d457806150c08882614402565b8452602084019350506020810190506150ad565b5050509392505050565b600082601f8301126150f3576150f26141c0565b5b8135615103848260208601615075565b91505092915050565b600080600080600060a08688031215615128576151276140fb565b5b6000615136888289016143cc565b9550506020615147888289016143cc565b945050604086013567ffffffffffffffff81111561516857615167614100565b5b615174888289016150de565b935050606086013567ffffffffffffffff81111561519557615194614100565b5b6151a1888289016150de565b925050608086013567ffffffffffffffff8111156151c2576151c1614100565b5b6151ce888289016142d8565b9150509295509295909350565b60006020820190506151f06000830184614cff565b92915050565b600080600080606085870312156152105761520f6140fb565b5b600061521e878288016143cc565b945050602061522f878288016143cc565b935050604085013567ffffffffffffffff8111156152505761524f614100565b5b61525c878288016148f1565b925092505092959194509250565b600081519050919050565b600082825260208201905092915050565b60006152918261526a565b61529b8185615275565b93506152ab818560208601614dcc565b6152b4816141ca565b840191505092915050565b600060208201905081810360008301526152d98184615286565b905092915050565b600082825260208201905092915050565b60006152fd826149fe565b61530781856152e1565b935061531283614a1a565b8060005b8381101561534357815161532a8882614a2a565b975061533583614a42565b925050600181019050615316565b5085935050505092915050565b6000602082019050818103600083015261536a81846152f2565b905092915050565b600060a08301600083015161538a60008601826149ef565b50602083015184820360208601526153a28282614a4f565b91505060408301516153b76040860182614aad565b5060608301516153ca6060860182614ad8565b5060808301516153dd6080860182614ad8565b508091505092915050565b600060208201905081810360008301526154028184615372565b905092915050565b600080600080600060a08688031215615426576154256140fb565b5b6000615434888289016143cc565b9550506020615445888289016143cc565b945050604061545688828901614402565b935050606061546788828901614402565b925050608086013567ffffffffffffffff81111561548857615487614100565b5b615494888289016142d8565b9150509295509295909350565b60006040820190506154b66000830185614359565b6154c36020830184614359565b9392505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061550b6002836154ca565b9150615516826154d5565b600282019050919050565b6000819050919050565b61553c6155378261434f565b615521565b82525050565b600061554d826154fe565b9150615559828561552b565b602082019150615569828461552b565b6020820191508190509392505050565b7f4163636f756e743a2063616c6c6572206e6f7420617070726f7665642074617260008201527f6765742e00000000000000000000000000000000000000000000000000000000602082015250565b60006155d5602483615275565b91506155e082615579565b604082019050919050565b60006020820190508181036000830152615604816155c8565b9050919050565b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126156375761563661560b565b5b80840192508235915067ffffffffffffffff82111561565957615658615610565b5b60208301925060018202360383131561567557615674615615565b5b509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006156e6826143e1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615719576157186156ac565b5b600182019050919050565b7f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e7460008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b6000615780602183615275565b915061578b82615724565b604082019050919050565b600060208201905081810360008301526157af81615773565b9050919050565b7f4163636f756e743a2077726f6e67206172726179206c656e677468732e000000600082015250565b60006157ec601d83615275565b91506157f7826157b6565b602082019050919050565b6000602082019050818103600083015261581b816157df565b9050919050565b61582b81614853565b82525050565b60006040820190506158466000830185615822565b6158536020830184614669565b9392505050565b61586381614abc565b811461586e57600080fd5b50565b6000813590506158808161585a565b92915050565b60006020828403121561589c5761589b6140fb565b5b60006158aa84828501615871565b91505092915050565b7f21706572696f6400000000000000000000000000000000000000000000000000600082015250565b60006158e9600783615275565b91506158f4826158b3565b602082019050919050565b60006020820190508181036000830152615918816158dc565b9050919050565b7f2173696700000000000000000000000000000000000000000000000000000000600082015250565b6000615955600483615275565b91506159608261591f565b602082019050919050565b6000602082019050818103600083015261598481615948565b9050919050565b600060ff82169050919050565b6159a18161598b565b81146159ac57600080fd5b50565b6000813590506159be81615998565b92915050565b6000602082840312156159da576159d96140fb565b5b60006159e8848285016159af565b91505092915050565b7f61646d696e000000000000000000000000000000000000000000000000000000600082015250565b6000615a27600583615275565b9150615a32826159f1565b602082019050919050565b60006020820190508181036000830152615a5681615a1a565b9050919050565b6000615a68826143e1565b9150615a73836143e1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615aa857615aa76156ac565b5b828201905092915050565b60008083356001602003843603038112615ad057615acf61560b565b5b80840192508235915067ffffffffffffffff821115615af257615af1615610565b5b602083019250602082023603831315615b0e57615b0d615615565b5b509250929050565b6000615b2560208401846143cc565b905092915050565b6000615b3c60208401846159af565b905092915050565b615b4d8161598b565b82525050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112615b7f57615b7e615b5d565b5b83810192508235915060208301925067ffffffffffffffff821115615ba757615ba6615b53565b5b602082023603841315615bbd57615bbc615b58565b5b509250929050565b6000819050919050565b6000602082019050919050565b6000615be88385614a09565b9350615bf382615bc5565b8060005b85811015615c2c57615c098284615b16565b615c138882614a2a565b9750615c1e83615bcf565b925050600181019050615bf7565b5085925050509392505050565b6000615c486020840184614402565b905092915050565b6000615c5f6020840184615871565b905092915050565b6000615c7660208401846144db565b905092915050565b615c878161434f565b82525050565b60006101208301615ca16000840184615b16565b615cae60008601826149ef565b50615cbc6020840184615b2d565b615cc96020860182615b44565b50615cd76040840184615b62565b8583036040870152615cea838284615bdc565b92505050615cfb6060840184615c39565b615d086060860182614aad565b50615d166080840184615c50565b615d236080860182614ad8565b50615d3160a0840184615c50565b615d3e60a0860182614ad8565b50615d4c60c0840184615c50565b615d5960c0860182614ad8565b50615d6760e0840184615c50565b615d7460e0860182614ad8565b50615d83610100840184615c67565b615d91610100860182615c7e565b508091505092915050565b60006020820190508181036000830152615db68184615c8d565b905092915050565b7f4e6f7420617574686f72697a6564000000000000000000000000000000000000600082015250565b6000615df4600e83615275565b9150615dff82615dbe565b602082019050919050565b60006020820190508181036000830152615e2381615de7565b9050919050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000615e86602e83615275565b9150615e9182615e2a565b604082019050919050565b60006020820190508181036000830152615eb581615e79565b9050919050565b6000819050919050565b6000615ee1615edc615ed784615ebc565b614ef0565b61598b565b9050919050565b615ef181615ec6565b82525050565b6000602082019050615f0c6000830184615ee8565b92915050565b6000819050919050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6000615f5b615f56615f5184615f12565b614ef0565b615f1c565b9050919050565b615f6b81615f40565b82525050565b6000604082019050615f866000830185614cff565b615f936020830184615f62565b9392505050565b600081519050615fa9816143eb565b92915050565b600060208284031215615fc557615fc46140fb565b5b6000615fd384828501615f9a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061602357607f821691505b6020821081141561603757616036615fdc565b5b50919050565b7f2144617461000000000000000000000000000000000000000000000000000000600082015250565b6000616073600583615275565b915061607e8261603d565b602082019050919050565b600060208201905081810360008301526160a281616066565b9050919050565b600080fd5b600080fd5b600080858511156160c7576160c66160a9565b5b838611156160d8576160d76160ae565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b600061611283836160ee565b8261611d8135614105565b9250600482101561615d576161587fffffffff00000000000000000000000000000000000000000000000000000000836004036008026160f9565b831692505b505092915050565b60006020828403121561617b5761617a6140fb565b5b60006161898482850161487c565b91505092915050565b6000602082840312156161a8576161a76140fb565b5b60006161b684828501614402565b91505092915050565b600067ffffffffffffffff8211156161da576161d96141db565b5b602082029050602081019050919050565b60006161fe6161f9846161bf565b61423b565b9050808382526020820190506020840283018581111561622157616220614698565b5b835b8181101561624a578061623688826143cc565b845260208401935050602081019050616223565b5050509392505050565b600082601f830112616269576162686141c0565b5b81356162798482602086016161eb565b91505092915050565b600067ffffffffffffffff82111561629d5761629c6141db565b5b602082029050602081019050919050565b60006162c16162bc84616282565b61423b565b905080838252602082019050602084028301858111156162e4576162e3614698565b5b835b8181101561632b57803567ffffffffffffffff811115616309576163086141c0565b5b80860161631689826142d8565b855260208501945050506020810190506162e6565b5050509392505050565b600082601f83011261634a576163496141c0565b5b813561635a8482602086016162ae565b91505092915050565b60008060006060848603121561637c5761637b6140fb565b5b600084013567ffffffffffffffff81111561639a57616399614100565b5b6163a686828701616254565b935050602084013567ffffffffffffffff8111156163c7576163c6614100565b5b6163d3868287016150de565b925050604084013567ffffffffffffffff8111156163f4576163f3614100565b5b61640086828701616335565b9150509250925092565b7f6163636f756e743a206e6f742066726f6d20456e747279506f696e7400000000600082015250565b6000616440601c83615275565b915061644b8261640a565b602082019050919050565b6000602082019050818103600083015261646f81616433565b9050919050565b600081905092915050565b50565b6000616491600083616476565b915061649c82616481565b600082019050919050565b60006164b282616484565b9150819050919050565b6164c58161418a565b81146164d057600080fd5b50565b6000815190506164e2816164bc565b92915050565b6000602082840312156164fe576164fd6140fb565b5b600061650c848285016164d3565b91505092915050565b600061652082614db0565b61652a8185616476565b935061653a818560208601614dcc565b80840191505092915050565b60006165528284616515565b915081905092915050565b7f2161646d696e0000000000000000000000000000000000000000000000000000600082015250565b6000616593600683615275565b915061659e8261655d565b602082019050919050565b600060208201905081810360008301526165c281616586565b9050919050565b60006040820190506165de6000830185614cff565b6165eb6020830184614359565b9392505050565b6000604082019050818103600083015261660c8185615286565b905081810360208301526166208184615286565b90509392505050565b600081905092915050565b61663d816143a3565b82525050565b600061664f8383616634565b60208301905092915050565b60006166678385616629565b935061667282615bc5565b8060005b858110156166ab576166888284615b16565b6166928882616643565b975061669d83615bcf565b925050600181019050616676565b5085925050509392505050565b60006166c582848661665b565b91508190509392505050565b6166da8161598b565b82525050565b6166e981614abc565b82525050565b600061014082019050616705600083018d614359565b616712602083018c614cff565b61671f604083018b6166d1565b61672c606083018a614359565b6167396080830189614669565b61674660a08301886166e0565b61675360c08301876166e0565b61676060e08301866166e0565b61676e6101008301856166e0565b61677c610120830184614359565b9b9a5050505050505050505050565b600082825260208201905092915050565b60006167a782614db0565b6167b1818561678b565b93506167c1818560208601614dcc565b6167ca816141ca565b840191505092915050565b60006040820190506167ea6000830185614cff565b81810360208301526167fc818461679c565b90509392505050565b600060a08201905061681a6000830188614359565b6168276020830187614359565b6168346040830186614359565b6168416060830185614669565b61684e6080830184614cff565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006168bd601883615275565b91506168c882616887565b602082019050919050565b600060208201905081810360008301526168ec816168b0565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000616929601f83615275565b9150616934826168f3565b602082019050919050565b600060208201905081810360008301526169588161691c565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006169bb602283615275565b91506169c68261695f565b604082019050919050565b600060208201905081810360008301526169ea816169ae565b9050919050565b60006169fc826143e1565b9150616a07836143e1565b925082821015616a1a57616a196156ac565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b6000616ab0602683615275565b9150616abb82616a54565b604082019050919050565b60006020820190508181036000830152616adf81616aa3565b9050919050565b6000608082019050616afb6000830187614359565b616b0860208301866166d1565b616b156040830185614359565b616b226060830184614359565b9594505050505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220c01f45986875a650052d69ddb710a441ce161ad5c7fe9d20f876664fcbe181a564736f6c634300080c0033"; + diff --git a/src/test/smart-wallet/utils/AABenchmarkPrepare.sol b/src/test/smart-wallet/utils/AABenchmarkPrepare.sol index 8a8e709d6..554f3b4fa 100644 --- a/src/test/smart-wallet/utils/AABenchmarkPrepare.sol +++ b/src/test/smart-wallet/utils/AABenchmarkPrepare.sol @@ -8,8 +8,7 @@ import "../../utils/BaseTest.sol"; import { IEntryPoint } from "contracts/prebuilts/account/utils/Entrypoint.sol"; import { AccountFactory } from "contracts/prebuilts/account/non-upgradeable/AccountFactory.sol"; - -import "solady/utils/LibString.sol"; +import "contracts/lib/TWStrings.sol"; import "forge-std/Test.sol"; @@ -30,24 +29,24 @@ contract AABenchmarkPrepare is BaseTest { string memory accountFactoryAddressString = string.concat( "address constant THIRDWEB_ACCOUNT_FACTORY_ADDRESS = ", - LibString.toHexStringChecksummed(accountFactoryAddress), + TWStrings.toHexStringChecksummed(accountFactoryAddress), ";" ); string memory accountFactoryBytecodeString = string.concat( 'bytes constant THIRDWEB_ACCOUNT_FACTORY_BYTECODE = hex"', - LibString.toHexStringNoPrefix(accountFactoryBytecode), + TWStrings.toHexStringNoPrefix(accountFactoryBytecode), '"', ";" ); string memory accountImplAddressString = string.concat( "address constant THIRDWEB_ACCOUNT_IMPL_ADDRESS = ", - LibString.toHexStringChecksummed(accountImplAddress), + TWStrings.toHexStringChecksummed(accountImplAddress), ";" ); string memory accountImplBytecodeString = string.concat( 'bytes constant THIRDWEB_ACCOUNT_IMPL_BYTECODE = hex"', - LibString.toHexStringNoPrefix(accountImplBytecode), + TWStrings.toHexStringNoPrefix(accountImplBytecode), '"', ";" ); diff --git a/src/test/smart-wallet/utils/AABenchmarkTest.t.sol b/src/test/smart-wallet/utils/AABenchmarkTest.t.sol index 36dd5cc0c..03f7fa9ed 100644 --- a/src/test/smart-wallet/utils/AABenchmarkTest.t.sol +++ b/src/test/smart-wallet/utils/AABenchmarkTest.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; -import "aa-benchmark/src/TestBase.sol"; +import "./AATestBase.sol"; import { ThirdwebAccountFactory, ThirdwebAccount, THIRDWEB_ACCOUNT_FACTORY_ADDRESS, THIRDWEB_ACCOUNT_IMPL_ADDRESS, THIRDWEB_ACCOUNT_FACTORY_BYTECODE, THIRDWEB_ACCOUNT_IMPL_BYTECODE } from "./AABenchmarkArtifacts.sol"; contract ProfileThirdwebAccount is AAGasProfileBase { diff --git a/src/test/smart-wallet/utils/AATestArtifacts.sol b/src/test/smart-wallet/utils/AATestArtifacts.sol new file mode 100644 index 000000000..66ecea693 --- /dev/null +++ b/src/test/smart-wallet/utils/AATestArtifacts.sol @@ -0,0 +1,9 @@ +pragma solidity ^0.8.0; + +bytes constant ENTRYPOINT_0_6_BYTECODE = hex"60806040526004361015610023575b361561001957600080fd5b610021615531565b005b60003560e01c80630396cb60146101b35780630bd28e3b146101aa5780631b2e01b8146101a15780631d732756146101985780631fad948c1461018f578063205c28781461018657806335567e1a1461017d5780634b1d7cf5146101745780635287ce121461016b57806370a08231146101625780638f41ec5a14610159578063957122ab146101505780639b249f6914610147578063a61935311461013e578063b760faf914610135578063bb9fe6bf1461012c578063c23a5cea14610123578063d6383f941461011a578063ee219423146101115763fc7e286d0361000e5761010c611bcd565b61000e565b5061010c6119b5565b5061010c61184d565b5061010c6116b4565b5061010c611536565b5061010c6114f7565b5061010c6114d6565b5061010c611337565b5061010c611164565b5061010c611129565b5061010c6110a4565b5061010c610f54565b5061010c610bf8565b5061010c610b33565b5061010c610994565b5061010c6108ba565b5061010c6106e7565b5061010c610467565b5061010c610385565b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043563ffffffff8116808203610359576103547fa5ae833d0bb1dcd632d98a8b70973e8516812898e19bf27b70071ebc8dc52c01916102716102413373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b9161024d811515615697565b61026a610261600185015463ffffffff1690565b63ffffffff1690565b11156156fc565b54926103366dffffffffffffffffffffffffffff946102f461029834888460781c166121d5565b966102a4881515615761565b6102b0818911156157c6565b6102d4816102bc6105ec565b941684906dffffffffffffffffffffffffffff169052565b6001602084015287166dffffffffffffffffffffffffffff166040830152565b63ffffffff83166060820152600060808201526103313373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61582b565b6040805194855263ffffffff90911660208501523393918291820190565b0390a2005b600080fd5b6024359077ffffffffffffffffffffffffffffffffffffffffffffffff8216820361035957565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043577ffffffffffffffffffffffffffffffffffffffffffffffff81168103610359576104149033600052600160205260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b61041e8154612491565b9055005b73ffffffffffffffffffffffffffffffffffffffff81160361035957565b6024359061044d82610422565b565b60c4359061044d82610422565b359061044d82610422565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760206104fc6004356104a881610422565b73ffffffffffffffffffffffffffffffffffffffff6104c561035e565b91166000526001835260406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b54604051908152f35b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761055157604052565b610559610505565b604052565b610100810190811067ffffffffffffffff82111761055157604052565b67ffffffffffffffff811161055157604052565b6060810190811067ffffffffffffffff82111761055157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761055157604052565b6040519061044d82610535565b6040519060c0820182811067ffffffffffffffff82111761055157604052565b604051906040820182811067ffffffffffffffff82111761055157604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209267ffffffffffffffff8111610675575b01160190565b61067d610505565b61066f565b92919261068e82610639565b9161069c60405193846105ab565b829481845281830111610359578281602093846000960137010152565b9181601f840112156103595782359167ffffffffffffffff8311610359576020838186019501011161035957565b5034610359576101c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff60043581811161035957366023820112156103595761074a903690602481600401359101610682565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36016101808112610359576101006040519161078783610535565b12610359576040516107988161055e565b6107a0610440565b815260443560208201526064356040820152608435606082015260a43560808201526107ca61044f565b60a082015260e43560c08201526101043560e082015281526101243560208201526101443560408201526101643560608201526101843560808201526101a4359182116103595761083e9261082661082e9336906004016106b9565b9290916128b1565b6040519081529081906020820190565b0390f35b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8301126103595760043567ffffffffffffffff9283821161035957806023830112156103595781600401359384116103595760248460051b830101116103595760240191906024356108b781610422565b90565b5034610359576108c936610842565b6108d4929192611e3a565b6108dd83611d2d565b60005b84811061095d57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f9728480a183915b85831061092d576109238585611ed7565b6100216001600255565b909193600190610953610941878987611dec565b61094b8886611dca565b51908861233f565b0194019190610912565b8061098b610984610972600194869896611dca565b5161097e848a88611dec565b84613448565b9083612f30565b019290926108e0565b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356109d081610422565b6024359060009133835282602052604083206dffffffffffffffffffffffffffff81541692838311610ad557848373ffffffffffffffffffffffffffffffffffffffff829593610a788496610a3f610a2c8798610ad29c6121c0565b6dffffffffffffffffffffffffffff1690565b6dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810185905233917fd1c19fbcd4551a5edfb66d43d2e337c04837afda3482b42bdf569a8fccdae5fb91a2165af1610acc611ea7565b50615ba2565b80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f576974686472617720616d6f756e7420746f6f206c61726765000000000000006044820152fd5b50346103595760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576020600435610b7181610422565b73ffffffffffffffffffffffffffffffffffffffff610b8e61035e565b911660005260018252610bc98160406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006040519260401b16178152f35b503461035957610c0736610842565b610c0f611e3a565b6000805b838210610df657610c249150611d2d565b7fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000805b848110610d5c57505060008093815b818110610c9357610923868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2611ed7565b610cf7610ca182848a6124cb565b610ccc610cb3610cb36020840161256d565b73ffffffffffffffffffffffffffffffffffffffff1690565b7f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a280612519565b906000915b808310610d1457505050610d0f90612491565b610c5c565b90919497610d4f610d49610d5592610d438c8b610d3c82610d368e8b8d611dec565b92611dca565b519161233f565b906121d5565b99612491565b95612491565b9190610cfc565b610d678186886124cb565b6020610d7f610d768380612519565b9290930161256d565b9173ffffffffffffffffffffffffffffffffffffffff60009316905b828410610db45750505050610daf90612491565b610c4d565b90919294610d4f81610de985610de2610dd0610dee968d611dca565b51610ddc8c8b8a611dec565b85613448565b908b613148565b612491565b929190610d9b565b610e018285876124cb565b90610e0c8280612519565b92610e1c610cb36020830161256d565b9173ffffffffffffffffffffffffffffffffffffffff8316610e416001821415612577565b610e62575b505050610e5c91610e56916121d5565b91612491565b90610c13565b909592610e7b6040999693999895989788810190611fc8565b92908a3b156103595789938b918a5193849283927fe3563a4f00000000000000000000000000000000000000000000000000000000845260049e8f850193610ec294612711565b03815a93600094fa9081610f3b575b50610f255786517f86a9f75000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16818a0190815281906020010390fd5b0390fd5b9497509295509093509181610e56610e5c610e46565b80610f48610f4e9261057b565b8061111e565b38610ed1565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761083e73ffffffffffffffffffffffffffffffffffffffff600435610fa881610422565b608060409283928351610fba81610535565b60009381858093528260208201528287820152826060820152015216815280602052209061104965ffffffffffff6001835194610ff686610535565b80546dffffffffffffffffffffffffffff8082168852607082901c60ff161515602089015260789190911c1685870152015463ffffffff8116606086015260201c16608084019065ffffffffffff169052565b5191829182919091608065ffffffffffff8160a08401956dffffffffffffffffffffffffffff808251168652602082015115156020870152604082015116604086015263ffffffff6060820151166060860152015116910152565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff6004356110f581610422565b16600052600060205260206dffffffffffffffffffffffffffff60406000205416604051908152f35b600091031261035957565b50346103595760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957602060405160018152f35b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035957600467ffffffffffffffff8135818111610359576111b590369084016106b9565b9050602435916111c483610422565b604435908111610359576111db90369085016106b9565b92909115908161132d575b506112c6576014821015611236575b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160409060208152600060208201520190565b6112466112529261124c92612b88565b90612b96565b60601c90565b3b1561125f5738806111f5565b610f21906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601b60208201527f41413330207061796d6173746572206e6f74206465706c6f796564000000000060408201520190565b610f21836040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352820160609060208152601960208201527f41413230206163636f756e74206e6f74206465706c6f7965640000000000000060408201520190565b90503b15386111e6565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595760043567ffffffffffffffff81116103595761138960249136906004016106b9565b906113bf6040519283927f570e1a3600000000000000000000000000000000000000000000000000000000845260048401612d2c565b0360208273ffffffffffffffffffffffffffffffffffffffff92816000857f0000000000000000000000007fc98430eaedbb6070b35b39d798725049088348165af1918215611471575b600092611441575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61146391925060203d811161146a575b61145b81836105ab565b810190612d17565b9038611411565b503d611451565b611479612183565b611409565b90816101609103126103595790565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610359576004359067ffffffffffffffff8211610359576108b79160040161147e565b50346103595760206114ef6114ea3661148d565b612a0c565b604051908152f35b5060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595761002160043561153181610422565b61562b565b5034610359576000807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126116b1573381528060205260408120600181019063ffffffff825416908115611653576115f06115b5611618936115a76115a2855460ff9060701c1690565b61598f565b65ffffffffffff42166159f4565b84547fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff16602082901b69ffffffffffff000000001617909455565b7fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff8154169055565b60405165ffffffffffff91909116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a280f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b80fd5b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610359576004356116f081610422565b610ad273ffffffffffffffffffffffffffffffffffffffff6117323373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b926117ea611755610a2c86546dffffffffffffffffffffffffffff9060781c1690565b94611761861515615a0e565b6117c26001820161179a65ffffffffffff611786835465ffffffffffff9060201c1690565b16611792811515615a73565b421015615ad8565b80547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055565b7fffffff0000000000000000000000000000ffffffffffffffffffffffffffffff8154169055565b6040805173ffffffffffffffffffffffffffffffffffffffff831681526020810186905233917fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda391a2600080809581948294165af1611847611ea7565b50615b3d565b50346103595760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595767ffffffffffffffff6004358181116103595761189e90369060040161147e565b602435916118ab83610422565b604435908111610359576118c6610f219136906004016106b9565b6118ce611caa565b6118d785612e2b565b6118ea6118e48287613240565b906153ba565b946118fa826000924384526121e2565b96438252819360609573ffffffffffffffffffffffffffffffffffffffff8316611981575b50505050608001519361194e6040611940602084015165ffffffffffff1690565b92015165ffffffffffff1690565b906040519687967f8b7ac980000000000000000000000000000000000000000000000000000000008852600488016127e1565b8395508394965061199b60409492939451809481936127d3565b03925af19060806119aa611ea7565b92919038808061191f565b5034610359576119c43661148d565b6119cc611caa565b6119d582612e2b565b6119df8183613240565b825160a00151919391611a0c9073ffffffffffffffffffffffffffffffffffffffff166154dc565b6154dc565b90611a30611a07855173ffffffffffffffffffffffffffffffffffffffff90511690565b94611a39612b50565b50611a68611a4c60409586810190611fc8565b90600060148310611bc55750611246611a079261124c92612b88565b91611a72916153ba565b805173ffffffffffffffffffffffffffffffffffffffff169073ffffffffffffffffffffffffffffffffffffffff821660018114916080880151978781015191886020820151611ac79065ffffffffffff1690565b91015165ffffffffffff16916060015192611ae06105f9565b9a8b5260208b0152841515898b015265ffffffffffff1660608a015265ffffffffffff16608089015260a088015215159081611bbc575b50611b515750610f2192519485947fe0cff05f00000000000000000000000000000000000000000000000000000000865260048601612cbd565b9190610f2193611b60846154dc565b611b87611b6b610619565b73ffffffffffffffffffffffffffffffffffffffff9096168652565b6020850152519586957ffaecb4e400000000000000000000000000000000000000000000000000000000875260048701612c2b565b90501538611b17565b9150506154dc565b50346103595760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103595773ffffffffffffffffffffffffffffffffffffffff600435611c1e81610422565b16600052600060205260a0604060002065ffffffffffff60018254920154604051926dffffffffffffffffffffffffffff90818116855260ff8160701c161515602086015260781c16604084015263ffffffff8116606084015260201c166080820152f35b60209067ffffffffffffffff8111611c9d575b60051b0190565b611ca5610505565b611c96565b60405190611cb782610535565b604051608083610100830167ffffffffffffffff811184821017611d20575b60405260009283815283602082015283604082015283606082015283838201528360a08201528360c08201528360e082015281528260208201528260408201528260608201520152565b611d28610505565b611cd6565b90611d3782611c83565b611d4460405191826105ab565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d728294611c83565b019060005b828110611d8357505050565b602090611d8e611caa565b82828501015201611d77565b507f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020918151811015611ddf575b60051b010190565b611de7611d9a565b611dd7565b9190811015611e2d575b60051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea181360301821215610359570190565b611e35611d9a565b611df6565b6002805414611e495760028055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b3d15611ed2573d90611eb882610639565b91611ec660405193846105ab565b82523d6000602084013e565b606090565b73ffffffffffffffffffffffffffffffffffffffff168015611f6a57600080809381935af1611f04611ea7565b5015611f0c57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f41413931206661696c65642073656e6420746f2062656e6566696369617279006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4141393020696e76616c69642062656e656669636961727900000000000000006044820152fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff82116103595760200191813603831361035957565b90816020910312610359575190565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60005b83811061207a5750506000910152565b818101518382015260200161206a565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936120c681518092818752878088019101612067565b0116010190565b906120e76080916108b796946101c0808652850191612028565b9360e0815173ffffffffffffffffffffffffffffffffffffffff80825116602087015260208201516040870152604082015160608701526060820151858701528482015160a087015260a08201511660c086015260c081015182860152015161010084015260208101516101208401526040810151610140840152606081015161016084015201516101808201526101a081840391015261208a565b506040513d6000823e3d90fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b919082039182116121cd57565b61044d612190565b919082018092116121cd57565b905a918160206121fb6060830151936060810190611fc8565b906122348560405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af16000918161230f575b50612308575060206000803e7fdeaddead000000000000000000000000000000000000000000000000000000006000511461229b5761229561228a6108b7945a906121c0565b6080840151906121d5565b91614afc565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9250505090565b61233191925060203d8111612338575b61232981836105ab565b810190612019565b9038612244565b503d61231f565b909291925a9380602061235b6060830151946060810190611fc8565b906123948660405195869485947f1d732756000000000000000000000000000000000000000000000000000000008652600486016120cd565b03816000305af160009181612471575b5061246a575060206000803e7fdeaddead00000000000000000000000000000000000000000000000000000000600051146123fc576123f66123eb6108b795965a906121c0565b6080830151906121d5565b92614ddf565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152600f60408201527f41413935206f7574206f6620676173000000000000000000000000000000000060608201520190565b9450505050565b61248a91925060203d81116123385761232981836105ab565b90386123a4565b6001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146124bf570190565b6124c7612190565b0190565b919081101561250c575b60051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610359570190565b612514611d9a565b6124d5565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610359570180359067ffffffffffffffff821161035957602001918160051b3603831361035957565b356108b781610422565b1561257e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035957016020813591019167ffffffffffffffff821161035957813603831361035957565b6108b7916126578161263d8461045c565b73ffffffffffffffffffffffffffffffffffffffff169052565b602082013560208201526126f26126a361268861267760408601866125dc565b610160806040880152860191612028565b61269560608601866125dc565b908583036060870152612028565b6080840135608084015260a084013560a084015260c084013560c084015260e084013560e084015261010080850135908401526101206126e5818601866125dc565b9185840390860152612028565b9161270361014091828101906125dc565b929091818503910152612028565b949391929083604087016040885252606086019360608160051b8801019482600090815b848310612754575050505050508460206108b795968503910152612028565b9091929394977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08b820301855288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffea1843603018112156127cf57600191846127bd920161262c565b98602090810196950193019190612735565b8280fd5b908092918237016000815290565b9290936108b796959260c0958552602085015265ffffffffffff8092166040850152166060830152151560808201528160a0820152019061208a565b1561282457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4141393220696e7465726e616c2063616c6c206f6e6c790000000000000000006044820152fd5b9060406108b79260008152816020820152019061208a565b6040906108b793928152816020820152019061208a565b909291925a936128c230331461281d565b8151946040860151955a6113886060830151890101116129e2576108b7966000958051612909575b50505090612903915a9003608084015101943691610682565b91615047565b612938916129349161292f855173ffffffffffffffffffffffffffffffffffffffff1690565b615c12565b1590565b612944575b80806128ea565b61290392919450612953615c24565b908151612967575b5050600193909161293d565b7f1c4fada7374c0a9ee8841fc38afe82932dc0f8e69012e927f061a8bae611a20173ffffffffffffffffffffffffffffffffffffffff6020870151926129d860206129c6835173ffffffffffffffffffffffffffffffffffffffff1690565b9201519560405193849316968361289a565b0390a3388061295b565b7fdeaddead0000000000000000000000000000000000000000000000000000000060005260206000fd5b612a22612a1c6040830183611fc8565b90615c07565b90612a33612a1c6060830183611fc8565b90612ae9612a48612a1c610120840184611fc8565b60405194859360208501956101008201359260e08301359260c08101359260a08201359260808301359273ffffffffffffffffffffffffffffffffffffffff60208201359135168c9693909a9998959261012098959273ffffffffffffffffffffffffffffffffffffffff6101408a019d168952602089015260408801526060870152608086015260a085015260c084015260e08301526101008201520152565b0391612b1b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938481018352826105ab565b51902060408051602081019283523091810191909152466060820152608092830181529091612b4a90826105ab565b51902090565b604051906040820182811067ffffffffffffffff821117612b7b575b60405260006020838281520152565b612b83610505565b612b6c565b906014116103595790601490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009035818116939260148110612bcb57505050565b60140360031b82901b16169150565b9060c060a06108b793805184526020810151602085015260408101511515604085015265ffffffffffff80606083015116606086015260808201511660808501520151918160a0820152019061208a565b9294612c8c61044d95612c7a610100959998612c68612c54602097610140808c528b0190612bda565b9b878a019060208091805184520151910152565b80516060890152602001516080880152565b805160a08701526020015160c0860152565b73ffffffffffffffffffffffffffffffffffffffff81511660e0850152015191019060208091805184520151910152565b612d0661044d94612cf4612cdf60a0959998969960e0865260e0860190612bda565b98602085019060208091805184520151910152565b80516060840152602001516080830152565b019060208091805184520151910152565b9081602091031261035957516108b781610422565b9160206108b7938181520191612028565b90612d6c73ffffffffffffffffffffffffffffffffffffffff916108b797959694606085526060850191612028565b941660208201526040818503910152612028565b60009060033d11612d8d57565b905060046000803e60005160e01c90565b600060443d106108b7576040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc91823d016004833e815167ffffffffffffffff918282113d602484011117612e1a57818401948551938411612e22573d85010160208487010111612e1a57506108b7929101602001906105ab565b949350505050565b50949350505050565b612e386040820182611fc8565b612e50612e448461256d565b93610120810190611fc8565b9290303b1561035957600093612e949160405196879586957f957122ab00000000000000000000000000000000000000000000000000000000875260048701612d3d565b0381305afa9081612f1d575b5061044d576001612eaf612d80565b6308c379a014612ec8575b612ec057565b61044d612183565b612ed0612d9e565b80612edc575b50612eba565b80516000925015612ed657610f21906040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b80610f48612f2a9261057b565b38612ea0565b9190612f3b9061317f565b73ffffffffffffffffffffffffffffffffffffffff929183166130da5761306c57612f659061317f565b9116612ffe57612f725750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413334207369676e6174757265206572726f7200000000000000000000000060608201520190565b610f21836040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601760408201527f414132322065787069726564206f72206e6f742064756500000000000000000060608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601460408201527f41413234207369676e6174757265206572726f7200000000000000000000000060608201520190565b9291906131549061317f565b909273ffffffffffffffffffffffffffffffffffffffff808095169116036130da5761306c57612f65905b80156131d25761318e9061535f565b73ffffffffffffffffffffffffffffffffffffffff65ffffffffffff8060408401511642119081156131c2575b5091511691565b90506020830151164210386131bb565b50600090600090565b156131e257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b916000915a9381519061325382826136b3565b61325c81612a0c565b602084015261329a6effffffffffffffffffffffffffffff60808401516060850151176040850151176101008401359060e0850135171711156131db565b6132a382613775565b6132ae818584613836565b97906132df6129346132d4875173ffffffffffffffffffffffffffffffffffffffff1690565b60208801519061546c565b6133db576132ec43600052565b73ffffffffffffffffffffffffffffffffffffffff61332460a0606097015173ffffffffffffffffffffffffffffffffffffffff1690565b166133c1575b505a810360a0840135106133545760809360c092604087015260608601525a900391013501910152565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413430206f76657220766572696669636174696f6e4761734c696d6974000060608201520190565b909350816133d2929750858461455c565b9590923861332a565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b9290916000925a825161345b81846136b3565b61346483612a0c565b60208501526134a26effffffffffffffffffffffffffffff60808301516060840151176040840151176101008601359060e0870135171711156131db565b6134ab81613775565b6134b78186868b613ba2565b98906134e86129346134dd865173ffffffffffffffffffffffffffffffffffffffff1690565b60208701519061546c565b6135e0576134f543600052565b73ffffffffffffffffffffffffffffffffffffffff61352d60a0606096015173ffffffffffffffffffffffffffffffffffffffff1690565b166135c5575b505a840360a08601351061355f5750604085015260608401526080919060c0905a900391013501910152565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601e60448201527f41413430206f76657220766572696669636174696f6e4761734c696d697400006064820152608490fd5b909250816135d79298508686856147ef565b96909138613533565b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601a60408201527f4141323520696e76616c6964206163636f756e74206e6f6e636500000000000060608201520190565b1561365557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b613725906136dd6136c38261256d565b73ffffffffffffffffffffffffffffffffffffffff168452565b602081013560208401526080810135604084015260a0810135606084015260c0810135608084015260e081013560c084015261010081013560e0840152610120810190611fc8565b90811561376a5761374f61124c6112468460a09461374a601461044d9998101561364e565b612b88565b73ffffffffffffffffffffffffffffffffffffffff16910152565b505060a06000910152565b60a081015173ffffffffffffffffffffffffffffffffffffffff16156137b75760c060035b60ff60408401519116606084015102016080830151019101510290565b60c0600161379a565b6137d86040929594939560608352606083019061262c565b9460208201520152565b9061044d602f60405180947f414132332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b810103600f8101855201836105ab565b916000926000925a936139046020835193613865855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d6138766040830183611fc8565b9084613e0d565b60a086015173ffffffffffffffffffffffffffffffffffffffff16906138a243600052565b85809373ffffffffffffffffffffffffffffffffffffffff809416159889613b3a575b60600151908601516040517f3a871cdd0000000000000000000000000000000000000000000000000000000081529788968795869390600485016137c0565b03938a1690f1829181613b1a575b50613b115750600190613923612d80565b6308c379a014613abd575b50613a50575b613941575b50505a900391565b61396b9073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b613986610a2c82546dffffffffffffffffffffffffffff1690565b8083116139e3576139dc926dffffffffffffffffffffffffffff9103166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b3880613939565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601760408201527f41413231206469646e2774207061792070726566756e6400000000000000000060608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613ac5612d9e565b9081613ad1575061392e565b610f2191613adf91506137e2565b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301612882565b95506139349050565b613b3391925060203d81116123385761232981836105ab565b9038613912565b9450613b80610a2c613b6c8c73ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b546dffffffffffffffffffffffffffff1690565b8b811115613b975750856060835b969150506138c5565b606087918d03613b8e565b90926000936000935a94613beb6020835193613bd2855173ffffffffffffffffffffffffffffffffffffffff1690565b9561387d613be36040830183611fc8565b90848c61412b565b03938a1690f1829181613ded575b50613de45750600190613c0a612d80565b6308c379a014613d8e575b50613d20575b613c29575b5050505a900391565b613c539073ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b91613c6f610a2c84546dffffffffffffffffffffffffffff1690565b90818311613cba575082547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000169190036dffffffffffffffffffffffffffff16179055388080613c20565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152608490fd5b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601660408201527f4141323320726576657274656420286f72204f4f47290000000000000000000060608201520190565b613d96612d9e565b9081613da25750613c15565b8691613dae91506137e2565b90610f216040519283927f220266b60000000000000000000000000000000000000000000000000000000084526004840161289a565b9650613c1b9050565b613e0691925060203d81116123385761232981836105ab565b9038613bf9565b909180613e1957505050565b81515173ffffffffffffffffffffffffffffffffffffffff1692833b6140be57606083510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280613e78878760048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156140b1575b600092614091575b508082169586156140245716809503613fb7573b15613f4a5761124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d93613f1193612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a3565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313520696e6974436f6465206d757374206372656174652073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6140aa91925060203d811161146a5761145b81836105ab565b9038613ec7565b6140b9612183565b613ebf565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601f60408201527f414131302073656e64657220616c726561647920636f6e73747275637465640060608201520190565b9290918161413a575b50505050565b82515173ffffffffffffffffffffffffffffffffffffffff1693843b6143e257606084510151604051907f570e1a3600000000000000000000000000000000000000000000000000000000825260208280614199888860048401612d2c565b0381600073ffffffffffffffffffffffffffffffffffffffff95867f0000000000000000000000007fc98430eaedbb6070b35b39d7987250490883481690f19182156143d5575b6000926143b5575b5080821696871561434757168096036142d9573b15614273575061124c6112467fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d9361423393612b88565b602083810151935160a001516040805173ffffffffffffffffffffffffffffffffffffffff9485168152939091169183019190915290a338808080614134565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152608490fd5b610f21826040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152602060408201527f4141313420696e6974436f6465206d7573742072657475726e2073656e64657260608201520190565b610f21846040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601b60408201527f4141313320696e6974436f6465206661696c6564206f72204f4f47000000000060608201520190565b6143ce91925060203d811161146a5761145b81836105ab565b90386141e8565b6143dd612183565b6141e0565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152608490fd5b1561444f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4141343120746f6f206c6974746c6520766572696669636174696f6e476173006044820152fd5b919060408382031261035957825167ffffffffffffffff81116103595783019080601f83011215610359578151916144e483610639565b916144f260405193846105ab565b838352602084830101116103595760209261451291848085019101612067565b92015190565b9061044d602f60405180947f414133332072657665727465643a20000000000000000000000000000000000060208301526138268151809260208686019101612067565b93919260609460009460009380519261459b60a08a86015195614580888811614448565b015173ffffffffffffffffffffffffffffffffffffffff1690565b916145c68373ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b946145e2610a2c87546dffffffffffffffffffffffffffff1690565b968588106147825773ffffffffffffffffffffffffffffffffffffffff60208a98946146588a966dffffffffffffffffffffffffffff8b6146919e03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b015194604051998a98899788937ff465c77e000000000000000000000000000000000000000000000000000000008552600485016137c0565b0395169103f190818391849361475c575b506147555750506001906146b4612d80565b6308c379a014614733575b506146c657565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601660408201527f4141333320726576657274656420286f72204f4f47290000000000000000000060608201520190565b61473b612d9e565b908161474757506146bf565b610f2191613adf9150614518565b9450925050565b90925061477b91503d8085833e61477381836105ab565b8101906144ad565b91386146a2565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b91949293909360609560009560009382519061481660a08b84015193614580848611614448565b936148418573ffffffffffffffffffffffffffffffffffffffff166000526000602052604060002090565b61485c610a2c82546dffffffffffffffffffffffffffff1690565b8781106149b7579273ffffffffffffffffffffffffffffffffffffffff60208a989693946146588a966dffffffffffffffffffffffffffff8d6148d69e9c9a03166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b0395169103f1908183918493614999575b506149915750506001906148f9612d80565b6308c379a014614972575b5061490c5750565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152601660448201527f4141333320726576657274656420286f72204f4f4729000000000000000000006064820152608490fd5b61497a612d9e565b90816149865750614904565b613dae925050614518565b955093505050565b9092506149b091503d8085833e61477381836105ab565b91386148e7565b610f218a6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601e60408201527f41413331207061796d6173746572206465706f73697420746f6f206c6f77000060608201520190565b60031115614a2f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b929190614a7c6040916002865260606020870152606086019061208a565b930152565b939291906003811015614a2f57604091614a7c91865260606020870152606086019061208a565b9061044d603660405180947f4141353020706f73744f702072657665727465643a20000000000000000000006020830152614aec8151809260208686019101612067565b81010360168101855201836105ab565b929190925a93600091805191614b1183615318565b9260a0810195614b35875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff93908481169081614ca457505050614b76825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f94614bc26020928c614c329551039061553a565b015194896020614c04614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b9a5173ffffffffffffffffffffffffffffffffffffffff1690565b9401519785604051968796169a16988590949392606092608083019683521515602083015260408201520152565b0390a4565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152602060408201527f414135312070726566756e642062656c6f772061637475616c476173436f737460608201520190565b9a918051614cb4575b5050614b78565b6060850151600099509091803b15614ddb579189918983614d07956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081614dc8575b50614dc3576001614d20612d80565b6308c379a014614da4575b614d37575b3880614cad565b6040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b614dac612d9e565b80614db75750614d2b565b613adf610f2191614aa8565b614d30565b80610f48614dd59261057b565b38614d11565b8980fd5b9392915a90600092805190614df382615318565b9360a0830196614e17885173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff95908681169081614f0d57505050614e58845173ffffffffffffffffffffffffffffffffffffffff1690565b915b5a9003019485029860408301908a825110614ea757507f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f949392614bc2614c32938c60209451039061553a565b604080517f220266b600000000000000000000000000000000000000000000000000000000815260048101929092526024820152602060448201527f414135312070726566756e642062656c6f772061637475616c476173436f73746064820152608490fd5b93918051614f1d575b5050614e5a565b606087015160009a509091803b1561504357918a918a83614f70956040518097819682957fa9a234090000000000000000000000000000000000000000000000000000000084528c029060048401614a5e565b0393f19081615030575b5061502b576001614f89612d80565b6308c379a01461500e575b614fa0575b3880614f16565b610f218b6040519182917f220266b600000000000000000000000000000000000000000000000000000000835260048301608091815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b615016612d9e565b806150215750614f94565b613dae8d91614aa8565b614f99565b80610f4861503d9261057b565b38614f7a565b8a80fd5b909392915a9480519161505983615318565b9260a081019561507d875173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff938185169182615165575050506150bd825173ffffffffffffffffffffffffffffffffffffffff1690565b985b5a90030193840297604084019089825110614c37577f49628fd1471006c1482da88028e9ce4dbb080b815c9b0344d39e5a8e6ec1419f946151096020928c614c329551039061553a565b61511288614a25565b015194896020615139614be9865173ffffffffffffffffffffffffffffffffffffffff1690565b940151604080519182529815602082015297880152606087015290821695909116939081906080820190565b9a918151615175575b50506150bf565b8784026151818a614a25565b60028a1461520c576060860151823b15610359576151d493600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f180156151ff575b6151ec575b505b388061516e565b80610f486151f99261057b565b386151e3565b615207612183565b6151de565b6060860151823b156103595761525793600080948d604051978896879586937fa9a2340900000000000000000000000000000000000000000000000000000000855260048501614a81565b0393f19081615305575b50615300576001615270612d80565b6308c379a0146152ed575b156151e5576040517f220266b600000000000000000000000000000000000000000000000000000000815280610f21600482016080906000815260406020820152601260408201527f4141353020706f73744f7020726576657274000000000000000000000000000060608201520190565b6152f5612d9e565b80614db7575061527b565b6151e5565b80610f486153129261057b565b38615261565b60e060c082015191015180821461533c57480180821015615337575090565b905090565b5090565b6040519061534d8261058f565b60006040838281528260208201520152565b615367615340565b5065ffffffffffff808260a01c1680156153b3575b604051926153898461058f565b73ffffffffffffffffffffffffffffffffffffffff8116845260d01c602084015216604082015290565b508061537c565b6153cf6153d5916153c9615340565b5061535f565b9161535f565b9073ffffffffffffffffffffffffffffffffffffffff9182825116928315615461575b65ffffffffffff928391826040816020850151169301511693836040816020840151169201511690808410615459575b50808511615451575b506040519561543f8761058f565b16855216602084015216604082015290565b935038615431565b925038615428565b8151811693506153f8565b73ffffffffffffffffffffffffffffffffffffffff16600052600160205267ffffffffffffffff6154c88260401c60406000209077ffffffffffffffffffffffffffffffffffffffffffffffff16600052602052604060002090565b918254926154d584612491565b9055161490565b9073ffffffffffffffffffffffffffffffffffffffff6154fa612b50565b9216600052600060205263ffffffff600160406000206dffffffffffffffffffffffffffff815460781c1685520154166020830152565b61044d3361562b565b73ffffffffffffffffffffffffffffffffffffffff16600052600060205260406000206dffffffffffffffffffffffffffff8082541692830180931161561e575b8083116155c05761044d92166dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465706f736974206f766572666c6f77000000000000000000000000000000006044820152fd5b615626612190565b61557b565b73ffffffffffffffffffffffffffffffffffffffff9061564b348261553a565b168060005260006020527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c460206dffffffffffffffffffffffffffff60406000205416604051908152a2565b1561569e57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d757374207370656369667920756e7374616b652064656c61790000000000006044820152fd5b1561570357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e6e6f7420646563726561736520756e7374616b652074696d65000000006044820152fd5b1561576857565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f207374616b652073706563696669656400000000000000000000000000006044820152fd5b156157cd57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7374616b65206f766572666c6f770000000000000000000000000000000000006044820152fd5b9065ffffffffffff6080600161044d9461588b6dffffffffffffffffffffffffffff86511682906dffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffff0000000000000000000000000000825416179055565b602085015115156eff000000000000000000000000000082549160701b16807fffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffff83161783557fffffff000000000000000000000000000000ffffffffffffffffffffffffffff7cffffffffffffffffffffffffffff000000000000000000000000000000604089015160781b16921617178155019263ffffffff6060820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000008554161784550151167fffffffffffffffffffffffffffffffffffffffffffff000000000000ffffffff69ffffffffffff0000000083549260201b169116179055565b1561599657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b91909165ffffffffffff808094169116019182116121cd57565b15615a1557565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b15615a7a57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b15615adf57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b15615b4457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b15615ba957565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6661696c656420746f20776974686472617700000000000000000000000000006044820152fd5b816040519182372090565b9060009283809360208451940192f190565b3d610800808211615c4b575b50604051906020818301016040528082526000602083013e90565b905038615c3056fea2646970667358221220a706d8b02d7086d80e9330811f5af84b2614abdc5e9a1f2260126070a31d7cee64736f6c63430008110033"; + +bytes constant CREATOR_0_6_BYTECODE = hex"6080604052600436101561001257600080fd5b6000803560e01c63570e1a361461002857600080fd5b346100c95760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100c95760043567ffffffffffffffff918282116100c957366023830112156100c95781600401359283116100c95736602484840101116100c9576100c561009e84602485016100fc565b60405173ffffffffffffffffffffffffffffffffffffffff90911681529081906020820190565b0390f35b80fd5b507f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90806014116101bb5767ffffffffffffffff917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec82018381116101cd575b604051937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f81600b8701160116850190858210908211176101c0575b604052808452602084019036848401116101bb576020946000600c819682946014880187378301015251923560601c5af19060005191156101b557565b60009150565b600080fd5b6101c86100cc565b610178565b6101d56100cc565b61013a56fea26469706673582212201927e80b76ab9b71c952137dd676621a9fdf520c25928815636594036eb1c40364736f6c63430008110033"; + +bytes constant VERIFYINGPAYMASTER_BYTECODE = hex"6080604052600436106100e85760003560e01c8063a9a234091161008a578063c399ec8811610059578063c399ec881461028d578063d0e30db0146102a2578063f2fde38b146102aa578063f465c77e146102ca57600080fd5b8063a9a2340914610204578063b0d691fe14610224578063bb9fe6bf14610258578063c23a5cea1461026d57600080fd5b8063715018a6116100c6578063715018a6146101735780638da5cb5b1461018857806394d4ad60146101a657806394e1fc19146101d657600080fd5b80630396cb60146100ed578063205c28781461010257806323d9ac9b14610122575b600080fd5b6101006100fb366004610dc7565b6102f8565b005b34801561010e57600080fd5b5061010061011d366004610e09565b610383565b34801561012e57600080fd5b506101567f000000000000000000000000074bd8c57fe6f33ec5b580c92401f4feafc4443381565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561017f57600080fd5b506101006103f5565b34801561019457600080fd5b506000546001600160a01b0316610156565b3480156101b257600080fd5b506101c66101c1366004610e77565b610409565b60405161016a9493929190610eb9565b3480156101e257600080fd5b506101f66101f1366004610f39565b610446565b60405190815260200161016a565b34801561021057600080fd5b5061010061021f366004610f97565b610542565b34801561023057600080fd5b506101567f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278981565b34801561026457600080fd5b5061010061055c565b34801561027957600080fd5b50610100610288366004610ff7565b6105d3565b34801561029957600080fd5b506101f6610659565b6101006106e9565b3480156102b657600080fd5b506101006102c5366004610ff7565b61074b565b3480156102d657600080fd5b506102ea6102e5366004611014565b6107c9565b60405161016a929190611062565b6103006107ed565b604051621cb65b60e51b815263ffffffff821660048201527f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27896001600160a01b031690630396cb609034906024016000604051808303818588803b15801561036757600080fd5b505af115801561037b573d6000803e3d6000fd5b505050505050565b61038b6107ed565b60405163040b850f60e31b81526001600160a01b038381166004830152602482018390527f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789169063205c287890604401600060405180830381600087803b15801561036757600080fd5b6103fd6107ed565b6104076000610847565b565b600080368161041c6054601487896110b7565b81019061042991906110e1565b909450925061043b85605481896110b7565b949793965094505050565b6000833580602086013561045d6040880188611114565b60405161046b92919061115b565b6040519081900390206104816060890189611114565b60405161048f92919061115b565b604080519182900382206001600160a01b03909516602083015281019290925260608201526080808201929092529086013560a08083019190915286013560c08083019190915286013560e08083019190915286013561010080830191909152860135610120820152466101408201523061016082015265ffffffffffff80861661018083015284166101a08201526101c001604051602081830303815290604052805190602001209150509392505050565b61054a610897565b61055684848484610907565b50505050565b6105646107ed565b7f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27896001600160a01b031663bb9fe6bf6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105bf57600080fd5b505af1158015610556573d6000803e3d6000fd5b6105db6107ed565b60405163611d2e7560e11b81526001600160a01b0382811660048301527f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d2789169063c23a5cea90602401600060405180830381600087803b15801561063e57600080fd5b505af1158015610652573d6000803e3d6000fd5b5050505050565b6040516370a0823160e01b81523060048201526000907f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27896001600160a01b0316906370a0823190602401602060405180830381865afa1580156106c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e4919061116b565b905090565b60405163b760faf960e01b81523060048201527f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27896001600160a01b03169063b760faf99034906024016000604051808303818588803b15801561063e57600080fd5b6107536107ed565b6001600160a01b0381166107bd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6107c681610847565b50565b606060006107d5610897565b6107e085858561093f565b915091505b935093915050565b6000546001600160a01b031633146104075760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b4565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b336001600160a01b037f0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d278916146104075760405162461bcd60e51b815260206004820152601560248201527414d95b99195c881b9bdd08115b9d1c9e541bda5b9d605a1b60448201526064016107b4565b60405162461bcd60e51b815260206004820152600d60248201526c6d757374206f7665727269646560981b60448201526064016107b4565b60606000808036816109586101c16101208b018b611114565b9296509094509250905060408114806109715750604181145b6109e5576040805162461bcd60e51b81526020600482015260248101919091527f566572696679696e675061796d61737465723a20696e76616c6964207369676e60448201527f6174757265206c656e67746820696e207061796d6173746572416e644461746160648201526084016107b4565b6000610a486109f58b8787610446565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9050610a8a8184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610b1892505050565b6001600160a01b03167f000000000000000000000000074bd8c57fe6f33ec5b580c92401f4feafc444336001600160a01b031614610aed57610ace60018686610b3c565b60405180602001604052806000815250909650965050505050506107e5565b610af960008686610b3c565b6040805160208101909152600081529b909a5098505050505050505050565b6000806000610b278585610b74565b91509150610b3481610bb9565b509392505050565b600060d08265ffffffffffff16901b60a08465ffffffffffff16901b85610b64576000610b67565b60015b60ff161717949350505050565b6000808251604103610baa5760208301516040840151606085015160001a610b9e87828585610d03565b94509450505050610bb2565b506000905060025b9250929050565b6000816004811115610bcd57610bcd611184565b03610bd55750565b6001816004811115610be957610be9611184565b03610c365760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107b4565b6002816004811115610c4a57610c4a611184565b03610c975760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107b4565b6003816004811115610cab57610cab611184565b036107c65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016107b4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610d3a5750600090506003610dbe565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610d8e573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610db757600060019250925050610dbe565b9150600090505b94509492505050565b600060208284031215610dd957600080fd5b813563ffffffff81168114610ded57600080fd5b9392505050565b6001600160a01b03811681146107c657600080fd5b60008060408385031215610e1c57600080fd5b8235610e2781610df4565b946020939093013593505050565b60008083601f840112610e4757600080fd5b50813567ffffffffffffffff811115610e5f57600080fd5b602083019150836020828501011115610bb257600080fd5b60008060208385031215610e8a57600080fd5b823567ffffffffffffffff811115610ea157600080fd5b610ead85828601610e35565b90969095509350505050565b600065ffffffffffff808716835280861660208401525060606040830152826060830152828460808401376000608084840101526080601f19601f850116830101905095945050505050565b60006101608284031215610f1857600080fd5b50919050565b803565ffffffffffff81168114610f3457600080fd5b919050565b600080600060608486031215610f4e57600080fd5b833567ffffffffffffffff811115610f6557600080fd5b610f7186828701610f05565b935050610f8060208501610f1e565b9150610f8e60408501610f1e565b90509250925092565b60008060008060608587031215610fad57600080fd5b843560038110610fbc57600080fd5b9350602085013567ffffffffffffffff811115610fd857600080fd5b610fe487828801610e35565b9598909750949560400135949350505050565b60006020828403121561100957600080fd5b8135610ded81610df4565b60008060006060848603121561102957600080fd5b833567ffffffffffffffff81111561104057600080fd5b61104c86828701610f05565b9660208601359650604090950135949350505050565b604081526000835180604084015260005b818110156110905760208187018101516060868401015201611073565b506000606082850101526060601f19601f8301168401019150508260208301529392505050565b600080858511156110c757600080fd5b838611156110d457600080fd5b5050820193919092039150565b600080604083850312156110f457600080fd5b6110fd83610f1e565b915061110b60208401610f1e565b90509250929050565b6000808335601e1984360301811261112b57600080fd5b83018035915067ffffffffffffffff82111561114657600080fd5b602001915036819003821315610bb257600080fd5b8183823760009101908152919050565b60006020828403121561117d57600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd"; + +address constant VERIFYINGPAYMASTER_ADDRESS = 0xe1Fb85Ec54767ED89252751F6667CF566b16f1F0; diff --git a/src/test/smart-wallet/utils/AATestBase.sol b/src/test/smart-wallet/utils/AATestBase.sol new file mode 100644 index 000000000..c2ca548e0 --- /dev/null +++ b/src/test/smart-wallet/utils/AATestBase.sol @@ -0,0 +1,285 @@ +pragma solidity ^0.8.0; + +import { IEntryPoint } from "contracts/prebuilts/account/interface/IEntryPoint.sol"; +import { UserOperation } from "contracts/prebuilts/account/utils/UserOperation.sol"; +import { IAccount } from "contracts/prebuilts/account/interface/IAccount.sol"; +import { VERIFYINGPAYMASTER_BYTECODE, VERIFYINGPAYMASTER_ADDRESS, ENTRYPOINT_0_6_BYTECODE, CREATOR_0_6_BYTECODE } from "./AATestArtifacts.sol"; + +import "contracts/external-deps/openzeppelin/utils/cryptography/ECDSA.sol"; +import "forge-std/Test.sol"; +import "forge-std/console.sol"; + +import { MockERC20 } from "../../mocks/MockERC20.sol"; + +interface IVerifyingPaymaster { + function owner() external view returns (address); + + function getHash( + UserOperation calldata userOp, + uint48 validUntil, + uint48 validAfter + ) external view returns (bytes32); +} + +interface VmModified { + function cool(address _target) external; + + function keyExists(string calldata, string calldata) external returns (bool); + + function parseJsonKeys(string calldata json, string calldata key) external pure returns (string[] memory keys); +} + +uint256 constant OV_FIXED = 21000; +uint256 constant OV_PER_USEROP = 18300; +uint256 constant OV_PER_WORD = 4; +uint256 constant OV_PER_ZERO_BYTE = 4; +uint256 constant OV_PER_NONZERO_BYTE = 16; + +abstract contract AAGasProfileBase is Test { + string public name; + string public scenarioName; + uint256 sum; + string jsonObj; + IEntryPoint public entryPoint; + address payable public beneficiary; + IAccount public account; + address public owner; + uint256 public key; + IVerifyingPaymaster public paymaster; + address public verifier; + uint256 public verifierKey; + bool public writeGasProfile = false; + + function(UserOperation memory) internal view returns (bytes memory) paymasterData; + function(UserOperation memory) internal view returns (bytes memory) dummyPaymasterData; + + function initializeTest(string memory _name) internal { + writeGasProfile = vm.envOr("WRITE_GAS_PROFILE", false); + name = _name; + entryPoint = IEntryPoint(payable(address(0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789))); + vm.etch(address(entryPoint), ENTRYPOINT_0_6_BYTECODE); + vm.etch(0x7fc98430eAEdbb6070B35B39D798725049088348, CREATOR_0_6_BYTECODE); + beneficiary = payable(makeAddr("beneficiary")); + vm.deal(beneficiary, 1e18); + paymasterData = emptyPaymasterAndData; + dummyPaymasterData = emptyPaymasterAndData; + (verifier, verifierKey) = makeAddrAndKey("VERIFIER"); + paymaster = IVerifyingPaymaster(VERIFYINGPAYMASTER_ADDRESS); + vm.etch(address(paymaster), VERIFYINGPAYMASTER_BYTECODE); + vm.store(address(paymaster), bytes32(0), bytes32(uint256(uint160(verifier)))); + } + + function setAccount() internal { + (owner, key) = makeAddrAndKey("Owner"); + account = getAccountAddr(owner); + vm.deal(address(account), 1e18); + } + + function fillUserOp(bytes memory _data) internal view returns (UserOperation memory op) { + op.sender = address(account); + op.nonce = entryPoint.getNonce(address(account), 0); + if (address(account).code.length == 0) { + op.initCode = getInitCode(owner); + } + op.callData = _data; + op.callGasLimit = 1000000; + op.verificationGasLimit = 1000000; + op.preVerificationGas = 21000; + op.maxFeePerGas = 1; + op.maxPriorityFeePerGas = 1; + op.signature = getDummySig(op); + op.paymasterAndData = dummyPaymasterData(op); + op.preVerificationGas = calculatePreVerificationGas(op); + op.paymasterAndData = paymasterData(op); + op.signature = getSignature(op); + } + + function signUserOpHash(uint256 _key, UserOperation memory _op) internal view returns (bytes memory signature) { + bytes32 hash = entryPoint.getUserOpHash(_op); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(_key, ECDSA.toEthSignedMessageHash(hash)); + signature = abi.encodePacked(r, s, v); + } + + function executeUserOp( + UserOperation memory _op, + string memory _test, + uint256 _value + ) internal { + UserOperation[] memory ops = new UserOperation[](1); + ops[0] = _op; + uint256 eth_before; + if (_op.paymasterAndData.length > 0) { + eth_before = entryPoint.balanceOf(address(paymaster)); + } else { + eth_before = entryPoint.balanceOf(address(account)) + address(account).balance; + } + // vm.cool to be introduced to foundry + //VmModified(address(vm)).cool(address(entryPoint)); + //VmModified(address(vm)).cool(address(account)); + entryPoint.handleOps(ops, beneficiary); + uint256 eth_after; + if (_op.paymasterAndData.length > 0) { + eth_after = entryPoint.balanceOf(address(paymaster)); + } else { + eth_after = entryPoint.balanceOf(address(account)) + address(account).balance + _value; + } + if (!writeGasProfile) { + console.log("case - %s", _test); + console.log(" gasUsed : ", eth_before - eth_after); + console.log(" calldatacost : ", calldataCost(pack(_op))); + } + if (writeGasProfile && bytes(scenarioName).length > 0) { + uint256 gasUsed = eth_before - eth_after; + vm.serializeUint(jsonObj, _test, gasUsed); + sum += gasUsed; + } + } + + function testCreation() internal { + UserOperation memory op = fillUserOp(fillData(address(0), 0, "")); + executeUserOp(op, "creation", 0); + } + + function testTransferNative(address _recipient, uint256 _amount) internal { + vm.skip(writeGasProfile); + createAccount(owner); + _amount = bound(_amount, 1, address(account).balance / 2); + UserOperation memory op = fillUserOp(fillData(_recipient, _amount, "")); + executeUserOp(op, "native", _amount); + } + + function testTransferNative() internal { + createAccount(owner); + uint256 amount = 5e17; + address recipient = makeAddr("recipient"); + UserOperation memory op = fillUserOp(fillData(recipient, amount, "")); + executeUserOp(op, "native", amount); + } + + function testTransferERC20() internal { + createAccount(owner); + MockERC20 mockERC20 = new MockERC20(); + mockERC20.mint(address(account), 1e18); + uint256 amount = 5e17; + address recipient = makeAddr("recipient"); + uint256 balance = mockERC20.balanceOf(recipient); + UserOperation memory op = fillUserOp( + fillData(address(mockERC20), 0, abi.encodeWithSelector(mockERC20.transfer.selector, recipient, amount)) + ); + executeUserOp(op, "erc20", 0); + assertEq(mockERC20.balanceOf(recipient), balance + amount); + } + + function testBenchmark1Vanila() external { + scenarioName = "vanila"; + jsonObj = string(abi.encodePacked(scenarioName, " ", name)); + testCreation(); + testTransferNative(); + testTransferERC20(); + if (writeGasProfile) { + string memory res = vm.serializeUint(jsonObj, "sum", sum); + console.log(res); + vm.writeJson(res, string.concat("./results/", scenarioName, "_", name, ".json")); + } + } + + function testBenchmark2Paymaster() external { + scenarioName = "paymaster"; + jsonObj = string(abi.encodePacked(scenarioName, " ", name)); + entryPoint.depositTo{ value: 100e18 }(address(paymaster)); + paymasterData = validatePaymasterAndData; + dummyPaymasterData = getDummyPaymasterAndData; + testCreation(); + testTransferNative(); + testTransferERC20(); + if (writeGasProfile) { + string memory res = vm.serializeUint(jsonObj, "sum", sum); + console.log(res); + vm.writeJson(res, string.concat("./results/", scenarioName, "_", name, ".json")); + } + } + + function testBenchmark3Deposit() external { + scenarioName = "deposit"; + jsonObj = string(abi.encodePacked(scenarioName, " ", name)); + entryPoint.depositTo{ value: 100e18 }(address(account)); + testCreation(); + testTransferNative(); + testTransferERC20(); + if (writeGasProfile) { + string memory res = vm.serializeUint(jsonObj, "sum", sum); + console.log(res); + vm.writeJson(res, string.concat("./results/", scenarioName, "_", name, ".json")); + } + } + + function emptyPaymasterAndData(UserOperation memory _op) internal pure returns (bytes memory ret) {} + + function validatePaymasterAndData(UserOperation memory _op) internal view returns (bytes memory ret) { + bytes32 hash = paymaster.getHash(_op, 0, 0); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(verifierKey, ECDSA.toEthSignedMessageHash(hash)); + ret = abi.encodePacked(address(paymaster), uint256(0), uint256(0), r, s, uint8(v)); + } + + function getDummyPaymasterAndData(UserOperation memory _op) internal view returns (bytes memory ret) { + ret = abi.encodePacked( + address(paymaster), + uint256(0), + uint256(0), + hex"fffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c" + ); + } + + function pack(UserOperation memory _op) internal pure returns (bytes memory) { + bytes memory packed = abi.encode( + _op.sender, + _op.nonce, + _op.initCode, + _op.callData, + _op.callGasLimit, + _op.verificationGasLimit, + _op.preVerificationGas, + _op.maxFeePerGas, + _op.maxPriorityFeePerGas, + _op.paymasterAndData, + _op.signature + ); + return packed; + } + + function calldataCost(bytes memory packed) internal view returns (uint256) { + uint256 cost = 0; + for (uint256 i = 0; i < packed.length; i++) { + if (packed[i] == 0) { + cost += OV_PER_ZERO_BYTE; + } else { + cost += OV_PER_NONZERO_BYTE; + } + } + return cost; + } + + // NOTE: this can vary depending on the bundler, this equation is referencing eth-infinitism bundler's pvg calculation + function calculatePreVerificationGas(UserOperation memory _op) internal view returns (uint256) { + bytes memory packed = pack(_op); + uint256 calculated = OV_FIXED + OV_PER_USEROP + (OV_PER_WORD * (packed.length + 31)) / 32; + calculated += calldataCost(packed); + return calculated; + } + + function createAccount(address _owner) internal virtual; + + function getSignature(UserOperation memory _op) internal view virtual returns (bytes memory); + + function getDummySig(UserOperation memory _op) internal pure virtual returns (bytes memory); + + function fillData( + address _to, + uint256 _amount, + bytes memory _data + ) internal view virtual returns (bytes memory); + + function getAccountAddr(address _owner) internal view virtual returns (IAccount _account); + + function getInitCode(address _owner) internal view virtual returns (bytes memory); +} From 754d9540b17b22e9e926f8d2d1aa0e927ff51503 Mon Sep 17 00:00:00 2001 From: Krishang Date: Tue, 21 Nov 2023 01:16:04 +0530 Subject: [PATCH 6/7] prettier ignore file w bytecode --- .prettierignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.prettierignore b/.prettierignore index 4971c404b..11631ff81 100644 --- a/.prettierignore +++ b/.prettierignore @@ -9,4 +9,5 @@ node_modules/ typechain/ # files +src/test/smart-wallet/utils/AABenchmarkArtifacts.sol coverage.json From e7ced3497ecb82192cc21b7fc6dd289e5c1e9c98 Mon Sep 17 00:00:00 2001 From: Krishang Date: Tue, 21 Nov 2023 01:20:41 +0530 Subject: [PATCH 7/7] rename import --- src/test/smart-wallet/utils/AATestBase.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/smart-wallet/utils/AATestBase.sol b/src/test/smart-wallet/utils/AATestBase.sol index c2ca548e0..48da6dfe1 100644 --- a/src/test/smart-wallet/utils/AATestBase.sol +++ b/src/test/smart-wallet/utils/AATestBase.sol @@ -1,6 +1,6 @@ pragma solidity ^0.8.0; -import { IEntryPoint } from "contracts/prebuilts/account/interface/IEntryPoint.sol"; +import { IEntryPoint } from "contracts/prebuilts/account/interface/IEntrypoint.sol"; import { UserOperation } from "contracts/prebuilts/account/utils/UserOperation.sol"; import { IAccount } from "contracts/prebuilts/account/interface/IAccount.sol"; import { VERIFYINGPAYMASTER_BYTECODE, VERIFYINGPAYMASTER_ADDRESS, ENTRYPOINT_0_6_BYTECODE, CREATOR_0_6_BYTECODE } from "./AATestArtifacts.sol";