From 1fadd37314001ff2577c69864ab36e69049b4af0 Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Mon, 26 May 2025 16:22:16 +0100 Subject: [PATCH 1/9] Add support for kernel + 7702 --- .../alto/constants/accounts/kernel.ts | 4 +- .../mock-aa-infra/alto/index.ts | 11 +- packages/permissionless-test/src/utils.ts | 43 +++- .../accounts/kernel/toKernelSmartAccount.ts | 217 +++++++++++++----- .../accounts/simple/toSimpleSmartAccount.ts | 5 +- 5 files changed, 209 insertions(+), 71 deletions(-) diff --git a/packages/permissionless-test/mock-aa-infra/alto/constants/accounts/kernel.ts b/packages/permissionless-test/mock-aa-infra/alto/constants/accounts/kernel.ts index a579d114..75d22d7a 100644 --- a/packages/permissionless-test/mock-aa-infra/alto/constants/accounts/kernel.ts +++ b/packages/permissionless-test/mock-aa-infra/alto/constants/accounts/kernel.ts @@ -54,9 +54,9 @@ export const KERNEL_V07_V3_2_ACCOUNT_V3_LOGIC_CREATECALL: Hex = "0x0000000000000000000000000000000000000000000000000000000000000000610140806040523461020357602081615e4a80380380916100208285610207565b83398101031261020357516001600160a01b038116810361020357306080524660a05260a0604051610053604082610207565b6006815260208101906512d95c9b995b60d21b825260405191610077604084610207565b60058352602083019164181719971960d91b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b825260048152610101602482610207565b5190516001600160581b031981169190601582106101e3575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615c0b908161023f82396080518161472c015260a0518161474f015260c051816147bf015260e051816147e50152610100518161470b0152610120518181816103b40152818161069d0152818161084301528181610a9f01528181610e1e01528181611136015281816112aa015281816113000152818161182d0152818161195d015281816125ac0152612ff30152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761022a57604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b36612ea15761001b612e70565b005b5f3560e01c8063112d3a7d1461020c578063150b7a02146102075780631626ba7e1461020257806319822f7c146101fd5780631f1b92e3146101f85780633659cfe6146101f35780633c3b752b146101ee57806352141cd9146101e957806357b3a5f4146101e45780636e6fa0c6146101df578063721e67f4146101da57806384b0196e146101d55780638dd7712f146101d057806390ef8862146101cb5780639198bdf5146101c65780639517e29f146101c15780639cfd7cff146101bc578063a65d69d4146101b7578063a71763a8146101b2578063adb610a3146101ad578063b8afe17d146101a8578063bc197c81146101a3578063c3e589781461019e578063d03c791414610199578063d691c96414610194578063e6f3d50a1461018f578063e9ae5c531461018a578063f1f7f0f914610185578063f23a6e6114610180578063f2dc691d1461017b5763fc9c5dec0361000e57611b12565b611af4565b611a9a565b611a64565b611936565b6117b8565b6116d6565b611689565b6115b6565b6114a5565b611439565b611407565b6112d9565b611295565b61123d565b61110f565b610ff8565b610ee9565b610dee565b610d50565b610cca565b610c6f565b610bbc565b610a1e565b610988565b61080d565b610665565b610380565b61031f565b6102c5565b61029f565b6001600160a01b0381160361022257565b5f80fd5b359061023182610211565b565b9181601f84011215610222578235916001600160401b038311610222576020838186019501011161022257565b6060600319820112610222576004359160243561027c81610211565b91604435906001600160401b0382116102225761029b91600401610233565b9091565b346102225760206102bb6102b236610260565b92919091611d65565b6040519015158152f35b34610222576080366003190112610222576102e1600435610211565b6102ec602435610211565b6064356001600160401b0381116102225761030b903690600401610233565b5050604051630a85bd0160e11b8152602090f35b34610222576040366003190112610222576004356024356001600160401b0381116102225760209161035861035e923690600401610233565b91611f2a565b6040516001600160e01b03199091168152f35b90816101209103126102225790565b6060366003190112610222576004356001600160401b038111610222576103ab903690600401610371565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610632576103ef6020820135613212565b9092919084836001600160f81b0319861615610619575b82610411939461340b565b9361043661042661042184611cf7565b6120ca565b946001600160f81b031916151590565b9384806105d8575b6105c957602001516001600160a01b031690819081156104d15760019261046f61048e925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b0361053c57826104e0575b50506104d157816104bb925b6104bf575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104aa565b631a0a9b9f60e21b5f5260045ffd5b61053592506105319161051561050f6105096104fe61052a95611d2e565b9360608101906120f6565b90611b72565b90611cc1565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f80610499565b82919291610596575b506104d15761050981606061055b9301906120f6565b638dd7712f60e01b916001600160e01b03199161057791611cc1565b160361058757816104bb926104a5565b63dbbb044b60e01b5f5260045ffd5b6105c3915061052a6105aa61053192611d2e565b61051561050f6105bd60608801886120f6565b90611b61565b5f610545565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106116106085f516020615beb5f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061043e565b5f516020615beb5f395f51905f525460581b9250610406565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361022257565b359063ffffffff8216820361022257565b602036600319011261022257610679610641565b61069a6106945f516020615beb5f395f51905f525460581b90565b60581c90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610803575b156107f95760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa90811561079d575f916107ca575b50156106325760405163d68f602560e01b8152915f838061072f363433600485016121bd565b038183865af192831561079d575f936107a2575b5061074d90613624565b803b1561022257604051630b9dfbed60e11b8152915f91839182908490829061077990600483016121e2565b03925af1801561079d5761078957005b806107975f61001b93610fa1565b80610d22565b611f1f565b61074d9193506107c3903d805f833e6107bb8183610fa1565b81019061215b565b9290610743565b6107ec915060203d6020116107f2575b6107e48183610fa1565b810190612128565b5f610709565b503d6107da565b5061001b90613624565b50303314156106cd565b60203660031901126102225760043561082581610211565b6108406106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061093c575b156109325760405163ecd0596160e01b81526004808201526001600160a01b039190911690602081602481855afa90811561079d575f91610913575b50156106325760405163d68f602560e01b8152915f83806108d5363433600485016121bd565b038183865af192831561079d575f936108f3575b5061074d906121f3565b61074d91935061090c903d805f833e6107bb8183610fa1565b92906108e9565b61092c915060203d6020116107f2576107e48183610fa1565b5f6108af565b5061001b906121f3565b5030331415610873565b6001600160581b031981160361022257565b9181601f84011215610222578235916001600160401b038311610222576020808501948460051b01011161022257565b346102225760a0366003190112610222576004356109a581610946565b6024356109b181610211565b6044356001600160401b038111610222576109d0903690600401610233565b6064939193356001600160401b038111610222576109f2903690600401610233565b91608435956001600160401b03871161022257610a1661001b973690600401610958565b969095612339565b608036600319011261022257600435610a3681610946565b602435610a4281610211565b6044356001600160401b03811161022257610a61903690600401610233565b6064356001600160401b03811161022257610a80903690600401610233565b91610a9c6106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610ba0575b15610b915760405163ecd0596160e01b81526004808201526001600160a01b03919091169490602081602481895afa90811561079d575f91610b72575b50156106325760405163d68f602560e01b8152955f8780610b32363433600485016121bd565b0381838a5af196871561079d575f97610b52575b5061074d959697612482565b61074d969750610b6b903d805f833e6107bb8183610fa1565b9695610b46565b610b8b915060203d6020116107f2576107e48183610fa1565b5f610b0c565b50919361001b95939193612482565b5030331415610acf565b6001600160e01b031981160361022257565b34610222576020366003190112610222576104bb610bfd600435610bdf81610baa565b5f60408051610bed81610f2f565b8281528260208201520152611e57565b600160405191610c0c83610f2f565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461022257604036600319011261022257602060ff610cbe600435610c9381610946565b610ca860243591610ca383610baa565b611d2e565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610222576020366003190112610222576020610cff600435610cec81610211565b5f604051610cf981610f4f565b5261304f565b60405190610d0c82610f4f565b546001600160a01b031690819052604051908152f35b5f91031261022257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610222575f36600319011261022257610d8f610d9d610d6e613971565b604092919251938493600f60f81b855260e0602086015260e0850190610d2c565b908382036040850152610d2c565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610dd5575050500390f35b8251845285945060209384019390920191600101610dc7565b6040366003190112610222576004356001600160401b03811161022257610e19903690600401610371565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610632575f908152602081905260409020546001600160a01b03169060609060018314159081610eb9575b610e8e610e87826060610e959401906120f6565b8091611b80565b9030613a59565b5015610eaa57610ea157005b61001b91613a7e565b63f21e646b60e01b5f5260045ffd5b9150610e95610e8e610e87610edf610ed7610e8760608801886120f6565b903489613a0e565b9492505050610e73565b34610222575f36600319011261022257602063ffffffff5f516020615beb5f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f4a57604052565b610f1b565b602081019081106001600160401b03821117610f4a57604052565b604081019081106001600160401b03821117610f4a57604052565b61012081019081106001600160401b03821117610f4a57604052565b90601f801991011681019081106001600160401b03821117610f4a57604052565b60405190610231604083610fa1565b6040519061023161012083610fa1565b6001600160401b038111610f4a5760051b60200190565b6080366003190112610222576004356001600160401b03811161022257611023903690600401610958565b602435916001600160401b038311610222573660238401121561022257826004013561104e81610fe1565b9361105c6040519586610fa1565b8185526024602086019260061b8201019036821161022257602401915b8183106110ce575050506044356001600160401b038111610222576110a2903690600401610958565b90606435946001600160401b038611610222576110c661001b963690600401610958565b959094612587565b60408336031261022257602060409182516110e881610f6a565b6110f186610654565b81528286013561110081610211565b83820152815201920191611079565b61111836610260565b6111336106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611233575b156112285760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa90811561079d575f91611209575b50156106325760405163d68f602560e01b8152935f85806111c9363433600485016121bd565b038183885af194851561079d575f956111e9575b5061074d939495612754565b61074d949550611202903d805f833e6107bb8183610fa1565b94936111dd565b611222915060203d6020116107f2576107e48183610fa1565b5f6111a3565b509161001b93612754565b5030331415611166565b34610222575f366003190112610222576104bb60405161125e604082610fa1565b601681527535b2b93732b61730b23b30b731b2b2173b181719971960511b6020820152604051918291602083526020830190610d2c565b34610222575f366003190112610222576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6112e236610260565b6112fd6106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806113fd575b156113f25760405163ecd0596160e01b81526004808201526001600160a01b03919091169290602081602481875afa90811561079d575f916113d3575b50156106325760405163d68f602560e01b8152935f8580611393363433600485016121bd565b038183885af194851561079d575f956113b3575b5061074d939495612aad565b61074d9495506113cc903d805f833e6107bb8183610fa1565b94936113a7565b6113ec915060203d6020116107f2576107e48183610fa1565b5f61136d565b509161001b93612aad565b5030331415611330565b34610222575f36600319011261022257602063ffffffff5f516020615beb5f395f51905f525460a81c16604051908152f35b3461022257602036600319011261022257604061146960043561145b81610946565b611463612c55565b50611cf7565b81519061147582610f6a565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b346102225760a0366003190112610222576114c1600435610211565b6114cc602435610211565b6044356001600160401b038111610222576114eb903690600401610958565b50506064356001600160401b0381116102225761150c903690600401610958565b50506084356001600160401b0381116102225761152d903690600401610233565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b8181106115965750505090565b82516001600160501b031916845260209384019390920191600101611589565b34610222576020366003190112610222576115f56004356115d681610baa565b6060604080516115e581610f2f565b5f81525f60208201520152611e8d565b60016040519161160483610f2f565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b818110611666576104bb858761165581880382610fa1565b604082015260405191829182611541565b825460501b6001600160501b03191684526020909301926001928301920161163d565b346102225760203660031901126102225760206102bb600435612c6d565b9060406003198301126102225760043591602435906001600160401b0382116102225761029b91600401610233565b6116df366116a7565b90916001600160a01b036116f23361304f565b54169182156117a95760609060018414159485611792575b61171492936142f0565b92611782575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061175357505050500390f35b919360019193955060206117728192603f198a82030186528851610d2c565b9601920192018594939192611744565b61178b91613a7e565b5f8061171a565b61171492506117a23634876139b5565b925061170a565b63710c949760e01b5f5260045ffd5b6060366003190112610222576004356117d081610946565b6024356001600160401b038111610222576117ef903690600401610233565b6044356001600160401b0381116102225761180e903690600401610233565b9061182a6106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061192c575b1561191f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169390602081602481885afa90811561079d575f91611900575b50156106325760405163d68f602560e01b8152945f86806118c0363433600485016121bd565b038183895af195861561079d575f966118e0575b5061074d949596612d45565b61074d9596506118f9903d805f833e6107bb8183610fa1565b95946118d4565b611919915060203d6020116107f2576107e48183610fa1565b5f61189a565b5091909261001b94612d45565b503033141561185d565b61193f366116a7565b61195a6106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611a5a575b15611a4f5760405163ecd0596160e01b81526004808201526001600160a01b03919091169190602081602481865afa90811561079d575f91611a30575b50156106325760405163d68f602560e01b8152925f84806119f0363433600485016121bd565b038183875af193841561079d575f94611a10575b5061074d929394612d5a565b61074d939450611a29903d805f833e6107bb8183610fa1565b9392611a04565b611a49915060203d6020116107f2576107e48183610fa1565b5f6119ca565b509061001b92612d5a565b503033141561198d565b34610222575f3660031901126102225760205f516020615beb5f395f51905f525460581b604051906001600160581b0319168152f35b346102225760a036600319011261022257611ab6600435610211565b611ac1602435610211565b6084356001600160401b03811161022257611ae0903690600401610233565b505060405163f23a6e6160e01b8152602090f35b346102225760203660031901126102225760206102bb600435612d65565b34610222576040366003190112610222576004356001600160401b03811161022257611b59611b476020923690600401610371565b60243590611b5482610211565b612d72565b604051908152f35b906008116102225760040190600490565b906004116102225790600490565b909291928360041161022257831161022257600401916003190190565b906020116102225790602090565b90929192836020116102225783116102225760200191601f190190565b906018116102225760040190601490565b906014116102225790601490565b909291928360011161022257831161022257600101915f190190565b906009116102225760010190600890565b909291928360091161022257831161022257600901916008190190565b906016116102225790601690565b906016116102225760020190601490565b909291928360161161022257831161022257601601916015190190565b906002116102225790600290565b909291928360141161022257831161022257601401916013190190565b90602c116102225760180190601490565b90939293848311610222578411610222578101920390565b356001600160e01b0319811692919060048210611cdc575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611db457506001600160a01b0392611dae9250611d9e915060581b600160581b600160f81b0316600160f81b17611cf7565b5460201c6001600160a01b031690565b16151590565b60028103611df457506001600160a01b0392611dae9250611de89150611ddb90841661304f565b546001600160a01b031690565b6001600160a01b031690565b600303611e3457611e15611e1061050f600193611e2395611b72565b611e57565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b359060208110611e49575090565b5f199060200360031b1b1690565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b908160209103126102225751611ed881610baa565b90565b908060209392818452848401375f828201840152601f01601f1916010190565b611ed8949260609260018060a01b0316825260208201528160408201520191611edb565b6040513d5f823e3d90fd5b91611f3491613087565b919080836001600160f81b03198416156120aa575b6020811015918261206d575b82612057575b506001600160a01b039050611f75611de8611d9e86611cf7565b16156104d1576001600160f81b03198316600160f81b0361200a5790611fa26020949392611fc0966131b8565b604051637aa8f17760e11b8152958694859384933360048601611efb565b039160581c6001600160a01b03165afa90811561079d575f91611fe1575090565b611ed8915060203d602011612003575b611ffb8183610fa1565b810190611ec3565b503d611ff1565b929160081b93600160f11b61203861202b61202488611e8d565b5460f01b90565b6001600160f01b03191690565b1661204857611ed8943390613104565b635b71057960e01b5f5260045ffd5b819295506120659350611bab565b925f80611f5b565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a6120a361209d8385611b9d565b90611e3b565b1491611f55565b92506120c45f516020615beb5f395f51905f525460581b90565b92611f49565b906040516120d781610f6a565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561022257018035906001600160401b0382116102225760200191813603831361022257565b90816020910312610222575180151581036102225790565b6001600160401b038111610f4a57601f01601f191660200190565b602081830312610222578051906001600160401b038211610222570181601f820112156102225780519061218e82612140565b9261219c6040519485610fa1565b8284526020838301011161022257815f9260208093018386015e8301015290565b611ed8939260609260018060a01b03168252602082015281604082015201905f611edb565b906020611ed8928181520190610d2c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b1561224d57565b60405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b5f516020615beb5f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156122e45761029b9160051b8101906120f6565b6122b9565b908092918237015f815290565b60405190612305602083610fa1565b5f8252565b3d15612334573d9061231b82612140565b916123296040519384610fa1565b82523d5f602084013e565b606090565b949392919096959661237c6001600160581b03196123756123685f516020615beb5f395f51905f525460581b90565b6001600160581b03191690565b1615612246565b6001600160581b03198616156104d1576001600160f81b03198616600160f81b14158061246a575b61245b57856123b5612402976136e9565b6123d66123c0610fc2565b60018152925b6001600160a01b03166020840152565b5f516020615beb5f395f51905f52805463ffffffff60a81b1916600160a81b17905561374f565b61374f565b5f5b81811061241057505050565b5f8061241d8385876122cd565b9061242d604051809381936122e9565b039082305af161243b61230a565b501561244957600101612404565b636534eae560e11b5f5260045260245ffd5b6361c4e91b60e11b5f5260045ffd5b506001600160f81b03198616600160f91b14156123a4565b94939291906001600160581b03198616156104d1576001600160f81b03198616600160f81b14158061252d575b61245b576124bc866136e9565b6001600160a01b036124d0611d9e88611cf7565b16156124df575b505050505050565b612522956123fd6125055f516020615beb5f395f51905f525463ffffffff9060a81c1690565b926123c660405194612518604087610fa1565b63ffffffff168552565b5f80808080806124d7565b506001600160f81b03198616600160f91b14156124af565b9060405161255281610f2f565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b959294919390946125a96106945f516020615beb5f395f51905f525460581b90565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161415806126f9575b156126ea5760405163ecd0596160e01b81526004808201526001600160a01b039190911695906020816024818a5afa90811561079d575f916126cb575b50156106325760405163d68f602560e01b8152965f888061263f363433600485016121bd565b0381838b5af197881561079d575f986126ab575b5061265f969798613af7565b803b1561022257604051630b9dfbed60e11b8152915f91839182908490829061268b90600483016121e2565b03925af1801561079d5761269d575b50565b806107975f61023193610fa1565b61265f9798506126c4903d805f833e6107bb8183610fa1565b9796612653565b6126e4915060203d6020116107f2576107e48183610fa1565b5f612619565b50919390929461023196613af7565b50303314156125dc565b916020611ed8938181520191611edb565b356bffffffffffffffffffffffff19811692919060148210612734575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b9091906001810361289957509060549060581b600160581b600160f81b0316600160f81b179161279061278684611cf7565b5463ffffffff1690565b5f516020615beb5f395f51905f525460a81c63ffffffff169063ffffffff808316911614612881575b506128226127fb611de86127f56127ef6127e85f516020615beb5f395f51905f525463ffffffff9060a81c1690565b9886611bd9565b90612714565b60601c90565b612812612806610fc2565b63ffffffff9097168752565b6001600160a01b03166020860152565b61284d601482019461283486806120f6565b61284460348694939401896120f6565b9390928861374f565b0191600461285b84836120f6565b905014612868575b505050565b61050f6105096102319461287b936120f6565b90613f3b565b6128939060010163ffffffff16612288565b5f6127b9565b600281036128ee5750610231926034826128e16128c6611de86127f56127ef60146128e899019786611bd9565b80966128d286806120f6565b916001600160a01b0316613eaa565b01906120f6565b91613cec565b9091906003810361295957506128e8906038612951611de86127f56127ef6102319861294b60188a01978a612939611de86127f56127ef8761293361050f8288611b72565b95611bc8565b6129438b806120f6565b939092613b64565b88611bc8565b9301906120f6565b9091600482036129ee576001600160a01b03831693843b1561022257612998945f92836040518098819582946306d61fe760e41b845260048401612703565b03925af192831561079d575f516020615bab5f395f51905f52936129da575b50604080519182526001600160a01b03909216602082015290819081015b0390a1565b806107975f6129e893610fa1565b5f6129b7565b60058203612a2b576001600160a01b03831693843b1561022257612998945f92836040518098819582946306d61fe760e41b845260048401612703565b60068203612a68576001600160a01b03831693843b1561022257612998945f92836040518098819582946306d61fe760e41b845260048401612703565b631092ef5760e11b5f5260045ffd5b929192612a8382612140565b91612a916040519384610fa1565b829481845281830111610222578281602093845f960137010152565b60018103612ad6575061269a92919060581b600160581b600160f81b0316600160f81b1761418f565b60028103612af3575061269a9291906001600160a01b031661410c565b60038103612b1e575050612b188280612b1261050f61269a9686611b72565b93611b80565b9161405e565b909160048203612bb057612b7d6129b7915f516020615bcb5f395f51905f5295612b565f516020615beb5f395f51905f525460581b90565b612b62611d9e82611cf7565b6001600160a01b03888116911614612b83575b503691612a77565b83613fa0565b612b8f612baa91611cf7565b8054640100000000600160c01b031916640100000000179055565b5f612b75565b60058203612c36575f516020615beb5f395f51905f525460581b5b612bd861209d8684611b9d565b906001600160f81b03198116600160f91b14612c0e575b5050612b7d6129b7915f516020615bcb5f395f51905f52953691612a77565b60081b6001600160e01b03191614612c27575f80612bef565b6313002bdd60e31b5f5260045ffd5b60068203612a68575f516020615beb5f395f51905f525460581b612bcb565b60405190612c6282610f6a565b5f6020838281520152565b612c81818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612d31575b81612d1c575b81612d03575b50611e345760ff60f81b16600160f81b8114159081612cf9575b50612cf3576001600160e01b031916612cee576001600160501b031916612cea57600190565b5f90565b505f90565b50505f90565b905015155f612cc4565b6001600160f81b031916607f60f91b141590505f612caa565b6001600160f81b031980821614159150612ca4565b6001600160f81b0319811615159150612c9e565b91612d559161023195949361418f565b61450f565b9061269a92916142f0565b60071115612cea57600190565b612e2e90612e6a90612d8d6001600160a01b03823516611de8565b90612e3c6020820135612e2e612daf612da960408601866120f6565b906145a1565b93612dc0612da960608301836120f6565b90608081013560a082013590612de2612da960c08501359460e08101906120f6565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b03601f198101835282610fa1565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b612ebd612eb85f356001600160e01b031916611e57565b612545565b80516001600160a01b0390612ed3908216611de8565b16156130405780516060906001600160a01b0390612ef2908216611de8565b1660018114158061302f575b15612fe35750508051612f1d906001600160a01b0316369034906139b5565b60408201516001600160f81b03191680612fa357506020820151612f49906001600160a01b03166145ac565b92905b15612f9b57516001600160a01b03169060018214158281612f86575b50612f76575b825160208401f35b612f7f91613a7e565b5f80612f6e565b6001600160a01b03908116141590505f612f68565b825160208401fd5b6001600160f81b031990811603612fd4576020820151612fcd906001600160a01b03163690613a34565b9290612f4c565b632d6a6bb760e01b5f5260045ffd5b6001600160a01b0303612f1d57337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614612f1d576348f5c3ed60e01b5f5260045ffd5b506001600160a01b03811415612efe565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9182358060f81c805f146130cb57806001146130be576002146130a8575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b9092608092611ed89694835260018060a01b0316602083015260408201528160608201520191611edb565b61311d65ffffffffffff939561312997958785856145ee565b969295919890986146dd565b50911642109081156131a6575b506131925761314a613174916020976131b8565b60405163392dffaf60e01b8152978896879586959193916001600160e01b031916600487016130d9565b03916001600160a01b03165afa90811561079d575f91611fe1575090565b506001600160e01b03199695505050505050565b65ffffffffffff91501642115f613136565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c8383526040820152604081526131f7606082610fa1565b519020901561320957611ed89061481b565b611ed890614709565b90818060081b9160ff839260f01c1660021461322a57565b6001600160d81b031983169150565b9080601f8301121561022257816020611ed893359101612a77565b919091610120818403126102225761326a610fd1565b9261327482610226565b84526020820135602085015260408201356001600160401b038111610222578161329f918401613239565b604085015260608201356001600160401b03811161022257816132c3918401613239565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b0381116102225781613305918401613239565b60e08501526101008201356001600160401b038111610222576133289201613239565b610100830152565b90816020910312610222575190565b80516001600160a01b03168252611ed891602082015160208201526101006133c061339061337e60408601516101206040870152610120860190610d2c565b60608601518582036060870152610d2c565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d2c565b92015190610100818403910152610d2c565b9392916133ef90604092865260606020870152606086019061333f565b930152565b9291906133ef60209160408652604086019061333f565b9290925f9261341a3682613254565b916134296101008301836120f6565b918193835f936020821015806135ef575b6135b0575b5050506001600160f81b031916600160f81b145b613589575b506001600160f81b03198616600160f81b036134ef575050604051639700320360e01b815293602092859283915f91839161349691600484016133f4565b039260581c6001600160a01b03165af190811561079d57611ed8925f926134be575b50614c75565b6134e191925060203d6020116134e8575b6134d98183610fa1565b810190613330565b905f6134b8565b503d6134cf565b909460081b93909291600160f01b61350c61202b61202488611e8d565b1661357a575f61352c61352660209661355699858a614a96565b94614c75565b604051630ccab7a160e01b8152979096889586948593926001600160e01b031916600485016133d2565b03926001600160a01b03165af190811561079d57611ed8925f926134be5750614c75565b6314b9743f60e01b5f5260045ffd5b9161359693955086614890565b9193916135a4368284612a77565b6101008401525f613458565b9195509250829196506135c39350611bab565b90916135d0368385612a77565b6101008501526134536135e66001923390612d72565b95905f8061343f565b507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a61361e61209d8484611b9d565b1461343a565b5f516020615beb5f395f51905f5254600a63ffffffff8260a81c16019063ffffffff82116136d55763ffffffff838116921682116136c65761366e9060c81c63ffffffff16610608565b10156105c9575f516020615beb5f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c1681116136bd5750565b61023190612288565b63e60fd64760e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615beb5f395f51905f525416175f516020615beb5f395f51905f5255604051906001600160581b0319168152a1565b92949093919361376161278685611cf7565b5f516020615beb5f395f51905f525460a81c63ffffffff169063ffffffff808316911614613959575b506020810180516001600160a01b031615613950575b5f516020615beb5f395f51905f525460a81c63ffffffff1663ffffffff6137ce610608855163ffffffff1690565b911614801590613924575b6105c957613827613834926137ed87611cf7565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613913575b5050506001600160f81b03198116600160f81b036138f05760581c6001600160a01b031690813b15610222576040516306d61fe760e41b8152925f9184918291613895919060048401612703565b038183855af190811561079d575f516020615bab5f395f51905f52926129d5926138dc575b5060408051600181526001600160a01b03909216602083015290918291820190565b806107975f6138ea93610fa1565b5f6138ba565b91506001600160f81b03198216600160f91b0361245b576102319160081b614e5d565b61391c92613cec565b5f8080613847565b5061393161278686611cf7565b63ffffffff613947610608855163ffffffff1690565b911610156137d9565b600181526137a0565b61396b9060010163ffffffff16612288565b5f61378a565b60409081516139808382610fa1565b600681526512d95c9b995b60d21b6020820152916139a081519182610fa1565b6005815264181719971960d91b602082015290565b916139dc925f8080946040519687958694859363d68f602560e01b85523360048601611efb565b03926001600160a01b03165af190811561079d575f916139fa575090565b611ed891503d805f833e6107bb8183610fa1565b5f92836139dc95936040519687958694859363d68f602560e01b85523360048601611efb565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561022257604051630b9dfbed60e11b815260206004820152915f918391829084908290613abb906024830190610d2c565b03925af1801561079d57613acc5750565b5f61023191610fa1565b8051156122e45760200190565b80518210156122e45760209160051b010190565b909593919492965f5b87811015613b5057600190613b4a8a89613b368489613b2f828060051b8c013595613b2a87610946565b613ae3565b51946122cd565b90613b42868d8d6122cd565b94909361374f565b01613b00565b509650505050505050565b90156122e45790565b9293929091906001600160a01b03821615613cdd575b613b8390611e57565b93613baf613ba2613b948684613b5b565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b03198516613cb5576001600160a01b03841691613bd691908190611be7565b823b1561022257613c00925f92836040518096819582946306d61fe760e41b845260048401612703565b03925af194851561079d57613c64613c849360019361023198613ca1575b5060408051600381526001600160a01b03881660208201525f516020615bab5f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107975f613caf93610fa1565b5f613c1e565b50909390506001600160f81b031980841603612fd4576001613c8491613c6461023196613c48565b6001600160a01b039150613b7a565b6001600160a01b0316919082158015613ea0575b6128635760405163d60b347f60e01b8152306004820152602081602481875afa90811561079d575f91613e81575b50613dc5579080613d3e92611be7565b9190813b15610222576040516306d61fe760e41b8152925f9184918291613d69919060048401612703565b038183855af190811561079d575f516020615bab5f395f51905f52926129d592613db1575b505b60408051600481526001600160a01b03909216602083015290918291820190565b806107975f613dbf93610fa1565b5f613d8e565b81151580613e62575b613dec575b50506129d55f516020615bab5f395f51905f5291613d90565b9080613df792611be7565b9190813b15610222576040516306d61fe760e41b8152925f9184918291613e22919060048401612703565b038183855af190811561079d575f516020615bab5f395f51905f52926129d592613e4e575b5091613dd3565b806107975f613e5c93610fa1565b5f613e47565b506001600160f81b031980613e7a613b948585613b5b565b1614613dce565b613e9a915060203d6020116107f2576107e48183610fa1565b5f613d2e565b5060018314613d00565b92613eb59084615169565b81613f045750505f80916040518260208201916306d61fe760e41b8352613eee81612e2e60248201604090602081525f60208201520190565b51926001600160a01b03165af15061269a61230a565b6001600160a01b039092169190823b156102225761268b925f92836040518096819582946306d61fe760e41b845260048401612703565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a91606091613f6d82610ca883611d2e565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f806040519361400085613ff26020820196638a91b0e360e01b88526020602484018181520190610d2c565b03601f198101875286610fa1565b6040519361400f602086610fa1565b828552602085019583908a905f368a375193f1913d9081614056575b815f9293523e604080516001600160a01b0390951685528115156020860152909390819081016129d5565b5f915061402b565b61406b9093929193611e57565b80546001600160a01b031981168255600190910180546001600160a01b039092169490929091906001600160f81b0319605883901b16156140bb575b505081546001600160a81b03191690915550565b6140d9926140ca913691612a77565b906001600160a01b0316613fa0565b50805460408051600381526001600160a01b0390921660208301525f516020615bcb5f395f51905f5291a15f80806140a7565b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205260409081902080546001600160a01b0319811690915590921694935f516020615bcb5f395f51905f529361417f9161417991369190612a77565b82613fa0565b50815190600282526020820152a1565b9291906141bf6141ad5f516020615beb5f395f51905f525460581b90565b6001600160581b031980871691161490565b612c27576141cf611d9e85611cf7565b936141f06141dc82611cf7565b8054640100000000600160c01b0319169055565b6001600160f81b03198116600160f81b0361423357916138ba6141796129d5935f516020615bcb5f395f51905f529560018060a01b039060581c16933691612a77565b91506001600160f81b03198216600160f91b0361245b576102319160081b6151ef565b604080519091906142678382610fa1565b6001815291601f1901825f5b82811061427f57505050565b806060602080938501015201614273565b9061429a82610fe1565b6142a76040519182610fa1565b82815280926142b8601f1991610fe1565b01905f5b8281106142c857505050565b8060606020809385010152016142bc565b906040611ed8925f81528160208201520190610d2c565b600881901b9291906001600160f81b03198116600160f81b036143835750906143189161542d565b90916001600160f81b031981166143335750611ed891615545565b6001600160f81b031916600160f81b0361435057611ed891615499565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b0319811661443b5750906143a0916153af565b916143a9614256565b956001600160f81b031981166143d657506143c3936153f7565b6143cc83613ad6565b5261269a82613ad6565b6001600160f81b031916600160f81b03614350576143f3936153d0565b6143fc84613ad6565b52610231577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76129d561442e84613ad6565b51604051918291826142d9565b909391906001600160f81b0319908116036143505761446561446b9161445f614256565b95615387565b91613a59565b61447785939293613ad6565b526001600160f81b03198116600160f81b036144c257501561449557565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76129d561442e84613ad6565b6001600160f81b031916614350576102315760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b9091906001600160a01b031680158015614597575b6128635781156122e4575f516020615bcb5f395f51905f52926129d5926001600160f81b03198235811614614577575b505060408051600481526001600160a01b03909216602083015290918291820190565b614588816141799261458f94611be7565b3691612a77565b505f80614554565b5060018114614524565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b9491848461466f92969593966040519061460782610f85565b5f82525f602083015260408201995f8b52614669606084019a8b925f84525f60808701525f60a0870152606060c087015261465a60e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b526155d0565b60ff80614688614682613b948786613b5b565b60f81c90565b16036146ce576146b76146a2846146b2956146c794611be7565b9490955163ffffffff60e01b1690565b611e8d565b5460101c6001600160a01b031690565b9351929190565b63b32eeb6960e01b5f5260045ffd5b8065ffffffffffff8260a01c169182156001146146fb575b60d01c92565b65ffffffffffff92506146f5565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615614794575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220614777565b60a0614825613971565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a526042601820905f603a52565b9190939293601481019160141161022257803560601c928291906148b2612c55565b602081018690525f516020615beb5f395f51905f525460a81c63ffffffff168082526001600160a01b03909616979091906148ed85806120f6565b6148f6916145a1565b9860348501996149068b886120f6565b61490f916145a1565b90605487019961491f8b8a6120f6565b614928916145a1565b604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c505602082019081526001600160581b03198a169282019290925263ffffffff9390931660608401526001600160a01b0395909516608083015260a082019290925260c081019290925260e08083019190915281526149ac61010082610fa1565b519020905f1461050961029b98614a0d6094986128e1976149ee61287b9761050f97614a26576149db9061481b565b6149e860748d01856120f6565b9161583e565b9e614a046149fc84806120f6565b9290946120f6565b9390928a61374f565b614a20614a1a828b6120f6565b906159dd565b886120f6565b614a2f90614709565b6149db565b80548210156122e4575f5260205f2001905f90565b356001600160c01b0319811692919060088210614a64575050565b6001600160c01b031960089290920360031b82901b16169150565b604090611ed893928152816020820152019061333f565b93929190935f926001614aa883611e8d565b015f5b8154811015614c3857614ad9614ad1614ac48385614a34565b90549060031b1c60501b90565b908160501c90565b939095614af5614aef614682613b948585613b5b565b60ff1690565b808403614c0a5750908181614b2e614b22614b1c614b1684614b4c98611c03565b90614a49565b60c01c90565b6001600160401b031690565b600901918c610100614b44614588868686611c14565b910152611ca9565b939093955b600160f01b1615614b69575b50600101939193614aab565b604051633894f6e760e11b81529196906020908390815f81614b998f6001600160e01b03198d1660048401614a7f565b03926001600160a01b03165af191821561079d575f92614bea575b506001600160a01b038216614bd657600191614bcf91614c75565b9590614b5d565b631f24c1fb60e11b5f52600487905260245ffd5b614c0391925060203d81116134e8576134d98183610fa1565b905f614bb4565b9196909491831115614c2557630760bdcf60e11b5f5260045ffd5b614c2d6122f6565b6101008b0152614b51565b505091929460ff80614c50614682613b948789613b5b565b16036146ce57610100614c6d614588856146b796611ed898611be7565b910152611e8d565b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114614ca5575050600190565b65ffffffffffff60a01b8216916001600160d01b03198082169083168415614d25575b65ffffffffffff60a01b84168015614d15575b858110908618028086189514614d04575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b9450614cec565b5065ffffffffffff60a01b614cdb565b65ffffffffffff60a01b9450614cc8565b903590601e198136030182121561022257018035906001600160401b03821161022257602001918160051b3603831361022257565b8054905f815581614d7a575050565b5f5260205f20908101905b818110614d90575050565b5f8155600101614d85565b356001600160501b0319811692919060168210614db6575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f4a57614df391600182018155614a34565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b9092809260209483528483013701015f815290565b356001600160f01b0319811692919060028210614e42575050565b6001600160f01b031960029290920360031b82901b16169150565b9190614e699080614d36565b9260fe84118015615161575b615152576001614e8482611e8d565b0154615139575b5f1984015f5b818110614ffb575090614f50614f498387614ee9614f3a614f2161202b614f1b614f1587614f6c9e9f8e614f10614f7a9f8f90611de86127f56127ef614edb614ee19489896122cd565b90611c3f565b9a8b91611e8d565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6122cd565b90611c6d565b90614e27565b614f2a88611e8d565b9060f01c61ffff19825416179055565b6001600160a01b0316966122cd565b8091611c50565b6040519586939092906001600160e01b03191660208501614e12565b03601f198101845283610fa1565b803b15610222575f614fa092604051809481926306d61fe760e41b8352600483016121e2565b038183855af190811561079d575f516020615bab5f395f51905f52926129d592614fe7575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107975f614ff593610fa1565b5f614fc5565b61509690615041600161500d86611e8d565b0161503b61502e615028615022868d8c6122cd565b90611c31565b90614d9b565b6001600160501b03191690565b90614dd1565b61505b611de8611de86127f56127ef614edb868d8c6122cd565b615069614f49838a896122cd565b60405194918591615088916001600160e01b03198a1660208501614e12565b03601f198101855284610fa1565b803b15610222576040516306d61fe760e41b8152925f9184918290849082906150c290600483016121e2565b03925af191821561079d57600192615125575b505f516020615bab5f395f51905f5261511c6150fb6127f56127ef614edb868d8c6122cd565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a101614e91565b806107975f61513393610fa1565b5f6150d5565b61514d600161514783611e8d565b01614d6b565b614e8b565b63b62d956d60e01b5f5260045ffd5b508315614e75565b5f516020615bab5f395f51905f52916040916001600160a01b038216156151e6575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b6001915061518b565b91906151fa83611e8d565b916152058280614d36565b9190506001840191600183540103615378575f5b82548110156152b657805f516020615bcb5f395f51905f526152ad8661528b612e2e6141798c61526f88615269615259614ad18f60019e614ac491614a34565b90508c8060a01b03169780614d36565b906122cd565b6040519485939092906001600160e01b03191660208501614e12565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a101615219565b509361531991506102319392615314614f6c926152d7600161514783611e8d565b8554614f50906152f29060101c6001600160a01b0316611de8565b936153096153008280614d36565b91909280614d36565b5f19019290506122cd565b613fa0565b5080545f516020615bcb5f395f51905f5290615365906153449060101c6001600160a01b0316611de8565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b63013dcc8d60e31b5f5260045ffd5b9160138211156153a257823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b9060338111156153a257813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af115615424573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c176153a257830160208101938135938461545157505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c176153a2578061545957505050565b91906154a481614290565b925f5b8281106154b357505050565b806154dd60019260051b8401358401604081013581019060208235920190602081013590356153d0565b6154e78389613ae3565b52156154f4575b016154a7565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb761553d6155228389613ae3565b51604051918291858352604060208401526040830190610d2c565b0390a16154ee565b919061555081614290565b925f5b82811061555f57505050565b8061558960019260051b8401358401604081013581019060208235920190602081013590356153f7565b6155938288613ae3565b5261559e8187613ae3565b5001615553565b9092608092611ed89594835260018060a01b0316602083015260408201528160608201520190610d2c565b91606083019060016156256155ec845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b85811061563c5750505050505050565b61564c614ad1614ac48385614a34565b6001600160a01b031660a0890190815260808901949091615675906001600160f01b0319168652565b61568f615688614682613b948985613b5b565b60ff168a52565b61569d614aef8a5160ff1690565b80840361580c57508581816156c2614b22614b1c614b166157179b9c6156ea98611c03565b8c60c06156dd61458860208401948086526009018688611c14565b9101525160090191611ca9565b949094955b51600160f11b90615709906001600160f01b03191661202b565b166001600160f01b03191690565b15615726575b5060010161562c565b51615739906001600160a01b0316611de8565b602061575f615752615752895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b815295869490938593849361579e9390926001600160a01b031690600486016155a5565b03915afa90811561079d575f916157ee575b506001600160a01b0381166157da57906001916157d260408a01918251614c75565b90529061571d565b631f24c1fb60e11b5f52600482905260245ffd5b615806915060203d81116134e8576134d98183610fa1565b5f6157b0565b90949083111561582557630760bdcf60e11b5f5260045ffd5b61571790615834365f88612a77565b60c08b01526156ef565b5f516020615beb5f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b036158f9579161589e939161587f611de860209560581c90565b9160405195869485938493637aa8f17760e11b85523060048601611efb565b03915afa90811561079d575f916158da575b505b6001600160e01b0319166374eca2c160e11b016158cb57565b6362467c7760e11b5f5260045ffd5b6158f3915060203d60201161200357611ffb8183610fa1565b5f6158b0565b9094509091906001600160f81b03198116600160f91b0361245b576020916159279160081b958430886145ee565b60405163392dffaf60e01b8152929792958694938593849361595a93909230906001600160e01b031916600487016130d9565b03916001600160a01b03165afa90811561079d575f9161597b575b506158b2565b615994915060203d60201161200357611ffb8183610fa1565b5f615975565b156159a157565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c69642073656c6563746f724461746160601b6044820152606490fd5b6159ea61050f8383611b72565b9160048110156159f957505050565b602c8110615b9b57602c820190615a19611de86127f56127ef8487611bc8565b615a43615a35613ba2613b94615a2f87806120f6565b90613b5b565b6001600160f81b0319161590565b80615af6575b611de86127f56127ef85615a9e6102319a87615a82611de86127f56127ef8f9d6128e89f9e8f604c9f6129519f615aa4575b5050611c98565b615a8c8b806120f6565b9390926001600160a01b031690613b64565b88611c98565b6128e8615ae8615aef93606c860190615ae3615ad2611de86127f56127ef615acc87876120f6565b90611bd9565b9586906001600160a01b0316615169565b6120f6565b8091611c7b565b8f87615a7b565b5060405163ecd0596160e01b81526002600482015290949291906020816024816001600160a01b038a165afa93841561079d576127f56127ef84615a9e611de8948b615a82611de86127f56102319f8f9c6128e89f9d8f604c9f936129519f946127ef955f91615b7c575b509f50505050505050505097509a5050959650505050615a49565b615b95915060203d6020116107f2576107e48183610fa1565b5f615b61565b6102319250600491501461599a56fed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" export const KERNEL_V07_V3_3_ACCOUNT_V3_LOGIC_CREATECALL: Hex = - "0x0000000000000000000000000000000000000000000000000000000000000000610140806040523461020a576020816162458038038091610020828561020e565b83398101031261020a57516001600160a01b038116810361020a57306080524660a05260a060405161005360408261020e565b6006815260208101906512d95c9b995b60d21b82526040519161007760408461020e565b60058352602083019164181719971960d91b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b82526004815261010160248261020e565b5190516001600160581b031981169190601582106101ea575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615fff9081610246823960805181615765015260a05181615788015260c051816157f8015260e0518161581e015261010051816157440152610120518181816103c4015281816106ac0152818161086601528181610ac401528181610e600152818161115d015281816112ee0152818161132901528181611528015281816119b901528181611aeb015281816125b701526132100152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761023157604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b366131b65761001b613185565b005b5f3560e01c8063112d3a7d1461021c578063150b7a02146102175780631626ba7e1461021257806319822f7c1461020d5780631f1b92e3146102085780633659cfe6146102035780633c3b752b146101fe57806352141cd9146101f957806357b3a5f4146101f45780636e6fa0c6146101ef578063721e67f4146101ea57806384b0196e146101e55780638dd7712f146101e057806390ef8862146101db5780639198bdf5146101d65780639517e29f146101d15780639cfd7cff146101cc578063a65d69d4146101c7578063a71763a8146101c2578063adb610a3146101bd578063b8afe17d146101b8578063b9b82941146101b3578063bc197c81146101ae578063c3e58978146101a9578063d03c7914146101a4578063d691c9641461019f578063e6f3d50a1461019a578063e9ae5c5314610195578063f1f7f0f914610190578063f23a6e611461018b578063f2dc691d146101865763fc9c5dec0361000e57611cbd565b611c9f565b611c45565b611c0f565b611adf565b61195f565b61187d565b611830565b61175d565b61164c565b6114f5565b61147f565b61144d565b61131d565b6112d9565b611281565b611151565b61103a565b610f2b565b610e30565b610d92565b610d0c565b610cb1565b610bfe565b610a5e565b6109c8565b61084b565b610695565b610390565b61032f565b6102d5565b6102af565b6001600160a01b0381160361023257565b5f80fd5b359061024182610221565b565b9181601f84011215610232578235916001600160401b038311610232576020838186019501011161023257565b6060600319820112610232576004359160243561028c81610221565b91604435906001600160401b038211610232576102ab91600401610243565b9091565b346102325760206102cb6102c236610270565b92919091611f10565b6040519015158152f35b34610232576080366003190112610232576102f1600435610221565b6102fc602435610221565b6064356001600160401b0381116102325761031b903690600401610243565b5050604051630a85bd0160e11b8152602090f35b34610232576040366003190112610232576004356024356001600160401b0381116102325760209161036861036e923690600401610243565b91613382565b6040516001600160e01b03199091168152f35b90816101209103126102325790565b6060366003190112610232576004356001600160401b038111610232576103bb903690600401610381565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662576103ff60208201356135ce565b9092919084836001600160f81b0319861615610649575b8261042193946137c7565b9361044661043661043184611ea2565b611fda565b946001600160f81b031916151590565b938480610608575b6105f957602001516001600160a01b0316801591819083806105f2575b6104f2576001926104866104a5925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b149081156105ea575b501561055d5782610501575b50506104f257816104dc925b6104e0575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104cb565b631a0a9b9f60e21b5f5260045ffd5b61055692506105529161053661053061052a61051f61054b95611ed9565b936060810190612006565b90611d1d565b90611e6c565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f806104ba565b829192916105b7575b506104f25761052a81606061057c930190612006565b638dd7712f60e01b916001600160e01b03199161059891611e6c565b16036105a857816104dc926104c6565b63dbbb044b60e01b5f5260045ffd5b6105e4915061054b6105cb61055292611ed9565b6105366105306105de6060880188612006565b90611d0c565b5f610566565b90505f6104ae565b508661046b565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106416106385f516020615fdf5f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061044e565b5f516020615fdf5f395f51905f525460581b9250610416565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361023257565b359063ffffffff8216820361023257565b6020366003190112610232576106a9610671565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610841575b15610838576107116107056106ff5f516020615fdf5f395f51905f525460581b90565b60581c90565b6001600160a01b031690565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610809575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061076e36343360048501612164565b038183865af19283156107dc575f936107e1575b5061078c90613a5b565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906107b890600483016121ad565b03925af180156107dc576107c857005b806107d65f61001b93610fe3565b80610d64565b6120bc565b61078c919350610802903d805f833e6107fa8183610fe3565b8101906120e2565b9290610782565b61082b915060203d602011610831575b6108238183610fe3565b8101906120a4565b5f61073b565b503d610819565b61001b90613a5b565b50303314156106dc565b60203660031901126102325760043561086381610221565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061097c575b15610973576108b96107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610954575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061091636343360048501612164565b038183865af19283156107dc575f93610934575b5061078c906121be565b61078c91935061094d903d805f833e6107fa8183610fe3565b929061092a565b61096d915060203d602011610831576108238183610fe3565b5f6108e3565b61001b906121be565b5030331415610896565b6001600160581b031981160361023257565b9181601f84011215610232578235916001600160401b038311610232576020808501948460051b01011161023257565b346102325760a0366003190112610232576004356109e581610986565b6024356109f181610221565b6044356001600160401b03811161023257610a10903690600401610243565b6064939193356001600160401b03811161023257610a32903690600401610243565b91608435956001600160401b03871161023257610a5661001b973690600401610998565b969095612325565b608036600319011261023257600435610a7681610986565b602435610a8281610221565b6044356001600160401b03811161023257610aa1903690600401610243565b6064356001600160401b03811161023257610ac0903690600401610243565b91337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610be2575b15610bd457610b176107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610bb5575b50156106625760405163d68f602560e01b8152956001600160a01b039190911694905f8780610b7536343360048501612164565b0381838a5af19687156107dc575f97610b95575b5061078c9596976124a8565b61078c969750610bae903d805f833e6107fa8183610fe3565b9695610b89565b610bce915060203d602011610831576108238183610fe3565b5f610b41565b919361001b959391936124a8565b5030331415610af4565b6001600160e01b031981160361023257565b34610232576020366003190112610232576104dc610c3f600435610c2181610bec565b5f60408051610c2f81610f71565b8281528260208201520152612038565b600160405191610c4e83610f71565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461023257604036600319011261023257602060ff610d00600435610cd581610986565b610cea60243591610ce583610bec565b611ed9565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610232576020366003190112610232576020610d41600435610d2e81610221565b5f604051610d3b81610f91565b52613335565b60405190610d4e82610f91565b546001600160a01b031690819052604051908152f35b5f91031261023257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610232575f36600319011261023257610dd1610ddf610db0613da7565b604092919251938493600f60f81b855260e0602086015260e0850190610d6e565b908382036040850152610d6e565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610e17575050500390f35b8251845285945060209384019390920191600101610e09565b6040366003190112610232576004356001600160401b03811161023257610e5b903690600401610381565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575f908152602081905260409020546001600160a01b03169060609060018314159081610efb575b610ed0610ec9826060610ed7940190612006565b8091611d2b565b9030613e8f565b5015610eec57610ee357005b61001b91613eb4565b63f21e646b60e01b5f5260045ffd5b9150610ed7610ed0610ec9610f21610f19610ec96060880188612006565b903489613e44565b9492505050610eb5565b34610232575f36600319011261023257602063ffffffff5f516020615fdf5f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f8c57604052565b610f5d565b602081019081106001600160401b03821117610f8c57604052565b604081019081106001600160401b03821117610f8c57604052565b61012081019081106001600160401b03821117610f8c57604052565b90601f801991011681019081106001600160401b03821117610f8c57604052565b60405190610241604083610fe3565b6040519061024161012083610fe3565b6001600160401b038111610f8c5760051b60200190565b6080366003190112610232576004356001600160401b03811161023257611065903690600401610998565b602435916001600160401b038311610232573660238401121561023257826004013561109081611023565b9361109e6040519586610fe3565b8185526024602086019260061b8201019036821161023257602401915b818310611110575050506044356001600160401b038111610232576110e4903690600401610998565b90606435946001600160401b0386116102325761110861001b963690600401610998565b9590946125ad565b604083360312610232576020604091825161112a81610fac565b61113386610684565b81528286013561114281610221565b838201528152019201916110bb565b61115a36610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611277575b1561126d576111b06107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161124e575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f858061120e36343360048501612164565b038183885af19485156107dc575f9561122e575b5061078c93949561277c565b61078c949550611247903d805f833e6107fa8183610fe3565b9493611222565b611267915060203d602011610831576108238183610fe3565b5f6111da565b9161001b9361277c565b503033141561118d565b34610232575f366003190112610232576104dc6040516112a2604082610fe3565b601681527535b2b93732b61730b23b30b731b2b2173b181719971960511b6020820152604051918291602083526020830190610d6e565b34610232575f366003190112610232576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b61132636610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611443575b156114395761137c6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161141a575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f85806113da36343360048501612164565b038183885af19485156107dc575f956113fa575b5061078c939495612ad0565b61078c949550611413903d805f833e6107fa8183610fe3565b94936113ee565b611433915060203d602011610831576108238183610fe3565b5f6113a6565b9161001b93612ad0565b5030331415611359565b34610232575f36600319011261023257602063ffffffff5f516020615fdf5f395f51905f525460a81c16604051908152f35b346102325760203660031901126102325760406114af6004356114a181610986565b6114a9612cfa565b50611ea2565b8151906114bb82610fac565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b8015150361023257565b60603660031901126102325760043561150d81610986565b60243561151981610bec565b604435611525816114eb565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611642575b156116385761157b6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611619575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f84806115d936343360048501612164565b038183875af19384156107dc575f946115f9575b5061078c9293946143db565b61078c939450611612903d805f833e6107fa8183610fe3565b93926115ed565b611632915060203d602011610831576108238183610fe3565b5f6115a5565b9061001b926143db565b5030331415611558565b346102325760a036600319011261023257611668600435610221565b611673602435610221565b6044356001600160401b03811161023257611692903690600401610998565b50506064356001600160401b038111610232576116b3903690600401610998565b50506084356001600160401b038111610232576116d4903690600401610243565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b81811061173d5750505090565b82516001600160501b031916845260209384019390920191600101611730565b346102325760203660031901126102325761179c60043561177d81610bec565b60606040805161178c81610f71565b5f81525f6020820152015261206e565b6001604051916117ab83610f71565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b81811061180d576104dc85876117fc81880382610fe3565b6040820152604051918291826116e8565b825460501b6001600160501b0319168452602090930192600192830192016117e4565b346102325760203660031901126102325760206102cb600435612d12565b9060406003198301126102325760043591602435906001600160401b038211610232576102ab91600401610243565b6118863661184e565b90916001600160a01b0361189933613335565b54169182156119505760609060018414159485611939575b6118bb9293614661565b92611929575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b8282106118fa57505050500390f35b919360019193955060206119198192603f198a82030186528851610d6e565b96019201920185949391926118eb565b61193291613eb4565b5f806118c1565b6118bb9250611949363487613deb565b92506118b1565b63710c949760e01b5f5260045ffd5b60603660031901126102325760043561197781610986565b6024356001600160401b03811161023257611996903690600401610243565b6044356001600160401b038111610232576119b5903690600401610243565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611ad5575b15611ac957611a0c6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611aaa575b50156106625760405163d68f602560e01b8152946001600160a01b039190911693905f8680611a6a36343360048501612164565b038183895af19586156107dc575f96611a8a575b5061078c949596612dea565b61078c959650611aa3903d805f833e6107fa8183610fe3565b9594611a7e565b611ac3915060203d602011610831576108238183610fe3565b5f611a36565b91909261001b94612dea565b50303314156119e9565b611ae83661184e565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611c05575b15611bfb57611b3e6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611bdc575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f8480611b9c36343360048501612164565b038183875af19384156107dc575f94611bbc575b5061078c92939461307d565b61078c939450611bd5903d805f833e6107fa8183610fe3565b9392611bb0565b611bf5915060203d602011610831576108238183610fe3565b5f611b68565b9061001b9261307d565b5030331415611b1b565b34610232575f3660031901126102325760205f516020615fdf5f395f51905f525460581b604051906001600160581b0319168152f35b346102325760a036600319011261023257611c61600435610221565b611c6c602435610221565b6084356001600160401b03811161023257611c8b903690600401610243565b505060405163f23a6e6160e01b8152602090f35b346102325760203660031901126102325760206102cb600435613088565b34610232576040366003190112610232576004356001600160401b03811161023257611d04611cf26020923690600401610381565b60243590611cff82610221565b613095565b604051908152f35b906008116102325760040190600490565b906004116102325790600490565b909291928360041161023257831161023257600401916003190190565b906018116102325760040190601490565b906014116102325790601490565b906020116102325790602090565b90929192836020116102325783116102325760200191601f190190565b909291928360011161023257831161023257600101915f190190565b906009116102325760010190600890565b909291928360091161023257831161023257600901916008190190565b906016116102325790601690565b906016116102325760020190601490565b909291928360161161023257831161023257601601916015190190565b906002116102325790600290565b909291928360141161023257831161023257601401916013190190565b90602c116102325760180190601490565b90939293848311610232578411610232578101920390565b356001600160e01b0319811692919060048210611e87575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611f5f57506001600160a01b0392611f599250611f49915060581b600160581b600160f81b0316600160f81b17611ea2565b5460201c6001600160a01b031690565b16151590565b60028103611f9357506001600160a01b0392611f5992506107059150611f86908416613335565b546001600160a01b031690565b600303611fd357611fb4611faf610530600193611fc295611d1d565b612038565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b90604051611fe781610fac565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561023257018035906001600160401b0382116102325760200191813603831361023257565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b9081602091031261023257516120b9816114eb565b90565b6040513d5f823e3d90fd5b6001600160401b038111610f8c57601f01601f191660200190565b602081830312610232578051906001600160401b038211610232570181601f8201121561023257805190612115826120c7565b926121236040519485610fe3565b8284526020838301011161023257815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b6120b9939260609260018060a01b03168252602082015281604082015201905f612144565b6120b9949260609260018060a01b0316825260208201528160408201520191612144565b9060206120b9928181520190610d6e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b60405190612220602083610fe3565b5f8252565b90813b5f612232826120c7565b936122406040519586610fe3565b82855260208501903c565b80516020909101516001600160f01b031981169291906002821061226d575050565b6001600160f01b031960029290920360031b82901b16169150565b5f516020615fdf5f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156122e4576102ab9160051b810190612006565b6122b9565b908092918237015f815290565b3d15612320573d90612307826120c7565b916123156040519384610fe3565b82523d5f602084013e565b606090565b94939291909695966001600160581b031961235e6123515f516020615fdf5f395f51905f525460581b90565b6001600160581b03191690565b1615801590612480575b612472576001600160581b03198616156104f2576001600160f81b03198616600160f81b14158061245a575b61244b57856123a56123f297613b20565b6123c66123b0611004565b60018152925b6001600160a01b03166020840152565b5f516020615fdf5f395f51905f52805463ffffffff60a81b1916600160a81b179055613b86565b613b86565b5f5b81811061240057505050565b5f8061240d8385876122cd565b9061241d604051809381936122e9565b039082305af161242b6122f6565b5015612439576001016123f4565b636534eae560e11b5f5260045260245ffd5b6361c4e91b60e11b5f5260045ffd5b506001600160f81b03198616600160f91b1415612394565b62dc149f60e41b5f5260045ffd5b5061ef0160f01b6001600160f01b03196124a161249c30612225565b61224b565b1614612368565b94939291906001600160581b03198616156104f2576001600160f81b03198616600160f81b141580612553575b61244b576124e286613b20565b6001600160a01b036124f6611f4988611ea2565b1615612505575b505050505050565b612548956123ed61252b5f516020615fdf5f395f51905f525463ffffffff9060a81c1690565b926123b66040519461253e604087610fe3565b63ffffffff168552565b5f80808080806124fd565b506001600160f81b03198616600160f91b14156124d5565b9060405161257881610f71565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b95909491939092337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580612721575b156127135761260a6107056106ff5f516020615fdf5f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f916126f4575b50156106625760405163d68f602560e01b8152966001600160a01b039190911695905f888061266836343360048501612164565b0381838b5af19788156107dc575f986126d4575b50612688969798613f2d565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906126b490600483016121ad565b03925af180156107dc576126c6575b50565b806107d65f61024193610fe3565b6126889798506126ed903d805f833e6107fa8183610fe3565b979661267c565b61270d915060203d602011610831576108238183610fe3565b5f612634565b919390929461024196613f2d565b50303314156125e7565b9160206120b9938181520191612144565b356bffffffffffffffffffffffff1981169291906014821061275c575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b9091600182036128f8575f516020615f9f5f395f51905f5293906054600160f81b600160581b600160f81b03605887901b1617916127c66127bc84611ea2565b5463ffffffff1690565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff8083169116146128e0575b5061285861283161070561282b61282561281e5f516020615fdf5f395f51905f525463ffffffff9060a81c1690565b9886611d59565b9061273c565b60601c90565b61284861283c611004565b63ffffffff9097168752565b6001600160a01b03166020860152565b612883601482019461286a8680612006565b61287a6034869493940189612006565b93909288613b86565b019160046128918483612006565b9050146128bf575b5050505b604080519182526001600160a01b03909216602082015290819081015b0390a1565b61053061052a6128d8946128d293612006565b90614376565b5f8080612899565b6128f29060010163ffffffff16612288565b5f6127ef565b6002820361296057806129555f516020615f9f5f395f51905f5295603461292f61070561282b612825601461295b99019588611d59565b9361294e8561293e8580612006565b906001600160a01b038c166142e5565b0190612006565b91614122565b61289d565b600382036129d657806129555f516020615f9f5f395f51905f529560386129ce61070561282b612825601861295b9901956129c88c8a6129b661070561282b612825876129b06105308288611d1d565b95611d48565b6129c08b80612006565b939092613f9a565b88611d48565b930190612006565b600482148015612a74575b8015612a6a575b15612a5b576001600160a01b03831693843b1561023257612a22945f92836040518098819582946306d61fe760e41b84526004840161272b565b03925af19283156107dc575f516020615f9f5f395f51905f5293612a47575b5061289d565b806107d65f612a5593610fe3565b5f612a41565b631092ef5760e11b5f5260045ffd5b50600682146129e8565b50600582146129e1565b359060208110612a8c575090565b5f199060200360031b1b1690565b929192612aa6826120c7565b91612ab46040519384610fe3565b829481845281830111610232578281602093845f960137010152565b909160018203612b41575f516020615fbf5f395f51905f5293612b1f91612b1991612b10600160f81b600160581b600160f81b03605889901b16176144a9565b505b3691612a9a565b83614509565b50604080519182526001600160a01b03909216602082015290819081016128ba565b60028203612bb1576001600160a01b038381165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902080546001600160a01b031981169091555f516020615fbf5f395f51905f5295612b1f93612b19939092165b50612b12565b919060038103612bd6575050610530612bd292612bcd92611d1d565b614445565b5050565b909160048203612c5f57612b19612b1f915f516020615fbf5f395f51905f5295612c0e5f516020615fdf5f395f51905f525460581b90565b612c1a611f4982611ea2565b6001600160a01b03888116911614612c325750612b12565b612c3e612c5991611ea2565b8054640100000000600160c01b031916640100000000179055565b5f612bab565b600582148015612cf0575b15612a5b575f516020615fdf5f395f51905f525460581b612c94612c8e8684611d67565b90612a7e565b906001600160f81b03198116600160f91b14612cc8575b5050612b19612b1f915f516020615fbf5f395f51905f5295612b12565b60081b6001600160e01b03191614612ce1575f80612cab565b6313002bdd60e31b5f5260045ffd5b5060068214612c6a565b60405190612d0782610fac565b5f6020838281520152565b612d26818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612dd6575b81612dc1575b81612da8575b50611fd35760ff60f81b16600160f81b8114159081612d9e575b50612d98576001600160e01b031916612d93576001600160501b031916612d8f57600190565b5f90565b505f90565b50505f90565b905015155f612d69565b6001600160f81b031916607f60f91b141590505f612d4f565b6001600160f81b031980821614159150612d49565b6001600160f81b0319811615159150612d43565b9094939291612df8826144a9565b916001600160f81b03198116600160f81b03612e70575f516020615fbf5f395f51905f5291612e46612e406102419899612e689460018060a01b039060581c16933691612a9a565b82614509565b5060408051600181526001600160a01b03909216602083015290918291820190565b0390a161490f565b9294919290506001600160f81b03198116600160f91b0361244b5760081b92612e988461206e565b94612ea38780614880565b949050600187019460018654010361306e5794956001600160e01b0319871695905f5b8654811015612f7c57805f516020615fbf5f395f51905f52612f738c612f51612f43612e408e612f318f99612f2b612f1b612f13612f068460019f6148b5565b90549060031b1c60501b90565b908160501c90565b90508c8060a01b03169780614880565b906122cd565b604094919451948593602085016148ca565b03601f198101835282610fe3565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a101612ec6565b509194509296612ff761300a916130056130699598612fa86001612fa26102419d61206e565b016148df565b8554612fe590612fc39060101c6001600160a01b0316610705565b93612fda612fd18280614880565b91909280614880565b5f19019290506122cd565b604095919551958693602085016148ca565b03601f198101845283610fe3565b614509565b5080545f516020615fbf5f395f51905f5290613056906130359060101c6001600160a01b0316610705565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b61490f565b63013dcc8d60e31b5f5260045ffd5b906126c39291614661565b60071115612d8f57600190565b612f439061317f906130b06001600160a01b03823516610705565b906131516020820135612f436130d26130cc6040860186612006565b9061499a565b936130e36130cc6060830183612006565b90608081013560a0820135906131056130cc60c08501359460e0810190612006565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b6131d26131cd5f356001600160e01b031916612038565b61256b565b80516001600160a01b03906131e8908216610705565b16156133265780516060906001600160a01b0316806002600160a01b031981016133045750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575b60408201516001600160f81b031916806132c45750602082015161326b906001600160a01b03166149a5565b92905b156132bc57516001600160a01b031690600182141582816132a8575b50613298575b825160208401f35b6132a191613eb4565b5f80613290565b6001600160a01b039150811614155f61328a565b825160208401fd5b6001600160f81b0319908116036132f55760208201516132ee906001600160a01b03163690613e6a565b929061326e565b632d6a6bb760e01b5f5260045ffd5b600103613312575b5061323f565b613320915036903490613deb565b5f61330c565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9081602091031261023257516120b981610bec565b9161338c916149e7565b919080836001600160f81b03198416156135ae575b60208110159182613577575b82613561575b50506133c161043184611ea2565b60208101516001600160a01b03906133da908216610705565b16158061354e575b6104f2576001600160f81b0319841615159081613515575b506105f9576001600160f81b03198316600160f81b0361348e5790613426602094939261344496614a39565b604051637aa8f17760e11b8152958694859384933360048601612189565b039160581c6001600160a01b03165afa9081156107dc575f91613465575090565b6120b9915060203d602011613487575b61347f8183610fe3565b81019061336d565b503d613475565b92916001600160f81b03198116600160f91b036134ee5760081b93600160f11b6134d16134c46134bd8861206e565b5460f01b90565b6001600160f01b03191690565b166134df576120b994614b77565b635b71057960e01b5f5260045ffd5b929391929091906001600160f81b03191661244b576120b99361351091614a39565b614a93565b5163ffffffff16905063ffffffff6135456106385f516020615fdf5f395f51905f525463ffffffff9060c81c1690565b9116105f6133fa565b506001600160f81b0319841615156133e2565b8192955061356f9350611d75565b925f806133b3565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a6135a7612c8e8385611d67565b14916133ad565b92506135c85f516020615fdf5f395f51905f525460581b90565b926133a1565b90818060081b9160ff839260f01c166002146135e657565b6001600160d81b031983169150565b9080601f83011215610232578160206120b993359101612a9a565b9190916101208184031261023257613626611013565b9261363082610236565b84526020820135602085015260408201356001600160401b038111610232578161365b9184016135f5565b604085015260608201356001600160401b038111610232578161367f9184016135f5565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b03811161023257816136c19184016135f5565b60e08501526101008201356001600160401b038111610232576136e492016135f5565b610100830152565b90816020910312610232575190565b80516001600160a01b031682526120b9916020820151602082015261010061377c61374c61373a60408601516101206040870152610120860190610d6e565b60608601518582036060870152610d6e565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d6e565b92015190610100818403910152610d6e565b9392916137ab9060409286526060602087015260608601906136fb565b930152565b9291906137ab6020916040865260408601906136fb565b9290925f926137d63682613610565b916137e5610100830183612006565b918193835f93602082101580613a26575b6139e7575b5050506001600160f81b031916600160f81b145b6139c0575b506001600160f81b03198616600160f81b036138ab575050604051639700320360e01b815293602092859283915f91839161385291600484016137b0565b039260581c6001600160a01b03165af19081156107dc576120b9925f9261387a575b50615053565b61389d91925060203d6020116138a4575b6138958183610fe3565b8101906136ec565b905f613874565b503d61388b565b909491939092916001600160f81b03198116600160f91b0361395c5760081b93600160f01b6138df6134c46134bd8861206e565b1661394d575f6138ff6138f960209661392999858a614e64565b94615053565b604051630ccab7a160e01b8152979096889586948593926001600160e01b0319166004850161378e565b03926001600160a01b03165af19081156107dc576120b9925f9261387a5750615053565b6314b9743f60e01b5f5260045ffd5b919350506001600160f81b03191661244b576139b190630b135d3f60e11b9361351063ffffffff60e01b946020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042090565b16036139bb575f90565b600190565b916139cd93955086614c2c565b9193916139db368284612a9a565b6101008401525f613814565b9195509250829196506139fa9350611d75565b9091613a07368385612a9a565b61010085015261380f613a1d6001923390613095565b95905f806137fb565b507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a613a55612c8e8484611d67565b146137f6565b5f516020615fdf5f395f51905f5254600a63ffffffff8260a81c16019063ffffffff8211613b0c5763ffffffff83811692168211613afd57613aa59060c81c63ffffffff16610638565b10156105f9575f516020615fdf5f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c168111613af45750565b61024190612288565b63e60fd64760e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615fdf5f395f51905f525416175f516020615fdf5f395f51905f5255604051906001600160581b0319168152a1565b929490939193613b986127bc85611ea2565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff808316911614613d8f575b506020810180516001600160a01b031615613d86575b5f516020615fdf5f395f51905f525460a81c63ffffffff1663ffffffff613c05610638855163ffffffff1690565b911614801590613d5a575b6105f957613c5e613c6b92613c2487611ea2565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613d49575b5050506001600160f81b03198116600160f81b03613d265760581c6001600160a01b031690813b15610232576040516306d61fe760e41b8152925f9184918291613ccc91906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92613d12575060408051600181526001600160a01b03909216602083015290918291820190565b806107d65f613d2093610fe3565b5f612e46565b91506001600160f81b03198216600160f91b0361244b576102419160081b6151a6565b613d5292614122565b5f8080613c7e565b50613d676127bc86611ea2565b63ffffffff613d7d610638855163ffffffff1690565b91161015613c10565b60018152613bd7565b613da19060010163ffffffff16612288565b5f613bc1565b6040908151613db68382610fe3565b600681526512d95c9b995b60d21b602082015291613dd681519182610fe3565b6005815264181719971960d91b602082015290565b91613e12925f8080946040519687958694859363d68f602560e01b85523360048601612189565b03926001600160a01b03165af19081156107dc575f91613e30575090565b6120b991503d805f833e6107fa8183610fe3565b5f9283613e1295936040519687958694859363d68f602560e01b85523360048601612189565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561023257604051630b9dfbed60e11b815260206004820152915f918391829084908290613ef1906024830190610d6e565b03925af180156107dc57613f025750565b5f61024191610fe3565b8051156122e45760200190565b80518210156122e45760209160051b010190565b909593919492965f5b87811015613f8657600190613f808a89613f6c8489613f65828060051b8c013595613f6087610986565b613f19565b51946122cd565b90613f78868d8d6122cd565b949093613b86565b01613f36565b509650505050505050565b90156122e45790565b9293929091906001600160a01b03821615614113575b613fb990612038565b93613fe5613fd8613fca8684613f91565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b031985166140eb576001600160a01b0384169161400c91908190611d92565b823b1561023257614036925f92836040518096819582946306d61fe760e41b84526004840161272b565b03925af19485156107dc5761409a6140ba93600193610241986140d7575b5060408051600381526001600160a01b03881660208201525f516020615f9f5f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107d65f6140e593610fe3565b5f614054565b50909390506001600160f81b0319808416036132f55760016140ba9161409a6102419661407e565b6001600160a01b039150613fb0565b6001600160a01b03169190821580156142db575b6142d65760405163d60b347f60e01b8152306004820152602081602481875afa9081156107dc575f916142b7575b506141fb57908061417492611d92565b9190813b15610232576040516306d61fe760e41b8152925f918491829161419f91906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba926141e7575b505b60408051600481526001600160a01b03909216602083015290918291820190565b806107d65f6141f593610fe3565b5f6141c4565b81151580614298575b614222575b50506128ba5f516020615f9f5f395f51905f52916141c6565b908061422d92611d92565b9190813b15610232576040516306d61fe760e41b8152925f918491829161425891906004840161272b565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92614284575b5091614209565b806107d65f61429293610fe3565b5f61427d565b506001600160f81b0319806142b0613fca8585613f91565b1614614204565b6142d0915060203d602011610831576108238183610fe3565b5f614164565b505050565b5060018314614136565b926142f0908461549e565b8161433f5750505f80916040518260208201916306d61fe760e41b835261432981612f4360248201604090602081525f60208201520190565b51926001600160a01b03165af1506126c36122f6565b6001600160a01b039092169190823b15610232576126b4925f92836040518096819582946306d61fe760e41b84526004840161272b565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a916060916143a882610cea83611ed9565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b907f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a9260609261440e83610cea83611ed9565b9115159160ff1981541660ff84161790556040519263ffffffff60e01b1683526001600160581b03191660208301526040820152a1565b61444f5f91612038565b80546001600160a01b031981168255600190910180546001600160a01b0390921693916001600160f81b0319605882901b1615614498575b5080546001600160a81b0319169055565b6001600160a01b031692505f614487565b906001600160581b03195f516020615fdf5f395f51905f525460581b166001600160581b0319831614612ce1576144f56001600160a01b036144ea84611ea2565b5460201c1692611ea2565b8054640100000000600160c01b0319169055565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f80604051936145698561455b6020820196638a91b0e360e01b88526020602484018181520190610d6e565b03601f198101875286610fe3565b60405193614578602086610fe3565b828552602085019583908a905f368a375193f1913d90816145bf575b815f9293523e604080516001600160a01b0390951685528115156020860152909390819081016128ba565b5f9150614594565b604080519091906145d88382610fe3565b6001815291601f1901825f5b8281106145f057505050565b8060606020809385010152016145e4565b9061460b82611023565b6146186040519182610fe3565b8281528092614629601f1991611023565b01905f5b82811061463957505050565b80606060208093850101520161462d565b9060406120b9925f81528160208201520190610d6e565b600881901b9291906001600160f81b03198116600160f81b036146f4575090614689916155ca565b90916001600160f81b031981166146a457506120b9916156e2565b6001600160f81b031916600160f81b036146c1576120b991615636565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b031981166147ac5750906147119161554c565b9161471a6145c7565b956001600160f81b03198116614747575061473493615594565b61473d83613f0c565b526126c382613f0c565b6001600160f81b031916600160f81b036146c1576147649361556d565b61476d84613f0c565b52610241577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128ba61479f84613f0c565b516040519182918261464a565b909391906001600160f81b0319908116036146c1576147d66147dc916147d06145c7565b95615524565b91613e8f565b6147e885939293613f0c565b526001600160f81b03198116600160f81b0361483357501561480657565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128ba61479f84613f0c565b6001600160f81b0319166146c1576102415760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b903590601e198136030182121561023257018035906001600160401b03821161023257602001918160051b3603831361023257565b80548210156122e4575f5260205f2001905f90565b9092809260209483528483013701015f815290565b8054905f8155816148ee575050565b5f5260205f20908101905b818110614904575050565b5f81556001016148f9565b9091906001600160a01b031680158015614990575b6142d65781156122e4575f516020615fbf5f395f51905f52926128ba926001600160f81b03198235811614614977575b505060408051600481526001600160a01b03909216602083015290918291820190565b612b1281612e409261498894611d92565b505f80614954565b5060018114614924565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b9182358060f81c805f14614a2b5780600114614a1e57600214614a08575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c838352604082015260408152614a78606082610fe3565b5190209015614a8a576120b990615854565b6120b990615742565b9190614aa0913691612a9a565b604051916020820191805180604014614b2b57604114614acd5750505050505b638baa579f5f526004601cfd5b80606060409201515f1a60205201516060525b5f52516040526020600160805f825afa51905f6060526040523d614b05575050614ac0565b6001600160a01b03163003614b1f57630b135d3f60e11b90565b6001600160e01b031990565b506040015160ff81901c601b016020526001600160ff1b0316606052614ae0565b90926080926120b99694835260018060a01b0316602083015260408201528160608201520191612144565b614b9065ffffffffffff929594614b9c948733856158c9565b97929491959095615993565b5091164210908115614c1a575b50614c0757602094614bba91614a39565b60405163392dffaf60e01b815295869485938493614be993929133906001600160e01b03191660048701614b4c565b03916001600160a01b03165afa9081156107dc575f91613465575090565b506001600160e01b031995945050505050565b65ffffffffffff91501642115f614ba9565b9190939293601481019160141161023257803560601c92829190614c4e612cfa565b6001600160a01b03909516602086019081529490614cad614c716127bc83611ea2565b5f516020615fdf5f395f51905f525460a81c63ffffffff169063ffffffff808316911603614e125760010163ffffffff165b63ffffffff168352565b815163ffffffff1695516001600160a01b031697614ccb8580612006565b614cd49161499a565b986034850199614ce48b88612006565b614ced9161499a565b906054870199614cfd8b8a612006565b614d069161499a565b604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c505602082019081526001600160581b03198a169282019290925263ffffffff9390931660608401526001600160a01b0395909516608083015260a082019290925260c081019290925260e0808301919091528152614d8a61010082610fe3565b519020905f1461052a6102ab98614deb60949861294e97614dcc6128d29761053097614e0457614db990615854565b614dc660748d0185612006565b91615c58565b9e614de2614dda8480612006565b929094612006565b9390928a613b86565b614dfe614df8828b612006565b90615dd2565b88612006565b614e0d90615742565b614db9565b614ca3565b356001600160c01b0319811692919060088210614e32575050565b6001600160c01b031960089290920360031b82901b16169150565b6040906120b99392815281602082015201906136fb565b93929190935f926001614e768361206e565b015f5b8154811015614ff757614e92612f13612f0683856148b5565b939095614eb4614eae614ea8613fca8585613f91565b60f81c90565b60ff1690565b808403614fc95750908181614eed614ee1614edb614ed584614f0b98611dae565b90614e17565b60c01c90565b6001600160401b031690565b600901918c610100614f03612b12868686611dbf565b910152611e54565b939093955b600160f01b1615614f28575b50600101939193614e79565b604051633894f6e760e11b81529196906020908390815f81614f588f6001600160e01b03198d1660048401614e4d565b03926001600160a01b03165af19182156107dc575f92614fa9575b506001600160a01b038216614f9557600191614f8e91615053565b9590614f1c565b631f24c1fb60e11b5f52600487905260245ffd5b614fc291925060203d81116138a4576138958183610fe3565b905f614f73565b9196909491831115614fe457630760bdcf60e11b5f5260045ffd5b614fec612211565b6101008b0152614f10565b505091929460ff8061500f614ea8613fca8789613f91565b16036150445761010061502c612b1285615034966120b998611d92565b91015261206e565b5460101c6001600160a01b031690565b63b32eeb6960e01b5f5260045ffd5b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114615083575050600190565b65ffffffffffff60a01b8216916001600160d01b03198082169083168415615103575b65ffffffffffff60a01b841680156150f3575b8581109086180280861895146150e2575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b94506150ca565b5065ffffffffffff60a01b6150b9565b65ffffffffffff60a01b94506150a6565b356001600160501b031981169291906016821061512f575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f8c5761516c916001820181556148b5565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b356001600160f01b031981169291906002821061226d575050565b91906151b29080614880565b9260fe84118015615496575b6154875760016151cd8261206e565b0154615474575b5f1984015f5b818110615336575090615299615292838761523261528361526a6134c461526461525e87612ff79e9f8e6152596152b59f8f9061070561282b61282561522461522a9489896122cd565b90611dea565b9a8b9161206e565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6122cd565b90611e18565b9061518b565b6152738861206e565b9060f01c61ffff19825416179055565b6001600160a01b0316966122cd565b8091611dfb565b6040519586939092906001600160e01b031916602085016148ca565b803b15610232575f6152db92604051809481926306d61fe760e41b8352600483016121ad565b038183855af19081156107dc575f516020615f9f5f395f51905f52926128ba92615322575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107d65f61533093610fe3565b5f615300565b6153d19061537c60016153488661206e565b0161537661536961536361535d868d8c6122cd565b90611ddc565b90615114565b6001600160501b03191690565b9061514a565b61539661070561070561282b612825615224868d8c6122cd565b6153a4615292838a896122cd565b604051949185916153c3916001600160e01b03198a16602085016148ca565b03601f198101855284610fe3565b803b15610232576040516306d61fe760e41b8152925f9184918290849082906153fd90600483016121ad565b03925af19182156107dc57600192615460575b505f516020615f9f5f395f51905f5261545761543661282b612825615224868d8c6122cd565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a1016151da565b806107d65f61546e93610fe3565b5f615410565b6154826001612fa28361206e565b6151d4565b63b62d956d60e01b5f5260045ffd5b5083156151be565b5f516020615f9f5f395f51905f52916040916001600160a01b0382161561551b575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b600191506154c0565b91601382111561553f57823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b90603381111561553f57813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af1156155c1573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c1761553f5783016020810193813593846155ee57505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c1761553f57806155f657505050565b919061564181614601565b925f5b82811061565057505050565b8061567a60019260051b84013584016040810135810190602082359201906020810135903561556d565b6156848389613f19565b5215615691575b01615644565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76156da6156bf8389613f19565b51604051918291858352604060208401526040830190610d6e565b0390a161568b565b91906156ed81614601565b925f5b8281106156fc57505050565b8061572660019260051b840135840160408101358101906020823592019060208101359035615594565b6157308288613f19565b5261573b8187613f19565b50016156f0565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f0000000000000000000000000000000000000000000000000000000000000000461416156157cd575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f00000000000000000000000000000000000000000000000000000000000000006040820152466060820152306080820152206157b0565b60a061585e613da7565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a526042601820905f603a52565b9491848461594a9296959396604051906158e282610fc7565b5f82525f602083015260408201995f8b52615944606084019a8b925f84525f60808701525f60a0870152606060c087015261593560e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b526159ea565b60ff8061595d614ea8613fca8786613f91565b160361504457615034615977846159879561598c94611d92565b9490955163ffffffff60e01b1690565b61206e565b9351929190565b8065ffffffffffff8260a01c169182156001146159b1575b60d01c92565b65ffffffffffff92506159ab565b90926080926120b99594835260018060a01b0316602083015260408201528160608201520190610d6e565b9160608301906001615a3f615a06845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b858110615a565750505050505050565b615a66612f13612f0683856148b5565b6001600160a01b031660a0890190815260808901949091615a8f906001600160f01b0319168652565b615aa9615aa2614ea8613fca8985613f91565b60ff168a52565b615ab7614eae8a5160ff1690565b808403615c265750858181615adc614ee1614edb614ed5615b319b9c615b0498611dae565b8c60c0615af7612b1260208401948086526009018688611dbf565b9101525160090191611e54565b949094955b51600160f11b90615b23906001600160f01b0319166134c4565b166001600160f01b03191690565b15615b40575b50600101615a46565b51615b53906001600160a01b0316610705565b6020615b79615b6c615b6c895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b8152958694909385938493615bb89390926001600160a01b031690600486016159bf565b03915afa9081156107dc575f91615c08575b506001600160a01b038116615bf45790600191615bec60408a01918251615053565b905290615b37565b631f24c1fb60e11b5f52600482905260245ffd5b615c20915060203d81116138a4576138958183610fe3565b5f615bca565b909490831115615c3f57630760bdcf60e11b5f5260045ffd5b615b3190615c4e365f88612a9a565b60c08b0152615b09565b5f516020615fdf5f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b03615d135791615cb89391615c9961070560209560581c90565b9160405195869485938493637aa8f17760e11b85523060048601612189565b03915afa9081156107dc575f91615cf4575b505b6001600160e01b0319166374eca2c160e11b01615ce557565b6362467c7760e11b5f5260045ffd5b615d0d915060203d6020116134875761347f8183610fe3565b5f615cca565b90949192916001600160f81b03198216600160f91b03615db45750602091615d419160081b958430886158c9565b60405163392dffaf60e01b81529297929586949385938493615d7493909230906001600160e01b03191660048701614b4c565b03916001600160a01b03165afa9081156107dc575f91615d95575b50615ccc565b615dae915060203d6020116134875761347f8183610fe3565b5f615d8f565b94906001600160f81b03191661244b57615dcd92614a93565b615ccc565b615ddf6105308383611d1d565b91602c8110615f8257602c820190615e0061070561282b6128258487611d48565b615e2a615e1c613fd8613fca615e168780612006565b90613f91565b6001600160f81b0319161590565b80615edd575b61070561282b61282585615e856102419a87615e6961070561282b6128258f9d6129559f9e8f604c9f6129ce9f615e8b575b5050611e43565b615e738b80612006565b9390926001600160a01b031690613f9a565b88611e43565b612955615ecf615ed693606c860190615eca615eb961070561282b612825615eb38787612006565b90611d59565b9586906001600160a01b031661549e565b612006565b8091611e26565b8f87615e62565b5060405163ecd0596160e01b81526002600482015290949291906020816024816001600160a01b038a165afa9384156107dc5761282b61282584615e85610705948b615e6961070561282b6102419f8f9c6129559f9d8f604c9f936129ce9f94612825955f91615f63575b509f50505050505050505097509a5050959650505050615e30565b615f7c915060203d602011610831576108238183610fe3565b5f615f48565b90506004915003615f8f57565b637a210a5d60e11b5f5260045ffdfed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" + "0x0000000000000000000000000000000000000000000000000000000000000000610140806040523461020a576020816161db8038038091610020828561020e565b83398101031261020a57516001600160a01b038116810361020a57306080524660a05260a060405161005360408261020e565b6006815260208101906512d95c9b995b60d21b82526040519161007760408461020e565b60058352602083019164302e332e3360d81b8352519020915190208160c0528060e052604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f835260208301526040820152466060820152306080820152206101005261012052604051602081019063deadbeef60e01b82526004815261010160248261020e565b5190516001600160581b031981169190601582106101ea575b7f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f80546001600160a81b031916605885901c179055604051615f9590816102468239608051816156fb015260a0518161571e015260c0518161578e015260e051816157b4015261010051816156da0152610120518181816103c4015281816106ac0152818161086601528181610ac401528181610e600152818161115d015281816112ee0152818161132901528181611528015281816119b901528181611aeb015281816125b901526132050152f35b6001600160581b031960159290920360031b82901b161690505f8061011a565b5f80fd5b601f909101601f19168101906001600160401b0382119082101761023157604052565b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001d575b366131ab5761001b61317a565b005b5f3560e01c8063112d3a7d1461021c578063150b7a02146102175780631626ba7e1461021257806319822f7c1461020d5780631f1b92e3146102085780633659cfe6146102035780633c3b752b146101fe57806352141cd9146101f957806357b3a5f4146101f45780636e6fa0c6146101ef578063721e67f4146101ea57806384b0196e146101e55780638dd7712f146101e057806390ef8862146101db5780639198bdf5146101d65780639517e29f146101d15780639cfd7cff146101cc578063a65d69d4146101c7578063a71763a8146101c2578063adb610a3146101bd578063b8afe17d146101b8578063b9b82941146101b3578063bc197c81146101ae578063c3e58978146101a9578063d03c7914146101a4578063d691c9641461019f578063e6f3d50a1461019a578063e9ae5c5314610195578063f1f7f0f914610190578063f23a6e611461018b578063f2dc691d146101865763fc9c5dec0361000e57611cc0565b611c9f565b611c45565b611c0f565b611adf565b61195f565b61187d565b611830565b61175d565b61164c565b6114f5565b61147f565b61144d565b61131d565b6112d9565b611281565b611151565b61103a565b610f2b565b610e30565b610d92565b610d0c565b610cb1565b610bfe565b610a5e565b6109c8565b61084b565b610695565b610390565b61032f565b6102d5565b6102af565b6001600160a01b0381160361023257565b5f80fd5b359061024182610221565b565b9181601f84011215610232578235916001600160401b038311610232576020838186019501011161023257565b6060600319820112610232576004359160243561028c81610221565b91604435906001600160401b038211610232576102ab91600401610243565b9091565b346102325760206102cb6102c236610270565b92919091611f13565b6040519015158152f35b34610232576080366003190112610232576102f1600435610221565b6102fc602435610221565b6064356001600160401b0381116102325761031b903690600401610243565b5050604051630a85bd0160e11b8152602090f35b34610232576040366003190112610232576004356024356001600160401b0381116102325760209161036861036e923690600401610243565b91613377565b6040516001600160e01b03199091168152f35b90816101209103126102325790565b6060366003190112610232576004356001600160401b038111610232576103bb903690600401610381565b602435604435917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662576103ff60208201356135c3565b9092919084836001600160f81b0319861615610649575b8261042193946137bc565b9361044661043661043184611ea5565b611fdd565b946001600160f81b031916151590565b938480610608575b6105f957602001516001600160a01b0316801591819083806105f2575b6104f2576001926104866104a5925f525f60205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b149081156105ea575b501561055d5782610501575b50506104f257816104dc925b6104e0575b506040519081529081906020820190565b0390f35b3490349034903490335af1505f6104cb565b631a0a9b9f60e21b5f5260045ffd5b61055692506105529161053661053061052a61051f61054b95611edc565b936060810190612009565b90611d20565b90611e6f565b63ffffffff60e01b165f5260205260405f2090565b5460ff1690565b1590565b5f806104ba565b829192916105b7575b506104f25761052a81606061057c930190612009565b638dd7712f60e01b916001600160e01b03199161059891611e6f565b16036105a857816104dc926104c6565b63dbbb044b60e01b5f5260045ffd5b6105e4915061054b6105cb61055292611edc565b6105366105306105de6060880188612009565b90611d0f565b5f610566565b90505f6104ae565b508661046b565b633ab3447f60e11b5f5260045ffd5b50805163ffffffff1663ffffffff6106416106385f516020615f755f395f51905f525463ffffffff9060c81c1690565b63ffffffff1690565b91161061044e565b5f516020615f755f395f51905f525460581b9250610416565b6348f5c3ed60e01b5f5260045ffd5b6004359063ffffffff8216820361023257565b359063ffffffff8216820361023257565b6020366003190112610232576106a9610671565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610841575b15610838576107116107056106ff5f516020615f755f395f51905f525460581b90565b60581c90565b6001600160a01b031690565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610809575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061076e36343360048501612167565b038183865af19283156107dc575f936107e1575b5061078c90613a50565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906107b890600483016121b0565b03925af180156107dc576107c857005b806107d65f61001b93610fe3565b80610d64565b6120bf565b61078c919350610802903d805f833e6107fa8183610fe3565b8101906120e5565b9290610782565b61082b915060203d602011610831575b6108238183610fe3565b8101906120a7565b5f61073b565b503d610819565b61001b90613a50565b50303314156106dc565b60203660031901126102325760043561086381610221565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614158061097c575b15610973576108b96107056106ff5f516020615f755f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610954575b50156106625760405163d68f602560e01b8152916001600160a01b0391909116905f838061091636343360048501612167565b038183865af19283156107dc575f93610934575b5061078c906121c1565b61078c91935061094d903d805f833e6107fa8183610fe3565b929061092a565b61096d915060203d602011610831576108238183610fe3565b5f6108e3565b61001b906121c1565b5030331415610896565b6001600160581b031981160361023257565b9181601f84011215610232578235916001600160401b038311610232576020808501948460051b01011161023257565b346102325760a0366003190112610232576004356109e581610986565b6024356109f181610221565b6044356001600160401b03811161023257610a10903690600401610243565b6064939193356001600160401b03811161023257610a32903690600401610243565b91608435956001600160401b03871161023257610a5661001b973690600401610998565b969095612327565b608036600319011261023257600435610a7681610986565b602435610a8281610221565b6044356001600160401b03811161023257610aa1903690600401610243565b6064356001600160401b03811161023257610ac0903690600401610243565b91337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580610be2575b15610bd457610b176107056106ff5f516020615f755f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91610bb5575b50156106625760405163d68f602560e01b8152956001600160a01b039190911694905f8780610b7536343360048501612167565b0381838a5af19687156107dc575f97610b95575b5061078c9596976124aa565b61078c969750610bae903d805f833e6107fa8183610fe3565b9695610b89565b610bce915060203d602011610831576108238183610fe3565b5f610b41565b919361001b959391936124aa565b5030331415610af4565b6001600160e01b031981160361023257565b34610232576020366003190112610232576104dc610c3f600435610c2181610bec565b5f60408051610c2f81610f71565b828152826020820152015261203b565b600160405191610c4e83610f71565b805460a083901b839003168084529101546001600160a01b0380821660208086019182526001600160f81b031960589490941b84166040968701908152865195841686529151909216918401919091525116918101919091529081906060820190565b3461023257604036600319011261023257602060ff610d00600435610cd581610986565b610cea60243591610ce583610bec565b611edc565b9063ffffffff60e01b165f5260205260405f2090565b54166040519015158152f35b34610232576020366003190112610232576020610d41600435610d2e81610221565b5f604051610d3b81610f91565b5261332a565b60405190610d4e82610f91565b546001600160a01b031690819052604051908152f35b5f91031261023257565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b34610232575f36600319011261023257610dd1610ddf610db0613d9c565b604092919251938493600f60f81b855260e0602086015260e0850190610d6e565b908382036040850152610d6e565b4660608301523060808301525f60a083015281810360c083015260206060519182815201906080905f5b818110610e17575050500390f35b8251845285945060209384019390920191600101610e09565b6040366003190112610232576004356001600160401b03811161023257610e5b903690600401610381565b6024357f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575f908152602081905260409020546001600160a01b03169060609060018314159081610efb575b610ed0610ec9826060610ed7940190612009565b8091611d2e565b9030613e84565b5015610eec57610ee357005b61001b91613ea9565b63f21e646b60e01b5f5260045ffd5b9150610ed7610ed0610ec9610f21610f19610ec96060880188612009565b903489613e39565b9492505050610eb5565b34610232575f36600319011261023257602063ffffffff5f516020615f755f395f51905f525460c81c16604051908152f35b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117610f8c57604052565b610f5d565b602081019081106001600160401b03821117610f8c57604052565b604081019081106001600160401b03821117610f8c57604052565b61012081019081106001600160401b03821117610f8c57604052565b90601f801991011681019081106001600160401b03821117610f8c57604052565b60405190610241604083610fe3565b6040519061024161012083610fe3565b6001600160401b038111610f8c5760051b60200190565b6080366003190112610232576004356001600160401b03811161023257611065903690600401610998565b602435916001600160401b038311610232573660238401121561023257826004013561109081611023565b9361109e6040519586610fe3565b8185526024602086019260061b8201019036821161023257602401915b818310611110575050506044356001600160401b038111610232576110e4903690600401610998565b90606435946001600160401b0386116102325761110861001b963690600401610998565b9590946125af565b604083360312610232576020604091825161112a81610fac565b61113386610684565b81528286013561114281610221565b838201528152019201916110bb565b61115a36610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611277575b1561126d576111b06107056106ff5f516020615f755f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161124e575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f858061120e36343360048501612167565b038183885af19485156107dc575f9561122e575b5061078c93949561277e565b61078c949550611247903d805f833e6107fa8183610fe3565b9493611222565b611267915060203d602011610831576108238183610fe3565b5f6111da565b9161001b9361277e565b503033141561118d565b34610232575f366003190112610232576104dc6040516112a2604082610fe3565b60168152756b65726e656c2e616476616e6365642e76302e332e3360501b6020820152604051918291602083526020830190610d6e565b34610232575f366003190112610232576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b61132636610270565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611443575b156114395761137c6107056106ff5f516020615f755f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f9161141a575b50156106625760405163d68f602560e01b8152936001600160a01b039190911692905f85806113da36343360048501612167565b038183885af19485156107dc575f956113fa575b5061078c939495612ad2565b61078c949550611413903d805f833e6107fa8183610fe3565b94936113ee565b611433915060203d602011610831576108238183610fe3565b5f6113a6565b9161001b93612ad2565b5030331415611359565b34610232575f36600319011261023257602063ffffffff5f516020615f755f395f51905f525460a81c16604051908152f35b346102325760203660031901126102325760406114af6004356114a181610986565b6114a9612cfc565b50611ea5565b8151906114bb82610fac565b5463ffffffff81168083526001600160a01b03602092831c81169383019384528451918252925190921690820152f35b8015150361023257565b60603660031901126102325760043561150d81610986565b60243561151981610bec565b604435611525816114eb565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611642575b156116385761157b6107056106ff5f516020615f755f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611619575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f84806115d936343360048501612167565b038183875af19384156107dc575f946115f9575b5061078c929394614356565b61078c939450611612903d805f833e6107fa8183610fe3565b93926115ed565b611632915060203d602011610831576108238183610fe3565b5f6115a5565b9061001b92614356565b5030331415611558565b346102325760a036600319011261023257611668600435610221565b611673602435610221565b6044356001600160401b03811161023257611692903690600401610998565b50506064356001600160401b038111610232576116b3903690600401610998565b50506084356001600160401b038111610232576116d4903690600401610243565b505060405163bc197c8160e01b8152602090f35b602080825282516001600160f01b03191681830152808301516001600160a01b03166040808401919091529092015160608083015280516080830181905260a09092019201905f5b81811061173d5750505090565b82516001600160501b031916845260209384019390920191600101611730565b346102325760203660031901126102325761179c60043561177d81610bec565b60606040805161178c81610f71565b5f81525f60208201520152612071565b6001604051916117ab83610f71565b805461ffff60f01b8160f01b168452828060a01b039060101c16602084015201906040519182602082549182815201915f5260205f20905f5b81811061180d576104dc85876117fc81880382610fe3565b6040820152604051918291826116e8565b825460501b6001600160501b0319168452602090930192600192830192016117e4565b346102325760203660031901126102325760206102cb600435612d14565b9060406003198301126102325760043591602435906001600160401b038211610232576102ab91600401610243565b6118863661184e565b90916001600160a01b036118993361332a565b54169182156119505760609060018414159485611939575b6118bb92936145dc565b92611929575b50506040518091602082016020835281518091526040830190602060408260051b8601019301915f905b8282106118fa57505050500390f35b919360019193955060206119198192603f198a82030186528851610d6e565b96019201920185949391926118eb565b61193291613ea9565b5f806118c1565b6118bb9250611949363487613de0565b92506118b1565b63710c949760e01b5f5260045ffd5b60603660031901126102325760043561197781610986565b6024356001600160401b03811161023257611996903690600401610243565b6044356001600160401b038111610232576119b5903690600401610243565b90337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611ad5575b15611ac957611a0c6107056106ff5f516020615f755f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611aaa575b50156106625760405163d68f602560e01b8152946001600160a01b039190911693905f8680611a6a36343360048501612167565b038183895af19586156107dc575f96611a8a575b5061078c949596612dec565b61078c959650611aa3903d805f833e6107fa8183610fe3565b9594611a7e565b611ac3915060203d602011610831576108238183610fe3565b5f611a36565b91909261001b94612dec565b50303314156119e9565b611ae83661184e565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580611c05575b15611bfb57611b3e6107056106ff5f516020615f755f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f91611bdc575b50156106625760405163d68f602560e01b8152926001600160a01b039190911691905f8480611b9c36343360048501612167565b038183875af19384156107dc575f94611bbc575b5061078c92939461307f565b61078c939450611bd5903d805f833e6107fa8183610fe3565b9392611bb0565b611bf5915060203d602011610831576108238183610fe3565b5f611b68565b9061001b9261307f565b5030331415611b1b565b34610232575f3660031901126102325760205f516020615f755f395f51905f525460581b604051906001600160581b0319168152f35b346102325760a036600319011261023257611c61600435610221565b611c6c602435610221565b6084356001600160401b03811161023257611c8b903690600401610243565b505060405163f23a6e6160e01b8152602090f35b34610232576020366003190112610232576020600435600760405191108152f35b34610232576040366003190112610232576004356001600160401b03811161023257611d07611cf56020923690600401610381565b60243590611d0282610221565b61308a565b604051908152f35b906008116102325760040190600490565b906004116102325790600490565b909291928360041161023257831161023257600401916003190190565b906018116102325760040190601490565b906014116102325790601490565b906020116102325790602090565b90929192836020116102325783116102325760200191601f190190565b909291928360011161023257831161023257600101915f190190565b906009116102325760010190600890565b909291928360091161023257831161023257600901916008190190565b906016116102325790601690565b906016116102325760020190601490565b909291928360161161023257831161023257601601916015190190565b906002116102325790600290565b909291928360141161023257831161023257601401916013190190565b90602c116102325760180190601490565b90939293848311610232578411610232578101920390565b356001600160e01b0319811692919060048210611e8a575050565b6001600160e01b031960049290920360031b82901b16169150565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85060205260405f2090565b6001600160581b0319165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85160205260405f2090565b90929060018103611f6257506001600160a01b0392611f5c9250611f4c915060581b600160581b600160f81b0316600160f81b17611ea5565b5460201c6001600160a01b031690565b16151590565b60028103611f9657506001600160a01b0392611f5c92506107059150611f8990841661332a565b546001600160a01b031690565b600303611fd657611fb7611fb2610530600193611fc595611d20565b61203b565b01546001600160a01b031690565b6001600160a01b0390811691161490565b5050505f90565b90604051611fea81610fac565b915463ffffffff81168352602090811c6001600160a01b031690830152565b903590601e198136030182121561023257018035906001600160401b0382116102325760200191813603831361023257565b63ffffffff60e01b165f527f7c341349a4360fdd5d5bc07e69f325dc6aaea3eb018b3e0ea7e53cc0bb0d6f3b60205260405f2090565b63ffffffff60e01b165f527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f85260205260405f2090565b9081602091031261023257516120bc816114eb565b90565b6040513d5f823e3d90fd5b6001600160401b038111610f8c57601f01601f191660200190565b602081830312610232578051906001600160401b038211610232570181601f8201121561023257805190612118826120ca565b926121266040519485610fe3565b8284526020838301011161023257815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b6120bc939260609260018060a01b03168252602082015281604082015201905f612147565b6120bc949260609260018060a01b0316825260208201528160408201520191612147565b9060206120bc928181520190610d6e565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556001600160a01b03167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2565b60405190612223602083610fe3565b5f8252565b90813b5f612235826120ca565b936122436040519586610fe3565b82855260208501903c565b80516020909101516001600160e81b0319811692919060038210612270575050565b6001600160e81b0319600392830390921b82901b16169150565b5f516020615f755f395f51905f52805463ffffffff60a81b191660a89290921b63ffffffff60a81b16919091179055565b634e487b7160e01b5f52603260045260245ffd5b908210156122e6576102ab9160051b810190612009565b6122bb565b908092918237015f815290565b3d15612322573d90612309826120ca565b916123176040519384610fe3565b82523d5f602084013e565b606090565b94939291909695966001600160581b03196123606123535f516020615f755f395f51905f525460581b90565b6001600160581b03191690565b1615801590612482575b612474576001600160581b03198616156104f2576001600160f81b03198616600160f81b14158061245c575b61244d57856123a76123f497613b15565b6123c86123b2611004565b60018152925b6001600160a01b03166020840152565b5f516020615f755f395f51905f52805463ffffffff60a81b1916600160a81b179055613b7b565b613b7b565b5f5b81811061240257505050565b5f8061240f8385876122cf565b9061241f604051809381936122eb565b039082305af161242d6122f8565b501561243b576001016123f6565b636534eae560e11b5f5260045260245ffd5b6361c4e91b60e11b5f5260045ffd5b506001600160f81b03198616600160f91b1415612396565b62dc149f60e41b5f5260045ffd5b5061ef0160f01b6001600160e81b03196124a361249e30612228565b61224e565b161461236a565b94939291906001600160581b03198616156104f2576001600160f81b03198616600160f81b141580612555575b61244d576124e486613b15565b6001600160a01b036124f8611f4c88611ea5565b1615612507575b505050505050565b61254a956123ef61252d5f516020615f755f395f51905f525463ffffffff9060a81c1690565b926123b860405194612540604087610fe3565b63ffffffff168552565b5f80808080806124ff565b506001600160f81b03198616600160f91b14156124d7565b9060405161257a81610f71565b82546001600160a01b03908116825260019390930154928316602082015260589290921b6001600160f81b0319166040830152565b95909491939092337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316141580612723575b156127155761260c6107056106ff5f516020615f755f395f51905f525460581b90565b60405163ecd0596160e01b8152600480820152602081602481855afa9081156107dc575f916126f6575b50156106625760405163d68f602560e01b8152966001600160a01b039190911695905f888061266a36343360048501612167565b0381838b5af19788156107dc575f986126d6575b5061268a969798613f22565b803b1561023257604051630b9dfbed60e11b8152915f9183918290849082906126b690600483016121b0565b03925af180156107dc576126c8575b50565b806107d65f61024193610fe3565b61268a9798506126ef903d805f833e6107fa8183610fe3565b979661267e565b61270f915060203d602011610831576108238183610fe3565b5f612636565b919390929461024196613f22565b50303314156125e9565b9160206120bc938181520191612147565b356bffffffffffffffffffffffff1981169291906014821061275e575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b9091600182036128fa575f516020615f355f395f51905f5293906054600160f81b600160581b600160f81b03605887901b1617916127c86127be84611ea5565b5463ffffffff1690565b5f516020615f755f395f51905f525460a81c63ffffffff169063ffffffff8083169116146128e2575b5061285a61283361070561282d6128276128205f516020615f755f395f51905f525463ffffffff9060a81c1690565b9886611d5c565b9061273e565b60601c90565b61284a61283e611004565b63ffffffff9097168752565b6001600160a01b03166020860152565b612885601482019461286c8680612009565b61287c6034869493940189612009565b93909288613b7b565b019160046128938483612009565b9050146128c1575b5050505b604080519182526001600160a01b03909216602082015290819081015b0390a1565b61053061052a6128da946128d493612009565b906142f1565b5f808061289b565b6128f49060010163ffffffff1661228a565b5f6127f1565b6002820361296257806129575f516020615f355f395f51905f5295603461293161070561282d612827601461295d99019588611d5c565b93612950856129408580612009565b906001600160a01b038c16614267565b0190612009565b91614117565b61289f565b600382036129d857806129575f516020615f355f395f51905f529560386129d061070561282d612827601861295d9901956129ca8c8a6129b861070561282d612827876129b26105308288611d20565b95611d4b565b6129c28b80612009565b939092613f8f565b88611d4b565b930190612009565b600482148015612a76575b8015612a6c575b15612a5d576001600160a01b03831693843b1561023257612a24945f92836040518098819582946306d61fe760e41b84526004840161272d565b03925af19283156107dc575f516020615f355f395f51905f5293612a49575b5061289f565b806107d65f612a5793610fe3565b5f612a43565b631092ef5760e11b5f5260045ffd5b50600682146129ea565b50600582146129e3565b359060208110612a8e575090565b5f199060200360031b1b1690565b929192612aa8826120ca565b91612ab66040519384610fe3565b829481845281830111610232578281602093845f960137010152565b909160018203612b43575f516020615f555f395f51905f5293612b2191612b1b91612b12600160f81b600160581b600160f81b03605889901b1617614424565b505b3691612a9c565b83614484565b50604080519182526001600160a01b03909216602082015290819081016128bc565b60028203612bb3576001600160a01b038381165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902080546001600160a01b031981169091555f516020615f555f395f51905f5295612b2193612b1b939092165b50612b14565b919060038103612bd8575050610530612bd492612bcf92611d20565b6143c0565b5050565b909160048203612c6157612b1b612b21915f516020615f555f395f51905f5295612c105f516020615f755f395f51905f525460581b90565b612c1c611f4c82611ea5565b6001600160a01b03888116911614612c345750612b14565b612c40612c5b91611ea5565b8054640100000000600160c01b031916640100000000179055565b5f612bad565b600582148015612cf2575b15612a5d575f516020615f755f395f51905f525460581b612c96612c908684611d6a565b90612a80565b906001600160f81b03198116600160f91b14612cca575b5050612b1b612b21915f516020615f555f395f51905f5295612b14565b60081b6001600160e01b03191614612ce3575f80612cad565b6313002bdd60e31b5f5260045ffd5b5060068214612c6c565b60405190612d0982610fac565b5f6020838281520152565b612d28818060081b918160301b9160501b90565b929091906001600160f81b03198116600160f81b14159081612dd8575b81612dc3575b81612daa575b50611fd65760ff60f81b16600160f81b8114159081612da0575b50612d9a576001600160e01b031916612d95576001600160501b031916612d9157600190565b5f90565b505f90565b50505f90565b905015155f612d6b565b6001600160f81b031916607f60f91b141590505f612d51565b6001600160f81b031980821614159150612d4b565b6001600160f81b0319811615159150612d45565b9094939291612dfa82614424565b916001600160f81b03198116600160f81b03612e72575f516020615f555f395f51905f5291612e48612e426102419899612e6a9460018060a01b039060581c16933691612a9c565b82614484565b5060408051600181526001600160a01b03909216602083015290918291820190565b0390a161488a565b9294919290506001600160f81b03198116600160f91b0361244d5760081b92612e9a84612071565b94612ea587806147fb565b94905060018701946001865401036130705794956001600160e01b0319871695905f5b8654811015612f7e57805f516020615f555f395f51905f52612f758c612f53612f45612e428e612f338f99612f2d612f1d612f15612f088460019f614830565b90549060031b1c60501b90565b908160501c90565b90508c8060a01b031697806147fb565b906122cf565b60409491945194859360208501614845565b03601f198101835282610fe3565b5060408051600581526001600160a01b03909216602083015290918291820190565b0390a101612ec8565b509194509296612ff961300c9161300761306b9598612faa6001612fa46102419d612071565b0161485a565b8554612fe790612fc59060101c6001600160a01b0316610705565b93612fdc612fd382806147fb565b919092806147fb565b5f19019290506122cf565b60409591955195869360208501614845565b03601f198101845283610fe3565b614484565b5080545f516020615f555f395f51905f5290613058906130379060101c6001600160a01b0316610705565b60408051600681526001600160a01b03909216602083015290918291820190565b0390a180546001600160b01b0319169055565b61488a565b63013dcc8d60e31b5f5260045ffd5b906126c592916145dc565b612f4590613174906130a56001600160a01b03823516610705565b906131466020820135612f456130c76130c16040860186612009565b90614915565b936130d86130c16060830183612009565b90608081013560a0820135906130fa6130c160c08501359460e0810190612009565b93604051988997602089019b8c94919260e0969399989794919961010087019a60018060a01b03168752602087015260408601526060850152608084015260a083015260c08201520152565b51902060408051602081019283526001600160a01b03909516908501525f6060850152929182906080820190565b51902090565b7f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587460408051338152346020820152a1565b6131c76131c25f356001600160e01b03191661203b565b61256d565b80516001600160a01b03906131dd908216610705565b161561331b5780516060906001600160a01b0316806002600160a01b031981016132f95750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610662575b60408201516001600160f81b031916806132b957506020820151613260906001600160a01b0316614920565b92905b156132b157516001600160a01b0316906001821415828161329d575b5061328d575b825160208401f35b61329691613ea9565b5f80613285565b6001600160a01b039150811614155f61327f565b825160208401fd5b6001600160f81b0319908116036132ea5760208201516132e3906001600160a01b03163690613e5f565b9290613263565b632d6a6bb760e01b5f5260045ffd5b600103613307575b50613234565b613315915036903490613de0565b5f613301565b631cd4b64760e21b5f5260045ffd5b6001600160a01b03165f9081527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b866020526040902090565b9081602091031261023257516120bc81610bec565b9161338191614962565b919080836001600160f81b03198416156135a3575b6020811015918261356c575b82613556575b50506133b661043184611ea5565b60208101516001600160a01b03906133cf908216610705565b161580613543575b6104f2576001600160f81b031984161515908161350a575b506105f9576001600160f81b03198316600160f81b03613483579061341b6020949392613439966149b4565b604051637aa8f17760e11b815295869485938493336004860161218c565b039160581c6001600160a01b03165afa9081156107dc575f9161345a575090565b6120bc915060203d60201161347c575b6134748183610fe3565b810190613362565b503d61346a565b92916001600160f81b03198116600160f91b036134e35760081b93600160f11b6134c66134b96134b288612071565b5460f01b90565b6001600160f01b03191690565b166134d4576120bc94614af2565b635b71057960e01b5f5260045ffd5b929391929091906001600160f81b03191661244d576120bc93613505916149b4565b614a0e565b5163ffffffff16905063ffffffff61353a6106385f516020615f755f395f51905f525463ffffffff9060c81c1690565b9116105f6133ef565b506001600160f81b0319841615156133d7565b819295506135649350611d78565b925f806133a8565b91507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a61359c612c908385611d6a565b14916133a2565b92506135bd5f516020615f755f395f51905f525460581b90565b92613396565b90818060081b9160ff839260f01c166002146135db57565b6001600160d81b031983169150565b9080601f83011215610232578160206120bc93359101612a9c565b919091610120818403126102325761361b611013565b9261362582610236565b84526020820135602085015260408201356001600160401b03811161023257816136509184016135ea565b604085015260608201356001600160401b03811161023257816136749184016135ea565b60608501526080820135608085015260a082013560a085015260c082013560c085015260e08201356001600160401b03811161023257816136b69184016135ea565b60e08501526101008201356001600160401b038111610232576136d992016135ea565b610100830152565b90816020910312610232575190565b80516001600160a01b031682526120bc916020820151602082015261010061377161374161372f60408601516101206040870152610120860190610d6e565b60608601518582036060870152610d6e565b6080850151608085015260a085015160a085015260c085015160c085015260e085015184820360e0860152610d6e565b92015190610100818403910152610d6e565b9392916137a09060409286526060602087015260608601906136f0565b930152565b9291906137a06020916040865260408601906136f0565b9290925f926137cb3682613605565b916137da610100830183612009565b918193835f93602082101580613a1b575b6139dc575b5050506001600160f81b031916600160f81b145b6139b5575b506001600160f81b03198616600160f81b036138a0575050604051639700320360e01b815293602092859283915f91839161384791600484016137a5565b039260581c6001600160a01b03165af19081156107dc576120bc925f9261386f575b50614fce565b61389291925060203d602011613899575b61388a8183610fe3565b8101906136e1565b905f613869565b503d613880565b909491939092916001600160f81b03198116600160f91b036139515760081b93600160f01b6138d46134b96134b288612071565b16613942575f6138f46138ee60209661391e99858a614ddf565b94614fce565b604051630ccab7a160e01b8152979096889586948593926001600160e01b03191660048501613783565b03926001600160a01b03165af19081156107dc576120bc925f9261386f5750614fce565b6314b9743f60e01b5f5260045ffd5b919350506001600160f81b03191661244d576139a690630b135d3f60e11b9361350563ffffffff60e01b946020527b19457468657265756d205369676e6564204d6573736167653a0a33325f52603c60042090565b16036139b0575f90565b600190565b916139c293955086614ba7565b9193916139d0368284612a9c565b6101008401525f613809565b9195509250829196506139ef9350611d78565b90916139fc368385612a9c565b610100850152613804613a12600192339061308a565b95905f806137f0565b507f0555ad2729e8da1777a4e5020806f8bf7601c3db6bfe402f410a34958363a95a613a4a612c908484611d6a565b146137eb565b5f516020615f755f395f51905f5254600a63ffffffff8260a81c16019063ffffffff8211613b015763ffffffff83811692168211613af257613a9a9060c81c63ffffffff16610638565b10156105f9575f516020615f755f395f51905f52805463ffffffff60c81b60c893841b1663ffffffff60c81b1990911617908190559081901c63ffffffff9081169160a81c168111613ae95750565b6102419061228a565b63e60fd64760e01b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b60207f6789ec0c85d6458d897a36a70129b101f8b4d84c6e218046c3107373dbcbae88918060581c6001600160581b0360a81b5f516020615f755f395f51905f525416175f516020615f755f395f51905f5255604051906001600160581b0319168152a1565b929490939193613b8d6127be85611ea5565b5f516020615f755f395f51905f525460a81c63ffffffff169063ffffffff808316911614613d84575b506020810180516001600160a01b031615613d7b575b5f516020615f755f395f51905f525460a81c63ffffffff1663ffffffff613bfa610638855163ffffffff1690565b911614801590613d4f575b6105f957613c53613c6092613c1987611ea5565b815181546020938401516001600160c01b031990911663ffffffff9290921691909117921b640100000000600160c01b0316919091179055565b516001600160a01b031690565b915f196001600160a01b03841601613d3e575b5050506001600160f81b03198116600160f81b03613d1b5760581c6001600160a01b031690813b15610232576040516306d61fe760e41b8152925f9184918291613cc191906004840161272d565b038183855af19081156107dc575f516020615f355f395f51905f52926128bc92613d07575060408051600181526001600160a01b03909216602083015290918291820190565b806107d65f613d1593610fe3565b5f612e48565b91506001600160f81b03198216600160f91b0361244d576102419160081b61513c565b613d4792614117565b5f8080613c73565b50613d5c6127be86611ea5565b63ffffffff613d72610638855163ffffffff1690565b91161015613c05565b60018152613bcc565b613d969060010163ffffffff1661228a565b5f613bb6565b6040908151613dab8382610fe3565b600681526512d95c9b995b60d21b602082015291613dcb81519182610fe3565b6005815264302e332e3360d81b602082015290565b91613e07925f8080946040519687958694859363d68f602560e01b8552336004860161218c565b03926001600160a01b03165af19081156107dc575f91613e25575090565b6120bc91503d805f833e6107fa8183610fe3565b5f9283613e0795936040519687958694859363d68f602560e01b8552336004860161218c565b5f9060405192808385378338925af4913d82523d5f602084013e60203d830101604052565b5f9192806040519485378338925af4913d82523d5f602084013e60203d830101604052565b6001600160a01b0316803b1561023257604051630b9dfbed60e11b815260206004820152915f918391829084908290613ee6906024830190610d6e565b03925af180156107dc57613ef75750565b5f61024191610fe3565b8051156122e65760200190565b80518210156122e65760209160051b010190565b909593919492965f5b87811015613f7b57600190613f758a89613f618489613f5a828060051b8c013595613f5587610986565b613f0e565b51946122cf565b90613f6d868d8d6122cf565b949093613b7b565b01613f2b565b509650505050505050565b90156122e65790565b9293929091906001600160a01b03821615614108575b613fae9061203b565b93613fda613fcd613fbf8684613f86565b356001600160f81b03191690565b6001600160f81b03191690565b936001600160f81b031985166140e0576001600160a01b0384169161400191908190611d95565b823b156102325761402b925f92836040518096819582946306d61fe760e41b84526004840161272d565b03925af19485156107dc5761408f6140af93600193610241986140cc575b5060408051600381526001600160a01b03881660208201525f516020615f355f395f51905f529190a15b82546001600160a01b0319166001600160a01b03909116178255565b0180546001600160a01b0319166001600160a01b03909316929092178255565b805460ff60a01b191660589290921c60ff60a01b16919091179055565b806107d65f6140da93610fe3565b5f614049565b50909390506001600160f81b0319808416036132ea5760016140af9161408f61024196614073565b6001600160a01b039150613fa5565b6001600160a01b031691908215801561425d575b6142585760405163d60b347f60e01b8152306004820152602081602481875afa9081156107dc575f91614239575b50158015614210575b61419a575b505060408051600481526001600160a01b0390921660208301525f516020615f355f395f51905f529190819081016128bc565b90806141a592611d95565b9190813b15610232576040516306d61fe760e41b8152925f91849182916141d091906004840161272d565b038183855af19081156107dc575f516020615f355f395f51905f52926128bc926141fc575b5091614167565b806107d65f61420a93610fe3565b5f6141f5565b50811515801561416257506001600160f81b031980614232613fbf8585613f86565b1614614162565b614252915060203d602011610831576108238183610fe3565b5f614159565b505050565b506001831461412b565b926142759092919284615434565b806142bb57915f929183612f456142a5829560405192839160208301966306d61fe760e41b88526024840161272d565b51926001600160a01b03165af1506126c56122f8565b6001600160a01b0390921691823b15610232576126b6925f92836040518096819582946306d61fe760e41b84526004840161272d565b7f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a9160609161432382610cea83611edc565b600160ff198254161790556040519163ffffffff60e01b1682526001600160581b031916602082015260016040820152a1565b907f9d17cd6d095ac90a655405ab29f30a7ee7e88ef3974c1bf7544bf591043bb71a9260609261438983610cea83611edc565b9115159160ff1981541660ff84161790556040519263ffffffff60e01b1683526001600160581b03191660208301526040820152a1565b6143ca5f9161203b565b80546001600160a01b031981168255600190910180546001600160a01b0390921693916001600160f81b0319605882901b1615614413575b5080546001600160a81b0319169055565b6001600160a01b031692505f614402565b906001600160581b03195f516020615f755f395f51905f525460581b166001600160581b0319831614612ce3576144706001600160a01b0361446584611ea5565b5460201c1692611ea5565b8054640100000000600160c01b0319169055565b91907f2b82f87bf66300af618a9621d3f221edfab735f5bacb4e004cce1b62375396c3905a905f80604051936144e4856144d66020820196638a91b0e360e01b88526020602484018181520190610d6e565b03601f198101875286610fe3565b604051936144f3602086610fe3565b828552602085019583908a905f368a375193f1913d908161453a575b815f9293523e604080516001600160a01b0390951685528115156020860152909390819081016128bc565b5f915061450f565b604080519091906145538382610fe3565b6001815291601f1901825f5b82811061456b57505050565b80606060208093850101520161455f565b9061458682611023565b6145936040519182610fe3565b82815280926145a4601f1991611023565b01905f5b8281106145b457505050565b8060606020809385010152016145a8565b9060406120bc925f81528160208201520190610d6e565b600881901b9291906001600160f81b03198116600160f81b0361466f57509061460491615560565b90916001600160f81b0319811661461f57506120bc91615678565b6001600160f81b031916600160f81b0361463c576120bc916155cc565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606490fd5b9293926001600160f81b0319811661472757509061468c916154e2565b91614695614542565b956001600160f81b031981166146c257506146af9361552a565b6146b883613f01565b526126c582613f01565b6001600160f81b031916600160f81b0361463c576146df93615503565b6146e884613f01565b52610241577fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128bc61471a84613f01565b51604051918291826145c5565b909391906001600160f81b03199081160361463c576147516147579161474b614542565b956154ba565b91613e84565b61476385939293613f01565b526001600160f81b03198116600160f81b036147ae57501561478157565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76128bc61471a84613f01565b6001600160f81b03191661463c576102415760405162461bcd60e51b815260206004820152601360248201527211195b1959d85d1958d85b1b0819985a5b1959606a1b6044820152606490fd5b903590601e198136030182121561023257018035906001600160401b03821161023257602001918160051b3603831361023257565b80548210156122e6575f5260205f2001905f90565b9092809260209483528483013701015f815290565b8054905f815581614869575050565b5f5260205f20908101905b81811061487f575050565b5f8155600101614874565b9091906001600160a01b03168015801561490b575b6142585781156122e6575f516020615f555f395f51905f52926128bc926001600160f81b031982358116146148f2575b505060408051600481526001600160a01b03909216602083015290918291820190565b612b1481612e429261490394611d95565b505f806148cf565b506001811461489f565b816040519182372090565b5f809160405136810160405236838237604051601481016040523360601b90528260143601925af190604051903d82523d5f602084013e60203d830101604052565b9182358060f81c805f146149a6578060011461499957600214614983575f80fd5b6001600160d81b03191692600501916004190190565b5092601501916014190190565b505060015f9301915f190190565b60405160208101917f1547321c374afde8a591d972a084b071c594c275e36724931ff96c25f2999c8383526040820152604081526149f3606082610fe3565b5190209015614a05576120bc906157ea565b6120bc906156d8565b9190614a1b913691612a9c565b604051916020820191805180604014614aa657604114614a485750505050505b638baa579f5f526004601cfd5b80606060409201515f1a60205201516060525b5f52516040526020600160805f825afa51905f6060526040523d614a80575050614a3b565b6001600160a01b03163003614a9a57630b135d3f60e11b90565b6001600160e01b031990565b506040015160ff81901c601b016020526001600160ff1b0316606052614a5b565b90926080926120bc9694835260018060a01b0316602083015260408201528160608201520191612147565b614b0b65ffffffffffff929594614b179487338561585f565b97929491959095615929565b5091164210908115614b95575b50614b8257602094614b35916149b4565b60405163392dffaf60e01b815295869485938493614b6493929133906001600160e01b03191660048701614ac7565b03916001600160a01b03165afa9081156107dc575f9161345a575090565b506001600160e01b031995945050505050565b65ffffffffffff91501642115f614b24565b9190939293601481019160141161023257803560601c92829190614bc9612cfc565b6001600160a01b03909516602086019081529490614c28614bec6127be83611ea5565b5f516020615f755f395f51905f525460a81c63ffffffff169063ffffffff808316911603614d8d5760010163ffffffff165b63ffffffff168352565b815163ffffffff1695516001600160a01b031697614c468580612009565b614c4f91614915565b986034850199614c5f8b88612009565b614c6891614915565b906054870199614c788b8a612009565b614c8191614915565b604080517fb17ab1224aca0d4255ef8161acaf2ac121b8faa32a4b2258c912cc5f8308c505602082019081526001600160581b03198a169282019290925263ffffffff9390931660608401526001600160a01b0395909516608083015260a082019290925260c081019290925260e0808301919091528152614d0561010082610fe3565b519020905f1461052a6102ab98614d6660949861295097614d476128d49761053097614d7f57614d34906157ea565b614d4160748d0185612009565b91615bee565b9e614d5d614d558480612009565b929094612009565b9390928a613b7b565b614d79614d73828b612009565b90615d68565b88612009565b614d88906156d8565b614d34565b614c1e565b356001600160c01b0319811692919060088210614dad575050565b6001600160c01b031960089290920360031b82901b16169150565b6040906120bc9392815281602082015201906136f0565b93929190935f926001614df183612071565b015f5b8154811015614f7257614e0d612f15612f088385614830565b939095614e2f614e29614e23613fbf8585613f86565b60f81c90565b60ff1690565b808403614f445750908181614e68614e5c614e56614e5084614e8698611db1565b90614d92565b60c01c90565b6001600160401b031690565b600901918c610100614e7e612b14868686611dc2565b910152611e57565b939093955b600160f01b1615614ea3575b50600101939193614df4565b604051633894f6e760e11b81529196906020908390815f81614ed38f6001600160e01b03198d1660048401614dc8565b03926001600160a01b03165af19182156107dc575f92614f24575b506001600160a01b038216614f1057600191614f0991614fce565b9590614e97565b631f24c1fb60e11b5f52600487905260245ffd5b614f3d91925060203d81116138995761388a8183610fe3565b905f614eee565b9196909491831115614f5f57630760bdcf60e11b5f5260045ffd5b614f67612214565b6101008b0152614e8b565b505091929460ff80614f8a614e23613fbf8789613f86565b1603614fbf57610100614fa7612b1485614faf966120bc98611d95565b910152612071565b5460101c6001600160a01b031690565b63b32eeb6960e01b5f5260045ffd5b908082186001600160a01b031615606083811b838501821b9081149184901b141717600114614ffe575050600190565b65ffffffffffff60a01b8216916001600160d01b0319808216908316841561507e575b65ffffffffffff60a01b8416801561506e575b85811090861802808618951461505d575b81811190821802189160018060a01b03911716171790565b65ffffffffffff60a01b9450615045565b5065ffffffffffff60a01b615034565b65ffffffffffff60a01b9450615021565b356001600160501b03198116929190601682106150aa575050565b6001600160501b031960169290920360031b82901b16169150565b805468010000000000000000811015610f8c576150e791600182018155614830565b819291549060031b9160501c821b9160018060b01b03901b1916179055565b356001600160f01b0319811692919060028210615121575050565b6001600160f01b031960029290920360031b82901b16169150565b919061514890806147fb565b9260fe8411801561542c575b61541d57600161516382612071565b015461540a575b5f1984015f5b8181106152cc57509061522f61522883876151c86152196152006134b96151fa6151f487612ff99e9f8e6151ef61524b9f8f9061070561282d6128276151ba6151c09489896122cf565b90611ded565b9a8b91612071565b805462010000600160b01b03191660109290921b62010000600160b01b0316919091179055565b6122cf565b90611e1b565b90615106565b61520988612071565b9060f01c61ffff19825416179055565b6001600160a01b0316966122cf565b8091611dfe565b6040519586939092906001600160e01b03191660208501614845565b803b15610232575f61527192604051809481926306d61fe760e41b8352600483016121b0565b038183855af19081156107dc575f516020615f355f395f51905f52926128bc926152b8575b5060408051600681526001600160a01b03909216602083015290918291820190565b806107d65f6152c693610fe3565b5f615296565b6153679061531260016152de86612071565b0161530c6152ff6152f96152f3868d8c6122cf565b90611ddf565b9061508f565b6001600160501b03191690565b906150c5565b61532c61070561070561282d6128276151ba868d8c6122cf565b61533a615228838a896122cf565b60405194918591615359916001600160e01b03198a1660208501614845565b03601f198101855284610fe3565b803b15610232576040516306d61fe760e41b8152925f91849182908490829061539390600483016121b0565b03925af19182156107dc576001926153f6575b505f516020615f355f395f51905f526153ed6153cc61282d6128276151ba868d8c6122cf565b60408051600581526001600160a01b03909216602083015290918291820190565b0390a101615170565b806107d65f61540493610fe3565b5f6153a6565b6154186001612fa483612071565b61516a565b63b62d956d60e01b5f5260045ffd5b508315615154565b5f516020615f355f395f51905f52916040916001600160a01b038216156154b1575b6001600160a01b039081165f8181527f1bbee3173dbdc223633258c9f337a0fff8115f206d302bea0ed3eac003b68b8660205284902080546001600160a01b03191693909216929092179055815190600282526020820152a1565b60019150615456565b9160138211156154d557823560601c92601401916013190190565b63ba597e7e5f526004601cfd5b9060338111156154d557813560601c92601483013592603401916033190190565b905f928491604051958692833738935af1913d82523d5f602084013e60203d830101604052565b90925f92819594604051968792833738935af115615557573d82523d5f602084013e60203d830101604052565b503d5f823e3d90fd5b918235826020118160401c176154d557830160208101938135938461558457505050565b01601f190190835b5f190160208160051b8301013580830160608101908135809101918680602080860135809601011191111792171760401c176154d5578061558c57505050565b91906155d78161457c565b925f5b8281106155e657505050565b8061561060019260051b840135840160408101358101906020823592019060208101359035615503565b61561a8389613f0e565b5215615627575b016155da565b7fe723f28f104e46b47fd3531f3608374ac226bcf3ddda334a23a266453e0efdb76156706156558389613f0e565b51604051918291858352604060208401526040830190610d6e565b0390a1615621565b91906156838161457c565b925f5b82811061569257505050565b806156bc60019260051b84013584016040810135810190602082359201906020810135903561552a565b6156c68288613f0e565b526156d18187613f0e565b5001615686565b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000030147f000000000000000000000000000000000000000000000000000000000000000046141615615763575b6719010000000000005f52601a52603a526042601820905f603a52565b5060a06040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000604082015246606082015230608082015220615746565b60a06157f4613d9c565b90602081519101209060208151910120604051917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352602083015260408201525f6060820152306080820152206719010000000000005f52601a52603a526042601820905f603a52565b949184846158e092969593966040519061587882610fc7565b5f82525f602083015260408201995f8b526158da606084019a8b925f84525f60808701525f60a0870152606060c08701526158cb60e08701915f83526101008801955f87529063ffffffff60e01b169052565b6001600160a01b039091169052565b52615980565b60ff806158f3614e23613fbf8786613f86565b1603614fbf57614faf61590d8461591d9561592294611d95565b9490955163ffffffff60e01b1690565b612071565b9351929190565b8065ffffffffffff8260a01c16918215600114615947575b60d01c92565b65ffffffffffff9250615941565b90926080926120bc9594835260018060a01b0316602083015260408201528160608201520190610d6e565b91606083019060016159d561599c845163ffffffff60e01b1690565b6001600160e01b0319165f9081527f7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f8526020526040902090565b01805493905f5b8581106159ec5750505050505050565b6159fc612f15612f088385614830565b6001600160a01b031660a0890190815260808901949091615a25906001600160f01b0319168652565b615a3f615a38614e23613fbf8985613f86565b60ff168a52565b615a4d614e298a5160ff1690565b808403615bbc5750858181615a72614e5c614e56614e50615ac79b9c615a9a98611db1565b8c60c0615a8d612b1460208401948086526009018688611dc2565b9101525160090191611e57565b949094955b51600160f11b90615ab9906001600160f01b0319166134b9565b166001600160f01b03191690565b15615ad6575b506001016159dc565b51615ae9906001600160a01b0316610705565b6020615b0f615b02615b02895163ffffffff60e01b1690565b6001600160e01b03191690565b60e08a01516101008b015160c08c015160405163184dfdbb60e11b8152958694909385938493615b4e9390926001600160a01b03169060048601615955565b03915afa9081156107dc575f91615b9e575b506001600160a01b038116615b8a5790600191615b8260408a01918251614fce565b905290615acd565b631f24c1fb60e11b5f52600482905260245ffd5b615bb6915060203d81116138995761388a8183610fe3565b5f615b60565b909490831115615bd557630760bdcf60e11b5f5260045ffd5b615ac790615be4365f88612a9c565b60c08b0152615a9f565b5f516020615f755f395f51905f52545f9493929060581b6001600160f81b03198116600160f81b03615ca95791615c4e9391615c2f61070560209560581c90565b9160405195869485938493637aa8f17760e11b8552306004860161218c565b03915afa9081156107dc575f91615c8a575b505b6001600160e01b0319166374eca2c160e11b01615c7b57565b6362467c7760e11b5f5260045ffd5b615ca3915060203d60201161347c576134748183610fe3565b5f615c60565b90949192916001600160f81b03198216600160f91b03615d4a5750602091615cd79160081b9584308861585f565b60405163392dffaf60e01b81529297929586949385938493615d0a93909230906001600160e01b03191660048701614ac7565b03916001600160a01b03165afa9081156107dc575f91615d2b575b50615c62565b615d44915060203d60201161347c576134748183610fe3565b5f615d25565b94906001600160f81b03191661244d57615d6392614a0e565b615c62565b615d756105308383611d20565b91602c8110615f1857602c820190615d9661070561282d6128278487611d4b565b615dc0615db2613fcd613fbf615dac8780612009565b90613f86565b6001600160f81b0319161590565b80615e73575b61070561282d61282785615e1b6102419a87615dff61070561282d6128278f9d6129579f9e8f604c9f6129d09f615e21575b5050611e46565b615e098b80612009565b9390926001600160a01b031690613f8f565b88611e46565b612957615e65615e6c93606c860190615e60615e4f61070561282d612827615e498787612009565b90611d5c565b9586906001600160a01b0316615434565b612009565b8091611e29565b8f87615df8565b5060405163ecd0596160e01b81526002600482015290949291906020816024816001600160a01b038a165afa9384156107dc5761282d61282784615e1b610705948b615dff61070561282d6102419f8f9c6129579f9d8f604c9f936129d09f94612827955f91615ef9575b509f50505050505050505097509a5050959650505050615dc6565b615f12915060203d602011610831576108238183610fe3565b5f615ede565b90506004915003615f2557565b637a210a5d60e11b5f5260045ffdfed21d0b289f126c4b473ea641963e766833c2f13866e4ff480abd787c100ef123341347516a9de374859dfda710fa4828b2d48cb57d4fbe4c1149612b8e02276e7bcaa2ced2a71450ed5a9a1b4848e8e5206dbc3f06011e595f7f55428cc6f84f0000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032" export const KERNEL_V07_V3_3_FACTORY_CREATECALL: Hex = - "0x000000000000000000000000000000000000000000000000000000000000000060a034607357601f61044238819003918201601f19168301916001600160401b03831184841017607757808492602094604052833981010312607357516001600160a01b03811681036073576080526040516103b6908161008c823960805181818160c60152818161021d01526102d80152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816348aac39214610250575080635c60da1b146102085763ea6d13ac1461003d575f80fd5b6100463661033f565b60405161006c602080838181019587898837878201908382015203018084520182610394565b519020905f92604051927fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212060358501523060581b845260ff84538060158501526055842094341591863b156101eb5750506001906101e6575f38818034895af1156101d9575b836040525f60605215610157575b6040516001600160a01b0385168152602090f35b9180825f9493859483378101838152039082855af13d156101d4573d67ffffffffffffffff81116101c0576040519061019a601f8201601f191660200183610394565b81525f60203d92013e5b156101b1575f8080610143565b63487e630960e11b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6101a4565b63b12d13eb5f526004601cfd5b610135565b91509450605f602134f593846101355763301164255f526004601cfd5b3461024c575f36600319011261024c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461024c57806102826020806102653661033f565b908084889499019889378201908382015203018084520182610394565b5190206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f602120906040525f60605260ff5f536035523060601b600152601552602060555f205f6035526040519060018060a01b03168152f35b90604060031983011261024c5760043567ffffffffffffffff811161024c578260238201121561024c5780600401359267ffffffffffffffff841161024c576024848301011161024c57602401919060243590565b90601f8019910116810190811067ffffffffffffffff8211176101c05760405256000000000000000000000000e264dccc54e4b6906c0d1fee11d4326c06d33c80" + "0x000000000000000000000000000000000000000000000000000000000000000060a03461008d57601f61045c38819003918201601f19168301916001600160401b038311848410176100915780849260209460405283398101031261008d57516001600160a01b038116810361008d57806080523b1561007e576040516103b690816100a6823960805181818160c60152818161021d01526102d80152f35b632e07c4bd60e11b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816348aac39214610250575080635c60da1b146102085763ea6d13ac1461003d575f80fd5b6100463661033f565b60405161006c602080838181019587898837878201908382015203018084520182610394565b519020905f92604051927fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f60212060358501523060581b845260ff84538060158501526055842094341591863b156101eb5750506001906101e6575f38818034895af1156101d9575b836040525f60605215610157575b6040516001600160a01b0385168152602090f35b9180825f9493859483378101838152039082855af13d156101d4573d67ffffffffffffffff81116101c0576040519061019a601f8201601f191660200183610394565b81525f60203d92013e5b156101b1575f8080610143565b63487e630960e11b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b6101a4565b63b12d13eb5f526004601cfd5b610135565b91509450605f602134f593846101355763301164255f526004601cfd5b3461024c575f36600319011261024c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461024c57806102826020806102653661033f565b908084889499019889378201908382015203018084520182610394565b5190206040517fcc3735a920a3ca505d382bbc545af43d6000803e6038573d6000fd5b3d6000f36060527f5155f3363d3d373d3d363d7f360894a13ba1a3210667c828492db98dca3e20766040526160096020527f0000000000000000000000000000000000000000000000000000000000000000601e5268603d3d8160223d3973600a52605f602120906040525f60605260ff5f536035523060601b600152601552602060555f205f6035526040519060018060a01b03168152f35b90604060031983011261024c5760043567ffffffffffffffff811161024c578260238201121561024c5780600401359267ffffffffffffffff841161024c576024848301011161024c57602401919060243590565b90601f8019910116810190811067ffffffffffffffff8211176101c05760405256000000000000000000000000d6cedde84be40893d153be9d467cd6ad37875b28" // Will deploy V0.7 KERNEL_FACTORY_ADDRESS to 0xd703aaE79538628d27099B8c4f621bE4CCd142d5 export const KERNEL_V07_META_FACTORY_CREATECALL: Hex = diff --git a/packages/permissionless-test/mock-aa-infra/alto/index.ts b/packages/permissionless-test/mock-aa-infra/alto/index.ts index f49211a7..ed1d0e78 100644 --- a/packages/permissionless-test/mock-aa-infra/alto/index.ts +++ b/packages/permissionless-test/mock-aa-infra/alto/index.ts @@ -634,6 +634,13 @@ export const setupContracts = async (rpc: string) => { data: "0x6e7dbabb000000000000000000000000E30c76Dc9eCF1c19F6Fec070674E1b4eFfE069FA0000000000000000000000000000000000000000000000000000000000000001" }) + // register 0x2577507b78c2008Ff367261CB6285d44ba5eF2E9 + await sendTransaction(walletClient, { + account: kernelFactoryOwner, + to: "0xd703aaE79538628d27099B8c4f621bE4CCd142d5" /* kernel factory v0.7 */, + data: "0x6e7dbabb0000000000000000000000002577507b78c2008Ff367261CB6285d44ba5eF2E90000000000000000000000000000000000000000000000000000000000000001" + }) + await sendTransaction(walletClient, { account: kernelFactoryOwner, to: "0xd703aaE79538628d27099B8c4f621bE4CCd142d5" /* kernel factory v0.7 */, @@ -707,8 +714,8 @@ export const setupContracts = async (rpc: string) => { "0xbA45a2BFb8De3D24cA9D7F1B551E14dFF5d690Fd", // Kernel v0.3.1 WebAuthn Validator "0xD830D15D3dc0C269F3dBAa0F3e8626d33CFdaBe1", // Kernel v0.3.2 Account Logic "0x7a1dBAB750f12a90EB1B60D2Ae3aD17D4D81EfFe", // Kernel v0.3.2 Factory - "0xE264dCCc54e4b6906c0D1Fee11D4326c06D33c80", // Kernel v0.3.3 Account Logic - "0xE30c76Dc9eCF1c19F6Fec070674E1b4eFfE069FA", // Kernel v0.3.3 Factory + "0xd6CEDDe84be40893d153Be9d467CD6aD37875b28", // Kernel v0.3.3 Account Logic + "0x2577507b78c2008Ff367261CB6285d44ba5eF2E9", // Kernel v0.3.3 Factory "0x00004EC70002a32400f8ae005A26081065620D20", // LightAccountFactory v1.1.0 "0xae8c656ad28F2B59a196AB61815C16A0AE1c3cba", // LightAccount v1.1.0 implementation "0x0000000000400CdFef5E2714E63d8040b700BC24", // LightAccountFactory v2.0.0 diff --git a/packages/permissionless-test/src/utils.ts b/packages/permissionless-test/src/utils.ts index fee803d4..a0f8dc82 100644 --- a/packages/permissionless-test/src/utils.ts +++ b/packages/permissionless-test/src/utils.ts @@ -328,10 +328,12 @@ export const getKernelEcdsaClient = async < anvilRpc, version, privateKey, - useMetaFactory + useMetaFactory, + eip7702 = false }: AAParamType & { version?: KernelVersion useMetaFactory?: boolean + eip7702?: boolean }) => { const publicClient = getPublicClient(anvilRpc) @@ -342,6 +344,18 @@ export const getKernelEcdsaClient = async < throw new Error("Kernel ERC7579 is not supported for V06") } + if (eip7702) { + return toKernelSmartAccount({ + client: publicClient, + entryPoint: { + address: entryPoint08Address, + version: "0.8" + }, + owner: privateKeyToAccount(privateKey ?? generatePrivateKey()), + eip7702: true + }) + } + return toKernelSmartAccount({ client: publicClient, entryPoint: { @@ -449,6 +463,7 @@ export const getCoreSmartAccounts = (): Array<{ supportsEntryPointV06: boolean supportsEntryPointV07: boolean supportsEntryPointV08: boolean + isEip7702Compliant?: boolean isEip1271Compliant: boolean getSmartAccountClient: ( conf: AAParamType @@ -727,7 +742,33 @@ export const getCoreSmartAccounts = (): Array<{ }), supportsEntryPointV06: false, supportsEntryPointV07: true, + supportsEntryPointV08: true, + isEip1271Compliant: true + }, + { + name: "Kernel 7579 0.3.3 + EIP-7702", + getSmartAccountClient: async (conf: AAParamType) => + getBundlerClient({ + account: await getKernelEcdsaClient({ + ...(conf as AAParamType<"0.6" | "0.7">), + version: "0.3.3" as KernelVersion<"0.6" | "0.7"> + }), + ...conf + }), + getErc7579SmartAccountClient: async ( + conf: AAParamType + ) => + getSmartAccountClient({ + account: await getKernelEcdsaClient({ + ...(conf as AAParamType<"0.6" | "0.7">), + version: "0.3.3" as KernelVersion<"0.6" | "0.7"> + }), + ...conf + }), + supportsEntryPointV06: false, + supportsEntryPointV07: true, supportsEntryPointV08: false, + isEip7702Compliant: true, isEip1271Compliant: true }, { diff --git a/packages/permissionless/accounts/kernel/toKernelSmartAccount.ts b/packages/permissionless/accounts/kernel/toKernelSmartAccount.ts index a0fa50a1..a87637f4 100644 --- a/packages/permissionless/accounts/kernel/toKernelSmartAccount.ts +++ b/packages/permissionless/accounts/kernel/toKernelSmartAccount.ts @@ -5,6 +5,7 @@ import type { Chain, JsonRpcAccount, OneOf, + PrivateKeyAccount, Transport, WalletClient } from "viem" @@ -31,7 +32,7 @@ import { getUserOperationHash, toSmartAccount } from "viem/account-abstraction" -import { signMessage as _signMessage, getChainId } from "viem/actions" +import { getChainId, signMessage as signMessageViem } from "viem/actions" import { getAction } from "viem/utils" import { getAccountNonce } from "../../actions/public/getAccountNonce.js" import { getSenderAddress } from "../../actions/public/getSenderAddress.js" @@ -56,6 +57,8 @@ import { isWebAuthnAccount } from "./utils/isWebAuthnAccount.js" import { signMessage } from "./utils/signMessage.js" import { signTypedData } from "./utils/signTypedData.js" +type EntryPointVersion = "0.6" | "0.7" + /** * The account creation ABI for a kernel smart account (from the KernelFactory) */ @@ -91,7 +94,7 @@ const createAccountAbi = [ } ] as const -export type KernelVersion = +export type KernelVersion = entryPointVersion extends "0.6" ? "0.2.1" | "0.2.2" | "0.2.3" | "0.2.4" : "0.3.0-beta" | "0.3.1" | "0.3.2" | "0.3.3" @@ -100,7 +103,7 @@ export type KernelVersion = * Default addresses map for different kernel smart account versions */ export const KERNEL_VERSION_TO_ADDRESSES_MAP: { - [key in KernelVersion<"0.6" | "0.7">]: { + [key in KernelVersion]: { ECDSA_VALIDATOR: Address WEB_AUTHN_VALIDATOR?: Address ACCOUNT_LOGIC: Address @@ -150,8 +153,8 @@ export const KERNEL_VERSION_TO_ADDRESSES_MAP: { }, "0.3.3": { ECDSA_VALIDATOR: "0x845ADb2C711129d4f3966735eD98a9F09fC4cE57", - ACCOUNT_LOGIC: "0xE264dCCc54e4b6906c0D1Fee11D4326c06D33c80", - FACTORY_ADDRESS: "0xE30c76Dc9eCF1c19F6Fec070674E1b4eFfE069FA", + ACCOUNT_LOGIC: "0xd6CEDDe84be40893d153Be9d467CD6aD37875b28", + FACTORY_ADDRESS: "0x2577507b78c2008Ff367261CB6285d44ba5eF2E9", META_FACTORY_ADDRESS: "0xd703aaE79538628d27099B8c4f621bE4CCd142d5" } } @@ -160,10 +163,15 @@ export const KERNEL_VERSION_TO_ADDRESSES_MAP: { * Get supported Kernel Smart Account version based on entryPoint * @param entryPoint */ -const getDefaultKernelVersion = ( +const getDefaultKernelVersion = ( entryPointVersion: TEntryPointVersion, - version?: KernelVersion + version?: KernelVersion, + eip7702?: boolean ): KernelVersion => { + if (eip7702) { + return "0.3.3" as KernelVersion + } + if (version) { return version } @@ -195,7 +203,7 @@ const getDefaultAddresses = ({ kernelVersion, isWebAuthn }: Partial & { - kernelVersion: KernelVersion<"0.6" | "0.7"> + kernelVersion: KernelVersion isWebAuthn: boolean }): KERNEL_ADDRESSES => { const addresses = KERNEL_VERSION_TO_ADDRESSES_MAP[kernelVersion] @@ -227,7 +235,7 @@ export const getEcdsaRootIdentifierForKernelV3 = ( * @param owner * @param ecdsaValidatorAddress */ -const getInitializationData = ({ +const getInitializationData = ({ entryPoint: { version: entryPointVersion }, kernelVersion, validatorData, @@ -322,7 +330,7 @@ const getValidatorData = async (owner: WebAuthnAccount | LocalAccount) => { * @param accountLogicAddress * @param ecdsaValidatorAddress */ -const getAccountInitCode = async ({ +const getAccountInitCode = async ({ entryPointVersion, kernelVersion, validatorData, @@ -375,44 +383,74 @@ const getAccountInitCode = async ({ } export type ToKernelSmartAccountParameters< - entryPointVersion extends "0.6" | "0.7", + entryPointVersion extends EntryPointVersion, kernelVersion extends KernelVersion, owner extends OneOf< | EthereumProvider | WalletClient | LocalAccount | WebAuthnAccount - > + >, + eip7702 extends boolean = false > = { client: Client< Transport, Chain | undefined, JsonRpcAccount | LocalAccount | undefined > - owners: [owner] - entryPoint?: { - address: Address - version: entryPointVersion - } - address?: Address version?: kernelVersion - index?: bigint - factoryAddress?: Address - metaFactoryAddress?: Address - accountLogicAddress?: Address - validatorAddress?: Address - nonceKey?: bigint - useMetaFactory?: boolean | "optional" -} + eip7702?: eip7702 +} & (eip7702 extends true + ? { + owner: OneOf< + | EthereumProvider + | WalletClient + | LocalAccount + > + entryPoint?: { + address: Address + version: "0.7" + } + address?: never + index?: never + factoryAddress?: never + metaFactoryAddress?: never + accountLogicAddress?: never + validatorAddress?: never + nonceKey?: never + useMetaFactory?: never + } + : { + entryPoint?: { + address: Address + version: entryPointVersion + } + owners: [owner] + address?: Address + index?: bigint + factoryAddress?: Address + metaFactoryAddress?: Address + accountLogicAddress?: Address + validatorAddress?: Address + nonceKey?: bigint + useMetaFactory?: boolean | "optional" + }) export type KernelSmartAccountImplementation< - entryPointVersion extends "0.6" | "0.7" = "0.7" + entryPointVersion extends EntryPointVersion = "0.7", + eip7702 extends boolean = false > = Assign< SmartAccountImplementation< entryPointVersion extends "0.6" ? typeof entryPoint06Abi : typeof entryPoint07Abi, - entryPointVersion + entryPointVersion, + eip7702 extends true + ? { + implementation: Address + } + : object, + eip7702 // { // // entryPoint === ENTRYPOINT_ADDRESS_V06 ? "0.2.2" : "0.3.0-beta" // abi: entryPointVersion extends "0.6" ? typeof BiconomyAbi @@ -423,8 +461,11 @@ export type KernelSmartAccountImplementation< > export type ToKernelSmartAccountReturnType< - entryPointVersion extends "0.6" | "0.7" = "0.7" -> = SmartAccount> + entryPointVersion extends EntryPointVersion = "0.7", + eip7702 extends boolean = false +> = eip7702 extends true + ? SmartAccount> + : SmartAccount> /** * Build a kernel smart account from a private key, that use the ECDSA or passkeys signer behind the scene * @param client @@ -436,56 +477,86 @@ export type ToKernelSmartAccountReturnType< * @param validatorAddress */ export async function toKernelSmartAccount< - entryPointVersion extends "0.6" | "0.7", + entryPointVersion extends EntryPointVersion, kernelVersion extends KernelVersion, owner extends OneOf< | EthereumProvider | WalletClient | LocalAccount | WebAuthnAccount - > + >, + eip7702 extends boolean = false >( parameters: ToKernelSmartAccountParameters< entryPointVersion, kernelVersion, - owner + owner, + eip7702 > -): Promise> { +): Promise> { const { client, address, index = 0n, - owners, version, validatorAddress: _validatorAddress, factoryAddress: _factoryAddress, metaFactoryAddress: _metaFactoryAddress, accountLogicAddress: _accountLogicAddress, - useMetaFactory = true + useMetaFactory = true, + eip7702 = false } = parameters + const owners = (() => { + if (eip7702 && "owner" in parameters) { + return [parameters.owner] + } + + if ("owners" in parameters) { + return parameters.owners + } + + throw new Error("Invalid parameters") + })() + const isWebAuthn = owners[0].type === "webAuthn" - const owner = isWebAuthn - ? (owners[0] as WebAuthnAccount) - : await toOwner({ - owner: owners[0] as OneOf< - | EthereumProvider - | WalletClient - | LocalAccount - > - }) - - const entryPoint = { - address: parameters.entryPoint?.address ?? entryPoint07Address, - abi: - (parameters.entryPoint?.version ?? "0.7") === "0.6" - ? entryPoint06Abi - : entryPoint07Abi, - version: parameters.entryPoint?.version ?? "0.7" - } as const - - const kernelVersion = getDefaultKernelVersion(entryPoint.version, version) + const owner = await (() => { + if (isWebAuthn) { + return owners[0] as WebAuthnAccount + } + return toOwner({ + owner: owners[0] as OneOf< + | EthereumProvider + | WalletClient + | LocalAccount + > + }) + })() + + const entryPoint = (() => { + const address = parameters.entryPoint?.address ?? entryPoint07Address + const version = parameters.entryPoint?.version ?? "0.7" + + let abi: typeof entryPoint06Abi | typeof entryPoint07Abi = + entryPoint07Abi + + if (version === "0.6") { + abi = entryPoint06Abi + } + + return { + address, + abi, + version + } as const + })() + + const kernelVersion = getDefaultKernelVersion( + entryPoint.version, + version, + eip7702 + ) const { accountLogicAddress, @@ -539,6 +610,18 @@ export async function toKernelSmartAccount< } const { accountAddress, getFactoryArgs } = await (async () => { + if (eip7702) { + return { + accountAddress: (owner as LocalAccount).address, + getFactoryArgs: async () => { + return { + factory: undefined, + factoryData: undefined + } + } + } + } + let getFactoryArgs = getFactoryArgsFunc( useMetaFactory === "optional" ? true : useMetaFactory ) @@ -577,6 +660,17 @@ export async function toKernelSmartAccount< client, entryPoint, getFactoryArgs, + extend: eip7702 + ? { + implementation: accountLogicAddress + } + : undefined, + authorization: eip7702 + ? { + address: accountLogicAddress, + account: owner as PrivateKeyAccount + } + : undefined, async getAddress() { return accountAddress }, @@ -633,9 +727,7 @@ export async function toKernelSmartAccount< owner, message, accountAddress: await this.getAddress(), - kernelVersion: - // TODO: remove this once 0.3.3 is released - kernelVersion === "0.3.3" ? "0.3.2" : kernelVersion, + kernelVersion: kernelVersion, chainId: await getMemoizedChainId() }) @@ -654,9 +746,7 @@ export async function toKernelSmartAccount< chainId: await getMemoizedChainId(), ...(typedData as TypedDataDefinition), accountAddress: await this.getAddress(), - kernelVersion: - // TODO: remove this once 0.3.3 is released - kernelVersion === "0.3.3" ? "0.3.2" : kernelVersion + kernelVersion: kernelVersion }) if (isKernelV2(kernelVersion)) { @@ -683,6 +773,7 @@ export async function toKernelSmartAccount< entryPointVersion: entryPoint.version, chainId: chainId }) + const signature = isWebAuthnAccount(owner) ? await signMessage({ owner, @@ -701,5 +792,5 @@ export async function toKernelSmartAccount< } return signature } - }) as Promise> + }) as Promise> } diff --git a/packages/permissionless/accounts/simple/toSimpleSmartAccount.ts b/packages/permissionless/accounts/simple/toSimpleSmartAccount.ts index a8ce9807..7ceb7cd3 100644 --- a/packages/permissionless/accounts/simple/toSimpleSmartAccount.ts +++ b/packages/permissionless/accounts/simple/toSimpleSmartAccount.ts @@ -372,12 +372,11 @@ export async function toSimpleSmartAccount< entryPointAddress: entryPoint.address, userOperation: { ...userOperation, - sender: - userOperation.sender ?? (await this.getAddress()), + sender: await this.getAddress(), signature: "0x" } }) - return await localOwner.signTypedData(typedData) + return localOwner.signTypedData(typedData) } return signMessage(client, { From debbd02e39713d55b3b49e3b2655ddc5dd6968e4 Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Wed, 28 May 2025 11:14:34 +0100 Subject: [PATCH 2/9] fix tests --- bun.lock | 196 ++++++++++++++++-- package.json | 2 +- packages/mock-paymaster/helpers/schema.ts | 33 ++- .../permissionless-test/src/testWithRpc.ts | 28 ++- packages/permissionless-test/src/utils.ts | 16 +- packages/permissionless/accounts/index.ts | 13 +- .../kernel/to7702KernelSmartAccount.ts | 60 ++++++ .../accounts/kernel/toKernelSmartAccount.ts | 2 +- .../smartAccount/sendTransaction.test.ts | 48 ++++- 9 files changed, 339 insertions(+), 59 deletions(-) create mode 100644 packages/permissionless/accounts/kernel/to7702KernelSmartAccount.ts diff --git a/bun.lock b/bun.lock index c9ca9dbb..e83bd9b0 100644 --- a/bun.lock +++ b/bun.lock @@ -8,7 +8,7 @@ "@changesets/changelog-github": "^0.4.8", "@changesets/cli": "^2.26.2", "@permissionless/wagmi": "workspace:packages/wagmi", - "@pimlico/alto": "^0.0.18", + "@pimlico/alto": "0.0.0-main.20250527T165035", "@pimlico/mock-paymaster": "workspace:packages/mock-paymaster", "@size-limit/esbuild-why": "^9.0.0", "@size-limit/preset-small-lib": "^9.0.0", @@ -53,7 +53,7 @@ }, "packages/permissionless": { "name": "permissionless", - "version": "0.2.45", + "version": "0.2.47", "peerDependencies": { "ox": "0.6.7", "viem": "^2.28.1", @@ -335,7 +335,7 @@ "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.52.1", "", { "dependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A=="], - "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.25.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ=="], + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.30.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA=="], "@opentelemetry/core": ["@opentelemetry/core@1.30.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ=="], @@ -349,14 +349,52 @@ "@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@types/shimmer": "^1.0.2", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw=="], + "@opentelemetry/instrumentation-amqplib": ["@opentelemetry/instrumentation-amqplib@0.46.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ=="], + + "@opentelemetry/instrumentation-connect": ["@opentelemetry/instrumentation-connect@0.43.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/connect": "3.4.38" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ht7YGWQuV5BopMcw5Q2hXn3I8eG8TH0J/kc/GMcW4CuNTgiP6wCu44BOnucJWL3CmFWaRHI//vWyAhaC8BwePw=="], + + "@opentelemetry/instrumentation-dataloader": ["@opentelemetry/instrumentation-dataloader@0.16.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-K/qU4CjnzOpNkkKO4DfCLSQshejRNAJtd4esgigo/50nxCB6XCyi1dhAblUHM9jG5dRm8eu0FB+t87nIo99LYQ=="], + + "@opentelemetry/instrumentation-express": ["@opentelemetry/instrumentation-express@0.47.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-QNXPTWteDclR2B4pDFpz0TNghgB33UMjUt14B+BZPmtH1MwUFAfLHBaP5If0Z5NZC+jaH8oF2glgYjrmhZWmSw=="], + "@opentelemetry/instrumentation-fastify": ["@opentelemetry/instrumentation-fastify@0.38.0", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.52.0", "@opentelemetry/semantic-conventions": "^1.22.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-HBVLpTSYpkQZ87/Df3N0gAw7VzYZV3n28THIBrJWfuqw3Or7UqdhnjeuMIPQ04BKk3aZc0cWn2naSQObbh5vXw=="], + "@opentelemetry/instrumentation-fs": ["@opentelemetry/instrumentation-fs@0.19.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-6g0FhB3B9UobAR60BGTcXg4IHZ6aaYJzp0Ki5FhnxyAPt8Ns+9SSvgcrnsN2eGmk3RWG5vYycUGOEApycQL24A=="], + + "@opentelemetry/instrumentation-generic-pool": ["@opentelemetry/instrumentation-generic-pool@0.43.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-M6qGYsp1cURtvVLGDrPPZemMFEbuMmCXgQYTReC/IbimV5sGrLBjB+/hANUpRZjX67nGLdKSVLZuQQAiNz+sww=="], + + "@opentelemetry/instrumentation-graphql": ["@opentelemetry/instrumentation-graphql@0.47.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-EGQRWMGqwiuVma8ZLAZnExQ7sBvbOx0N/AE/nlafISPs8S+QtXX+Viy6dcQwVWwYHQPAcuY3bFt3xgoAwb4ZNQ=="], + + "@opentelemetry/instrumentation-hapi": ["@opentelemetry/instrumentation-hapi@0.45.2", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-7Ehow/7Wp3aoyCrZwQpU7a2CnoMq0XhIcioFuKjBb0PLYfBfmTsFTUyatlHu0fRxhwcRsSQRTvEhmZu8CppBpQ=="], + "@opentelemetry/instrumentation-http": ["@opentelemetry/instrumentation-http@0.52.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/instrumentation": "0.52.1", "@opentelemetry/semantic-conventions": "1.25.1", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q=="], "@opentelemetry/instrumentation-ioredis": ["@opentelemetry/instrumentation-ioredis@0.42.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.52.0", "@opentelemetry/redis-common": "^0.36.2", "@opentelemetry/semantic-conventions": "^1.23.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-P11H168EKvBB9TUSasNDOGJCSkpT44XgoM6d3gRIWAa9ghLpYhl0uRkS8//MqPzcJVHr3h3RmfXIpiYLjyIZTw=="], + "@opentelemetry/instrumentation-kafkajs": ["@opentelemetry/instrumentation-kafkajs@0.7.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-OtjaKs8H7oysfErajdYr1yuWSjMAectT7Dwr+axIoZqT9lmEOkD/H/3rgAs8h/NIuEi2imSXD+vL4MZtOuJfqQ=="], + + "@opentelemetry/instrumentation-knex": ["@opentelemetry/instrumentation-knex@0.44.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-U4dQxkNhvPexffjEmGwCq68FuftFK15JgUF05y/HlK3M6W/G2iEaACIfXdSnwVNe9Qh0sPfw8LbOPxrWzGWGMQ=="], + + "@opentelemetry/instrumentation-koa": ["@opentelemetry/instrumentation-koa@0.47.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-l/c+Z9F86cOiPJUllUCt09v+kICKvT+Vg1vOAJHtHPsJIzurGayucfCMq2acd/A/yxeNWunl9d9eqZ0G+XiI6A=="], + + "@opentelemetry/instrumentation-lru-memoizer": ["@opentelemetry/instrumentation-lru-memoizer@0.44.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-5MPkYCvG2yw7WONEjYj5lr5JFehTobW7wX+ZUFy81oF2lr9IPfZk9qO+FTaM0bGEiymwfLwKe6jE15nHn1nmHg=="], + + "@opentelemetry/instrumentation-mongodb": ["@opentelemetry/instrumentation-mongodb@0.52.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-1xmAqOtRUQGR7QfJFfGV/M2kC7wmI2WgZdpru8hJl3S0r4hW0n3OQpEHlSGXJAaNFyvT+ilnwkT+g5L4ljHR6g=="], + + "@opentelemetry/instrumentation-mongoose": ["@opentelemetry/instrumentation-mongoose@0.46.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3kINtW1LUTPkiXFRSSBmva1SXzS/72we/jL22N+BnF3DFcoewkdkHPYOIdAAk9gSicJ4d5Ojtt1/HeibEc5OQg=="], + + "@opentelemetry/instrumentation-mysql": ["@opentelemetry/instrumentation-mysql@0.45.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/mysql": "2.15.26" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-TKp4hQ8iKQsY7vnp/j0yJJ4ZsP109Ht6l4RHTj0lNEG1TfgTrIH5vJMbgmoYXWzNHAqBH2e7fncN12p3BP8LFg=="], + + "@opentelemetry/instrumentation-mysql2": ["@opentelemetry/instrumentation-mysql2@0.45.2", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0", "@opentelemetry/sql-common": "^0.40.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-h6Ad60FjCYdJZ5DTz1Lk2VmQsShiViKe0G7sYikb0GHI0NVvApp2XQNRHNjEMz87roFttGPLHOYVPlfy+yVIhQ=="], + + "@opentelemetry/instrumentation-pg": ["@opentelemetry/instrumentation-pg@0.51.1", "", { "dependencies": { "@opentelemetry/core": "^1.26.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0", "@opentelemetry/sql-common": "^0.40.1", "@types/pg": "8.6.1", "@types/pg-pool": "2.0.6" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-QxgjSrxyWZc7Vk+qGSfsejPVFL1AgAJdSBMYZdDUbwg730D09ub3PXScB9d04vIqPriZ+0dqzjmQx0yWKiCi2Q=="], + "@opentelemetry/instrumentation-pino": ["@opentelemetry/instrumentation-pino@0.41.0", "", { "dependencies": { "@opentelemetry/api-logs": "^0.52.0", "@opentelemetry/core": "^1.25.0", "@opentelemetry/instrumentation": "^0.52.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Kpv0fJRk/8iMzMk5Ue5BsUJfHkBJ2wQoIi/qduU1a1Wjx9GLj6J2G17PHjPK5mnZjPNzkFOXFADZMfgDioliQw=="], + "@opentelemetry/instrumentation-redis-4": ["@opentelemetry/instrumentation-redis-4@0.46.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/redis-common": "^0.36.2", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-UMqleEoabYMsWoTkqyt9WAzXwZ4BlFZHO40wr3d5ZvtjKCHlD4YXLm+6OLCeIi/HkX7EXvQaz8gtAwkwwSEvcQ=="], + + "@opentelemetry/instrumentation-tedious": ["@opentelemetry/instrumentation-tedious@0.18.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/tedious": "^4.0.14" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-5Cuy/nj0HBaH+ZJ4leuD7RjgvA844aY2WW+B5uLcWtxGjRZl3MNLuxnNg5DYWZNPO+NafSSnra0q49KWAHsKBg=="], + "@opentelemetry/instrumentation-undici": ["@opentelemetry/instrumentation-undici@0.4.0", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.52.0" }, "peerDependencies": { "@opentelemetry/api": "^1.7.0" } }, "sha512-UdMQBpz11SqtWlmDnk5SoqF5QDom4VmW8SVDt9Q2xuMWVh8lc0kVROfoo2pl7zU6H6gFR8eudb3eFXIdrFn0ew=="], "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.52.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-transformer": "0.52.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ=="], @@ -385,11 +423,13 @@ "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.30.0", "", {}, "sha512-4VlGgo32k2EQ2wcCY3vEU28A0O13aOtHz3Xt2/2U5FAh9EfhD6t6DqL5Z6yAnRCntbTFDU4YfbpyzSlHNWycPw=="], + "@opentelemetry/sql-common": ["@opentelemetry/sql-common@0.40.1", "", { "dependencies": { "@opentelemetry/core": "^1.1.0" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0" } }, "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg=="], + "@paulmillr/qr": ["@paulmillr/qr@0.2.1", "", {}, "sha512-IHnV6A+zxU7XwmKFinmYjUcwlyK9+xkG3/s9KcQhI9BjQKycrJ1JRO+FbNYPwZiPKW3je/DR0k7w8/gLa5eaxQ=="], "@permissionless/wagmi": ["@permissionless/wagmi@workspace:packages/wagmi"], - "@pimlico/alto": ["@pimlico/alto@0.0.18", "", { "dependencies": { "@fastify/websocket": "^10.0.1", "@opentelemetry/api": "^1.9.0", "@opentelemetry/core": "^1.25.1", "@opentelemetry/exporter-trace-otlp-proto": "^0.52.1", "@opentelemetry/instrumentation-fastify": "^0.38.0", "@opentelemetry/instrumentation-http": "^0.52.1", "@opentelemetry/instrumentation-ioredis": "^0.42.0", "@opentelemetry/instrumentation-pino": "^0.41.0", "@opentelemetry/instrumentation-undici": "^0.4.0", "@opentelemetry/sdk-node": "^0.52.1", "@opentelemetry/sdk-trace-base": "^1.25.1", "@opentelemetry/semantic-conventions": "^1.25.1", "@pimlico/opentelemetry-instrumentation-viem": "^0.0.4", "@sentry/node": "^7.83.0", "@types/node": "^18.16.3", "@types/ws": "^8.5.10", "abitype": "^0.8.0", "async-mutex": "^0.4.0", "bull": "^4.15.1", "dotenv": "^16.0.3", "fastify": "^4.25.2", "ioredis": "^5.4.1", "opentelemetry-instrumentation-fetch-node": "^1.2.3", "pino": "^8.15.0", "pino-http": "^8.4.0", "pino-pretty": "^10.0.0", "prom-client": "^14.2.0", "type-fest": "^4.35.0", "viem": "^2.24.3", "yargs": "^17.7.1", "zod": "^3.21.4", "zod-validation-error": "^1.3.0" }, "bin": { "alto": "esm/cli/alto.js" } }, "sha512-JIDEEYgdnkT7+wdxk0OBLSVwhm2CaLSbCw4474C9ZFmBggKBOByzaYCeIAJPb+Tag3WVBDXrXb2lYi2aRT9phQ=="], + "@pimlico/alto": ["@pimlico/alto@0.0.0-main.20250527T165035", "", { "dependencies": { "@fastify/websocket": "^10.0.1", "@opentelemetry/api": "^1.9.0", "@opentelemetry/core": "^1.25.1", "@opentelemetry/exporter-trace-otlp-proto": "^0.52.1", "@opentelemetry/instrumentation-fastify": "^0.38.0", "@opentelemetry/instrumentation-http": "^0.52.1", "@opentelemetry/instrumentation-ioredis": "^0.42.0", "@opentelemetry/instrumentation-pino": "^0.41.0", "@opentelemetry/instrumentation-undici": "^0.4.0", "@opentelemetry/sdk-node": "^0.52.1", "@opentelemetry/sdk-trace-base": "^1.25.1", "@opentelemetry/semantic-conventions": "^1.25.1", "@pimlico/opentelemetry-instrumentation-viem": "^0.0.4", "@sentry/node": "^9.15.0", "@types/node": "^18.16.3", "@types/ws": "^8.5.10", "abitype": "^0.8.0", "async-mutex": "^0.4.0", "bull": "^4.15.1", "dotenv": "^16.0.3", "fastify": "^4.25.2", "ioredis": "^5.4.1", "opentelemetry-instrumentation-fetch-node": "^1.2.3", "pino": "^8.15.0", "pino-http": "^8.4.0", "pino-pretty": "^10.0.0", "prom-client": "^14.2.0", "type-fest": "^4.35.0", "viem": "^2.24.3", "yargs": "^17.7.1", "zod": "^3.21.4", "zod-validation-error": "^1.3.0" }, "bin": { "alto": "esm/cli/alto.js" } }, "sha512-wW4IStXcdeE5ct6lYAfL2hb9D4igh2lgxgjBPf/Cjz881V4ziBocQ4yqIR4lkoPU+wpgIWvb9UGH100oy59meg=="], "@pimlico/mock-paymaster": ["@pimlico/mock-paymaster@workspace:packages/mock-paymaster"], @@ -397,6 +437,8 @@ "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + "@prisma/instrumentation": ["@prisma/instrumentation@6.7.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" }, "peerDependencies": { "@opentelemetry/api": "^1.8" } }, "sha512-3NuxWlbzYNevgPZbV0ktA2z6r0bfh0g22ONTxcK09a6+6MdIPjHsYx1Hnyu4yOq+j7LmupO5J69hhuOnuvj8oQ=="], + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], @@ -485,17 +527,11 @@ "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], - "@sentry-internal/tracing": ["@sentry-internal/tracing@7.120.3", "", { "dependencies": { "@sentry/core": "7.120.3", "@sentry/types": "7.120.3", "@sentry/utils": "7.120.3" } }, "sha512-Ausx+Jw1pAMbIBHStoQ6ZqDZR60PsCByvHdw/jdH9AqPrNE9xlBSf9EwcycvmrzwyKspSLaB52grlje2cRIUMg=="], - - "@sentry/core": ["@sentry/core@7.120.3", "", { "dependencies": { "@sentry/types": "7.120.3", "@sentry/utils": "7.120.3" } }, "sha512-vyy11fCGpkGK3qI5DSXOjgIboBZTriw0YDx/0KyX5CjIjDDNgp5AGgpgFkfZyiYiaU2Ww3iFuKo4wHmBusz1uA=="], - - "@sentry/integrations": ["@sentry/integrations@7.120.3", "", { "dependencies": { "@sentry/core": "7.120.3", "@sentry/types": "7.120.3", "@sentry/utils": "7.120.3", "localforage": "^1.8.1" } }, "sha512-6i/lYp0BubHPDTg91/uxHvNui427df9r17SsIEXa2eKDwQ9gW2qRx5IWgvnxs2GV/GfSbwcx4swUB3RfEWrXrQ=="], + "@sentry/core": ["@sentry/core@9.22.0", "", {}, "sha512-ixvtKmPF42Y6ckGUbFlB54OWI75H2gO5UYHojO6eXFpS7xO3ZGgV/QH6wb40mWK+0w5XZ0233FuU9VpsuE6mKA=="], - "@sentry/node": ["@sentry/node@7.120.3", "", { "dependencies": { "@sentry-internal/tracing": "7.120.3", "@sentry/core": "7.120.3", "@sentry/integrations": "7.120.3", "@sentry/types": "7.120.3", "@sentry/utils": "7.120.3" } }, "sha512-t+QtekZedEfiZjbkRAk1QWJPnJlFBH/ti96tQhEq7wmlk3VszDXraZvLWZA0P2vXyglKzbWRGkT31aD3/kX+5Q=="], + "@sentry/node": ["@sentry/node@9.22.0", "", { "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1", "@opentelemetry/core": "^1.30.1", "@opentelemetry/instrumentation": "^0.57.2", "@opentelemetry/instrumentation-amqplib": "^0.46.1", "@opentelemetry/instrumentation-connect": "0.43.1", "@opentelemetry/instrumentation-dataloader": "0.16.1", "@opentelemetry/instrumentation-express": "0.47.1", "@opentelemetry/instrumentation-fs": "0.19.1", "@opentelemetry/instrumentation-generic-pool": "0.43.1", "@opentelemetry/instrumentation-graphql": "0.47.1", "@opentelemetry/instrumentation-hapi": "0.45.2", "@opentelemetry/instrumentation-http": "0.57.2", "@opentelemetry/instrumentation-ioredis": "0.47.1", "@opentelemetry/instrumentation-kafkajs": "0.7.1", "@opentelemetry/instrumentation-knex": "0.44.1", "@opentelemetry/instrumentation-koa": "0.47.1", "@opentelemetry/instrumentation-lru-memoizer": "0.44.1", "@opentelemetry/instrumentation-mongodb": "0.52.0", "@opentelemetry/instrumentation-mongoose": "0.46.1", "@opentelemetry/instrumentation-mysql": "0.45.1", "@opentelemetry/instrumentation-mysql2": "0.45.2", "@opentelemetry/instrumentation-pg": "0.51.1", "@opentelemetry/instrumentation-redis-4": "0.46.1", "@opentelemetry/instrumentation-tedious": "0.18.1", "@opentelemetry/instrumentation-undici": "0.10.1", "@opentelemetry/resources": "^1.30.1", "@opentelemetry/sdk-trace-base": "^1.30.1", "@opentelemetry/semantic-conventions": "^1.30.0", "@prisma/instrumentation": "6.7.0", "@sentry/core": "9.22.0", "@sentry/opentelemetry": "9.22.0", "import-in-the-middle": "^1.13.1", "minimatch": "^9.0.0" } }, "sha512-89r2p6n0xeT2eiqIB0WXgz/rJzUgiOgZex7NvYwzEGeP0GoteDIf0Kbth/gCOy1md/ngiW+0X+S2Ed/uRw4XEQ=="], - "@sentry/types": ["@sentry/types@7.120.3", "", {}, "sha512-C4z+3kGWNFJ303FC+FxAd4KkHvxpNFYAFN8iMIgBwJdpIl25KZ8Q/VdGn0MLLUEHNLvjob0+wvwlcRBBNLXOow=="], - - "@sentry/utils": ["@sentry/utils@7.120.3", "", { "dependencies": { "@sentry/types": "7.120.3" } }, "sha512-UDAOQJtJDxZHQ5Nm1olycBIsz2wdGX8SdzyGVHmD8EOQYAeDZQyIlQYohDe9nazdIOQLZCIc3fU0G9gqVLkaGQ=="], + "@sentry/opentelemetry": ["@sentry/opentelemetry@9.22.0", "", { "dependencies": { "@sentry/core": "9.22.0" }, "peerDependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.0.0", "@opentelemetry/core": "^1.30.1 || ^2.0.0", "@opentelemetry/instrumentation": "^0.57.1 || ^0.200.0", "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.0.0", "@opentelemetry/semantic-conventions": "^1.30.0" } }, "sha512-m6JI2LUCm4FT34OQgh7or2Y9chKn8BrqawNqu7BEqbsGADE5VPwtdu7DwPOD7pC6KN9lGHVf0bqS7197e8Kz/A=="], "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], @@ -521,14 +557,22 @@ "@types/babel__traverse": ["@types/babel__traverse@7.20.6", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg=="], + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + "@types/mysql": ["@types/mysql@2.15.26", "", { "dependencies": { "@types/node": "*" } }, "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ=="], + "@types/node": ["@types/node@18.19.80", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-kEWeMwMeIvxYkeg1gTc01awpwLbfMRZXdIhwRcakd/KlK53jmRC26LqcbIt7fnAQTu5GzlnWmzA3H6+l1u6xxQ=="], + "@types/pg": ["@types/pg@8.6.1", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w=="], + + "@types/pg-pool": ["@types/pg-pool@2.0.6", "", { "dependencies": { "@types/pg": "*" } }, "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ=="], + "@types/prop-types": ["@types/prop-types@15.7.14", "", {}, "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ=="], "@types/react": ["@types/react@18.3.18", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ=="], @@ -537,6 +581,8 @@ "@types/shimmer": ["@types/shimmer@1.2.0", "", {}, "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg=="], + "@types/tedious": ["@types/tedious@4.0.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw=="], + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], "@types/ws": ["@types/ws@8.18.0", "", { "dependencies": { "@types/node": "*" } }, "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw=="], @@ -909,6 +955,8 @@ "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + "forwarded-parse": ["forwarded-parse@2.1.2", "", {}, "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw=="], + "fs-extra": ["fs-extra@7.0.1", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], @@ -969,8 +1017,6 @@ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], - "import-in-the-middle": ["import-in-the-middle@1.13.1", "", { "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-k2V9wNm9B+ysuelDTHjI9d5KPc4l8zAZTGqj+pcynvWkypZd857ryzN8jNC7Pg2YZXNMJcHRPpaDyCBbNyVRpA=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -1057,8 +1103,6 @@ "keyvaluestorage-interface": ["keyvaluestorage-interface@1.0.0", "", {}, "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g=="], - "lie": ["lie@3.1.1", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw=="], - "light-my-request": ["light-my-request@5.14.0", "", { "dependencies": { "cookie": "^0.7.0", "process-warning": "^3.0.0", "set-cookie-parser": "^2.4.1" } }, "sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA=="], "lilconfig": ["lilconfig@2.1.0", "", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="], @@ -1071,8 +1115,6 @@ "load-tsconfig": ["load-tsconfig@0.2.5", "", {}, "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg=="], - "localforage": ["localforage@1.10.0", "", { "dependencies": { "lie": "3.1.1" } }, "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg=="], - "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], @@ -1213,6 +1255,12 @@ "permissionless": ["permissionless@workspace:packages/permissionless"], + "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], + + "pg-protocol": ["pg-protocol@1.10.0", "", {}, "sha512-IpdytjudNuLv8nhlHs/UrVBhU0e78J0oIS/0AVdTbWxSOkFUVdsHC/NrorO6nXsQNDTT1kzDSOMJubBQviX18Q=="], + + "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@3.0.1", "", {}, "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag=="], @@ -1239,6 +1287,14 @@ "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="], + "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], + + "postgres-bytea": ["postgres-bytea@1.0.0", "", {}, "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="], + + "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], + + "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], + "preact": ["preact@10.26.4", "", {}, "sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w=="], "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], @@ -1619,10 +1675,48 @@ "@opentelemetry/exporter-zipkin/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.25.1", "", {}, "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ=="], + "@opentelemetry/instrumentation-amqplib/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-connect/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-dataloader/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-express/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-fs/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-generic-pool/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-graphql/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-hapi/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + "@opentelemetry/instrumentation-http/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], "@opentelemetry/instrumentation-http/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.25.1", "", {}, "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ=="], + "@opentelemetry/instrumentation-kafkajs/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-knex/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-koa/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-lru-memoizer/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-mongodb/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-mongoose/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-mysql/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-mysql2/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-pg/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-redis-4/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-tedious/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + "@opentelemetry/otlp-exporter-base/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], "@opentelemetry/otlp-grpc-exporter-base/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], @@ -1653,6 +1747,8 @@ "@opentelemetry/sdk-trace-base/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], + "@opentelemetry/sdk-trace-node/@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.25.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ=="], + "@opentelemetry/sdk-trace-node/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], "@opentelemetry/sdk-trace-node/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw=="], @@ -1663,6 +1759,8 @@ "@pimlico/opentelemetry-instrumentation-viem/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-pmPlzfJd+vvgaZd/reMsC8RWgTXn2WY1OWT5RT42m3aOn5532TozwXNDhg1vzqJ+jnvmkREcdLr27ebJEQt0Jg=="], + "@prisma/instrumentation/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + "@reown/appkit/@walletconnect/types": ["@walletconnect/types@2.19.2", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-/LZWhkVCUN+fcTgQUxArxhn2R8DF+LSd/6Wh9FnpjeK/Sdupx1EPS8okWG6WPAqq2f404PRoNAfQytQ82Xdl3g=="], "@reown/appkit/@walletconnect/universal-provider": ["@walletconnect/universal-provider@2.19.2", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/jsonrpc-http-connection": "1.0.8", "@walletconnect/jsonrpc-provider": "1.0.14", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "@walletconnect/sign-client": "2.19.2", "@walletconnect/types": "2.19.2", "@walletconnect/utils": "2.19.2", "es-toolkit": "1.33.0", "events": "3.3.0" } }, "sha512-LkKg+EjcSUpPUhhvRANgkjPL38wJPIWumAYD8OK/g4OFuJ4W3lS/XTCKthABQfFqmiNbNbVllmywiyE44KdpQg=="], @@ -1675,6 +1773,18 @@ "@safe-global/safe-apps-sdk/viem": ["viem@2.23.2", "", { "dependencies": { "@noble/curves": "1.8.1", "@noble/hashes": "1.7.1", "@scure/bip32": "1.6.2", "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", "ox": "0.6.7", "ws": "8.18.0" }, "peerDependencies": { "typescript": ">=5.0.4" }, "optionalPeers": ["typescript"] }, "sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA=="], + "@sentry/node/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@sentry/node/@opentelemetry/instrumentation-http": ["@opentelemetry/instrumentation-http@0.57.2", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/instrumentation": "0.57.2", "@opentelemetry/semantic-conventions": "1.28.0", "forwarded-parse": "2.1.2", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-1Uz5iJ9ZAlFOiPuwYg29Bf7bJJc/GeoeJIFKJYQf67nTVKFe8RHbEtxgkOmK4UGZNHKXcpW4P8cWBYzBn1USpg=="], + + "@sentry/node/@opentelemetry/instrumentation-ioredis": ["@opentelemetry/instrumentation-ioredis@0.47.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/redis-common": "^0.36.2", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-OtFGSN+kgk/aoKgdkKQnBsQFDiG8WdCxu+UrHr0bXScdAmtSzLSraLo7wFIb25RVHfRWvzI5kZomqJYEg/l1iA=="], + + "@sentry/node/@opentelemetry/instrumentation-undici": ["@opentelemetry/instrumentation-undici@0.10.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.7.0" } }, "sha512-rkOGikPEyRpMCmNu9AQuV5dtRlDmJp2dK5sw8roVshAGoB6hH/3QjDtRhdwd75SsJwgynWUNRUYe0wAkTo16tQ=="], + + "@sentry/node/@opentelemetry/resources": ["@opentelemetry/resources@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA=="], + + "@sentry/opentelemetry/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.200.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.200.0", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-pmPlzfJd+vvgaZd/reMsC8RWgTXn2WY1OWT5RT42m3aOn5532TozwXNDhg1vzqJ+jnvmkREcdLr27ebJEQt0Jg=="], + "@size-limit/file/semver": ["semver@7.5.4", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA=="], "@wagmi/cli/abitype": ["abitype@1.0.8", "", { "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3 >=3.22.0" }, "optionalPeers": ["typescript", "zod"] }, "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg=="], @@ -1817,6 +1927,44 @@ "@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/sdk-trace-base/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.25.1", "", {}, "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ=="], + "@opentelemetry/instrumentation-amqplib/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-connect/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-dataloader/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-express/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-fs/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-generic-pool/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-graphql/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-hapi/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-kafkajs/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-knex/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-koa/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-lru-memoizer/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-mongodb/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-mongoose/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-mysql/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-mysql2/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-pg/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-redis-4/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/instrumentation-tedious/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + "@opentelemetry/otlp-exporter-base/@opentelemetry/core/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.25.1", "", {}, "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ=="], "@opentelemetry/otlp-grpc-exporter-base/@opentelemetry/core/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.25.1", "", {}, "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ=="], @@ -1839,6 +1987,8 @@ "@pimlico/opentelemetry-instrumentation-viem/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.200.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q=="], + "@prisma/instrumentation/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/sign-client": ["@walletconnect/sign-client@2.19.2", "", { "dependencies": { "@walletconnect/core": "2.19.2", "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-utils": "1.0.8", "@walletconnect/logger": "2.1.2", "@walletconnect/time": "1.0.2", "@walletconnect/types": "2.19.2", "@walletconnect/utils": "2.19.2", "events": "3.3.0" } }, "sha512-a/K5PRIFPCjfHq5xx3WYKHAAF8Ft2I1LtxloyibqiQOoUtNLfKgFB1r8sdMvXM7/PADNPe4iAw4uSE6PrARrfg=="], "@reown/appkit-controllers/@walletconnect/universal-provider/@walletconnect/types": ["@walletconnect/types@2.19.2", "", { "dependencies": { "@walletconnect/events": "1.0.1", "@walletconnect/heartbeat": "1.2.2", "@walletconnect/jsonrpc-types": "1.0.4", "@walletconnect/keyvaluestorage": "1.1.1", "@walletconnect/logger": "2.1.2", "events": "3.3.0" } }, "sha512-/LZWhkVCUN+fcTgQUxArxhn2R8DF+LSd/6Wh9FnpjeK/Sdupx1EPS8okWG6WPAqq2f404PRoNAfQytQ82Xdl3g=="], @@ -1859,6 +2009,14 @@ "@safe-global/safe-apps-sdk/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + "@sentry/node/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@sentry/node/@opentelemetry/instrumentation-http/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], + + "@sentry/node/@opentelemetry/resources/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], + + "@sentry/opentelemetry/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.200.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-IKJBQxh91qJ+3ssRly5hYEJ8NDHu9oY/B1PXVSCWf7zytmYO9RNLB0Ox9XQ/fJ8m6gY6Q6NtBWlmXfaXt5Uc4Q=="], + "@wagmi/cli/viem/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], "@walletconnect/logger/pino/on-exit-leak-free": ["on-exit-leak-free@0.2.0", "", {}, "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg=="], diff --git a/package.json b/package.json index 557ea6a6..df418cfc 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "@changesets/cli": "^2.26.2", "@permissionless/wagmi": "workspace:packages/wagmi", "@pimlico/mock-paymaster": "workspace:packages/mock-paymaster", - "@pimlico/alto": "^0.0.18", + "@pimlico/alto": "0.0.0-main.20250527T165035", "@size-limit/esbuild-why": "^9.0.0", "@size-limit/preset-small-lib": "^9.0.0", "@tanstack/react-query": "5.45.1", diff --git a/packages/mock-paymaster/helpers/schema.ts b/packages/mock-paymaster/helpers/schema.ts index fe8ff27c..a488cacf 100644 --- a/packages/mock-paymaster/helpers/schema.ts +++ b/packages/mock-paymaster/helpers/schema.ts @@ -60,6 +60,27 @@ export const hexDataSchema = z .regex(hexDataPattern, { message: "not valid hex data" }) .transform((val) => val.toLowerCase() as Hex) +const signedAuthorizationSchema = z.union([ + z.object({ + contractAddress: addressSchema, + chainId: hexNumberSchema.transform((val) => Number(val)), + nonce: hexNumberSchema.transform((val) => Number(val)), + r: hexDataSchema.transform((val) => val as Hex), + s: hexDataSchema.transform((val) => val as Hex), + v: hexNumberSchema.optional(), + yParity: hexNumberSchema.transform((val) => Number(val)) + }), + z.object({ + address: addressSchema, + chainId: hexNumberSchema.transform((val) => Number(val)), + nonce: hexNumberSchema.transform((val) => Number(val)), + r: hexDataSchema.transform((val) => val as Hex), + s: hexDataSchema.transform((val) => val as Hex), + v: hexNumberSchema.optional(), + yParity: hexNumberSchema.transform((val) => Number(val)) + }) +]) + const userOperationSchemaPaymasterV6 = z .object({ sender: addressSchema, @@ -80,7 +101,8 @@ const userOperationSchemaPaymasterV6 = z return "0x" } return val - }) + }), + eip7702Auth: signedAuthorizationSchema.optional().nullable() }) .strict() .transform((val) => { @@ -122,7 +144,8 @@ const userOperationSchemaPaymasterV7 = z return "0x" } return val - }) + }), + eip7702Auth: signedAuthorizationSchema.optional().nullable() }) .strict() .transform((val) => { @@ -173,7 +196,8 @@ const eip7677UserOperationSchemaV6 = z .optional() .transform((_) => { return "0x" as Hex - }) + }), + eip7702Auth: signedAuthorizationSchema.optional().nullable() }) .strict() .transform((val) => { @@ -219,7 +243,8 @@ const eip7677UserOperationSchemaV7 = z return "0x" } return val - }) + }), + eip7702Auth: signedAuthorizationSchema.optional().nullable() }) .strict() .transform((val) => { diff --git a/packages/permissionless-test/src/testWithRpc.ts b/packages/permissionless-test/src/testWithRpc.ts index 781989b9..78e8d46b 100644 --- a/packages/permissionless-test/src/testWithRpc.ts +++ b/packages/permissionless-test/src/testWithRpc.ts @@ -21,20 +21,16 @@ export const getInstances = async ({ const anvilPrivateKey = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" - const forkUrl = (import.meta as any).env.VITE_FORK_RPC_URL as - | string - | undefined - - const anvilInstance = forkUrl - ? anvil({ - chainId: foundry.id, - port: anvilPort, - forkUrl - }) - : anvil({ - chainId: foundry.id, - port: anvilPort - }) + const forkUrl = + ((import.meta as any).env.VITE_FORK_RPC_URL as string | undefined) ?? + "https://rpc.sepolia.org" + + const anvilInstance = anvil({ + chainId: foundry.id, + port: anvilPort, + forkUrl, + hardfork: "Prague" + }) const altoInstance = alto({ entrypoints: [ @@ -49,10 +45,10 @@ export const getInstances = async ({ utilityPrivateKey: anvilPrivateKey }) - // instance.on("stderr", (data) => { + // altoInstance.on("stderr", (data) => { // console.error(data.toString()) // }) - // instance.on("stdout", (data) => { + // altoInstance.on("stdout", (data) => { // console.log(data.toString()) // }) diff --git a/packages/permissionless-test/src/utils.ts b/packages/permissionless-test/src/utils.ts index a0f8dc82..d93c8a75 100644 --- a/packages/permissionless-test/src/utils.ts +++ b/packages/permissionless-test/src/utils.ts @@ -23,6 +23,7 @@ import { import { foundry } from "viem/chains" import { type KernelVersion, + to7702KernelSmartAccount, toKernelSmartAccount, toThirdwebSmartAccount } from "../../permissionless/accounts" @@ -345,14 +346,9 @@ export const getKernelEcdsaClient = async < } if (eip7702) { - return toKernelSmartAccount({ + return to7702KernelSmartAccount({ client: publicClient, - entryPoint: { - address: entryPoint08Address, - version: "0.8" - }, - owner: privateKeyToAccount(privateKey ?? generatePrivateKey()), - eip7702: true + owner: privateKeyToAccount(privateKey ?? generatePrivateKey()) }) } @@ -751,7 +747,8 @@ export const getCoreSmartAccounts = (): Array<{ getBundlerClient({ account: await getKernelEcdsaClient({ ...(conf as AAParamType<"0.6" | "0.7">), - version: "0.3.3" as KernelVersion<"0.6" | "0.7"> + version: "0.3.3" as KernelVersion<"0.6" | "0.7">, + eip7702: true }), ...conf }), @@ -761,7 +758,8 @@ export const getCoreSmartAccounts = (): Array<{ getSmartAccountClient({ account: await getKernelEcdsaClient({ ...(conf as AAParamType<"0.6" | "0.7">), - version: "0.3.3" as KernelVersion<"0.6" | "0.7"> + version: "0.3.3" as KernelVersion<"0.6" | "0.7">, + eip7702: true }), ...conf }), diff --git a/packages/permissionless/accounts/index.ts b/packages/permissionless/accounts/index.ts index deae9d2e..e6fbcfaf 100644 --- a/packages/permissionless/accounts/index.ts +++ b/packages/permissionless/accounts/index.ts @@ -42,6 +42,13 @@ import { toEcdsaKernelSmartAccount } from "./kernel/toEcdsaKernelSmartAccount.js" +import { + type To7702KernelSmartAccountImplementation, + type To7702KernelSmartAccountParameters, + type To7702KernelSmartAccountReturnType, + to7702KernelSmartAccount +} from "./kernel/to7702KernelSmartAccount.js" + import { type KernelSmartAccountImplementation, type KernelVersion, @@ -114,5 +121,9 @@ export { type ToEtherspotSmartAccountParameters, type EtherspotSmartAccountImplementation, type ToEtherspotSmartAccountReturnType, - toEtherspotSmartAccount + toEtherspotSmartAccount, + type To7702KernelSmartAccountParameters, + type To7702KernelSmartAccountImplementation, + type To7702KernelSmartAccountReturnType, + to7702KernelSmartAccount } diff --git a/packages/permissionless/accounts/kernel/to7702KernelSmartAccount.ts b/packages/permissionless/accounts/kernel/to7702KernelSmartAccount.ts new file mode 100644 index 00000000..ba1a70d0 --- /dev/null +++ b/packages/permissionless/accounts/kernel/to7702KernelSmartAccount.ts @@ -0,0 +1,60 @@ +import type { + Account, + Chain, + LocalAccount, + OneOf, + Transport, + WalletClient +} from "viem" +import type { EthereumProvider } from "../../utils/toOwner.js" +import { + type KernelSmartAccountImplementation, + type KernelVersion, + type ToKernelSmartAccountParameters, + type ToKernelSmartAccountReturnType, + toKernelSmartAccount +} from "./toKernelSmartAccount.js" + +export type To7702KernelSmartAccountParameters< + entryPointVersion extends "0.7", + kernelVersion extends KernelVersion, + owner extends OneOf< + | EthereumProvider + | WalletClient + | LocalAccount + > +> = ToKernelSmartAccountParameters< + entryPointVersion, + kernelVersion, + owner, + true +> + +export type To7702KernelSmartAccountImplementation< + entryPointVersion extends "0.7" = "0.7" +> = KernelSmartAccountImplementation + +export type To7702KernelSmartAccountReturnType< + entryPointVersion extends "0.7" = "0.7" +> = ToKernelSmartAccountReturnType + +export async function to7702KernelSmartAccount< + entryPointVersion extends "0.7", + kernelVersion extends KernelVersion, + owner extends OneOf< + | EthereumProvider + | WalletClient + | LocalAccount + > +>( + parameters: To7702KernelSmartAccountParameters< + entryPointVersion, + kernelVersion, + owner + > +): Promise> { + return toKernelSmartAccount({ + ...parameters, + eip7702: true + }) +} diff --git a/packages/permissionless/accounts/kernel/toKernelSmartAccount.ts b/packages/permissionless/accounts/kernel/toKernelSmartAccount.ts index a87637f4..c5ae1323 100644 --- a/packages/permissionless/accounts/kernel/toKernelSmartAccount.ts +++ b/packages/permissionless/accounts/kernel/toKernelSmartAccount.ts @@ -32,7 +32,7 @@ import { getUserOperationHash, toSmartAccount } from "viem/account-abstraction" -import { getChainId, signMessage as signMessageViem } from "viem/actions" +import { getChainId } from "viem/actions" import { getAction } from "viem/utils" import { getAccountNonce } from "../../actions/public/getAccountNonce.js" import { getSenderAddress } from "../../actions/public/getSenderAddress.js" diff --git a/packages/permissionless/actions/smartAccount/sendTransaction.test.ts b/packages/permissionless/actions/smartAccount/sendTransaction.test.ts index 28131d0b..251fbeab 100644 --- a/packages/permissionless/actions/smartAccount/sendTransaction.test.ts +++ b/packages/permissionless/actions/smartAccount/sendTransaction.test.ts @@ -1,4 +1,5 @@ import { zeroAddress } from "viem" +import { privateKeyToAccount } from "viem/accounts" import { foundry } from "viem/chains" import { describe, expect } from "vitest" import { testWithRpc } from "../../../permissionless-test/src/testWithRpc" @@ -14,7 +15,8 @@ describe.each(getCoreSmartAccounts())( getSmartAccountClient, supportsEntryPointV06, supportsEntryPointV07, - supportsEntryPointV08 + supportsEntryPointV08, + isEip7702Compliant }) => { testWithRpc.skipIf(!supportsEntryPointV06)( "sendTransaction_v06", @@ -71,25 +73,39 @@ describe.each(getCoreSmartAccounts())( async ({ rpc }) => { const { anvilRpc } = rpc + const privateKeyAccount = privateKeyToAccount( + "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356" + ) + const smartClient = await getSmartAccountClient({ entryPoint: { version: "0.7" }, privateKey: - "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", // anvil private key + "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356", // anvil private key ...rpc }) + const publicClient = getPublicClient(anvilRpc) + const transactionHash = await sendTransaction(smartClient, { to: zeroAddress, data: "0x", - value: 0n + value: 0n, + authorization: isEip7702Compliant + ? await privateKeyAccount.signAuthorization({ + address: (smartClient.account as any) + .implementation, + chainId: smartClient.chain.id, + nonce: await publicClient.getTransactionCount({ + address: smartClient.account.address + }) + }) + : undefined }) expect(transactionHash).toBeTruthy() - const publicClient = getPublicClient(anvilRpc) - const receipt = await publicClient.getTransactionReceipt({ hash: transactionHash }) @@ -240,6 +256,10 @@ describe.each(getCoreSmartAccounts())( const { anvilRpc } = rpc await (async () => { + const privateKeyAccount = privateKeyToAccount( + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" + ) + const smartClient = await getSmartAccountClient({ entryPoint: { version: "0.7" @@ -249,16 +269,28 @@ describe.each(getCoreSmartAccounts())( ...rpc }) + const publicClient = getPublicClient(anvilRpc) + const transactionHash = await sendTransaction(smartClient, { to: zeroAddress, data: "0x", - value: 0n + value: 0n, + authorization: isEip7702Compliant + ? await privateKeyAccount.signAuthorization({ + address: (smartClient.account as any) + .implementation, + chainId: smartClient.chain.id, + nonce: await publicClient.getTransactionCount( + { + address: smartClient.account.address + } + ) + }) + : undefined }) expect(transactionHash).toBeTruthy() - const publicClient = getPublicClient(anvilRpc) - const receipt = await publicClient.getTransactionReceipt({ hash: transactionHash }) From d7a155062d6e8fb7e3e458aa70d40eac9c542b65 Mon Sep 17 00:00:00 2001 From: plusminushalf <5251472+plusminushalf@users.noreply.github.com> Date: Wed, 28 May 2025 10:15:24 +0000 Subject: [PATCH 3/9] chore: format --- bun.lockb | Bin 341696 -> 363672 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bun.lockb b/bun.lockb index 1acb1905ea62df20a2c641ab3c81311d93457fbd..181a3520e4e849d3a85954c758f1234561a8e671 100755 GIT binary patch delta 51287 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%0D>gFr>LLU%T&gEVPGRsxgHD!_kQSSo8arAUo}Mt2 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 Kc73Kb=l=o_+&FFk From 4a5aaeb4b1146abc6c5609b81e6e79aac2d9c888 Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Wed, 28 May 2025 16:06:26 +0100 Subject: [PATCH 4/9] remove support for 7702 sign message as of now --- packages/permissionless-test/src/utils.ts | 2 +- .../accounts/kernel/to7702KernelSmartAccount.ts | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/permissionless-test/src/utils.ts b/packages/permissionless-test/src/utils.ts index d93c8a75..014ebe69 100644 --- a/packages/permissionless-test/src/utils.ts +++ b/packages/permissionless-test/src/utils.ts @@ -767,7 +767,7 @@ export const getCoreSmartAccounts = (): Array<{ supportsEntryPointV07: true, supportsEntryPointV08: false, isEip7702Compliant: true, - isEip1271Compliant: true + isEip1271Compliant: false }, { name: "Biconomy", diff --git a/packages/permissionless/accounts/kernel/to7702KernelSmartAccount.ts b/packages/permissionless/accounts/kernel/to7702KernelSmartAccount.ts index ba1a70d0..02174375 100644 --- a/packages/permissionless/accounts/kernel/to7702KernelSmartAccount.ts +++ b/packages/permissionless/accounts/kernel/to7702KernelSmartAccount.ts @@ -3,6 +3,7 @@ import type { Chain, LocalAccount, OneOf, + Prettify, Transport, WalletClient } from "viem" @@ -47,10 +48,12 @@ export async function to7702KernelSmartAccount< | LocalAccount > >( - parameters: To7702KernelSmartAccountParameters< - entryPointVersion, - kernelVersion, - owner + parameters: Prettify< + To7702KernelSmartAccountParameters< + entryPointVersion, + kernelVersion, + owner + > > ): Promise> { return toKernelSmartAccount({ From 721e9d3f1a5504ebc6e595c294aefd60459f3525 Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Wed, 28 May 2025 16:07:10 +0100 Subject: [PATCH 5/9] Added changeset --- .changeset/silly-eyes-worry.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/silly-eyes-worry.md diff --git a/.changeset/silly-eyes-worry.md b/.changeset/silly-eyes-worry.md new file mode 100644 index 00000000..c1f1333f --- /dev/null +++ b/.changeset/silly-eyes-worry.md @@ -0,0 +1,5 @@ +--- +"permissionless": patch +--- + +Added to7702KernelSmartAccount From ba8a6bd923bc48b20e5a55e71154c6ce614b2f2c Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Mon, 2 Jun 2025 13:41:43 +0100 Subject: [PATCH 6/9] use local instance as well --- .../permissionless-test/src/testWithRpc.ts | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/permissionless-test/src/testWithRpc.ts b/packages/permissionless-test/src/testWithRpc.ts index 78e8d46b..b309159b 100644 --- a/packages/permissionless-test/src/testWithRpc.ts +++ b/packages/permissionless-test/src/testWithRpc.ts @@ -21,16 +21,22 @@ export const getInstances = async ({ const anvilPrivateKey = "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" - const forkUrl = - ((import.meta as any).env.VITE_FORK_RPC_URL as string | undefined) ?? - "https://rpc.sepolia.org" - - const anvilInstance = anvil({ - chainId: foundry.id, - port: anvilPort, - forkUrl, - hardfork: "Prague" - }) + const forkUrl = (import.meta as any).env.VITE_FORK_RPC_URL as + | string + | undefined + + const anvilInstance = forkUrl + ? anvil({ + chainId: foundry.id, + port: anvilPort, + hardfork: "Prague", + forkUrl + }) + : anvil({ + chainId: foundry.id, + hardfork: "Prague", + port: anvilPort + }) const altoInstance = alto({ entrypoints: [ From 9573495f0f23aaab3de6a62601951c1d8d30b96d Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Mon, 2 Jun 2025 15:43:59 +0100 Subject: [PATCH 7/9] Fix tests --- packages/permissionless-test/src/utils.ts | 2 +- .../actions/erc7579/installModule.test.ts | 48 +++++++++++++++++-- .../actions/erc7579/installModule.ts | 5 +- .../actions/erc7579/installModules.test.ts | 43 ++++++++++++++++- .../actions/erc7579/installModules.ts | 3 ++ .../actions/erc7579/uninstallModule.test.ts | 28 +++++++++-- .../smartAccount/sendTransaction.test.ts | 8 ++-- 7 files changed, 122 insertions(+), 15 deletions(-) diff --git a/packages/permissionless-test/src/utils.ts b/packages/permissionless-test/src/utils.ts index 014ebe69..e6c28dce 100644 --- a/packages/permissionless-test/src/utils.ts +++ b/packages/permissionless-test/src/utils.ts @@ -766,7 +766,7 @@ export const getCoreSmartAccounts = (): Array<{ supportsEntryPointV06: false, supportsEntryPointV07: true, supportsEntryPointV08: false, - isEip7702Compliant: true, + isEip7702Compliant: false, isEip1271Compliant: false }, { diff --git a/packages/permissionless/actions/erc7579/installModule.test.ts b/packages/permissionless/actions/erc7579/installModule.test.ts index 980724ff..dea2a385 100644 --- a/packages/permissionless/actions/erc7579/installModule.test.ts +++ b/packages/permissionless/actions/erc7579/installModule.test.ts @@ -1,13 +1,17 @@ import { encodeAbiParameters, encodePacked, isHash, zeroAddress } from "viem" +import { privateKeyToAccount } from "viem/accounts" import { describe, expect } from "vitest" import { testWithRpc } from "../../../permissionless-test/src/testWithRpc" -import { getCoreSmartAccounts } from "../../../permissionless-test/src/utils" +import { + getCoreSmartAccounts, + getPublicClient +} from "../../../permissionless-test/src/utils" import { erc7579Actions } from "../erc7579" import { installModule } from "./installModule" describe.each(getCoreSmartAccounts())( "installModule $name", - ({ getErc7579SmartAccountClient, name }) => { + ({ getErc7579SmartAccountClient, name, isEip7702Compliant }) => { testWithRpc.skipIf(!getErc7579SmartAccountClient)( "installModule", async ({ rpc }) => { @@ -15,14 +19,22 @@ describe.each(getCoreSmartAccounts())( throw new Error("getErc7579SmartAccountClient not defined") } + const privateKey = + "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356" + + const privateKeyAccount = privateKeyToAccount(privateKey) + const smartClientWithoutExtend = await getErc7579SmartAccountClient({ entryPoint: { version: "0.7" }, + privateKey, ...rpc }) + const publicClient = getPublicClient(rpc.anvilRpc) + const smartClient = smartClientWithoutExtend.extend( erc7579Actions() ) @@ -47,7 +59,17 @@ describe.each(getCoreSmartAccounts())( ) ] ) - : moduleData + : moduleData, + authorization: isEip7702Compliant + ? await privateKeyAccount.signAuthorization({ + address: (smartClient.account as any) + .implementation, + chainId: smartClient.chain.id, + nonce: await publicClient.getTransactionCount({ + address: smartClient.account.address + }) + }) + : undefined }) expect(isHash(opHash)).toBe(true) @@ -88,14 +110,22 @@ describe.each(getCoreSmartAccounts())( throw new Error("getErc7579SmartAccountClient not defined") } + const privateKey = + "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356" + + const privateKeyAccount = privateKeyToAccount(privateKey) + const smartClientWithoutExtend = await getErc7579SmartAccountClient({ entryPoint: { version: "0.7" }, + privateKey, ...rpc }) + const publicClient = getPublicClient(rpc.anvilRpc) + const smartClient = smartClientWithoutExtend.extend( erc7579Actions() ) @@ -112,7 +142,17 @@ describe.each(getCoreSmartAccounts())( value: 0n, data: "0x" } - ] + ], + authorization: isEip7702Compliant + ? await privateKeyAccount.signAuthorization({ + address: (smartClient.account as any) + .implementation, + chainId: smartClient.chain.id, + nonce: await publicClient.getTransactionCount({ + address: smartClient.account.address + }) + }) + : undefined }) await smartClient.waitForUserOperationReceipt({ diff --git a/packages/permissionless/actions/erc7579/installModule.ts b/packages/permissionless/actions/erc7579/installModule.ts index 5eaaf28e..721a4801 100644 --- a/packages/permissionless/actions/erc7579/installModule.ts +++ b/packages/permissionless/actions/erc7579/installModule.ts @@ -1,4 +1,4 @@ -import type { Address, Client, Hex, OneOf } from "viem" +import type { Address, Client, Hex, OneOf, SignedAuthorization } from "viem" import { type GetSmartAccountParameter, type PaymasterActions, @@ -13,6 +13,7 @@ import type { ModuleType } from "./supportsModule.js" export type InstallModuleParameters< TSmartAccount extends SmartAccount | undefined > = GetSmartAccountParameter & { + authorization?: SignedAuthorization | undefined type: ModuleType address: Address maxFeePerGas?: bigint @@ -63,6 +64,7 @@ export function installModule( type, calls, paymaster, + authorization, paymasterContext } = parameters @@ -91,6 +93,7 @@ export function installModule( maxFeePerGas, maxPriorityFeePerGas, nonce, + authorization, account }) } diff --git a/packages/permissionless/actions/erc7579/installModules.test.ts b/packages/permissionless/actions/erc7579/installModules.test.ts index 7d057f67..3607c634 100644 --- a/packages/permissionless/actions/erc7579/installModules.test.ts +++ b/packages/permissionless/actions/erc7579/installModules.test.ts @@ -1,13 +1,17 @@ import { encodeAbiParameters, encodePacked, isHash, zeroAddress } from "viem" +import { privateKeyToAccount } from "viem/accounts" import { describe, expect } from "vitest" import { testWithRpc } from "../../../permissionless-test/src/testWithRpc" -import { getCoreSmartAccounts } from "../../../permissionless-test/src/utils" +import { + getCoreSmartAccounts, + getPublicClient +} from "../../../permissionless-test/src/utils" import { erc7579Actions } from "../erc7579" import { installModules } from "./installModules" describe.each(getCoreSmartAccounts())( "installModules $name", - ({ getErc7579SmartAccountClient, name }) => { + ({ getErc7579SmartAccountClient, name, isEip7702Compliant }) => { testWithRpc.skipIf(!getErc7579SmartAccountClient)( "installModules", async ({ rpc }) => { @@ -15,14 +19,22 @@ describe.each(getCoreSmartAccounts())( throw new Error("getErc7579SmartAccountClient not defined") } + const privateKey = + "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356" + + const privateKeyAccount = privateKeyToAccount(privateKey) + const smartClientWithoutExtend = await getErc7579SmartAccountClient({ entryPoint: { version: "0.7" }, + privateKey, ...rpc }) + const publicClient = getPublicClient(rpc.anvilRpc) + const smartClient = smartClientWithoutExtend.extend( erc7579Actions() ) @@ -41,6 +53,16 @@ describe.each(getCoreSmartAccounts())( data: "0x" } ], + authorization: isEip7702Compliant + ? await privateKeyAccount.signAuthorization({ + address: (smartClient.account as any) + .implementation, + chainId: smartClient.chain.id, + nonce: await publicClient.getTransactionCount({ + address: smartClient.account.address + }) + }) + : undefined, modules: [ { type: "executor", @@ -102,19 +124,36 @@ describe.each(getCoreSmartAccounts())( throw new Error("getErc7579SmartAccountClient not defined") } + const privateKey = + "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356" + + const privateKeyAccount = privateKeyToAccount(privateKey) + const smartClientWithoutExtend = await getErc7579SmartAccountClient({ entryPoint: { version: "0.7" }, + privateKey, ...rpc }) + const publicClient = getPublicClient(rpc.anvilRpc) const smartClient = smartClientWithoutExtend.extend( erc7579Actions() ) const userOpHash = await smartClient.sendUserOperation({ + authorization: isEip7702Compliant + ? await privateKeyAccount.signAuthorization({ + address: (smartClient.account as any) + .implementation, + chainId: smartClient.chain.id, + nonce: await publicClient.getTransactionCount({ + address: smartClient.account.address + }) + }) + : undefined, calls: [ { to: smartClient.account.address, diff --git a/packages/permissionless/actions/erc7579/installModules.ts b/packages/permissionless/actions/erc7579/installModules.ts index 0b1dbb1a..f586a4ea 100644 --- a/packages/permissionless/actions/erc7579/installModules.ts +++ b/packages/permissionless/actions/erc7579/installModules.ts @@ -14,6 +14,7 @@ import { export type InstallModulesParameters< TSmartAccount extends SmartAccount | undefined > = EncodeInstallModuleParameters & { + authorization?: SignedAuthorization | undefined maxFeePerGas?: bigint maxPriorityFeePerGas?: bigint nonce?: bigint @@ -54,6 +55,7 @@ export async function installModules< modules, paymaster, paymasterContext, + authorization, calls } = parameters @@ -80,6 +82,7 @@ export async function installModules< paymasterContext, maxFeePerGas, maxPriorityFeePerGas, + authorization, nonce, account: account }) diff --git a/packages/permissionless/actions/erc7579/uninstallModule.test.ts b/packages/permissionless/actions/erc7579/uninstallModule.test.ts index 65376b31..ffcba8f3 100644 --- a/packages/permissionless/actions/erc7579/uninstallModule.test.ts +++ b/packages/permissionless/actions/erc7579/uninstallModule.test.ts @@ -1,13 +1,17 @@ import { encodeAbiParameters, encodePacked, isHash, zeroAddress } from "viem" +import { privateKeyToAccount } from "viem/accounts" import { describe, expect } from "vitest" import { testWithRpc } from "../../../permissionless-test/src/testWithRpc" -import { getCoreSmartAccounts } from "../../../permissionless-test/src/utils" +import { + getCoreSmartAccounts, + getPublicClient +} from "../../../permissionless-test/src/utils" import { erc7579Actions } from "../erc7579" import { uninstallModule } from "./uninstallModule" describe.each(getCoreSmartAccounts())( "uninstallModule $name", - ({ getErc7579SmartAccountClient, name }) => { + ({ getErc7579SmartAccountClient, name, isEip7702Compliant }) => { testWithRpc.skipIf(!getErc7579SmartAccountClient)( "uninstallModule", async ({ rpc }) => { @@ -15,14 +19,22 @@ describe.each(getCoreSmartAccounts())( throw new Error("getErc7579SmartAccountClient not defined") } + const privateKey = + "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356" + + const privateKeyAccount = privateKeyToAccount(privateKey) + const smartClientWithoutExtend = await getErc7579SmartAccountClient({ entryPoint: { version: "0.7" }, + privateKey, ...rpc }) + const publicClient = getPublicClient(rpc.anvilRpc) + const smartClient = smartClientWithoutExtend.extend( erc7579Actions() ) @@ -46,7 +58,17 @@ describe.each(getCoreSmartAccounts())( ) ] ) - : moduleData + : moduleData, + authorization: isEip7702Compliant + ? await privateKeyAccount.signAuthorization({ + address: (smartClient.account as any) + .implementation, + chainId: smartClient.chain.id, + nonce: await publicClient.getTransactionCount({ + address: smartClient.account.address + }) + }) + : undefined }) await smartClient.waitForUserOperationReceipt({ diff --git a/packages/permissionless/actions/smartAccount/sendTransaction.test.ts b/packages/permissionless/actions/smartAccount/sendTransaction.test.ts index 251fbeab..fe507b33 100644 --- a/packages/permissionless/actions/smartAccount/sendTransaction.test.ts +++ b/packages/permissionless/actions/smartAccount/sendTransaction.test.ts @@ -73,16 +73,16 @@ describe.each(getCoreSmartAccounts())( async ({ rpc }) => { const { anvilRpc } = rpc - const privateKeyAccount = privateKeyToAccount( + const privateKey = "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356" - ) + + const privateKeyAccount = privateKeyToAccount(privateKey) const smartClient = await getSmartAccountClient({ entryPoint: { version: "0.7" }, - privateKey: - "0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356", // anvil private key + privateKey, // anvil private key ...rpc }) From c26c3e5b362f8ed1f7bad2442ba67bc83832daed Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Mon, 2 Jun 2025 15:44:45 +0100 Subject: [PATCH 8/9] Add changeset --- .changeset/full-peas-open.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/full-peas-open.md diff --git a/.changeset/full-peas-open.md b/.changeset/full-peas-open.md new file mode 100644 index 00000000..16821856 --- /dev/null +++ b/.changeset/full-peas-open.md @@ -0,0 +1,5 @@ +--- +"permissionless": patch +--- + +Added authorisation support for installModule and installModules From c9f493fb57286ee39a8769a606c695c213f7bda7 Mon Sep 17 00:00:00 2001 From: Garvit Khatri Date: Mon, 2 Jun 2025 16:02:51 +0100 Subject: [PATCH 9/9] fix build --- .../permissionless/actions/erc7579/installModules.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/permissionless/actions/erc7579/installModules.ts b/packages/permissionless/actions/erc7579/installModules.ts index f586a4ea..957f5754 100644 --- a/packages/permissionless/actions/erc7579/installModules.ts +++ b/packages/permissionless/actions/erc7579/installModules.ts @@ -1,4 +1,11 @@ -import type { Address, Chain, Client, Hex, Transport } from "viem" +import type { + Address, + Chain, + Client, + Hex, + SignedAuthorization, + Transport +} from "viem" import { type PaymasterActions, type SmartAccount,