From b42b5b9cbcbb2b3dbacd0f84e518021948ec3561 Mon Sep 17 00:00:00 2001 From: Ashutosh Ukey Date: Thu, 24 Oct 2024 18:52:07 +0000 Subject: [PATCH] docs: latest audited EP0.7 multisig plugin deployment --- .../1/run-1729795387.json | 49 ++++++++++++++ .../1/run-latest.json | 49 ++++++++++++++ .../11155111/run-1729794974.json | 49 ++++++++++++++ .../11155111/run-latest.json | 40 +++++------ .../137/run-1729795089.json | 66 +++++++++++++++++++ .../137/run-latest.json | 66 +++++++++++++++++++ .../42161/run-1729795217.json | 51 ++++++++++++++ .../42161/run-latest.json | 51 ++++++++++++++ .../421614/run-1729794812.json | 51 ++++++++++++++ .../421614/run-latest.json | 42 ++++++------ .../80002/run-1729794657.json | 66 +++++++++++++++++++ .../80002/run-latest.json | 52 ++++++++------- script/000_ContractAddress.sol | 2 +- .../WeightedWebauthnMultisigPlugin.json | 1 + 14 files changed, 570 insertions(+), 65 deletions(-) create mode 100644 broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/1/run-1729795387.json create mode 100644 broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/1/run-latest.json create mode 100644 broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/11155111/run-1729794974.json create mode 100644 broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/137/run-1729795089.json create mode 100644 broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/137/run-latest.json create mode 100644 broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/42161/run-1729795217.json create mode 100644 broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/42161/run-latest.json create mode 100644 broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/421614/run-1729794812.json create mode 100644 broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/80002/run-1729794657.json create mode 100644 script/verify/WeightedWebauthnMultisigPlugin.json diff --git a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/1/run-1729795387.json b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/1/run-1729795387.json new file mode 100644 index 0000000..57face1 --- /dev/null +++ b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/1/run-1729795387.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xef45dd54a42dcea02d8aaa51692e203c310706fec5c6f08750d142e13cdd74aa", + "transactionType": "CREATE2", + "contractName": "WeightedWebauthnMultisigPlugin", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x570c61", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a0346200007757601f62004a1d38819003918201601f19168301916001600160401b038311848410176200007c578084926020946040528339810103126200007757516001600160a01b0381168103620000775760805260405161498a90816200009382396080518181816119a1015261290a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461018d5780630b96422d146101885780630c7ecd84146101425780630cdc271f146101835780631128186d1461017e578063118a53891461017957806315b76b84146101745780631626ba7e1461016f57806346d60eb2146101425780636bbefc891461016a5780636d61fe701461016557806371af817b1461016057806377102c351461015b578063852b67af14610156578063858e6ee4146101515780638a91b0e31461014c578063b139ec6314610147578063bfd151c114610142578063c4db8dd91461013d578063c776313014610138578063c8050ee414610133578063e8eb3cc61461012e578063ef4a7203146101295763f582bceb1461012457600080fd5b611a01565b6119d0565b61198b565b61194b565b61153b565b61126c565b61040e565b611209565b611089565b611020565b610f53565b610f24565b610d00565b610bb0565b610aad565b610936565b6107f3565b6106a9565b61054e565b6104c1565b610262565b346101fd5760203660031901126101fd5760043563ffffffff60e01b81168091036101fd576020906372d61afb60e01b81149081156101d2575b506040519015158152f35b63043140ed60e01b8114915081156101ec575b50386101c7565b6301ffc9a760e01b149050386101e5565b600080fd5b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460051b0101116101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460061b0101116101fd57565b346101fd5760603660031901126101fd576001600160401b036004358181116101fd57610293903690600401610202565b916024359081116101fd576102ac903690600401610232565b926102b633613632565b6103a3576102d1926102c9913691611a59565b923691611ab7565b81519181519182840180851161039e576102ed90949294612b25565b9360009283915b818310610354575050506000915b8383106103175761031560443586612b80565b005b61034c60019161034761033361032d8787611d8f565b51613137565b61033d838a611d8f565b9061ffff19169052565b6122c5565b920191610302565b91939091906001906103959061034761038b6001600160a01b036103788a88611d8f565b511660101b62010000600160b01b031690565b61033d838c611d8f565b940191906102f4565b61206f565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b03821682036101fd57565b600435906001600160a01b03821682036101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd57602083818601950101116101fd57565b346101fd5760803660031901126101fd5760043560ff811681036101fd576024356001600160a01b038116036101fd576064356001600160401b0381116101fd5761045d9036906004016103e1565b5050611b2a565b634e487b7160e01b600052602160045260246000fd5b9060028210156104875752565b610464565b91926104aa608094979695929760a08501988552602085019061047a565b6001600160a01b0316604083015260608201520152565b346101fd5760403660031901126101fd5760043561ffff1981168091036101fd57610513906104ee6103b5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361054a93600881901c6001600160a01b03169160ff909116908661048c565b0390f35b346101fd5760403660031901126101fd5760043560ff811681036101fd576024356001600160401b0381116101fd5761045d9036906004016103e1565b60005b83811061059e5750506000910152565b818101518382015260200161058e565b906020916105c78151809281855285808601910161058b565b601f01601f1916010190565b906020908183526105ef815160808486015260a08501906105ae565b9180820151916060610626610613601f1996604096888a83030160408b01526105ae565b60408401518789830301848a01526105ae565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061066057505050505050505090565b909192939495969786806106978387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ae565b9a01950195019396959492919061064e565b346101fd5760003660031901126101fd576106c2611b59565b5061054a6106ce611b59565b6106d6611bb0565b81526106e0611bf3565b60208201526106ed611c14565b60408201526107a26106fd611c4d565b6060830190815261073961070f611cae565b6107176108aa565b63852b67af60e01b815290602082015282519061073382611cea565b52611cea565b5061076f610745611da3565b61074d6108aa565b6371af817b60e01b815290602082015282519061076982611cfc565b52611cfc565b50610778611ddc565b906107816108aa565b630b96422d60e01b8152916020830152519061079c82611d0c565b52611d0c565b50604051918291826105d3565b906003196060818401126101fd5760043560ff811681036101fd5792602435916001600160401b0383116101fd5782610120920301126101fd576004019060443590565b346101fd5761045d366107af565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761083257604052565b610801565b606081019081106001600160401b0382111761083257604052565b60a081019081106001600160401b0382111761083257604052565b61012081019081106001600160401b0382111761083257604052565b90601f801991011681019081106001600160401b0382111761083257604052565b604051906108b782610817565b565b604051906108b782610837565b6001600160401b03811161083257601f01601f191660200190565b9291926108ed826108c6565b916108fb6040519384610889565b8294818452818301116101fd578281602093846000960137010152565b9080601f830112156101fd57816020610933933591016108e1565b90565b346101fd5760403660031901126101fd576024356001600160401b0381116101fd5761096961097d913690600401610918565b61097560043533611ed0565b3390806122d4565b50156109a1576020630b135d3f60e11b5b6040516001600160e01b03199091168152f35b60206001600160e01b031961098e565b90815180825260208080930193019160005b8281106109d1575050505090565b835161ffff1916855293810193928101926001016109c3565b6080809180518452610a046020820151602086019061047a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610a48575050505090565b909192938260a082610a5d60019489516109ea565b01950193929101610a3a565b91610a95604091610a8760809497969760a0875260a08701906109b1565b908582036020870152610a28565b94805182850152602081015160608501520151910152565b346101fd576020806003193601126101fd57610ac76103cb565b610acf611e05565b50610ae1610adc82612ce5565b612d94565b90610aec8251612dd6565b9260005b8351811015610b545760019061ffff19610b0a8287611d8f565b5116600090815282845260408082206001600160a01b03871683526020529020610b38906120fd565b6120fd565b610b428288611d8f565b52610b4d8187611d8f565b5001610af0565b505060018060a01b0316600052600260205261054a610b766040600020611e24565b60405193849384610a69565b60206003198201126101fd57600435906001600160401b0382116101fd57610bac916004016103e1565b9091565b346101fd57610bbe36610b82565b610bc733613632565b15610c6b5781019060a0818303126101fd576001600160401b0381358181116101fd57820183601f820112156101fd5783816020610c0793359101611a59565b9260208301358281116101fd5781610c20918501611e9a565b9360408401358381116101fd5782610c39918601611eb5565b60608501359384116101fd5761031595610c5a610c60946080968801611e9a565b92612e26565b919092013591612fff565b60405162dc149f60e41b8152600490fd5b60a06003198201126101fd576001600160401b03906004358281116101fd5781610ca891600401610202565b939093926024358181116101fd5783610cc391600401610202565b939093926044358381116101fd5782610cde91600401610232565b939093926064359182116101fd57610cf891600401610202565b909160843590565b346101fd57610d0e36610c7c565b97969094959293610d1e33613632565b6103a357610d43610c5a94610d3b610d539a610d4b953691611a59565b983691611e4c565b943691611ab7565b933691611e4c565b819291519181518303610f12576000808415159283610de4575b3360009081526002602052604090209495509293610da79390610d9f9093610d9a600286019485546120dd565b612b73565b809255613677565b610dad57005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610ddf6040519283923384612fc9565b0390a1005b60005b868110610df45750610d6d565b91610e3e33610e27610e12610e09878d611d8f565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610e498488611d8f565b51518115610edb57878a82841015610e97579260019492610d9a610e8993610e818a610e7b610e0982610e8f9b611d8f565b92611d8f565b515190613991565b906120dd565b925b01610de7565b8284939497959711610eb0575b50505050600190610e91565b92849792610d9a610e8993610e8188610e7b610e0960019b610ed19b611d8f565b939038878a610ea4565b610f0e610eeb610e09878d611d8f565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b346101fd5760403660031901126101fd576020610f4b610f426103cb565b60243590611ed0565b604051908152f35b346101fd57610f6136610c7c565b97969094959293610f7133613632565b6103a357610d43610c5a94610d3b610f8e9a610d4b953691611a59565b90336000526002602052604060002092610faa845484846138ca565b60028692960192835491820180921161039e57825496870180971161039e5781610ff8947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613677565b610ddf6040519283923384612fc9565b901515815260c0810192916108b791602001906109ea565b346101fd5760603660031901126101fd576110396103cb565b60403660231901126101fd576110799061107360405161105881610817565b6024358152604435602082015261106d61201a565b50613137565b906131a0565b9061054a60405192839283611008565b346101fd5761109736610b82565b50506110a5610adc33612ce5565b6000903382526002602052600180604084200154906110e3336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6111c3575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6111bd887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b6111816111456108b9565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b61118a8161322b565b9061119b6040519283923384612045565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156111e4575b87908352608085208861fffe198254169155916110ed565b9081161580611200575b156111fa5782906111cc565b806110f2565b508015156111ee565b346101fd5760803660031901126101fd576044356001600160a01b03811681036101fd576064356001600160401b0381116101fd5760409161125261125e923690600401610918565b906024356004356122d4565b825191151582526020820152f35b346101fd576020610f4b61127f366107af565b916127e4565b90815180825260208080930193019160005b8281106112a5575050505090565b83516001600160e01b03191685529381019392810192600101611297565b908082519081815260208091019281808460051b8301019501936000915b8483106112f15750505050505090565b9091929394958480611335600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611285565b98019301930191949392906112e1565b80516005811015610487576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061138b575050505090565b909192938260806001926113b383895163ffffffff60e01b8151168452015184830190611345565b0195019392910161137d565b90815180825260208080930193019160005b8281106113df575050505090565b909192938260e06001926114186040895163ffffffff851b815116845261140c8682015187860190611345565b01516080830190611345565b019501939291016113d1565b906109339160208152815190611448610180928360208401526101a0830190611285565b916114c261149661148261146e602088015196601f199788888303016040890152611285565b604088015187878303016060880152611285565b606087015186868303016080870152611285565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526112c3565b61152b6115146114fd6114e660e089015194610100958989830301878a015261136b565b93880151936101209488888303018689015261136b565b92870151926101409387878303018588015261136b565b91860151916101609286868303018487015261136b565b94015192828503019101526113bf565b346101fd576000806003193601126119485761054a906115596129ca565b5061193b6115656129ca565b916115f06115e4611574612a36565b6115936115876040880192808452611cea565b63852b67af60e01b9052565b6115ac6115a08251611cfc565b630b96422d60e01b9052565b6115c56115b98251611d0c565b6371af817b60e01b9052565b6115de6115d28251611d1c565b630b135d3f60e11b9052565b51611d2c565b6377102c3560e01b9052565b6115f86108b9565b600181529061176e6020928284820152826040820152611616612a61565b60e087019081526116436116286108aa565b63852b67af60e01b8152838782015282519061073382611cea565b5061166a61164f6108aa565b630b96422d60e01b8152838782015282519061076982611cfc565b506116916116766108aa565b6371af817b60e01b8152838782015282519061079c82611d0c565b506116be61169d6108aa565b635b0e93fb60e11b815283878201528251906116b882611d1c565b52611d1c565b506116eb6116ca6108aa565b631a7e6adf60e11b815283878201528251906116e582611d2c565b52611d2c565b506117186116f76108aa565b633e15cc3d60e21b8152838782015282519061171282611d3c565b52611d3c565b506117456117246108aa565b63c1a221f360e01b8152838782015282519061173f82611d4c565b52611d4c565b5061174e6108aa565b63278f794360e11b81529185830152519061176882611d5c565b52611d5c565b506117776108b9565b6003815290808383015280604083015261178f6108b9565b6001815290808483015260408201526117fc6117a9612ac3565b9261010087019384526117d86117bd6108aa565b630b135d3f60e11b8152828782015285519061073382611cea565b506117e16108aa565b6377102c3560e01b8152908582015283519061076982611cfc565b506118236118086108aa565b63852b67af60e01b8152828582015283519061079c82611d0c565b5061184a61182f6108aa565b630b96422d60e01b815282858201528351906116b882611d1c565b506118716118566108aa565b6371af817b60e01b815282858201528351906116e582611d2c565b5061189861187d6108aa565b635b0e93fb60e11b8152828582015283519061171282611d3c565b506118bf6118a46108aa565b631a7e6adf60e11b8152828582015283519061173f82611d4c565b506118e66118cb6108aa565b633e15cc3d60e21b8152828582015283519061176882611d5c565b506119136118f26108aa565b63c1a221f360e01b8152828582015283519061190d82611d6d565b52611d6d565b5061191c6108aa565b63278f794360e11b815292830152519061193582611d7e565b52611d7e565b5060405191829182611424565b80fd5b346101fd5760403660031901126101fd57602061197e60405161196d81610817565b600435815260243583820152613137565b6040519061ffff19168152f35b346101fd5760003660031901126101fd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101fd5760203660031901126101fd57602062010000600160b01b036119f56103cb565b60101b16604051908152f35b346101fd5760403660031901126101fd57611079611a1d6103cb565b611a256103b5565b611a2d61201a565b5060101b62010000600160b01b0316906131a0565b6001600160401b0381116108325760051b60200190565b9291611a6482611a42565b91611a726040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611a985750505050565b81356001600160a01b03811681036101fd578152908301908301611a8b565b929192611ac382611a42565b604092611ad36040519283610889565b819581835260208093019160061b8401938185116101fd57915b848310611afc57505050505050565b85838303126101fd578386918251611b1381610817565b853581528286013583820152815201920191611aed565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761083257604052606080838181528160208201528160408201520152565b60405190602082018281106001600160401b038211176108325760405260008252565b60405190611bbd82610837565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611c0082610817565b60058252640312e302e360dc1b6020830152565b60405190611c2182610817565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108325760405260038352829160009160005b606080821015611ca557825160209291611c9282610817565b8682528382015287820183015201611c79565b50505091925050565b60405190611cbb82610817565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611cf75760200190565b611cd4565b805160011015611cf75760400190565b805160021015611cf75760600190565b805160031015611cf75760800190565b805160041015611cf75760a00190565b805160051015611cf75760c00190565b805160061015611cf75760e00190565b805160071015611cf7576101000190565b805160081015611cf7576101200190565b805160091015611cf7576101400190565b8051821015611cf75760209160051b010190565b60405190611db082610817565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611de982610817565b600d82526c52656d6f7665204f776e65727360981b6020830152565b60405190611e1282610837565b60006040838281528260208201520152565b90604051611e3181610837565b60406002829480548452600181015460208501520154910152565b9291611e5782611a42565b91611e656040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611e8b5750505050565b81358152908301908301611e7e565b9080601f830112156101fd5781602061093393359101611e4c565b9080601f830112156101fd5781602061093393359101611ab7565b61093391611fed611ff9611f9b611f3094611ee9611bb0565b611ef1611bf3565b6040519788916020998a9182611f10818401978881519384920161058b565b8201611f248251809386808501910161058b565b01038084520182610889565b519020604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647289820190815260208101939093524691830191909152306060808401919091529290921b6bffffffffffffffffffffffff191660808201529091829060a0830190565b0391611faf601f1993848101835282610889565b51902094604051938491820195869190602060408401937f7dc7da30a002512936154da01baa79a3d1e54e35034ffdfa7c53c28b3091236d81520152565b03908101835282610889565b519020906042916040519161190160f01b8352600283015260228201522090565b6040519061202782610852565b60006080838281528260208201528260408201528260608201520152565b93929161206a9060409260018060a01b031686526060602087015260608601906109b1565b930152565b634e487b7160e01b600052601160045260246000fd5b9060418202918083046041149015171561039e57565b600281901b91906001600160fe1b0381160361039e57565b906041820180921161039e57565b906015820180921161039e57565b906002820180921161039e57565b9190820180921161039e57565b60ff601f199116019060ff821161039e57565b9060405161210a81610852565b80928054825260018101549060ff821690600282101561048757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061215e82610837565b6000604083815161216e81610852565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926121a3816108c6565b916121b16040519384610889565b8294828452828201116101fd5760206108b793019061058b565b9080601f830112156101fd57815161093392602001612196565b519081151582036101fd57565b60209081818403126101fd5780516001600160401b03918282116101fd57016060818503126101fd5760409283519461222a86610837565b82518481116101fd5783019360a0858303126101fd5785519161224c83610852565b85518281116101fd57860181601f820112156101fd5781818661227193519101612196565b8352838601519182116101fd57856122916080926122ad948a99016121cb565b85850152868101518785015260608101516060850152016121e5565b60808201528552808201519085015201519082015290565b600019811461039e5760010190565b939291909160009460418251106126d7576001600160a01b0383166000908152600260205260409020600101549384156127a05760009384928391828483146127945792979460ff60015b16976001995b878110612359575050505050505050508061233f57509190565b604051631007539160e31b81526004810191909152602490fd5b61236a61236584612085565b6120b3565b821515908161278a575b811561277f575b5061275e576123a0838a90604102016020810151906060604082015191015160001a92565b91979088602060ff82161061275457508d6123bb899a6120ea565b9d600019019d5b60ff8116806125d1575050506001600160a01b03811681116125bf578d9862010000600160b01b038260101b169960018060a01b0383168b61243360016124228d610e27838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b16036125a6575b508c518411801561259c575b61258a5761245c6020808f8701015101856120dd565b8d5110612578578e938d8782108015612570575b612566575b61249893612494939290910160200191906001600160a01b03166135b7565b1590565b61254b575b61ffff19808916911681119081159161250a575b506124f1575b506124e36124ea916124dc86610e278a61ffff19166000526001602052604060002090565b54906120dd565b95926122c5565b9194612325565b6124fc575b8a6124b7565b919b50600099508b916124f6565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff199190911660608201526080902054159050386124b1565b90612558575b8b9061249d565b9a509b50819b60009a612551565b9096508690612475565b508715612470565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b5060418410612446565b6125b1575b8e61243a565b9d509e50849e60009d6125ab565b60405163e6c4247b60e01b8152600490fd5b6002036126f357505061ffff199060101b1697612604610b3388610e278c61ffff19166000526001602052604060002090565b6080606082015191015191612617612151565b508d51851180156126e9575b61258a578d61263a602080888401015101876120dd565b9051106126d7578f948e88821080156126cf575b6126c5575b6126b49492826126a361268184602061249499976126959701015160409485809282850101019201016121f2565b928251948591602083019190602083019252565b03601f198101855284610889565b815190602083015192015192613392565b1561249d5790612558578b9061249d565b9097508790612653565b50881561264e565b60405163d245329360e01b8152600490fd5b5060418510612623565b612701939a949291946132b2565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b0390811692909161274291612422908b90610e27565b161461249d5790612558578b9061249d565b98508d8a996123c2565b505099979650505050505050600014612778575060009190565b6000925090565b90508951103861237b565b8381119150612374565b92979460ff600061231f565b60405163d349279d60e01b8152600490fd5b903590601e19813603018212156101fd57018035906001600160401b0382116101fd576020019181360383136101fd57565b9192909260ff83161561281e576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6128539192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612862828501856127b2565b908184519182372061297e61287a60608701876127b2565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470848201528381526128f48161086d565b5190208451602081019182526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016604082015246606082015261294c81608081015b03601f198101835282610889565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b928383146129ba575061299b856129a2926129aa969701906127b2565b36916108e1565b9133916122d4565b50156129b557600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108325760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610832576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b038211176108325760405260088352600083815b6101008110612a9a5750505050565b6020908451612aa881610817565b84815282612ab4611e05565b81830152828501015201612a8b565b6040906040519161016083018381106001600160401b0382111761083257604052600a8352600083815b6101408110612afc5750505050565b6020908451612b0a81610817565b84815282612b16611e05565b81830152828501015201612aed565b90612b2f82611a42565b612b3c6040519182610889565b8281528092612b4d601f1991611a42565b0190602036910137565b9060008051602061491583398151915291820391821161039e57565b9190820391821161039e57565b91908251918215612cd357336000526002602052604090604060002080549480861115612cc157600094855b8851871015612c6657612bdc612494612bd661ffff19612bcc8b8e611d8f565b511661ffff191690565b33613cef565b612c3357612bfb6001916124dc8b610e27610e12610e098d3394611d8f565b96612c2c612c148b610e27610e12610e09863394611d8f565b60036000918281558260018201558260028201550155565b0195612bac565b610f0e86612c44610e098a8d611d8f565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612cac93979450610d9f867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612ca56002870195865492612b73565b8655612b73565b612cbc6040519283923384612045565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612d8b575b15612d705761fffe1985169101600581901b870184018290529360021615612d68576060850152608084205492612d29565b508592612d29565b95935050945050608091506001830160051b01016040528252565b50841515612d36565b908151612da081612b25565b9060005b818110612db2575090925050565b60019061ffff19612dc38288611d8f565b5116612dcf8286611d8f565b5201612da4565b90612de082611a42565b612ded6040519182610889565b8281528092612dfe601f1991611a42565b019060005b828110612e0f57505050565b602090612e1a61201a565b82828501015201612e03565b929093919383519480519282518714801590612fbe575b610f1257612e4e84889794986120dd565b96612e61612e5b89612b25565b98612dd6565b9660009485925b898b848610612f16575050505050506000925b848410612e89575050505050565b612f0e600191612ea9612e9f61032d8888611d8f565b61033d838d611d8f565b612eb38685611d8f565b51612ebe828b611d8f565b51526020600081612ecf848d611d8f565b510152612edc8787611d8f565b51516060612eea848d611d8f565b510152612ef78787611d8f565b5101516080612f06838c611d8f565b5101526122c5565b930192612e7b565b97610347612fb4926040612fa384612f9d612f4b8c9f9c612f698c9d9e61033d8660019e9f612f58612f4b87610e7b93611d8f565b516001600160a01b031690565b60101b62010000600160b01b031690565b612f73818d611d8f565b51612f7e8589611d8f565b5152612f976020612f8f868a611d8f565b510160019052565b8c611d8f565b93611d8f565b516001600160a01b03909216910152565b9601929190612e68565b508051841415612e3d565b6001600160a01b039091168152606060208201819052610933939192612ff1918401906109b1565b916040818403910152610a28565b919283156127a057600093845b83518610156130355761301f8685611d8f565b5151810180911161039e5760019095019461300c565b90939194508381106131005782826130ce7f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1793613097612cbc977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613788565b50508251906130a46108b9565b91825286602083015260408201526111663360018060a01b03166000526002602052604060002090565b6130de6040519283923384612fc9565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b906131336020928281519485920161058b565b0190565b60208151910151811580613198575b6131795760408051602081019384528082019290925281529061316a606083610889565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b508015613146565b9190916131ab61201a565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff19909416606085018190526080909420549093901561322357613217929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109336001926120fd565b505060009190565b6000919082805b82518210156132ac5761ffff19918261324b8286611d8f565b511686526001602081815260408089203360009081529083528190209294919254820180921161039e576001946132a593612c14939761328b878b611d8f565b51168b525288203360009081526020919091526040902090565b0190613232565b93505050565b9161093393916132c1936139f8565b90929192613a86565b906108b7602e60405180946c1131b430b63632b733b2911d1160991b60208301526132ff815180926020602d8601910161058b565b8101601160f91b602d82015203600e810185520183610889565b805160201015611cf75760400190565b6040513d6000823e3d90fd5b602092919061334b84928281519485920161058b565b019081520190565b3d1561337e573d90613364826108c6565b916133726040519384610889565b82523d6000602084013e565b606090565b908160209103126101fd575190565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a883116135ac57602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346133ff835160608601516133f9816120c1565b91613b13565b8981519101200361359f5761341f61342491613419613b96565b90613e7f565b6132ca565b613439825160408501516133f98451826120dd565b888151910120908881519101200361357757600160f81b8061346c61345e8551613319565b516001600160f81b03191690565b1603613577576080820151151580613583575b6135775751866040519182806134986000958694613120565b039060025afa156135725786816134dd815194516134bd604051968792868401613335565b03946134d1601f1996878101835282610889565b60405191828092613120565b039060025afa15613572578051604080518981018381526020810187905291820187905260608201889052608082018990529193839290613522908260a08501611fed565b51906101005afa95613532613353565b9081519780613569575b61354c5750506109339550613bf5565b6001976135659750820181019550019250613383915050565b1490565b5087151561353c565b613329565b50505050505050600090565b50600160fa1b8061359761345e8551613319565b16141561347f565b5050505050505050600090565b505050505050600090565b600091929082916040516135ef8161293e6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ae565b51915afa906135fc613353565b82613624575b8261360c57505090565b9091506020818051810103126101fd57602001511490565b915060208251101591613602565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080902054801590811561366f575090565b600191501690565b6001909201805490929182156136fa578281106136d9575080820361369b57505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b80935081925010613709575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b90805182556001820190602081015190600282101561048757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612cd35782825103610f12576103e883116138aa57906000915b8383106137ba575050509190565b9091946137e16124946137db6137d3610e098a87611d8f565b61ffff191690565b33613dc8565b61389a576137ef8684611d8f565b5151158015613883575b6138455761383c60019161382a6138108987611d8f565b5161382533610e27610e12610e098e8b611d8f565b61372b565b6138348886611d8f565b5151906120dd565b950191906137ac565b5084610e7b610e098261385794611d8f565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f42406138928785611d8f565b5151116137f9565b610f0e610eeb610e098885611d8f565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612cd35783835103610f12576103e86138ef85836120dd565b116139705750906000915b838310613908575050509190565b9091946139216124946137db6137d3610e098a87611d8f565b61389a5761392f8684611d8f565b5151158015613959575b6138455761395060019161382a6138108987611d8f565b950191906138fa565b50620f42406139688785611d8f565b515111613939565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b811580156139ec575b6139bf5761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f4240821161399a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613a7057926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa156135725780516001600160a01b03811615613a6757918190565b50809160019190565b50505060009160039190565b6004111561048757565b613a8f81613a7c565b80613a98575050565b613aa181613a7c565b60018103613abb5760405163f645eedf60e01b8152600490fd5b613ac481613a7c565b60028103613ae55760405163fce698f760e01b815260048101839052602490fd5b80613af1600392613a7c565b14613af95750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613b8e575b81811115613b86575b50828110613b3a57505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613b6f57908290613b57565b505060008583016020015250603f01168201604052565b905038613b2d565b925082613b24565b60405190613ba382610837565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613cd7575b8015613ccf575b8015613cb7575b613cad57613c1f8386613f27565b15613cad5760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614915833981519152948560a084015260208360c0816005600019fa156101fd57613ca79386613ca1945181818909940991613fc8565b91612b57565b90081590565b5050505050600090565b50600080516020614915833981519152821015613c11565b508115613c0a565b50600080516020614915833981519152841015613c03565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613dc0575b613db7576001600060015b15613d8b575b50606084015260808320805460009161fffe198083169190898314613d6a57505091613d3d565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613dad575b5015613da35738613d43565b5060009450505050565b9050151538613d97565b50600093505050565b508015613d32565b9061ffff1916908115613e5057604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613e4757600160809252209182549283158015613e3d575b15613e3157600193505555600190565b90600217905555600190565b5060018416613e21565b50505050600090565b5050600090565b90613e61826108c6565b613e6e6040519182610889565b8281528092612b4d601f19916108c6565b805115613f1d57613eaa613ea5613e9e613e99845161209b565b6120cf565b6003900490565b613e57565b91602083019180805101906020820192835194600085525b838310613ed157505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301613ec2565b5050610933611b8d565b600160601b63ffffffff60c01b031990818110801590613fbe575b8015613fad575b613fa5577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b5080158015613f4957508215613f49565b5081831015613f42565b60009260ff929091848315806146d4575b61357757613fe783836146dc565b90958615806146cc575b61468e575b85811c60028a60fe1c16015b1561467457600186821c1660028a831c60011b16016001811461463b575b6002811461462e575b600314614621575b60009493929419019560019860015b88600019116140ad5750505050505050505060405191606083015260208252602080830152602060408301526000805160206149358339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa156101fd5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b0319808260008051602061493583398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156146035760018c600286838f841c16921c831b1601146145cc575b838c8c6002600182841c168185851c60011b1601146145b9575b6003926001600292841c16921c60011b1601146145b0575b861561459d57600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614387575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a0960008051602061493583398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b031992839081908184800990096000805160206149358339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b60001901979693959493614040565b8661425c57919a9198919550600160601b63ffffffff60c01b0319905080808360008051602061493583398151915209600160601b63ffffffff60c01b03198460008051602061493583398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b0319908180808560008051602061493583398151915209600160601b63ffffffff60c01b0319866000805160206149358339815191520909600160601b63ffffffff60c01b03198560008051602061493583398151915209090997600160601b63ffffffff60c01b03199081808460008051602061493583398151915209600160601b63ffffffff60c01b0319856000805160206149358339815191520909099a600160601b63ffffffff60c01b0319808c60008051602061493583398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b03199283908180808360008051602061493583398151915209600160601b63ffffffff60c01b0319846000805160206149358339815191520909600160601b63ffffffff60c01b03198360008051602061493583398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614378565b60019c50909a8c99509095509050614378565b5050828461421b565b508993508a92508591508d90508c614203565b50506000805160206148f58339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f56141e9565b50949a90999097600160601b63ffffffff60c01b0319039450614378565b9150955084958091614031565b9397508793859350614029565b6000805160206148f583398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59350614020565b60001901600160028188841c16918b841c901b1601614002565b9790946000805160206149158339815191529182039008936000978515806146c4575b15613ff657505050505050505050600090565b5060016146b1565b508115613ff1565b508615613fd9565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592916000805160206148f5833981519152918115614834578083148061482b575b156148145750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe816001840892080960030981808080866000805160206149358339815191520981858009089981600181818b099a099709810393898203900890090893915b60405190602082526020808301526020604083015260608201526000805160206149358339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa156101fd57838080935180950980099009930990565b90915061482292935061483a565b919392916147ae565b5081851461471e565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b9209089509089280808080878009968709948180886000805160206148f583398151915209918180808560008051602061493583398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220d586e4fd303dfab4216400fe9fa3ed6319112d27701f24d09905e2c95485692164736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x6a", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x828081", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xef45dd54a42dcea02d8aaa51692e203c310706fec5c6f08750d142e13cdd74aa", + "transactionIndex": "0x13", + "blockHash": "0x1734bf81a44716b070381189e700732750bc36d2b8f80a9d1c6f0e7da9c960db", + "blockNumber": "0x141010c", + "gasUsed": "0x3f0a22", + "effectiveGasPrice": "0x25eaba060", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1729795387, + "chain": 1, + "commit": "bf15fa9" +} \ No newline at end of file diff --git a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/1/run-latest.json b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/1/run-latest.json new file mode 100644 index 0000000..57face1 --- /dev/null +++ b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/1/run-latest.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0xef45dd54a42dcea02d8aaa51692e203c310706fec5c6f08750d142e13cdd74aa", + "transactionType": "CREATE2", + "contractName": "WeightedWebauthnMultisigPlugin", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x570c61", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a0346200007757601f62004a1d38819003918201601f19168301916001600160401b038311848410176200007c578084926020946040528339810103126200007757516001600160a01b0381168103620000775760805260405161498a90816200009382396080518181816119a1015261290a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461018d5780630b96422d146101885780630c7ecd84146101425780630cdc271f146101835780631128186d1461017e578063118a53891461017957806315b76b84146101745780631626ba7e1461016f57806346d60eb2146101425780636bbefc891461016a5780636d61fe701461016557806371af817b1461016057806377102c351461015b578063852b67af14610156578063858e6ee4146101515780638a91b0e31461014c578063b139ec6314610147578063bfd151c114610142578063c4db8dd91461013d578063c776313014610138578063c8050ee414610133578063e8eb3cc61461012e578063ef4a7203146101295763f582bceb1461012457600080fd5b611a01565b6119d0565b61198b565b61194b565b61153b565b61126c565b61040e565b611209565b611089565b611020565b610f53565b610f24565b610d00565b610bb0565b610aad565b610936565b6107f3565b6106a9565b61054e565b6104c1565b610262565b346101fd5760203660031901126101fd5760043563ffffffff60e01b81168091036101fd576020906372d61afb60e01b81149081156101d2575b506040519015158152f35b63043140ed60e01b8114915081156101ec575b50386101c7565b6301ffc9a760e01b149050386101e5565b600080fd5b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460051b0101116101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460061b0101116101fd57565b346101fd5760603660031901126101fd576001600160401b036004358181116101fd57610293903690600401610202565b916024359081116101fd576102ac903690600401610232565b926102b633613632565b6103a3576102d1926102c9913691611a59565b923691611ab7565b81519181519182840180851161039e576102ed90949294612b25565b9360009283915b818310610354575050506000915b8383106103175761031560443586612b80565b005b61034c60019161034761033361032d8787611d8f565b51613137565b61033d838a611d8f565b9061ffff19169052565b6122c5565b920191610302565b91939091906001906103959061034761038b6001600160a01b036103788a88611d8f565b511660101b62010000600160b01b031690565b61033d838c611d8f565b940191906102f4565b61206f565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b03821682036101fd57565b600435906001600160a01b03821682036101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd57602083818601950101116101fd57565b346101fd5760803660031901126101fd5760043560ff811681036101fd576024356001600160a01b038116036101fd576064356001600160401b0381116101fd5761045d9036906004016103e1565b5050611b2a565b634e487b7160e01b600052602160045260246000fd5b9060028210156104875752565b610464565b91926104aa608094979695929760a08501988552602085019061047a565b6001600160a01b0316604083015260608201520152565b346101fd5760403660031901126101fd5760043561ffff1981168091036101fd57610513906104ee6103b5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361054a93600881901c6001600160a01b03169160ff909116908661048c565b0390f35b346101fd5760403660031901126101fd5760043560ff811681036101fd576024356001600160401b0381116101fd5761045d9036906004016103e1565b60005b83811061059e5750506000910152565b818101518382015260200161058e565b906020916105c78151809281855285808601910161058b565b601f01601f1916010190565b906020908183526105ef815160808486015260a08501906105ae565b9180820151916060610626610613601f1996604096888a83030160408b01526105ae565b60408401518789830301848a01526105ae565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061066057505050505050505090565b909192939495969786806106978387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ae565b9a01950195019396959492919061064e565b346101fd5760003660031901126101fd576106c2611b59565b5061054a6106ce611b59565b6106d6611bb0565b81526106e0611bf3565b60208201526106ed611c14565b60408201526107a26106fd611c4d565b6060830190815261073961070f611cae565b6107176108aa565b63852b67af60e01b815290602082015282519061073382611cea565b52611cea565b5061076f610745611da3565b61074d6108aa565b6371af817b60e01b815290602082015282519061076982611cfc565b52611cfc565b50610778611ddc565b906107816108aa565b630b96422d60e01b8152916020830152519061079c82611d0c565b52611d0c565b50604051918291826105d3565b906003196060818401126101fd5760043560ff811681036101fd5792602435916001600160401b0383116101fd5782610120920301126101fd576004019060443590565b346101fd5761045d366107af565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761083257604052565b610801565b606081019081106001600160401b0382111761083257604052565b60a081019081106001600160401b0382111761083257604052565b61012081019081106001600160401b0382111761083257604052565b90601f801991011681019081106001600160401b0382111761083257604052565b604051906108b782610817565b565b604051906108b782610837565b6001600160401b03811161083257601f01601f191660200190565b9291926108ed826108c6565b916108fb6040519384610889565b8294818452818301116101fd578281602093846000960137010152565b9080601f830112156101fd57816020610933933591016108e1565b90565b346101fd5760403660031901126101fd576024356001600160401b0381116101fd5761096961097d913690600401610918565b61097560043533611ed0565b3390806122d4565b50156109a1576020630b135d3f60e11b5b6040516001600160e01b03199091168152f35b60206001600160e01b031961098e565b90815180825260208080930193019160005b8281106109d1575050505090565b835161ffff1916855293810193928101926001016109c3565b6080809180518452610a046020820151602086019061047a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610a48575050505090565b909192938260a082610a5d60019489516109ea565b01950193929101610a3a565b91610a95604091610a8760809497969760a0875260a08701906109b1565b908582036020870152610a28565b94805182850152602081015160608501520151910152565b346101fd576020806003193601126101fd57610ac76103cb565b610acf611e05565b50610ae1610adc82612ce5565b612d94565b90610aec8251612dd6565b9260005b8351811015610b545760019061ffff19610b0a8287611d8f565b5116600090815282845260408082206001600160a01b03871683526020529020610b38906120fd565b6120fd565b610b428288611d8f565b52610b4d8187611d8f565b5001610af0565b505060018060a01b0316600052600260205261054a610b766040600020611e24565b60405193849384610a69565b60206003198201126101fd57600435906001600160401b0382116101fd57610bac916004016103e1565b9091565b346101fd57610bbe36610b82565b610bc733613632565b15610c6b5781019060a0818303126101fd576001600160401b0381358181116101fd57820183601f820112156101fd5783816020610c0793359101611a59565b9260208301358281116101fd5781610c20918501611e9a565b9360408401358381116101fd5782610c39918601611eb5565b60608501359384116101fd5761031595610c5a610c60946080968801611e9a565b92612e26565b919092013591612fff565b60405162dc149f60e41b8152600490fd5b60a06003198201126101fd576001600160401b03906004358281116101fd5781610ca891600401610202565b939093926024358181116101fd5783610cc391600401610202565b939093926044358381116101fd5782610cde91600401610232565b939093926064359182116101fd57610cf891600401610202565b909160843590565b346101fd57610d0e36610c7c565b97969094959293610d1e33613632565b6103a357610d43610c5a94610d3b610d539a610d4b953691611a59565b983691611e4c565b943691611ab7565b933691611e4c565b819291519181518303610f12576000808415159283610de4575b3360009081526002602052604090209495509293610da79390610d9f9093610d9a600286019485546120dd565b612b73565b809255613677565b610dad57005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610ddf6040519283923384612fc9565b0390a1005b60005b868110610df45750610d6d565b91610e3e33610e27610e12610e09878d611d8f565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610e498488611d8f565b51518115610edb57878a82841015610e97579260019492610d9a610e8993610e818a610e7b610e0982610e8f9b611d8f565b92611d8f565b515190613991565b906120dd565b925b01610de7565b8284939497959711610eb0575b50505050600190610e91565b92849792610d9a610e8993610e8188610e7b610e0960019b610ed19b611d8f565b939038878a610ea4565b610f0e610eeb610e09878d611d8f565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b346101fd5760403660031901126101fd576020610f4b610f426103cb565b60243590611ed0565b604051908152f35b346101fd57610f6136610c7c565b97969094959293610f7133613632565b6103a357610d43610c5a94610d3b610f8e9a610d4b953691611a59565b90336000526002602052604060002092610faa845484846138ca565b60028692960192835491820180921161039e57825496870180971161039e5781610ff8947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613677565b610ddf6040519283923384612fc9565b901515815260c0810192916108b791602001906109ea565b346101fd5760603660031901126101fd576110396103cb565b60403660231901126101fd576110799061107360405161105881610817565b6024358152604435602082015261106d61201a565b50613137565b906131a0565b9061054a60405192839283611008565b346101fd5761109736610b82565b50506110a5610adc33612ce5565b6000903382526002602052600180604084200154906110e3336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6111c3575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6111bd887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b6111816111456108b9565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b61118a8161322b565b9061119b6040519283923384612045565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156111e4575b87908352608085208861fffe198254169155916110ed565b9081161580611200575b156111fa5782906111cc565b806110f2565b508015156111ee565b346101fd5760803660031901126101fd576044356001600160a01b03811681036101fd576064356001600160401b0381116101fd5760409161125261125e923690600401610918565b906024356004356122d4565b825191151582526020820152f35b346101fd576020610f4b61127f366107af565b916127e4565b90815180825260208080930193019160005b8281106112a5575050505090565b83516001600160e01b03191685529381019392810192600101611297565b908082519081815260208091019281808460051b8301019501936000915b8483106112f15750505050505090565b9091929394958480611335600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611285565b98019301930191949392906112e1565b80516005811015610487576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061138b575050505090565b909192938260806001926113b383895163ffffffff60e01b8151168452015184830190611345565b0195019392910161137d565b90815180825260208080930193019160005b8281106113df575050505090565b909192938260e06001926114186040895163ffffffff851b815116845261140c8682015187860190611345565b01516080830190611345565b019501939291016113d1565b906109339160208152815190611448610180928360208401526101a0830190611285565b916114c261149661148261146e602088015196601f199788888303016040890152611285565b604088015187878303016060880152611285565b606087015186868303016080870152611285565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526112c3565b61152b6115146114fd6114e660e089015194610100958989830301878a015261136b565b93880151936101209488888303018689015261136b565b92870151926101409387878303018588015261136b565b91860151916101609286868303018487015261136b565b94015192828503019101526113bf565b346101fd576000806003193601126119485761054a906115596129ca565b5061193b6115656129ca565b916115f06115e4611574612a36565b6115936115876040880192808452611cea565b63852b67af60e01b9052565b6115ac6115a08251611cfc565b630b96422d60e01b9052565b6115c56115b98251611d0c565b6371af817b60e01b9052565b6115de6115d28251611d1c565b630b135d3f60e11b9052565b51611d2c565b6377102c3560e01b9052565b6115f86108b9565b600181529061176e6020928284820152826040820152611616612a61565b60e087019081526116436116286108aa565b63852b67af60e01b8152838782015282519061073382611cea565b5061166a61164f6108aa565b630b96422d60e01b8152838782015282519061076982611cfc565b506116916116766108aa565b6371af817b60e01b8152838782015282519061079c82611d0c565b506116be61169d6108aa565b635b0e93fb60e11b815283878201528251906116b882611d1c565b52611d1c565b506116eb6116ca6108aa565b631a7e6adf60e11b815283878201528251906116e582611d2c565b52611d2c565b506117186116f76108aa565b633e15cc3d60e21b8152838782015282519061171282611d3c565b52611d3c565b506117456117246108aa565b63c1a221f360e01b8152838782015282519061173f82611d4c565b52611d4c565b5061174e6108aa565b63278f794360e11b81529185830152519061176882611d5c565b52611d5c565b506117776108b9565b6003815290808383015280604083015261178f6108b9565b6001815290808483015260408201526117fc6117a9612ac3565b9261010087019384526117d86117bd6108aa565b630b135d3f60e11b8152828782015285519061073382611cea565b506117e16108aa565b6377102c3560e01b8152908582015283519061076982611cfc565b506118236118086108aa565b63852b67af60e01b8152828582015283519061079c82611d0c565b5061184a61182f6108aa565b630b96422d60e01b815282858201528351906116b882611d1c565b506118716118566108aa565b6371af817b60e01b815282858201528351906116e582611d2c565b5061189861187d6108aa565b635b0e93fb60e11b8152828582015283519061171282611d3c565b506118bf6118a46108aa565b631a7e6adf60e11b8152828582015283519061173f82611d4c565b506118e66118cb6108aa565b633e15cc3d60e21b8152828582015283519061176882611d5c565b506119136118f26108aa565b63c1a221f360e01b8152828582015283519061190d82611d6d565b52611d6d565b5061191c6108aa565b63278f794360e11b815292830152519061193582611d7e565b52611d7e565b5060405191829182611424565b80fd5b346101fd5760403660031901126101fd57602061197e60405161196d81610817565b600435815260243583820152613137565b6040519061ffff19168152f35b346101fd5760003660031901126101fd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101fd5760203660031901126101fd57602062010000600160b01b036119f56103cb565b60101b16604051908152f35b346101fd5760403660031901126101fd57611079611a1d6103cb565b611a256103b5565b611a2d61201a565b5060101b62010000600160b01b0316906131a0565b6001600160401b0381116108325760051b60200190565b9291611a6482611a42565b91611a726040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611a985750505050565b81356001600160a01b03811681036101fd578152908301908301611a8b565b929192611ac382611a42565b604092611ad36040519283610889565b819581835260208093019160061b8401938185116101fd57915b848310611afc57505050505050565b85838303126101fd578386918251611b1381610817565b853581528286013583820152815201920191611aed565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761083257604052606080838181528160208201528160408201520152565b60405190602082018281106001600160401b038211176108325760405260008252565b60405190611bbd82610837565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611c0082610817565b60058252640312e302e360dc1b6020830152565b60405190611c2182610817565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108325760405260038352829160009160005b606080821015611ca557825160209291611c9282610817565b8682528382015287820183015201611c79565b50505091925050565b60405190611cbb82610817565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611cf75760200190565b611cd4565b805160011015611cf75760400190565b805160021015611cf75760600190565b805160031015611cf75760800190565b805160041015611cf75760a00190565b805160051015611cf75760c00190565b805160061015611cf75760e00190565b805160071015611cf7576101000190565b805160081015611cf7576101200190565b805160091015611cf7576101400190565b8051821015611cf75760209160051b010190565b60405190611db082610817565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611de982610817565b600d82526c52656d6f7665204f776e65727360981b6020830152565b60405190611e1282610837565b60006040838281528260208201520152565b90604051611e3181610837565b60406002829480548452600181015460208501520154910152565b9291611e5782611a42565b91611e656040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611e8b5750505050565b81358152908301908301611e7e565b9080601f830112156101fd5781602061093393359101611e4c565b9080601f830112156101fd5781602061093393359101611ab7565b61093391611fed611ff9611f9b611f3094611ee9611bb0565b611ef1611bf3565b6040519788916020998a9182611f10818401978881519384920161058b565b8201611f248251809386808501910161058b565b01038084520182610889565b519020604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647289820190815260208101939093524691830191909152306060808401919091529290921b6bffffffffffffffffffffffff191660808201529091829060a0830190565b0391611faf601f1993848101835282610889565b51902094604051938491820195869190602060408401937f7dc7da30a002512936154da01baa79a3d1e54e35034ffdfa7c53c28b3091236d81520152565b03908101835282610889565b519020906042916040519161190160f01b8352600283015260228201522090565b6040519061202782610852565b60006080838281528260208201528260408201528260608201520152565b93929161206a9060409260018060a01b031686526060602087015260608601906109b1565b930152565b634e487b7160e01b600052601160045260246000fd5b9060418202918083046041149015171561039e57565b600281901b91906001600160fe1b0381160361039e57565b906041820180921161039e57565b906015820180921161039e57565b906002820180921161039e57565b9190820180921161039e57565b60ff601f199116019060ff821161039e57565b9060405161210a81610852565b80928054825260018101549060ff821690600282101561048757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061215e82610837565b6000604083815161216e81610852565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926121a3816108c6565b916121b16040519384610889565b8294828452828201116101fd5760206108b793019061058b565b9080601f830112156101fd57815161093392602001612196565b519081151582036101fd57565b60209081818403126101fd5780516001600160401b03918282116101fd57016060818503126101fd5760409283519461222a86610837565b82518481116101fd5783019360a0858303126101fd5785519161224c83610852565b85518281116101fd57860181601f820112156101fd5781818661227193519101612196565b8352838601519182116101fd57856122916080926122ad948a99016121cb565b85850152868101518785015260608101516060850152016121e5565b60808201528552808201519085015201519082015290565b600019811461039e5760010190565b939291909160009460418251106126d7576001600160a01b0383166000908152600260205260409020600101549384156127a05760009384928391828483146127945792979460ff60015b16976001995b878110612359575050505050505050508061233f57509190565b604051631007539160e31b81526004810191909152602490fd5b61236a61236584612085565b6120b3565b821515908161278a575b811561277f575b5061275e576123a0838a90604102016020810151906060604082015191015160001a92565b91979088602060ff82161061275457508d6123bb899a6120ea565b9d600019019d5b60ff8116806125d1575050506001600160a01b03811681116125bf578d9862010000600160b01b038260101b169960018060a01b0383168b61243360016124228d610e27838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b16036125a6575b508c518411801561259c575b61258a5761245c6020808f8701015101856120dd565b8d5110612578578e938d8782108015612570575b612566575b61249893612494939290910160200191906001600160a01b03166135b7565b1590565b61254b575b61ffff19808916911681119081159161250a575b506124f1575b506124e36124ea916124dc86610e278a61ffff19166000526001602052604060002090565b54906120dd565b95926122c5565b9194612325565b6124fc575b8a6124b7565b919b50600099508b916124f6565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff199190911660608201526080902054159050386124b1565b90612558575b8b9061249d565b9a509b50819b60009a612551565b9096508690612475565b508715612470565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b5060418410612446565b6125b1575b8e61243a565b9d509e50849e60009d6125ab565b60405163e6c4247b60e01b8152600490fd5b6002036126f357505061ffff199060101b1697612604610b3388610e278c61ffff19166000526001602052604060002090565b6080606082015191015191612617612151565b508d51851180156126e9575b61258a578d61263a602080888401015101876120dd565b9051106126d7578f948e88821080156126cf575b6126c5575b6126b49492826126a361268184602061249499976126959701015160409485809282850101019201016121f2565b928251948591602083019190602083019252565b03601f198101855284610889565b815190602083015192015192613392565b1561249d5790612558578b9061249d565b9097508790612653565b50881561264e565b60405163d245329360e01b8152600490fd5b5060418510612623565b612701939a949291946132b2565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b0390811692909161274291612422908b90610e27565b161461249d5790612558578b9061249d565b98508d8a996123c2565b505099979650505050505050600014612778575060009190565b6000925090565b90508951103861237b565b8381119150612374565b92979460ff600061231f565b60405163d349279d60e01b8152600490fd5b903590601e19813603018212156101fd57018035906001600160401b0382116101fd576020019181360383136101fd57565b9192909260ff83161561281e576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6128539192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612862828501856127b2565b908184519182372061297e61287a60608701876127b2565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470848201528381526128f48161086d565b5190208451602081019182526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016604082015246606082015261294c81608081015b03601f198101835282610889565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b928383146129ba575061299b856129a2926129aa969701906127b2565b36916108e1565b9133916122d4565b50156129b557600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108325760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610832576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b038211176108325760405260088352600083815b6101008110612a9a5750505050565b6020908451612aa881610817565b84815282612ab4611e05565b81830152828501015201612a8b565b6040906040519161016083018381106001600160401b0382111761083257604052600a8352600083815b6101408110612afc5750505050565b6020908451612b0a81610817565b84815282612b16611e05565b81830152828501015201612aed565b90612b2f82611a42565b612b3c6040519182610889565b8281528092612b4d601f1991611a42565b0190602036910137565b9060008051602061491583398151915291820391821161039e57565b9190820391821161039e57565b91908251918215612cd357336000526002602052604090604060002080549480861115612cc157600094855b8851871015612c6657612bdc612494612bd661ffff19612bcc8b8e611d8f565b511661ffff191690565b33613cef565b612c3357612bfb6001916124dc8b610e27610e12610e098d3394611d8f565b96612c2c612c148b610e27610e12610e09863394611d8f565b60036000918281558260018201558260028201550155565b0195612bac565b610f0e86612c44610e098a8d611d8f565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612cac93979450610d9f867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612ca56002870195865492612b73565b8655612b73565b612cbc6040519283923384612045565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612d8b575b15612d705761fffe1985169101600581901b870184018290529360021615612d68576060850152608084205492612d29565b508592612d29565b95935050945050608091506001830160051b01016040528252565b50841515612d36565b908151612da081612b25565b9060005b818110612db2575090925050565b60019061ffff19612dc38288611d8f565b5116612dcf8286611d8f565b5201612da4565b90612de082611a42565b612ded6040519182610889565b8281528092612dfe601f1991611a42565b019060005b828110612e0f57505050565b602090612e1a61201a565b82828501015201612e03565b929093919383519480519282518714801590612fbe575b610f1257612e4e84889794986120dd565b96612e61612e5b89612b25565b98612dd6565b9660009485925b898b848610612f16575050505050506000925b848410612e89575050505050565b612f0e600191612ea9612e9f61032d8888611d8f565b61033d838d611d8f565b612eb38685611d8f565b51612ebe828b611d8f565b51526020600081612ecf848d611d8f565b510152612edc8787611d8f565b51516060612eea848d611d8f565b510152612ef78787611d8f565b5101516080612f06838c611d8f565b5101526122c5565b930192612e7b565b97610347612fb4926040612fa384612f9d612f4b8c9f9c612f698c9d9e61033d8660019e9f612f58612f4b87610e7b93611d8f565b516001600160a01b031690565b60101b62010000600160b01b031690565b612f73818d611d8f565b51612f7e8589611d8f565b5152612f976020612f8f868a611d8f565b510160019052565b8c611d8f565b93611d8f565b516001600160a01b03909216910152565b9601929190612e68565b508051841415612e3d565b6001600160a01b039091168152606060208201819052610933939192612ff1918401906109b1565b916040818403910152610a28565b919283156127a057600093845b83518610156130355761301f8685611d8f565b5151810180911161039e5760019095019461300c565b90939194508381106131005782826130ce7f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1793613097612cbc977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613788565b50508251906130a46108b9565b91825286602083015260408201526111663360018060a01b03166000526002602052604060002090565b6130de6040519283923384612fc9565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b906131336020928281519485920161058b565b0190565b60208151910151811580613198575b6131795760408051602081019384528082019290925281529061316a606083610889565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b508015613146565b9190916131ab61201a565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff19909416606085018190526080909420549093901561322357613217929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109336001926120fd565b505060009190565b6000919082805b82518210156132ac5761ffff19918261324b8286611d8f565b511686526001602081815260408089203360009081529083528190209294919254820180921161039e576001946132a593612c14939761328b878b611d8f565b51168b525288203360009081526020919091526040902090565b0190613232565b93505050565b9161093393916132c1936139f8565b90929192613a86565b906108b7602e60405180946c1131b430b63632b733b2911d1160991b60208301526132ff815180926020602d8601910161058b565b8101601160f91b602d82015203600e810185520183610889565b805160201015611cf75760400190565b6040513d6000823e3d90fd5b602092919061334b84928281519485920161058b565b019081520190565b3d1561337e573d90613364826108c6565b916133726040519384610889565b82523d6000602084013e565b606090565b908160209103126101fd575190565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a883116135ac57602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346133ff835160608601516133f9816120c1565b91613b13565b8981519101200361359f5761341f61342491613419613b96565b90613e7f565b6132ca565b613439825160408501516133f98451826120dd565b888151910120908881519101200361357757600160f81b8061346c61345e8551613319565b516001600160f81b03191690565b1603613577576080820151151580613583575b6135775751866040519182806134986000958694613120565b039060025afa156135725786816134dd815194516134bd604051968792868401613335565b03946134d1601f1996878101835282610889565b60405191828092613120565b039060025afa15613572578051604080518981018381526020810187905291820187905260608201889052608082018990529193839290613522908260a08501611fed565b51906101005afa95613532613353565b9081519780613569575b61354c5750506109339550613bf5565b6001976135659750820181019550019250613383915050565b1490565b5087151561353c565b613329565b50505050505050600090565b50600160fa1b8061359761345e8551613319565b16141561347f565b5050505050505050600090565b505050505050600090565b600091929082916040516135ef8161293e6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ae565b51915afa906135fc613353565b82613624575b8261360c57505090565b9091506020818051810103126101fd57602001511490565b915060208251101591613602565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080902054801590811561366f575090565b600191501690565b6001909201805490929182156136fa578281106136d9575080820361369b57505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b80935081925010613709575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b90805182556001820190602081015190600282101561048757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612cd35782825103610f12576103e883116138aa57906000915b8383106137ba575050509190565b9091946137e16124946137db6137d3610e098a87611d8f565b61ffff191690565b33613dc8565b61389a576137ef8684611d8f565b5151158015613883575b6138455761383c60019161382a6138108987611d8f565b5161382533610e27610e12610e098e8b611d8f565b61372b565b6138348886611d8f565b5151906120dd565b950191906137ac565b5084610e7b610e098261385794611d8f565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f42406138928785611d8f565b5151116137f9565b610f0e610eeb610e098885611d8f565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612cd35783835103610f12576103e86138ef85836120dd565b116139705750906000915b838310613908575050509190565b9091946139216124946137db6137d3610e098a87611d8f565b61389a5761392f8684611d8f565b5151158015613959575b6138455761395060019161382a6138108987611d8f565b950191906138fa565b50620f42406139688785611d8f565b515111613939565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b811580156139ec575b6139bf5761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f4240821161399a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613a7057926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa156135725780516001600160a01b03811615613a6757918190565b50809160019190565b50505060009160039190565b6004111561048757565b613a8f81613a7c565b80613a98575050565b613aa181613a7c565b60018103613abb5760405163f645eedf60e01b8152600490fd5b613ac481613a7c565b60028103613ae55760405163fce698f760e01b815260048101839052602490fd5b80613af1600392613a7c565b14613af95750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613b8e575b81811115613b86575b50828110613b3a57505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613b6f57908290613b57565b505060008583016020015250603f01168201604052565b905038613b2d565b925082613b24565b60405190613ba382610837565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613cd7575b8015613ccf575b8015613cb7575b613cad57613c1f8386613f27565b15613cad5760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614915833981519152948560a084015260208360c0816005600019fa156101fd57613ca79386613ca1945181818909940991613fc8565b91612b57565b90081590565b5050505050600090565b50600080516020614915833981519152821015613c11565b508115613c0a565b50600080516020614915833981519152841015613c03565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613dc0575b613db7576001600060015b15613d8b575b50606084015260808320805460009161fffe198083169190898314613d6a57505091613d3d565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613dad575b5015613da35738613d43565b5060009450505050565b9050151538613d97565b50600093505050565b508015613d32565b9061ffff1916908115613e5057604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613e4757600160809252209182549283158015613e3d575b15613e3157600193505555600190565b90600217905555600190565b5060018416613e21565b50505050600090565b5050600090565b90613e61826108c6565b613e6e6040519182610889565b8281528092612b4d601f19916108c6565b805115613f1d57613eaa613ea5613e9e613e99845161209b565b6120cf565b6003900490565b613e57565b91602083019180805101906020820192835194600085525b838310613ed157505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301613ec2565b5050610933611b8d565b600160601b63ffffffff60c01b031990818110801590613fbe575b8015613fad575b613fa5577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b5080158015613f4957508215613f49565b5081831015613f42565b60009260ff929091848315806146d4575b61357757613fe783836146dc565b90958615806146cc575b61468e575b85811c60028a60fe1c16015b1561467457600186821c1660028a831c60011b16016001811461463b575b6002811461462e575b600314614621575b60009493929419019560019860015b88600019116140ad5750505050505050505060405191606083015260208252602080830152602060408301526000805160206149358339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa156101fd5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b0319808260008051602061493583398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156146035760018c600286838f841c16921c831b1601146145cc575b838c8c6002600182841c168185851c60011b1601146145b9575b6003926001600292841c16921c60011b1601146145b0575b861561459d57600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614387575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a0960008051602061493583398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b031992839081908184800990096000805160206149358339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b60001901979693959493614040565b8661425c57919a9198919550600160601b63ffffffff60c01b0319905080808360008051602061493583398151915209600160601b63ffffffff60c01b03198460008051602061493583398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b0319908180808560008051602061493583398151915209600160601b63ffffffff60c01b0319866000805160206149358339815191520909600160601b63ffffffff60c01b03198560008051602061493583398151915209090997600160601b63ffffffff60c01b03199081808460008051602061493583398151915209600160601b63ffffffff60c01b0319856000805160206149358339815191520909099a600160601b63ffffffff60c01b0319808c60008051602061493583398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b03199283908180808360008051602061493583398151915209600160601b63ffffffff60c01b0319846000805160206149358339815191520909600160601b63ffffffff60c01b03198360008051602061493583398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614378565b60019c50909a8c99509095509050614378565b5050828461421b565b508993508a92508591508d90508c614203565b50506000805160206148f58339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f56141e9565b50949a90999097600160601b63ffffffff60c01b0319039450614378565b9150955084958091614031565b9397508793859350614029565b6000805160206148f583398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59350614020565b60001901600160028188841c16918b841c901b1601614002565b9790946000805160206149158339815191529182039008936000978515806146c4575b15613ff657505050505050505050600090565b5060016146b1565b508115613ff1565b508615613fd9565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592916000805160206148f5833981519152918115614834578083148061482b575b156148145750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe816001840892080960030981808080866000805160206149358339815191520981858009089981600181818b099a099709810393898203900890090893915b60405190602082526020808301526020604083015260608201526000805160206149358339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa156101fd57838080935180950980099009930990565b90915061482292935061483a565b919392916147ae565b5081851461471e565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b9209089509089280808080878009968709948180886000805160206148f583398151915209918180808560008051602061493583398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220d586e4fd303dfab4216400fe9fa3ed6319112d27701f24d09905e2c95485692164736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x6a", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x828081", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xef45dd54a42dcea02d8aaa51692e203c310706fec5c6f08750d142e13cdd74aa", + "transactionIndex": "0x13", + "blockHash": "0x1734bf81a44716b070381189e700732750bc36d2b8f80a9d1c6f0e7da9c960db", + "blockNumber": "0x141010c", + "gasUsed": "0x3f0a22", + "effectiveGasPrice": "0x25eaba060", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1729795387, + "chain": 1, + "commit": "bf15fa9" +} \ No newline at end of file diff --git a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/11155111/run-1729794974.json b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/11155111/run-1729794974.json new file mode 100644 index 0000000..ab8c185 --- /dev/null +++ b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/11155111/run-1729794974.json @@ -0,0 +1,49 @@ +{ + "transactions": [ + { + "hash": "0x889be83e853ab303270bb1861cd7f276bc6b514f7719096c2550937676ba3a1a", + "transactionType": "CREATE2", + "contractName": "WeightedWebauthnMultisigPlugin", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x570c61", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a0346200007757601f62004a1d38819003918201601f19168301916001600160401b038311848410176200007c578084926020946040528339810103126200007757516001600160a01b0381168103620000775760805260405161498a90816200009382396080518181816119a1015261290a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461018d5780630b96422d146101885780630c7ecd84146101425780630cdc271f146101835780631128186d1461017e578063118a53891461017957806315b76b84146101745780631626ba7e1461016f57806346d60eb2146101425780636bbefc891461016a5780636d61fe701461016557806371af817b1461016057806377102c351461015b578063852b67af14610156578063858e6ee4146101515780638a91b0e31461014c578063b139ec6314610147578063bfd151c114610142578063c4db8dd91461013d578063c776313014610138578063c8050ee414610133578063e8eb3cc61461012e578063ef4a7203146101295763f582bceb1461012457600080fd5b611a01565b6119d0565b61198b565b61194b565b61153b565b61126c565b61040e565b611209565b611089565b611020565b610f53565b610f24565b610d00565b610bb0565b610aad565b610936565b6107f3565b6106a9565b61054e565b6104c1565b610262565b346101fd5760203660031901126101fd5760043563ffffffff60e01b81168091036101fd576020906372d61afb60e01b81149081156101d2575b506040519015158152f35b63043140ed60e01b8114915081156101ec575b50386101c7565b6301ffc9a760e01b149050386101e5565b600080fd5b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460051b0101116101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460061b0101116101fd57565b346101fd5760603660031901126101fd576001600160401b036004358181116101fd57610293903690600401610202565b916024359081116101fd576102ac903690600401610232565b926102b633613632565b6103a3576102d1926102c9913691611a59565b923691611ab7565b81519181519182840180851161039e576102ed90949294612b25565b9360009283915b818310610354575050506000915b8383106103175761031560443586612b80565b005b61034c60019161034761033361032d8787611d8f565b51613137565b61033d838a611d8f565b9061ffff19169052565b6122c5565b920191610302565b91939091906001906103959061034761038b6001600160a01b036103788a88611d8f565b511660101b62010000600160b01b031690565b61033d838c611d8f565b940191906102f4565b61206f565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b03821682036101fd57565b600435906001600160a01b03821682036101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd57602083818601950101116101fd57565b346101fd5760803660031901126101fd5760043560ff811681036101fd576024356001600160a01b038116036101fd576064356001600160401b0381116101fd5761045d9036906004016103e1565b5050611b2a565b634e487b7160e01b600052602160045260246000fd5b9060028210156104875752565b610464565b91926104aa608094979695929760a08501988552602085019061047a565b6001600160a01b0316604083015260608201520152565b346101fd5760403660031901126101fd5760043561ffff1981168091036101fd57610513906104ee6103b5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361054a93600881901c6001600160a01b03169160ff909116908661048c565b0390f35b346101fd5760403660031901126101fd5760043560ff811681036101fd576024356001600160401b0381116101fd5761045d9036906004016103e1565b60005b83811061059e5750506000910152565b818101518382015260200161058e565b906020916105c78151809281855285808601910161058b565b601f01601f1916010190565b906020908183526105ef815160808486015260a08501906105ae565b9180820151916060610626610613601f1996604096888a83030160408b01526105ae565b60408401518789830301848a01526105ae565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061066057505050505050505090565b909192939495969786806106978387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ae565b9a01950195019396959492919061064e565b346101fd5760003660031901126101fd576106c2611b59565b5061054a6106ce611b59565b6106d6611bb0565b81526106e0611bf3565b60208201526106ed611c14565b60408201526107a26106fd611c4d565b6060830190815261073961070f611cae565b6107176108aa565b63852b67af60e01b815290602082015282519061073382611cea565b52611cea565b5061076f610745611da3565b61074d6108aa565b6371af817b60e01b815290602082015282519061076982611cfc565b52611cfc565b50610778611ddc565b906107816108aa565b630b96422d60e01b8152916020830152519061079c82611d0c565b52611d0c565b50604051918291826105d3565b906003196060818401126101fd5760043560ff811681036101fd5792602435916001600160401b0383116101fd5782610120920301126101fd576004019060443590565b346101fd5761045d366107af565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761083257604052565b610801565b606081019081106001600160401b0382111761083257604052565b60a081019081106001600160401b0382111761083257604052565b61012081019081106001600160401b0382111761083257604052565b90601f801991011681019081106001600160401b0382111761083257604052565b604051906108b782610817565b565b604051906108b782610837565b6001600160401b03811161083257601f01601f191660200190565b9291926108ed826108c6565b916108fb6040519384610889565b8294818452818301116101fd578281602093846000960137010152565b9080601f830112156101fd57816020610933933591016108e1565b90565b346101fd5760403660031901126101fd576024356001600160401b0381116101fd5761096961097d913690600401610918565b61097560043533611ed0565b3390806122d4565b50156109a1576020630b135d3f60e11b5b6040516001600160e01b03199091168152f35b60206001600160e01b031961098e565b90815180825260208080930193019160005b8281106109d1575050505090565b835161ffff1916855293810193928101926001016109c3565b6080809180518452610a046020820151602086019061047a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610a48575050505090565b909192938260a082610a5d60019489516109ea565b01950193929101610a3a565b91610a95604091610a8760809497969760a0875260a08701906109b1565b908582036020870152610a28565b94805182850152602081015160608501520151910152565b346101fd576020806003193601126101fd57610ac76103cb565b610acf611e05565b50610ae1610adc82612ce5565b612d94565b90610aec8251612dd6565b9260005b8351811015610b545760019061ffff19610b0a8287611d8f565b5116600090815282845260408082206001600160a01b03871683526020529020610b38906120fd565b6120fd565b610b428288611d8f565b52610b4d8187611d8f565b5001610af0565b505060018060a01b0316600052600260205261054a610b766040600020611e24565b60405193849384610a69565b60206003198201126101fd57600435906001600160401b0382116101fd57610bac916004016103e1565b9091565b346101fd57610bbe36610b82565b610bc733613632565b15610c6b5781019060a0818303126101fd576001600160401b0381358181116101fd57820183601f820112156101fd5783816020610c0793359101611a59565b9260208301358281116101fd5781610c20918501611e9a565b9360408401358381116101fd5782610c39918601611eb5565b60608501359384116101fd5761031595610c5a610c60946080968801611e9a565b92612e26565b919092013591612fff565b60405162dc149f60e41b8152600490fd5b60a06003198201126101fd576001600160401b03906004358281116101fd5781610ca891600401610202565b939093926024358181116101fd5783610cc391600401610202565b939093926044358381116101fd5782610cde91600401610232565b939093926064359182116101fd57610cf891600401610202565b909160843590565b346101fd57610d0e36610c7c565b97969094959293610d1e33613632565b6103a357610d43610c5a94610d3b610d539a610d4b953691611a59565b983691611e4c565b943691611ab7565b933691611e4c565b819291519181518303610f12576000808415159283610de4575b3360009081526002602052604090209495509293610da79390610d9f9093610d9a600286019485546120dd565b612b73565b809255613677565b610dad57005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610ddf6040519283923384612fc9565b0390a1005b60005b868110610df45750610d6d565b91610e3e33610e27610e12610e09878d611d8f565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610e498488611d8f565b51518115610edb57878a82841015610e97579260019492610d9a610e8993610e818a610e7b610e0982610e8f9b611d8f565b92611d8f565b515190613991565b906120dd565b925b01610de7565b8284939497959711610eb0575b50505050600190610e91565b92849792610d9a610e8993610e8188610e7b610e0960019b610ed19b611d8f565b939038878a610ea4565b610f0e610eeb610e09878d611d8f565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b346101fd5760403660031901126101fd576020610f4b610f426103cb565b60243590611ed0565b604051908152f35b346101fd57610f6136610c7c565b97969094959293610f7133613632565b6103a357610d43610c5a94610d3b610f8e9a610d4b953691611a59565b90336000526002602052604060002092610faa845484846138ca565b60028692960192835491820180921161039e57825496870180971161039e5781610ff8947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613677565b610ddf6040519283923384612fc9565b901515815260c0810192916108b791602001906109ea565b346101fd5760603660031901126101fd576110396103cb565b60403660231901126101fd576110799061107360405161105881610817565b6024358152604435602082015261106d61201a565b50613137565b906131a0565b9061054a60405192839283611008565b346101fd5761109736610b82565b50506110a5610adc33612ce5565b6000903382526002602052600180604084200154906110e3336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6111c3575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6111bd887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b6111816111456108b9565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b61118a8161322b565b9061119b6040519283923384612045565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156111e4575b87908352608085208861fffe198254169155916110ed565b9081161580611200575b156111fa5782906111cc565b806110f2565b508015156111ee565b346101fd5760803660031901126101fd576044356001600160a01b03811681036101fd576064356001600160401b0381116101fd5760409161125261125e923690600401610918565b906024356004356122d4565b825191151582526020820152f35b346101fd576020610f4b61127f366107af565b916127e4565b90815180825260208080930193019160005b8281106112a5575050505090565b83516001600160e01b03191685529381019392810192600101611297565b908082519081815260208091019281808460051b8301019501936000915b8483106112f15750505050505090565b9091929394958480611335600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611285565b98019301930191949392906112e1565b80516005811015610487576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061138b575050505090565b909192938260806001926113b383895163ffffffff60e01b8151168452015184830190611345565b0195019392910161137d565b90815180825260208080930193019160005b8281106113df575050505090565b909192938260e06001926114186040895163ffffffff851b815116845261140c8682015187860190611345565b01516080830190611345565b019501939291016113d1565b906109339160208152815190611448610180928360208401526101a0830190611285565b916114c261149661148261146e602088015196601f199788888303016040890152611285565b604088015187878303016060880152611285565b606087015186868303016080870152611285565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526112c3565b61152b6115146114fd6114e660e089015194610100958989830301878a015261136b565b93880151936101209488888303018689015261136b565b92870151926101409387878303018588015261136b565b91860151916101609286868303018487015261136b565b94015192828503019101526113bf565b346101fd576000806003193601126119485761054a906115596129ca565b5061193b6115656129ca565b916115f06115e4611574612a36565b6115936115876040880192808452611cea565b63852b67af60e01b9052565b6115ac6115a08251611cfc565b630b96422d60e01b9052565b6115c56115b98251611d0c565b6371af817b60e01b9052565b6115de6115d28251611d1c565b630b135d3f60e11b9052565b51611d2c565b6377102c3560e01b9052565b6115f86108b9565b600181529061176e6020928284820152826040820152611616612a61565b60e087019081526116436116286108aa565b63852b67af60e01b8152838782015282519061073382611cea565b5061166a61164f6108aa565b630b96422d60e01b8152838782015282519061076982611cfc565b506116916116766108aa565b6371af817b60e01b8152838782015282519061079c82611d0c565b506116be61169d6108aa565b635b0e93fb60e11b815283878201528251906116b882611d1c565b52611d1c565b506116eb6116ca6108aa565b631a7e6adf60e11b815283878201528251906116e582611d2c565b52611d2c565b506117186116f76108aa565b633e15cc3d60e21b8152838782015282519061171282611d3c565b52611d3c565b506117456117246108aa565b63c1a221f360e01b8152838782015282519061173f82611d4c565b52611d4c565b5061174e6108aa565b63278f794360e11b81529185830152519061176882611d5c565b52611d5c565b506117776108b9565b6003815290808383015280604083015261178f6108b9565b6001815290808483015260408201526117fc6117a9612ac3565b9261010087019384526117d86117bd6108aa565b630b135d3f60e11b8152828782015285519061073382611cea565b506117e16108aa565b6377102c3560e01b8152908582015283519061076982611cfc565b506118236118086108aa565b63852b67af60e01b8152828582015283519061079c82611d0c565b5061184a61182f6108aa565b630b96422d60e01b815282858201528351906116b882611d1c565b506118716118566108aa565b6371af817b60e01b815282858201528351906116e582611d2c565b5061189861187d6108aa565b635b0e93fb60e11b8152828582015283519061171282611d3c565b506118bf6118a46108aa565b631a7e6adf60e11b8152828582015283519061173f82611d4c565b506118e66118cb6108aa565b633e15cc3d60e21b8152828582015283519061176882611d5c565b506119136118f26108aa565b63c1a221f360e01b8152828582015283519061190d82611d6d565b52611d6d565b5061191c6108aa565b63278f794360e11b815292830152519061193582611d7e565b52611d7e565b5060405191829182611424565b80fd5b346101fd5760403660031901126101fd57602061197e60405161196d81610817565b600435815260243583820152613137565b6040519061ffff19168152f35b346101fd5760003660031901126101fd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101fd5760203660031901126101fd57602062010000600160b01b036119f56103cb565b60101b16604051908152f35b346101fd5760403660031901126101fd57611079611a1d6103cb565b611a256103b5565b611a2d61201a565b5060101b62010000600160b01b0316906131a0565b6001600160401b0381116108325760051b60200190565b9291611a6482611a42565b91611a726040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611a985750505050565b81356001600160a01b03811681036101fd578152908301908301611a8b565b929192611ac382611a42565b604092611ad36040519283610889565b819581835260208093019160061b8401938185116101fd57915b848310611afc57505050505050565b85838303126101fd578386918251611b1381610817565b853581528286013583820152815201920191611aed565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761083257604052606080838181528160208201528160408201520152565b60405190602082018281106001600160401b038211176108325760405260008252565b60405190611bbd82610837565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611c0082610817565b60058252640312e302e360dc1b6020830152565b60405190611c2182610817565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108325760405260038352829160009160005b606080821015611ca557825160209291611c9282610817565b8682528382015287820183015201611c79565b50505091925050565b60405190611cbb82610817565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611cf75760200190565b611cd4565b805160011015611cf75760400190565b805160021015611cf75760600190565b805160031015611cf75760800190565b805160041015611cf75760a00190565b805160051015611cf75760c00190565b805160061015611cf75760e00190565b805160071015611cf7576101000190565b805160081015611cf7576101200190565b805160091015611cf7576101400190565b8051821015611cf75760209160051b010190565b60405190611db082610817565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611de982610817565b600d82526c52656d6f7665204f776e65727360981b6020830152565b60405190611e1282610837565b60006040838281528260208201520152565b90604051611e3181610837565b60406002829480548452600181015460208501520154910152565b9291611e5782611a42565b91611e656040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611e8b5750505050565b81358152908301908301611e7e565b9080601f830112156101fd5781602061093393359101611e4c565b9080601f830112156101fd5781602061093393359101611ab7565b61093391611fed611ff9611f9b611f3094611ee9611bb0565b611ef1611bf3565b6040519788916020998a9182611f10818401978881519384920161058b565b8201611f248251809386808501910161058b565b01038084520182610889565b519020604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647289820190815260208101939093524691830191909152306060808401919091529290921b6bffffffffffffffffffffffff191660808201529091829060a0830190565b0391611faf601f1993848101835282610889565b51902094604051938491820195869190602060408401937f7dc7da30a002512936154da01baa79a3d1e54e35034ffdfa7c53c28b3091236d81520152565b03908101835282610889565b519020906042916040519161190160f01b8352600283015260228201522090565b6040519061202782610852565b60006080838281528260208201528260408201528260608201520152565b93929161206a9060409260018060a01b031686526060602087015260608601906109b1565b930152565b634e487b7160e01b600052601160045260246000fd5b9060418202918083046041149015171561039e57565b600281901b91906001600160fe1b0381160361039e57565b906041820180921161039e57565b906015820180921161039e57565b906002820180921161039e57565b9190820180921161039e57565b60ff601f199116019060ff821161039e57565b9060405161210a81610852565b80928054825260018101549060ff821690600282101561048757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061215e82610837565b6000604083815161216e81610852565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926121a3816108c6565b916121b16040519384610889565b8294828452828201116101fd5760206108b793019061058b565b9080601f830112156101fd57815161093392602001612196565b519081151582036101fd57565b60209081818403126101fd5780516001600160401b03918282116101fd57016060818503126101fd5760409283519461222a86610837565b82518481116101fd5783019360a0858303126101fd5785519161224c83610852565b85518281116101fd57860181601f820112156101fd5781818661227193519101612196565b8352838601519182116101fd57856122916080926122ad948a99016121cb565b85850152868101518785015260608101516060850152016121e5565b60808201528552808201519085015201519082015290565b600019811461039e5760010190565b939291909160009460418251106126d7576001600160a01b0383166000908152600260205260409020600101549384156127a05760009384928391828483146127945792979460ff60015b16976001995b878110612359575050505050505050508061233f57509190565b604051631007539160e31b81526004810191909152602490fd5b61236a61236584612085565b6120b3565b821515908161278a575b811561277f575b5061275e576123a0838a90604102016020810151906060604082015191015160001a92565b91979088602060ff82161061275457508d6123bb899a6120ea565b9d600019019d5b60ff8116806125d1575050506001600160a01b03811681116125bf578d9862010000600160b01b038260101b169960018060a01b0383168b61243360016124228d610e27838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b16036125a6575b508c518411801561259c575b61258a5761245c6020808f8701015101856120dd565b8d5110612578578e938d8782108015612570575b612566575b61249893612494939290910160200191906001600160a01b03166135b7565b1590565b61254b575b61ffff19808916911681119081159161250a575b506124f1575b506124e36124ea916124dc86610e278a61ffff19166000526001602052604060002090565b54906120dd565b95926122c5565b9194612325565b6124fc575b8a6124b7565b919b50600099508b916124f6565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff199190911660608201526080902054159050386124b1565b90612558575b8b9061249d565b9a509b50819b60009a612551565b9096508690612475565b508715612470565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b5060418410612446565b6125b1575b8e61243a565b9d509e50849e60009d6125ab565b60405163e6c4247b60e01b8152600490fd5b6002036126f357505061ffff199060101b1697612604610b3388610e278c61ffff19166000526001602052604060002090565b6080606082015191015191612617612151565b508d51851180156126e9575b61258a578d61263a602080888401015101876120dd565b9051106126d7578f948e88821080156126cf575b6126c5575b6126b49492826126a361268184602061249499976126959701015160409485809282850101019201016121f2565b928251948591602083019190602083019252565b03601f198101855284610889565b815190602083015192015192613392565b1561249d5790612558578b9061249d565b9097508790612653565b50881561264e565b60405163d245329360e01b8152600490fd5b5060418510612623565b612701939a949291946132b2565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b0390811692909161274291612422908b90610e27565b161461249d5790612558578b9061249d565b98508d8a996123c2565b505099979650505050505050600014612778575060009190565b6000925090565b90508951103861237b565b8381119150612374565b92979460ff600061231f565b60405163d349279d60e01b8152600490fd5b903590601e19813603018212156101fd57018035906001600160401b0382116101fd576020019181360383136101fd57565b9192909260ff83161561281e576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6128539192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612862828501856127b2565b908184519182372061297e61287a60608701876127b2565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470848201528381526128f48161086d565b5190208451602081019182526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016604082015246606082015261294c81608081015b03601f198101835282610889565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b928383146129ba575061299b856129a2926129aa969701906127b2565b36916108e1565b9133916122d4565b50156129b557600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108325760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610832576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b038211176108325760405260088352600083815b6101008110612a9a5750505050565b6020908451612aa881610817565b84815282612ab4611e05565b81830152828501015201612a8b565b6040906040519161016083018381106001600160401b0382111761083257604052600a8352600083815b6101408110612afc5750505050565b6020908451612b0a81610817565b84815282612b16611e05565b81830152828501015201612aed565b90612b2f82611a42565b612b3c6040519182610889565b8281528092612b4d601f1991611a42565b0190602036910137565b9060008051602061491583398151915291820391821161039e57565b9190820391821161039e57565b91908251918215612cd357336000526002602052604090604060002080549480861115612cc157600094855b8851871015612c6657612bdc612494612bd661ffff19612bcc8b8e611d8f565b511661ffff191690565b33613cef565b612c3357612bfb6001916124dc8b610e27610e12610e098d3394611d8f565b96612c2c612c148b610e27610e12610e09863394611d8f565b60036000918281558260018201558260028201550155565b0195612bac565b610f0e86612c44610e098a8d611d8f565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612cac93979450610d9f867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612ca56002870195865492612b73565b8655612b73565b612cbc6040519283923384612045565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612d8b575b15612d705761fffe1985169101600581901b870184018290529360021615612d68576060850152608084205492612d29565b508592612d29565b95935050945050608091506001830160051b01016040528252565b50841515612d36565b908151612da081612b25565b9060005b818110612db2575090925050565b60019061ffff19612dc38288611d8f565b5116612dcf8286611d8f565b5201612da4565b90612de082611a42565b612ded6040519182610889565b8281528092612dfe601f1991611a42565b019060005b828110612e0f57505050565b602090612e1a61201a565b82828501015201612e03565b929093919383519480519282518714801590612fbe575b610f1257612e4e84889794986120dd565b96612e61612e5b89612b25565b98612dd6565b9660009485925b898b848610612f16575050505050506000925b848410612e89575050505050565b612f0e600191612ea9612e9f61032d8888611d8f565b61033d838d611d8f565b612eb38685611d8f565b51612ebe828b611d8f565b51526020600081612ecf848d611d8f565b510152612edc8787611d8f565b51516060612eea848d611d8f565b510152612ef78787611d8f565b5101516080612f06838c611d8f565b5101526122c5565b930192612e7b565b97610347612fb4926040612fa384612f9d612f4b8c9f9c612f698c9d9e61033d8660019e9f612f58612f4b87610e7b93611d8f565b516001600160a01b031690565b60101b62010000600160b01b031690565b612f73818d611d8f565b51612f7e8589611d8f565b5152612f976020612f8f868a611d8f565b510160019052565b8c611d8f565b93611d8f565b516001600160a01b03909216910152565b9601929190612e68565b508051841415612e3d565b6001600160a01b039091168152606060208201819052610933939192612ff1918401906109b1565b916040818403910152610a28565b919283156127a057600093845b83518610156130355761301f8685611d8f565b5151810180911161039e5760019095019461300c565b90939194508381106131005782826130ce7f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1793613097612cbc977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613788565b50508251906130a46108b9565b91825286602083015260408201526111663360018060a01b03166000526002602052604060002090565b6130de6040519283923384612fc9565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b906131336020928281519485920161058b565b0190565b60208151910151811580613198575b6131795760408051602081019384528082019290925281529061316a606083610889565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b508015613146565b9190916131ab61201a565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff19909416606085018190526080909420549093901561322357613217929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109336001926120fd565b505060009190565b6000919082805b82518210156132ac5761ffff19918261324b8286611d8f565b511686526001602081815260408089203360009081529083528190209294919254820180921161039e576001946132a593612c14939761328b878b611d8f565b51168b525288203360009081526020919091526040902090565b0190613232565b93505050565b9161093393916132c1936139f8565b90929192613a86565b906108b7602e60405180946c1131b430b63632b733b2911d1160991b60208301526132ff815180926020602d8601910161058b565b8101601160f91b602d82015203600e810185520183610889565b805160201015611cf75760400190565b6040513d6000823e3d90fd5b602092919061334b84928281519485920161058b565b019081520190565b3d1561337e573d90613364826108c6565b916133726040519384610889565b82523d6000602084013e565b606090565b908160209103126101fd575190565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a883116135ac57602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346133ff835160608601516133f9816120c1565b91613b13565b8981519101200361359f5761341f61342491613419613b96565b90613e7f565b6132ca565b613439825160408501516133f98451826120dd565b888151910120908881519101200361357757600160f81b8061346c61345e8551613319565b516001600160f81b03191690565b1603613577576080820151151580613583575b6135775751866040519182806134986000958694613120565b039060025afa156135725786816134dd815194516134bd604051968792868401613335565b03946134d1601f1996878101835282610889565b60405191828092613120565b039060025afa15613572578051604080518981018381526020810187905291820187905260608201889052608082018990529193839290613522908260a08501611fed565b51906101005afa95613532613353565b9081519780613569575b61354c5750506109339550613bf5565b6001976135659750820181019550019250613383915050565b1490565b5087151561353c565b613329565b50505050505050600090565b50600160fa1b8061359761345e8551613319565b16141561347f565b5050505050505050600090565b505050505050600090565b600091929082916040516135ef8161293e6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ae565b51915afa906135fc613353565b82613624575b8261360c57505090565b9091506020818051810103126101fd57602001511490565b915060208251101591613602565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080902054801590811561366f575090565b600191501690565b6001909201805490929182156136fa578281106136d9575080820361369b57505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b80935081925010613709575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b90805182556001820190602081015190600282101561048757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612cd35782825103610f12576103e883116138aa57906000915b8383106137ba575050509190565b9091946137e16124946137db6137d3610e098a87611d8f565b61ffff191690565b33613dc8565b61389a576137ef8684611d8f565b5151158015613883575b6138455761383c60019161382a6138108987611d8f565b5161382533610e27610e12610e098e8b611d8f565b61372b565b6138348886611d8f565b5151906120dd565b950191906137ac565b5084610e7b610e098261385794611d8f565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f42406138928785611d8f565b5151116137f9565b610f0e610eeb610e098885611d8f565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612cd35783835103610f12576103e86138ef85836120dd565b116139705750906000915b838310613908575050509190565b9091946139216124946137db6137d3610e098a87611d8f565b61389a5761392f8684611d8f565b5151158015613959575b6138455761395060019161382a6138108987611d8f565b950191906138fa565b50620f42406139688785611d8f565b515111613939565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b811580156139ec575b6139bf5761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f4240821161399a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613a7057926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa156135725780516001600160a01b03811615613a6757918190565b50809160019190565b50505060009160039190565b6004111561048757565b613a8f81613a7c565b80613a98575050565b613aa181613a7c565b60018103613abb5760405163f645eedf60e01b8152600490fd5b613ac481613a7c565b60028103613ae55760405163fce698f760e01b815260048101839052602490fd5b80613af1600392613a7c565b14613af95750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613b8e575b81811115613b86575b50828110613b3a57505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613b6f57908290613b57565b505060008583016020015250603f01168201604052565b905038613b2d565b925082613b24565b60405190613ba382610837565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613cd7575b8015613ccf575b8015613cb7575b613cad57613c1f8386613f27565b15613cad5760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614915833981519152948560a084015260208360c0816005600019fa156101fd57613ca79386613ca1945181818909940991613fc8565b91612b57565b90081590565b5050505050600090565b50600080516020614915833981519152821015613c11565b508115613c0a565b50600080516020614915833981519152841015613c03565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613dc0575b613db7576001600060015b15613d8b575b50606084015260808320805460009161fffe198083169190898314613d6a57505091613d3d565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613dad575b5015613da35738613d43565b5060009450505050565b9050151538613d97565b50600093505050565b508015613d32565b9061ffff1916908115613e5057604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613e4757600160809252209182549283158015613e3d575b15613e3157600193505555600190565b90600217905555600190565b5060018416613e21565b50505050600090565b5050600090565b90613e61826108c6565b613e6e6040519182610889565b8281528092612b4d601f19916108c6565b805115613f1d57613eaa613ea5613e9e613e99845161209b565b6120cf565b6003900490565b613e57565b91602083019180805101906020820192835194600085525b838310613ed157505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301613ec2565b5050610933611b8d565b600160601b63ffffffff60c01b031990818110801590613fbe575b8015613fad575b613fa5577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b5080158015613f4957508215613f49565b5081831015613f42565b60009260ff929091848315806146d4575b61357757613fe783836146dc565b90958615806146cc575b61468e575b85811c60028a60fe1c16015b1561467457600186821c1660028a831c60011b16016001811461463b575b6002811461462e575b600314614621575b60009493929419019560019860015b88600019116140ad5750505050505050505060405191606083015260208252602080830152602060408301526000805160206149358339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa156101fd5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b0319808260008051602061493583398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156146035760018c600286838f841c16921c831b1601146145cc575b838c8c6002600182841c168185851c60011b1601146145b9575b6003926001600292841c16921c60011b1601146145b0575b861561459d57600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614387575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a0960008051602061493583398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b031992839081908184800990096000805160206149358339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b60001901979693959493614040565b8661425c57919a9198919550600160601b63ffffffff60c01b0319905080808360008051602061493583398151915209600160601b63ffffffff60c01b03198460008051602061493583398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b0319908180808560008051602061493583398151915209600160601b63ffffffff60c01b0319866000805160206149358339815191520909600160601b63ffffffff60c01b03198560008051602061493583398151915209090997600160601b63ffffffff60c01b03199081808460008051602061493583398151915209600160601b63ffffffff60c01b0319856000805160206149358339815191520909099a600160601b63ffffffff60c01b0319808c60008051602061493583398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b03199283908180808360008051602061493583398151915209600160601b63ffffffff60c01b0319846000805160206149358339815191520909600160601b63ffffffff60c01b03198360008051602061493583398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614378565b60019c50909a8c99509095509050614378565b5050828461421b565b508993508a92508591508d90508c614203565b50506000805160206148f58339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f56141e9565b50949a90999097600160601b63ffffffff60c01b0319039450614378565b9150955084958091614031565b9397508793859350614029565b6000805160206148f583398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59350614020565b60001901600160028188841c16918b841c901b1601614002565b9790946000805160206149158339815191529182039008936000978515806146c4575b15613ff657505050505050505050600090565b5060016146b1565b508115613ff1565b508615613fd9565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592916000805160206148f5833981519152918115614834578083148061482b575b156148145750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe816001840892080960030981808080866000805160206149358339815191520981858009089981600181818b099a099709810393898203900890090893915b60405190602082526020808301526020604083015260608201526000805160206149358339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa156101fd57838080935180950980099009930990565b90915061482292935061483a565b919392916147ae565b5081851461471e565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b9209089509089280808080878009968709948180886000805160206148f583398151915209918180808560008051602061493583398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220d586e4fd303dfab4216400fe9fa3ed6319112d27701f24d09905e2c95485692164736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0xaa", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x12bf333", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x889be83e853ab303270bb1861cd7f276bc6b514f7719096c2550937676ba3a1a", + "transactionIndex": "0x42", + "blockHash": "0xaa2a78bd64dfcc6b9eb17a433ff181a0aca87c9fb12a46c0a54a30fd058eb126", + "blockNumber": "0x69dbf8", + "gasUsed": "0x3f0a22", + "effectiveGasPrice": "0x41c89e64", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1729794974, + "chain": 11155111, + "commit": "bf15fa9" +} \ No newline at end of file diff --git a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/11155111/run-latest.json b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/11155111/run-latest.json index 802a215..ab8c185 100644 --- a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/11155111/run-latest.json +++ b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/11155111/run-latest.json @@ -1,19 +1,21 @@ { "transactions": [ { - "hash": "0xa1630bda9207f10820a7b3ea0ffaaf4e09fee56a996a7067e326a9f0771ad48d", + "hash": "0x889be83e853ab303270bb1861cd7f276bc6b514f7719096c2550937676ba3a1a", "transactionType": "CREATE2", - "contractName": null, - "contractAddress": "0x558498e7cd325b17be8c8a79884a1cacfd72a4aa", + "contractName": "WeightedWebauthnMultisigPlugin", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", "function": null, - "arguments": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], "transaction": { - "from": "0xbcd75cbd82fc6c3e01e7b3793489ab2f879980ae", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x5e379c", + "gas": "0x570c61", "value": "0x0", - "input": "0x000000000000000000000000000000000000000000000000000000000000000060c0346200009857601f62004be838819003918201601f19168301916001600160401b038311848410176200009d578084926020946040528339810103126200009857516001600160a01b038116810362000098576080523060601b6001600160601b03191660a052604051614b349081620000b48239608051818181611ba00152612aae015260a0518181816110c701526120e80152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146101ad5780630b96422d146101a85780630c7ecd84146101585780630cdc271f146101a35780631128186d1461019e578063118a53891461019957806315b76b84146101945780631626ba7e1461018f578063197ea35b1461018a57806346d60eb2146101585780636bbefc89146101855780636d61fe701461018057806371af817b1461017b57806384b0196e14610176578063852b67af14610171578063858e6ee41461016c5780638616d61d146101675780638a91b0e314610162578063b139ec631461015d578063bfd151c114610158578063c4db8dd914610153578063c77631301461014e578063c8050ee414610149578063e8eb3cc614610144578063ef4a72031461013f5763f582bceb1461013a57600080fd5b611c00565b611bcf565b611b8a565b611b4a565b61173a565b611463565b61042e565b611400565b611280565b61125f565b6111f6565b611129565b611052565b610e2f565b610cdf565b610be9565b610ad5565b61098c565b610813565b6106c9565b61056e565b6104e1565b610282565b3461021d57602036600319011261021d5760043563ffffffff60e01b811680910361021d576020906372d61afb60e01b81149081156101f2575b506040519015158152f35b63043140ed60e01b81149150811561020c575b50386101e7565b6301ffc9a760e01b14905038610205565b600080fd5b9181601f8401121561021d578235916001600160401b03831161021d576020808501948460051b01011161021d57565b9181601f8401121561021d578235916001600160401b03831161021d576020808501948460061b01011161021d57565b3461021d57606036600319011261021d576001600160401b0360043581811161021d576102b3903690600401610222565b9160243590811161021d576102cc903690600401610252565b926102d6336137dc565b6103c3576102f1926102e9913691611c58565b923691611cb6565b8151918151918284018085116103be5761030d90949294612ce3565b9360009283915b818310610374575050506000915b8383106103375761033560443586612d3e565b005b61036c60019161036761035361034d8787611f7e565b516132e6565b61035d838a611f7e565b9061ffff19169052565b612469565b920191610322565b91939091906001906103b5906103676103ab6001600160a01b036103988a88611f7e565b511660101b62010000600160b01b031690565b61035d838c611f7e565b94019190610314565b612213565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b038216820361021d57565b600435906001600160a01b038216820361021d57565b9181601f8401121561021d578235916001600160401b03831161021d576020838186019501011161021d57565b3461021d57608036600319011261021d5760043560ff8116810361021d576024356001600160a01b0381160361021d576064356001600160401b03811161021d5761047d903690600401610401565b5050611d29565b634e487b7160e01b600052602160045260246000fd5b9060028210156104a75752565b610484565b91926104ca608094979695929760a08501988552602085019061049a565b6001600160a01b0316604083015260608201520152565b3461021d57604036600319011261021d5760043561ffff19811680910361021d576105339061050e6103d5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361056a93600881901c6001600160a01b03169160ff90911690866104ac565b0390f35b3461021d57604036600319011261021d5760043560ff8116810361021d576024356001600160401b03811161021d5761047d903690600401610401565b60005b8381106105be5750506000910152565b81810151838201526020016105ae565b906020916105e7815180928185528580860191016105ab565b601f01601f1916010190565b9060209081835261060f815160808486015260a08501906105ce565b9180820151916060610646610633601f1996604096888a83030160408b01526105ce565b60408401518789830301848a01526105ce565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061068057505050505050505090565b909192939495969786806106b78387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ce565b9a01950195019396959492919061066e565b3461021d57600036600319011261021d576106e2611d58565b5061056a6106ee611d58565b6106f6611d9f565b8152610700611de2565b602082015261070d611e03565b60408201526107c261071d611e3c565b6060830190815261075961072f611e9d565b610737610900565b63852b67af60e01b815290602082015282519061075382611ed9565b52611ed9565b5061078f610765611f92565b61076d610900565b6371af817b60e01b815290602082015282519061078982611eeb565b52611eeb565b50610798611fcb565b906107a1610900565b630b96422d60e01b815291602083015251906107bc82611efb565b52611efb565b50604051918291826105f3565b9060031960608184011261021d5760043560ff8116810361021d5792602435916001600160401b03831161021d57826101209203011261021d576004019060443590565b3461021d5761047d366107cf565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761085257604052565b610821565b60a081019081106001600160401b0382111761085257604052565b606081019081106001600160401b0382111761085257604052565b602081019081106001600160401b0382111761085257604052565b60e081019081106001600160401b0382111761085257604052565b61012081019081106001600160401b0382111761085257604052565b90601f801991011681019081106001600160401b0382111761085257604052565b6040519061090d82610837565b565b6040519061090d82610872565b6001600160401b03811161085257601f01601f191660200190565b9291926109438261091c565b9161095160405193846108df565b82948184528183011161021d578281602093846000960137010152565b9080601f8301121561021d5781602061098993359101610937565b90565b3461021d57604036600319011261021d576024356001600160401b03811161021d576109bf610a0491369060040161096e565b60206040516109e9816109db6004358583019190602083019252565b03601f1981018352826108df565b60405180948192638616d61d60e01b83523360048401612003565b0381305afa8015610a9157610a2492600091610a62575b50339080612478565b5015610a515761056a630b135d3f60e11b5b6040516001600160e01b031990911681529081906020820190565b61056a6001600160e01b0319610a36565b610a84915060203d602011610a8a575b610a7c81836108df565b810190611ff4565b38610a1b565b503d610a72565b612025565b90604060031983011261021d576004356001600160a01b038116810361021d5791602435906001600160401b03821161021d576109899160040161096e565b3461021d5761056a610aef610ae936610a96565b90612031565b6040519182916020835260208301906105ce565b90815180825260208080930193019160005b828110610b23575050505090565b835161ffff191685529381019392810192600101610b15565b6080809180518452610b566020820151602086019061049a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610b9a575050505090565b909192938260a082610baf6001948951610b3c565b01950193929101610b8c565b939291610be490610bd6604093606088526060880190610b03565b908682036020880152610b7a565b930152565b3461021d5760208060031936011261021d57610c036103eb565b610c14610c0f82612eab565b612f5a565b90610c1f8251612f9c565b9260005b8351811015610c875760019061ffff19610c3d8287611f7e565b5116600090815282845260408082206001600160a01b03871683526020529020610c6b906122a1565b6122a1565b610c758288611f7e565b52610c808187611f7e565b5001610c23565b505060018060a01b0316600052600260205261056a60016040600020015460405193849384610bbb565b602060031982011261021d57600435906001600160401b03821161021d57610cdb91600401610401565b9091565b3461021d57610ced36610cb1565b610cf6336137dc565b15610d9a5781019060a08183031261021d576001600160401b03813581811161021d57820183601f8201121561021d5783816020610d3693359101611c58565b92602083013582811161021d5781610d4f91850161218d565b93604084013583811161021d5782610d689186016121a8565b606085013593841161021d5761033595610d89610d8f94608096880161218d565b92612fec565b9190920135916131c5565b60405162dc149f60e41b8152600490fd5b60a060031982011261021d576001600160401b039060043582811161021d5781610dd791600401610222565b9390939260243581811161021d5783610df291600401610222565b9390939260443583811161021d5782610e0d91600401610252565b9390939260643591821161021d57610e2791600401610222565b909160843590565b3461021d57610e3d36610dab565b97969094959293610e4d336137dc565b6103c357610e72610d8994610e6a610e829a610e7a953691611c58565b98369161213f565b943691611cb6565b93369161213f565b9091825190825182036110405760009060008315159384610f0f575b50336000908152600260205260409020610ed2939291610ecc91610ec790946002860154612281565b612d31565b90613821565b610ed857005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610f0a604051928392338461318f565b0390a1005b6000905b808210610f205750610e9e565b9093610f6b33610f54610f3f610f36898d611f7e565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610f768689611f7e565b5151811561100957888a82841015610fc5579260019492610ec7610fb693610fae8c610fa8610f3682610fbc9b611f7e565b92611f7e565b515190613b3b565b90612281565b945b0190610f13565b8284939499959911610fde575b50505050600190610fbe565b92849692610ec7610fb693610fae88610fa8610f3660019b610fff9b611f7e565b929038888a610fd2565b61103c611019610f36898d611f7e565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b3461021d57600036600319011261021d576110ab61106e611d9f565b611076611de2565b604051906110838261088d565b600082526110b9602091604051958695601f60f81b875260e0602088015260e08701906105ce565b9085820360408701526105ce565b4660608501523360808501527f000000000000000000000000000000000000000000000000000000000000000060a085015283810360c08501526020808451928381520193019160005b82811061111257505050500390f35b835185528695509381019392810192600101611103565b3461021d5761113736610dab565b97969094959293611147336137dc565b6103c357610e72610d8994610e6a6111649a610e7a953691611c58565b9033600052600260205260406000209261118084548484613a74565b6002869296019283549182018092116103be5782549687018097116103be57816111ce947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613821565b610f0a604051928392338461318f565b901515815260c08101929161090d9160200190610b3c565b3461021d57606036600319011261021d5761120f6103eb565b604036602319011261021d5761124f9061124960405161122e81610837565b602435815260443560208201526112436121c3565b506132e6565b9061334f565b9061056a604051928392836111de565b3461021d576020611272610ae936610a96565b818151910120604051908152f35b3461021d5761128e36610cb1565b505061129c610c0f33612eab565b6000903382526002602052600180604084200154906112da336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6113ba575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6113b4887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b61137861133c61090f565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b611381816133da565b9061139260405192839233846121ee565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156113db575b87908352608085208861fffe198254169155916112e4565b90811615806113f7575b156113f15782906113c3565b806112e9565b508015156113e5565b3461021d57608036600319011261021d576044356001600160a01b038116810361021d576064356001600160401b03811161021d5760409161144961145592369060040161096e565b90602435600435612478565b825191151582526020820152f35b3461021d57602061147c611476366107cf565b91612988565b604051908152f35b90815180825260208080930193019160005b8281106114a4575050505090565b83516001600160e01b03191685529381019392810192600101611496565b908082519081815260208091019281808460051b8301019501936000915b8483106114f05750505050505090565b9091929394958480611534600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611484565b98019301930191949392906114e0565b805160058110156104a7576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061158a575050505090565b909192938260806001926115b283895163ffffffff60e01b8151168452015184830190611544565b0195019392910161157c565b90815180825260208080930193019160005b8281106115de575050505090565b909192938260e06001926116176040895163ffffffff851b815116845261160b8682015187860190611544565b01516080830190611544565b019501939291016115d0565b906109899160208152815190611647610180928360208401526101a0830190611484565b916116c161169561168161166d602088015196601f199788888303016040890152611484565b604088015187878303016060880152611484565b606087015186868303016080870152611484565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526114c2565b61172a6117136116fc6116e560e089015194610100958989830301878a015261156a565b93880151936101209488888303018689015261156a565b92870151926101409387878303018588015261156a565b91860151916101609286868303018487015261156a565b94015192828503019101526115be565b3461021d57600080600319360112611b475761056a90611758612b64565b50611b3a611764612b64565b916117ef6117e3611773612bd0565b6117926117866040880192808452611ed9565b63852b67af60e01b9052565b6117ab61179f8251611eeb565b630b96422d60e01b9052565b6117c46117b88251611efb565b6371af817b60e01b9052565b6117dd6117d18251611f0b565b6342580cb760e11b9052565b51611f1b565b630b135d3f60e11b9052565b6117f761090f565b600181529061196d6020928284820152826040820152611815612bfb565b60e08701908152611842611827610900565b63852b67af60e01b8152838782015282519061075382611ed9565b5061186961184e610900565b630b96422d60e01b8152838782015282519061078982611eeb565b50611890611875610900565b6371af817b60e01b815283878201528251906107bc82611efb565b506118bd61189c610900565b635b0e93fb60e11b815283878201528251906118b782611f0b565b52611f0b565b506118ea6118c9610900565b631a7e6adf60e11b815283878201528251906118e482611f1b565b52611f1b565b506119176118f6610900565b633e15cc3d60e21b8152838782015282519061191182611f2b565b52611f2b565b50611944611923610900565b63c1a221f360e01b8152838782015282519061193e82611f3b565b52611f3b565b5061194d610900565b63278f794360e11b81529185830152519061196782611f4b565b52611f4b565b5061197661090f565b6003815290808383015280604083015261198e61090f565b6001815290808483015260408201526119fb6119a8612c6f565b9261010087019384526119d76119bc610900565b630b135d3f60e11b8152828782015285519061075382611ed9565b506119e0610900565b6342580cb760e11b8152908582015283519061078982611eeb565b50611a22611a07610900565b63852b67af60e01b815282858201528351906107bc82611efb565b50611a49611a2e610900565b630b96422d60e01b815282858201528351906118b782611f0b565b50611a70611a55610900565b6371af817b60e01b815282858201528351906118e482611f1b565b50611a97611a7c610900565b635b0e93fb60e11b8152828582015283519061191182611f2b565b50611abe611aa3610900565b631a7e6adf60e11b8152828582015283519061193e82611f3b565b50611ae5611aca610900565b633e15cc3d60e21b8152828582015283519061196782611f4b565b50611b12611af1610900565b63c1a221f360e01b81528285820152835190611b0c82611f5c565b52611f5c565b50611b1b610900565b63278f794360e11b8152928301525190611b3482611f6d565b52611f6d565b5060405191829182611623565b80fd5b3461021d57604036600319011261021d576020611b7d604051611b6c81610837565b6004358152602435838201526132e6565b6040519061ffff19168152f35b3461021d57600036600319011261021d576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461021d57602036600319011261021d57602062010000600160b01b03611bf46103eb565b60101b16604051908152f35b3461021d57604036600319011261021d5761124f611c1c6103eb565b611c246103d5565b611c2c6121c3565b5060101b62010000600160b01b03169061334f565b6001600160401b0381116108525760051b60200190565b9291611c6382611c41565b91611c7160405193846108df565b829481845260208094019160051b810192831161021d57905b828210611c975750505050565b81356001600160a01b038116810361021d578152908301908301611c8a565b929192611cc282611c41565b604092611cd260405192836108df565b819581835260208093019160061b84019381851161021d57915b848310611cfb57505050505050565b858383031261021d578386918251611d1281610837565b853581528286013583820152815201920191611cec565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761085257604052606080838181528160208201528160408201520152565b60405190611d998261088d565b60008252565b60405190611dac82610872565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611def82610837565b60058252640312e302e360dc1b6020830152565b60405190611e1082610837565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108525760405260038352829160009160005b606080821015611e9457825160209291611e8182610837565b8682528382015287820183015201611e68565b50505091925050565b60405190611eaa82610837565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611ee65760200190565b611ec3565b805160011015611ee65760400190565b805160021015611ee65760600190565b805160031015611ee65760800190565b805160041015611ee65760a00190565b805160051015611ee65760c00190565b805160061015611ee65760e00190565b805160071015611ee6576101000190565b805160081015611ee6576101200190565b805160091015611ee6576101400190565b8051821015611ee65760209160051b010190565b60405190611f9f82610837565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611fd882610837565b600d82526c52656d6f7665204f776e65727360981b6020830152565b9081602091031261021d575190565b6001600160a01b039091168152604060208201819052610989929101906105ce565b6040513d6000823e3d90fd5b90610989906109db8151602080930120936040948551848101917fdfaf7f6d857ee2904b406c7ecdfdb06d93e4b009b03139affd7852a5636a95a483528782015286815261207e81610872565b5190209061208a611d9f565b84815191012090612099611de2565b85815191012090875191868301937fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472855289840152606083015246608083015260018060a01b031660a08201527f000000000000000000000000000000000000000000000000000000000000000060c082015260c08152612119816108a8565b519020945161190160f01b93810193845260028401959095526022830152839160420190565b929161214a82611c41565b9161215860405193846108df565b829481845260208094019160051b810192831161021d57905b82821061217e5750505050565b81358152908301908301612171565b9080601f8301121561021d578160206109899335910161213f565b9080601f8301121561021d5781602061098993359101611cb6565b604051906121d082610857565b60006080838281528260208201528260408201528260608201520152565b939291610be49060409260018060a01b03168652606060208701526060860190610b03565b634e487b7160e01b600052601160045260246000fd5b906041820291808304604114901517156103be57565b600281901b91906001600160fe1b038116036103be57565b90604182018092116103be57565b90601582018092116103be57565b90600282018092116103be57565b919082018092116103be57565b60ff601f199116019060ff82116103be57565b906040516122ae81610857565b80928054825260018101549060ff82169060028210156104a757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061230282610872565b6000604083815161231281610857565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926123478161091c565b9161235560405193846108df565b82948284528282011161021d57602061090d9301906105ab565b9080601f8301121561021d5781516109899260200161233a565b5190811515820361021d57565b602090818184031261021d5780516001600160401b039182821161021d570160608185031261021d576040928351946123ce86610872565b825184811161021d5783019360a08583031261021d578551916123f083610857565b855182811161021d57860181601f8201121561021d578181866124159351910161233a565b83528386015191821161021d5785612435608092612451948a990161236f565b8585015286810151878501526060810151606085015201612389565b60808201528552808201519085015201519082015290565b60001981146103be5760010190565b9392919091600094604182511061287b576001600160a01b0383166000908152600260205260409020600101549384156129445760009384928391828483146129385792979460ff60015b16976001995b8781106124fd57505050505050505050806124e357509190565b604051631007539160e31b81526004810191909152602490fd5b61250e61250984612229565b612257565b821515908161292e575b8115612923575b5061290257612544838a90604102016020810151906060604082015191015160001a92565b91979088602060ff8216106128f857508d61255f899a61228e565b9d600019019d5b60ff811680612775575050506001600160a01b0381168111612763578d9862010000600160b01b038260101b169960018060a01b0383168b6125d760016125c68d610f54838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b160361274a575b508c5184118015612740575b61272e576126006020808f870101510185612281565b8d511061271c578e938d8782108015612714575b61270a575b61263c93612638939290910160200191906001600160a01b0316613764565b1590565b6126ef575b61ffff1980891691168111908115916126ae575b50612695575b5061268761268e9161268086610f548a61ffff19166000526001602052604060002090565b5490612281565b9592612469565b91946124c9565b6126a0575b8a61265b565b919b50600099508b9161269a565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff19919091166060820152608090205415905038612655565b906126fc575b8b90612641565b9a509b50819b60009a6126f5565b9096508690612619565b508715612614565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b50604184106125ea565b612755575b8e6125de565b9d509e50849e60009d61274f565b60405163e6c4247b60e01b8152600490fd5b60020361289757505061ffff199060101b16976127a8610c6688610f548c61ffff19166000526001602052604060002090565b60806060820151910151916127bb6122f5565b508d518511801561288d575b61272e578d6127de60208088840101510187612281565b90511061287b578f948e8882108015612873575b612869575b6128589492826128476128258460206126389997612839970101516040948580928285010101920101612396565b928251948591602083019190602083019252565b03601f1981018552846108df565b81519060208301519201519261353d565b1561264157906126fc578b90612641565b90975087906127f7565b5088156127f2565b60405163d245329360e01b8152600490fd5b50604185106127c7565b6128a5939a94929194613461565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b039081169290916128e6916125c6908b90610f54565b161461264157906126fc578b90612641565b98508d8a99612566565b50509997965050505050505060001461291c575060009190565b6000925090565b90508951103861251f565b8381119150612518565b92979460ff60006124c3565b60405163d349279d60e01b8152600490fd5b903590601e198136030182121561021d57018035906001600160401b03821161021d5760200191813603831361021d57565b9192909260ff8316156129c2576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6129f79192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612a0682850185612956565b9081845191823720612b18612a1e6060870187612956565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47084820152838152612a98816108c3565b5190208451602081019182526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166040820152466060820152612ae681608081016109db565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b92838314612b545750612b3585612b3c92612b4496970190612956565b3691610937565b913391612478565b5015612b4f57600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108525760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610852576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b0382111761085257604052600883528260005b6101008110612c3257505050565b6020908351612c4081610837565b60008152828551612c5081610872565b6000815260008282015260008782015281830152828501015201612c24565b6040906040519161016083018381106001600160401b0382111761085257604052600a83528260005b6101408110612ca657505050565b6020908351612cb481610837565b60008152828551612cc481610872565b6000815260008282015260008782015281830152828501015201612c98565b90612ced82611c41565b612cfa60405191826108df565b8281528092612d0b601f1991611c41565b0190602036910137565b90600080516020614abf8339815191529182039182116103be57565b919082039182116103be57565b91908251918215612e9957336000526002602052604090604060002080549480861115612e8757600094855b8851871015612e2457612d9a612638612d9461ffff19612d8a8b8e611f7e565b511661ffff191690565b33613e99565b612df157612db96001916126808b610f54610f3f610f368d3394611f7e565b96612dea612dd28b610f54610f3f610f36863394611f7e565b60036000918281558260018201558260028201550155565b0195612d6a565b61103c86612e02610f368a8d611f7e565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612e7293979450612e6a867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612e636002870195865492612d31565b8655612d31565b809255613821565b612e8260405192839233846121ee565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612f51575b15612f365761fffe1985169101600581901b870184018290529360021615612f2e576060850152608084205492612eef565b508592612eef565b95935050945050608091506001830160051b01016040528252565b50841515612efc565b908151612f6681612ce3565b9060005b818110612f78575090925050565b60019061ffff19612f898288611f7e565b5116612f958286611f7e565b5201612f6a565b90612fa682611c41565b612fb360405191826108df565b8281528092612fc4601f1991611c41565b019060005b828110612fd557505050565b602090612fe06121c3565b82828501015201612fc9565b929093919383519480519282518714801590613184575b611040576130148488979498612281565b9661302761302189612ce3565b98612f9c565b9660009485925b898b8486106130dc575050505050506000925b84841061304f575050505050565b6130d460019161306f61306561034d8888611f7e565b61035d838d611f7e565b6130798685611f7e565b51613084828b611f7e565b51526020600081613095848d611f7e565b5101526130a28787611f7e565b515160606130b0848d611f7e565b5101526130bd8787611f7e565b51015160806130cc838c611f7e565b510152612469565b930192613041565b9761036761317a926040613169846131636131118c9f9c61312f8c9d9e61035d8660019e9f61311e61311187610fa893611f7e565b516001600160a01b031690565b60101b62010000600160b01b031690565b613139818d611f7e565b516131448589611f7e565b515261315d6020613155868a611f7e565b510160019052565b8c611f7e565b93611f7e565b516001600160a01b03909216910152565b960192919061302e565b508051841415613003565b6001600160a01b0390911681526060602082018190526109899391926131b791840190610b03565b916040818403910152610b7a565b9192831561294457600093845b83518610156131fb576131e58685611f7e565b515181018091116103be576001909501946131d2565b90939194508381106132c65782826132947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f179361325d612e82977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613932565b505082519061326a61090f565b918252866020830152604082015261135d3360018060a01b03166000526002602052604060002090565b6132a4604051928392338461318f565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b60208151910151811580613347575b613328576040805160208101938452808201929092528152906133196060836108df565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b5080156132f5565b91909161335a6121c3565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff1990941660608501819052608090942054909390156133d2576133c6929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109896001926122a1565b505060009190565b6000919082805b825182101561345b5761ffff1991826133fa8286611f7e565b51168652600160208181526040808920336000908152908352819020929491925482018092116103be5760019461345493612dd2939761343a878b611f7e565b51168b525288203360009081526020919091526040902090565b01906133e1565b93505050565b91610989939161347093613ba2565b90929192613c30565b9061348c602092828151948592016105ab565b0190565b9061090d602e60405180946c1131b430b63632b733b2911d1160991b60208301526134c5815180926020602d860191016105ab565b8101601160f91b602d82015203600e8101855201836108df565b805160201015611ee65760400190565b60209291906135058492828151948592016105ab565b019081520190565b3d15613538573d9061351e8261091c565b9161352c60405193846108df565b82523d6000602084013e565b606090565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8831161375957602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346135aa835160608601516135a481612265565b91613cbd565b8981519101200361374c576135ca6135cf916135c4613d40565b90614029565b613490565b6135e4825160408501516135a4845182612281565b888151910120908881519101200361372457600160f81b8061361761360985516134df565b516001600160f81b03191690565b1603613724576080820151151580613730575b6137245751866040519182806136436000958694613479565b039060025afa15610a91578681613688815194516136686040519687928684016134ef565b039461367c601f19968781018352826108df565b60405191828092613479565b039060025afa15610a915780516040805189810183815260208101879052918201879052606082018890526080820189905291938392906136d4908260a08501039081018352826108df565b51906101005afa956136e461350d565b908151978061371b575b6136fe5750506109899550613d9f565b6001976137179750820181019550019250611ff4915050565b1490565b508715156136ee565b50505050505050600090565b50600160fa1b8061374461360985516134df565b16141561362a565b5050505050505050600090565b505050505050600090565b6000919290829160405161379c816109db6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ce565b51915afa906137a961350d565b826137ce575b826137b957505090565b61371791925060208082518301019101611ff4565b9150602082511015916137af565b604080516001600160a01b039092168252637c9c64bb60e11b60208301526000908201526001606082015260809020548015908115613819575090565b600191501690565b6001909201805490929182156138a457828110613883575080820361384557505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b809350819250106138b3575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b9080518255600182019060208101519060028210156104a757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612e995782825103611040576103e88311613a5457906000915b838310613964575050509190565b90919461398b61263861398561397d610f368a87611f7e565b61ffff191690565b33613f72565b613a44576139998684611f7e565b5151158015613a2d575b6139ef576139e66001916139d46139ba8987611f7e565b516139cf33610f54610f3f610f368e8b611f7e565b6138d5565b6139de8886611f7e565b515190612281565b95019190613956565b5084610fa8610f3682613a0194611f7e565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f4240613a3c8785611f7e565b5151116139a3565b61103c611019610f368885611f7e565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612e995783835103611040576103e8613a998583612281565b11613b1a5750906000915b838310613ab2575050509190565b909194613acb61263861398561397d610f368a87611f7e565b613a4457613ad98684611f7e565b5151158015613b03575b6139ef57613afa6001916139d46139ba8987611f7e565b95019190613aa4565b50620f4240613b128785611f7e565b515111613ae3565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b81158015613b96575b613b695761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f42408211613b44565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613c1a57926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa15610a915780516001600160a01b03811615613c1157918190565b50809160019190565b50505060009160039190565b600411156104a757565b613c3981613c26565b80613c42575050565b613c4b81613c26565b60018103613c655760405163f645eedf60e01b8152600490fd5b613c6e81613c26565b60028103613c8f5760405163fce698f760e01b815260048101839052602490fd5b80613c9b600392613c26565b14613ca35750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613d38575b81811115613d30575b50828110613ce457505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613d1957908290613d01565b505060008583016020015250603f01168201604052565b905038613cd7565b925082613cce565b60405190613d4d82610872565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613e81575b8015613e79575b8015613e61575b613e5757613dc983866140d1565b15613e575760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614abf833981519152948560a084015260208360c0816005600019fa1561021d57613e519386613e4b945181818909940991614172565b91612d15565b90081590565b5050505050600090565b50600080516020614abf833981519152821015613dbb565b508115613db4565b50600080516020614abf833981519152841015613dad565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613f6a575b613f61576001600060015b15613f35575b50606084015260808320805460009161fffe198083169190898314613f1457505091613ee7565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613f57575b5015613f4d5738613eed565b5060009450505050565b9050151538613f41565b50600093505050565b508015613edc565b9061ffff1916908115613ffa57604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613ff157600160809252209182549283158015613fe7575b15613fdb57600193505555600190565b90600217905555600190565b5060018416613fcb565b50505050600090565b5050600090565b9061400b8261091c565b61401860405191826108df565b8281528092612d0b601f199161091c565b8051156140c75761405461404f614048614043845161223f565b612273565b6003900490565b614001565b91602083019180805101906020820192835194600085525b83831061407b57505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c168801015160028601531685010151908201530161406c565b5050610989611d8c565b600160601b63ffffffff60c01b031990818110801590614168575b8015614157575b61414f577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b50801580156140f3575082156140f3565b50818310156140ec565b60009260ff9290918483158061487e575b613724576141918383614886565b9095861580614876575b614838575b85811c60028a60fe1c16015b1561481e57600186821c1660028a831c60011b1601600181146147e5575b600281146147d8575b6003146147cb575b60009493929419019560019860015b8860001911614257575050505050505050506040519160608301526020825260208083015260206040830152600080516020614adf8339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa1561021d5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b03198082600080516020614adf83398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156147ad5760018c600286838f841c16921c831b160114614776575b838c8c6002600182841c168185851c60011b160114614763575b6003926001600292841c16921c60011b16011461475a575b861561474757600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614531575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a09600080516020614adf83398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b03199283908190818480099009600080516020614adf8339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b600019019796939594936141ea565b8661440657919a9198919550600160601b63ffffffff60c01b03199050808083600080516020614adf83398151915209600160601b63ffffffff60c01b031984600080516020614adf83398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b03199081808085600080516020614adf83398151915209600160601b63ffffffff60c01b031986600080516020614adf8339815191520909600160601b63ffffffff60c01b031985600080516020614adf83398151915209090997600160601b63ffffffff60c01b031990818084600080516020614adf83398151915209600160601b63ffffffff60c01b031985600080516020614adf8339815191520909099a600160601b63ffffffff60c01b0319808c600080516020614adf83398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b031992839081808083600080516020614adf83398151915209600160601b63ffffffff60c01b031984600080516020614adf8339815191520909600160601b63ffffffff60c01b031983600080516020614adf83398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614522565b60019c50909a8c99509095509050614522565b505082846143c5565b508993508a92508591508d90508c6143ad565b5050600080516020614a9f8339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5614393565b50949a90999097600160601b63ffffffff60c01b0319039450614522565b91509550849580916141db565b93975087938593506141d3565b600080516020614a9f83398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593506141ca565b60001901600160028188841c16918b841c901b16016141ac565b979094600080516020614abf83398151915291820390089360009785158061486e575b156141a057505050505050505050600090565b50600161485b565b50811561419b565b508615614183565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59291600080516020614a9f8339815191529181156149de57808314806149d5575b156149be5750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe81600184089208096003098180808086600080516020614adf8339815191520981858009089981600181818b099a099709810393898203900890090893915b6040519060208252602080830152602060408301526060820152600080516020614adf8339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa1561021d57838080935180950980099009930990565b9091506149cc9293506149e4565b91939291614958565b508185146148c8565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b920908950908928080808087800996870994818088600080516020614a9f833981519152099181808085600080516020614adf83398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220a0c290e5eb0e1be3796190b1960f3ad7cc5d8855b9eace513efe20d88fbbab0664736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", - "nonce": "0x6", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a0346200007757601f62004a1d38819003918201601f19168301916001600160401b038311848410176200007c578084926020946040528339810103126200007757516001600160a01b0381168103620000775760805260405161498a90816200009382396080518181816119a1015261290a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461018d5780630b96422d146101885780630c7ecd84146101425780630cdc271f146101835780631128186d1461017e578063118a53891461017957806315b76b84146101745780631626ba7e1461016f57806346d60eb2146101425780636bbefc891461016a5780636d61fe701461016557806371af817b1461016057806377102c351461015b578063852b67af14610156578063858e6ee4146101515780638a91b0e31461014c578063b139ec6314610147578063bfd151c114610142578063c4db8dd91461013d578063c776313014610138578063c8050ee414610133578063e8eb3cc61461012e578063ef4a7203146101295763f582bceb1461012457600080fd5b611a01565b6119d0565b61198b565b61194b565b61153b565b61126c565b61040e565b611209565b611089565b611020565b610f53565b610f24565b610d00565b610bb0565b610aad565b610936565b6107f3565b6106a9565b61054e565b6104c1565b610262565b346101fd5760203660031901126101fd5760043563ffffffff60e01b81168091036101fd576020906372d61afb60e01b81149081156101d2575b506040519015158152f35b63043140ed60e01b8114915081156101ec575b50386101c7565b6301ffc9a760e01b149050386101e5565b600080fd5b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460051b0101116101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460061b0101116101fd57565b346101fd5760603660031901126101fd576001600160401b036004358181116101fd57610293903690600401610202565b916024359081116101fd576102ac903690600401610232565b926102b633613632565b6103a3576102d1926102c9913691611a59565b923691611ab7565b81519181519182840180851161039e576102ed90949294612b25565b9360009283915b818310610354575050506000915b8383106103175761031560443586612b80565b005b61034c60019161034761033361032d8787611d8f565b51613137565b61033d838a611d8f565b9061ffff19169052565b6122c5565b920191610302565b91939091906001906103959061034761038b6001600160a01b036103788a88611d8f565b511660101b62010000600160b01b031690565b61033d838c611d8f565b940191906102f4565b61206f565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b03821682036101fd57565b600435906001600160a01b03821682036101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd57602083818601950101116101fd57565b346101fd5760803660031901126101fd5760043560ff811681036101fd576024356001600160a01b038116036101fd576064356001600160401b0381116101fd5761045d9036906004016103e1565b5050611b2a565b634e487b7160e01b600052602160045260246000fd5b9060028210156104875752565b610464565b91926104aa608094979695929760a08501988552602085019061047a565b6001600160a01b0316604083015260608201520152565b346101fd5760403660031901126101fd5760043561ffff1981168091036101fd57610513906104ee6103b5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361054a93600881901c6001600160a01b03169160ff909116908661048c565b0390f35b346101fd5760403660031901126101fd5760043560ff811681036101fd576024356001600160401b0381116101fd5761045d9036906004016103e1565b60005b83811061059e5750506000910152565b818101518382015260200161058e565b906020916105c78151809281855285808601910161058b565b601f01601f1916010190565b906020908183526105ef815160808486015260a08501906105ae565b9180820151916060610626610613601f1996604096888a83030160408b01526105ae565b60408401518789830301848a01526105ae565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061066057505050505050505090565b909192939495969786806106978387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ae565b9a01950195019396959492919061064e565b346101fd5760003660031901126101fd576106c2611b59565b5061054a6106ce611b59565b6106d6611bb0565b81526106e0611bf3565b60208201526106ed611c14565b60408201526107a26106fd611c4d565b6060830190815261073961070f611cae565b6107176108aa565b63852b67af60e01b815290602082015282519061073382611cea565b52611cea565b5061076f610745611da3565b61074d6108aa565b6371af817b60e01b815290602082015282519061076982611cfc565b52611cfc565b50610778611ddc565b906107816108aa565b630b96422d60e01b8152916020830152519061079c82611d0c565b52611d0c565b50604051918291826105d3565b906003196060818401126101fd5760043560ff811681036101fd5792602435916001600160401b0383116101fd5782610120920301126101fd576004019060443590565b346101fd5761045d366107af565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761083257604052565b610801565b606081019081106001600160401b0382111761083257604052565b60a081019081106001600160401b0382111761083257604052565b61012081019081106001600160401b0382111761083257604052565b90601f801991011681019081106001600160401b0382111761083257604052565b604051906108b782610817565b565b604051906108b782610837565b6001600160401b03811161083257601f01601f191660200190565b9291926108ed826108c6565b916108fb6040519384610889565b8294818452818301116101fd578281602093846000960137010152565b9080601f830112156101fd57816020610933933591016108e1565b90565b346101fd5760403660031901126101fd576024356001600160401b0381116101fd5761096961097d913690600401610918565b61097560043533611ed0565b3390806122d4565b50156109a1576020630b135d3f60e11b5b6040516001600160e01b03199091168152f35b60206001600160e01b031961098e565b90815180825260208080930193019160005b8281106109d1575050505090565b835161ffff1916855293810193928101926001016109c3565b6080809180518452610a046020820151602086019061047a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610a48575050505090565b909192938260a082610a5d60019489516109ea565b01950193929101610a3a565b91610a95604091610a8760809497969760a0875260a08701906109b1565b908582036020870152610a28565b94805182850152602081015160608501520151910152565b346101fd576020806003193601126101fd57610ac76103cb565b610acf611e05565b50610ae1610adc82612ce5565b612d94565b90610aec8251612dd6565b9260005b8351811015610b545760019061ffff19610b0a8287611d8f565b5116600090815282845260408082206001600160a01b03871683526020529020610b38906120fd565b6120fd565b610b428288611d8f565b52610b4d8187611d8f565b5001610af0565b505060018060a01b0316600052600260205261054a610b766040600020611e24565b60405193849384610a69565b60206003198201126101fd57600435906001600160401b0382116101fd57610bac916004016103e1565b9091565b346101fd57610bbe36610b82565b610bc733613632565b15610c6b5781019060a0818303126101fd576001600160401b0381358181116101fd57820183601f820112156101fd5783816020610c0793359101611a59565b9260208301358281116101fd5781610c20918501611e9a565b9360408401358381116101fd5782610c39918601611eb5565b60608501359384116101fd5761031595610c5a610c60946080968801611e9a565b92612e26565b919092013591612fff565b60405162dc149f60e41b8152600490fd5b60a06003198201126101fd576001600160401b03906004358281116101fd5781610ca891600401610202565b939093926024358181116101fd5783610cc391600401610202565b939093926044358381116101fd5782610cde91600401610232565b939093926064359182116101fd57610cf891600401610202565b909160843590565b346101fd57610d0e36610c7c565b97969094959293610d1e33613632565b6103a357610d43610c5a94610d3b610d539a610d4b953691611a59565b983691611e4c565b943691611ab7565b933691611e4c565b819291519181518303610f12576000808415159283610de4575b3360009081526002602052604090209495509293610da79390610d9f9093610d9a600286019485546120dd565b612b73565b809255613677565b610dad57005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610ddf6040519283923384612fc9565b0390a1005b60005b868110610df45750610d6d565b91610e3e33610e27610e12610e09878d611d8f565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610e498488611d8f565b51518115610edb57878a82841015610e97579260019492610d9a610e8993610e818a610e7b610e0982610e8f9b611d8f565b92611d8f565b515190613991565b906120dd565b925b01610de7565b8284939497959711610eb0575b50505050600190610e91565b92849792610d9a610e8993610e8188610e7b610e0960019b610ed19b611d8f565b939038878a610ea4565b610f0e610eeb610e09878d611d8f565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b346101fd5760403660031901126101fd576020610f4b610f426103cb565b60243590611ed0565b604051908152f35b346101fd57610f6136610c7c565b97969094959293610f7133613632565b6103a357610d43610c5a94610d3b610f8e9a610d4b953691611a59565b90336000526002602052604060002092610faa845484846138ca565b60028692960192835491820180921161039e57825496870180971161039e5781610ff8947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613677565b610ddf6040519283923384612fc9565b901515815260c0810192916108b791602001906109ea565b346101fd5760603660031901126101fd576110396103cb565b60403660231901126101fd576110799061107360405161105881610817565b6024358152604435602082015261106d61201a565b50613137565b906131a0565b9061054a60405192839283611008565b346101fd5761109736610b82565b50506110a5610adc33612ce5565b6000903382526002602052600180604084200154906110e3336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6111c3575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6111bd887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b6111816111456108b9565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b61118a8161322b565b9061119b6040519283923384612045565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156111e4575b87908352608085208861fffe198254169155916110ed565b9081161580611200575b156111fa5782906111cc565b806110f2565b508015156111ee565b346101fd5760803660031901126101fd576044356001600160a01b03811681036101fd576064356001600160401b0381116101fd5760409161125261125e923690600401610918565b906024356004356122d4565b825191151582526020820152f35b346101fd576020610f4b61127f366107af565b916127e4565b90815180825260208080930193019160005b8281106112a5575050505090565b83516001600160e01b03191685529381019392810192600101611297565b908082519081815260208091019281808460051b8301019501936000915b8483106112f15750505050505090565b9091929394958480611335600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611285565b98019301930191949392906112e1565b80516005811015610487576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061138b575050505090565b909192938260806001926113b383895163ffffffff60e01b8151168452015184830190611345565b0195019392910161137d565b90815180825260208080930193019160005b8281106113df575050505090565b909192938260e06001926114186040895163ffffffff851b815116845261140c8682015187860190611345565b01516080830190611345565b019501939291016113d1565b906109339160208152815190611448610180928360208401526101a0830190611285565b916114c261149661148261146e602088015196601f199788888303016040890152611285565b604088015187878303016060880152611285565b606087015186868303016080870152611285565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526112c3565b61152b6115146114fd6114e660e089015194610100958989830301878a015261136b565b93880151936101209488888303018689015261136b565b92870151926101409387878303018588015261136b565b91860151916101609286868303018487015261136b565b94015192828503019101526113bf565b346101fd576000806003193601126119485761054a906115596129ca565b5061193b6115656129ca565b916115f06115e4611574612a36565b6115936115876040880192808452611cea565b63852b67af60e01b9052565b6115ac6115a08251611cfc565b630b96422d60e01b9052565b6115c56115b98251611d0c565b6371af817b60e01b9052565b6115de6115d28251611d1c565b630b135d3f60e11b9052565b51611d2c565b6377102c3560e01b9052565b6115f86108b9565b600181529061176e6020928284820152826040820152611616612a61565b60e087019081526116436116286108aa565b63852b67af60e01b8152838782015282519061073382611cea565b5061166a61164f6108aa565b630b96422d60e01b8152838782015282519061076982611cfc565b506116916116766108aa565b6371af817b60e01b8152838782015282519061079c82611d0c565b506116be61169d6108aa565b635b0e93fb60e11b815283878201528251906116b882611d1c565b52611d1c565b506116eb6116ca6108aa565b631a7e6adf60e11b815283878201528251906116e582611d2c565b52611d2c565b506117186116f76108aa565b633e15cc3d60e21b8152838782015282519061171282611d3c565b52611d3c565b506117456117246108aa565b63c1a221f360e01b8152838782015282519061173f82611d4c565b52611d4c565b5061174e6108aa565b63278f794360e11b81529185830152519061176882611d5c565b52611d5c565b506117776108b9565b6003815290808383015280604083015261178f6108b9565b6001815290808483015260408201526117fc6117a9612ac3565b9261010087019384526117d86117bd6108aa565b630b135d3f60e11b8152828782015285519061073382611cea565b506117e16108aa565b6377102c3560e01b8152908582015283519061076982611cfc565b506118236118086108aa565b63852b67af60e01b8152828582015283519061079c82611d0c565b5061184a61182f6108aa565b630b96422d60e01b815282858201528351906116b882611d1c565b506118716118566108aa565b6371af817b60e01b815282858201528351906116e582611d2c565b5061189861187d6108aa565b635b0e93fb60e11b8152828582015283519061171282611d3c565b506118bf6118a46108aa565b631a7e6adf60e11b8152828582015283519061173f82611d4c565b506118e66118cb6108aa565b633e15cc3d60e21b8152828582015283519061176882611d5c565b506119136118f26108aa565b63c1a221f360e01b8152828582015283519061190d82611d6d565b52611d6d565b5061191c6108aa565b63278f794360e11b815292830152519061193582611d7e565b52611d7e565b5060405191829182611424565b80fd5b346101fd5760403660031901126101fd57602061197e60405161196d81610817565b600435815260243583820152613137565b6040519061ffff19168152f35b346101fd5760003660031901126101fd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101fd5760203660031901126101fd57602062010000600160b01b036119f56103cb565b60101b16604051908152f35b346101fd5760403660031901126101fd57611079611a1d6103cb565b611a256103b5565b611a2d61201a565b5060101b62010000600160b01b0316906131a0565b6001600160401b0381116108325760051b60200190565b9291611a6482611a42565b91611a726040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611a985750505050565b81356001600160a01b03811681036101fd578152908301908301611a8b565b929192611ac382611a42565b604092611ad36040519283610889565b819581835260208093019160061b8401938185116101fd57915b848310611afc57505050505050565b85838303126101fd578386918251611b1381610817565b853581528286013583820152815201920191611aed565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761083257604052606080838181528160208201528160408201520152565b60405190602082018281106001600160401b038211176108325760405260008252565b60405190611bbd82610837565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611c0082610817565b60058252640312e302e360dc1b6020830152565b60405190611c2182610817565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108325760405260038352829160009160005b606080821015611ca557825160209291611c9282610817565b8682528382015287820183015201611c79565b50505091925050565b60405190611cbb82610817565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611cf75760200190565b611cd4565b805160011015611cf75760400190565b805160021015611cf75760600190565b805160031015611cf75760800190565b805160041015611cf75760a00190565b805160051015611cf75760c00190565b805160061015611cf75760e00190565b805160071015611cf7576101000190565b805160081015611cf7576101200190565b805160091015611cf7576101400190565b8051821015611cf75760209160051b010190565b60405190611db082610817565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611de982610817565b600d82526c52656d6f7665204f776e65727360981b6020830152565b60405190611e1282610837565b60006040838281528260208201520152565b90604051611e3181610837565b60406002829480548452600181015460208501520154910152565b9291611e5782611a42565b91611e656040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611e8b5750505050565b81358152908301908301611e7e565b9080601f830112156101fd5781602061093393359101611e4c565b9080601f830112156101fd5781602061093393359101611ab7565b61093391611fed611ff9611f9b611f3094611ee9611bb0565b611ef1611bf3565b6040519788916020998a9182611f10818401978881519384920161058b565b8201611f248251809386808501910161058b565b01038084520182610889565b519020604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647289820190815260208101939093524691830191909152306060808401919091529290921b6bffffffffffffffffffffffff191660808201529091829060a0830190565b0391611faf601f1993848101835282610889565b51902094604051938491820195869190602060408401937f7dc7da30a002512936154da01baa79a3d1e54e35034ffdfa7c53c28b3091236d81520152565b03908101835282610889565b519020906042916040519161190160f01b8352600283015260228201522090565b6040519061202782610852565b60006080838281528260208201528260408201528260608201520152565b93929161206a9060409260018060a01b031686526060602087015260608601906109b1565b930152565b634e487b7160e01b600052601160045260246000fd5b9060418202918083046041149015171561039e57565b600281901b91906001600160fe1b0381160361039e57565b906041820180921161039e57565b906015820180921161039e57565b906002820180921161039e57565b9190820180921161039e57565b60ff601f199116019060ff821161039e57565b9060405161210a81610852565b80928054825260018101549060ff821690600282101561048757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061215e82610837565b6000604083815161216e81610852565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926121a3816108c6565b916121b16040519384610889565b8294828452828201116101fd5760206108b793019061058b565b9080601f830112156101fd57815161093392602001612196565b519081151582036101fd57565b60209081818403126101fd5780516001600160401b03918282116101fd57016060818503126101fd5760409283519461222a86610837565b82518481116101fd5783019360a0858303126101fd5785519161224c83610852565b85518281116101fd57860181601f820112156101fd5781818661227193519101612196565b8352838601519182116101fd57856122916080926122ad948a99016121cb565b85850152868101518785015260608101516060850152016121e5565b60808201528552808201519085015201519082015290565b600019811461039e5760010190565b939291909160009460418251106126d7576001600160a01b0383166000908152600260205260409020600101549384156127a05760009384928391828483146127945792979460ff60015b16976001995b878110612359575050505050505050508061233f57509190565b604051631007539160e31b81526004810191909152602490fd5b61236a61236584612085565b6120b3565b821515908161278a575b811561277f575b5061275e576123a0838a90604102016020810151906060604082015191015160001a92565b91979088602060ff82161061275457508d6123bb899a6120ea565b9d600019019d5b60ff8116806125d1575050506001600160a01b03811681116125bf578d9862010000600160b01b038260101b169960018060a01b0383168b61243360016124228d610e27838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b16036125a6575b508c518411801561259c575b61258a5761245c6020808f8701015101856120dd565b8d5110612578578e938d8782108015612570575b612566575b61249893612494939290910160200191906001600160a01b03166135b7565b1590565b61254b575b61ffff19808916911681119081159161250a575b506124f1575b506124e36124ea916124dc86610e278a61ffff19166000526001602052604060002090565b54906120dd565b95926122c5565b9194612325565b6124fc575b8a6124b7565b919b50600099508b916124f6565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff199190911660608201526080902054159050386124b1565b90612558575b8b9061249d565b9a509b50819b60009a612551565b9096508690612475565b508715612470565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b5060418410612446565b6125b1575b8e61243a565b9d509e50849e60009d6125ab565b60405163e6c4247b60e01b8152600490fd5b6002036126f357505061ffff199060101b1697612604610b3388610e278c61ffff19166000526001602052604060002090565b6080606082015191015191612617612151565b508d51851180156126e9575b61258a578d61263a602080888401015101876120dd565b9051106126d7578f948e88821080156126cf575b6126c5575b6126b49492826126a361268184602061249499976126959701015160409485809282850101019201016121f2565b928251948591602083019190602083019252565b03601f198101855284610889565b815190602083015192015192613392565b1561249d5790612558578b9061249d565b9097508790612653565b50881561264e565b60405163d245329360e01b8152600490fd5b5060418510612623565b612701939a949291946132b2565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b0390811692909161274291612422908b90610e27565b161461249d5790612558578b9061249d565b98508d8a996123c2565b505099979650505050505050600014612778575060009190565b6000925090565b90508951103861237b565b8381119150612374565b92979460ff600061231f565b60405163d349279d60e01b8152600490fd5b903590601e19813603018212156101fd57018035906001600160401b0382116101fd576020019181360383136101fd57565b9192909260ff83161561281e576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6128539192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612862828501856127b2565b908184519182372061297e61287a60608701876127b2565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470848201528381526128f48161086d565b5190208451602081019182526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016604082015246606082015261294c81608081015b03601f198101835282610889565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b928383146129ba575061299b856129a2926129aa969701906127b2565b36916108e1565b9133916122d4565b50156129b557600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108325760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610832576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b038211176108325760405260088352600083815b6101008110612a9a5750505050565b6020908451612aa881610817565b84815282612ab4611e05565b81830152828501015201612a8b565b6040906040519161016083018381106001600160401b0382111761083257604052600a8352600083815b6101408110612afc5750505050565b6020908451612b0a81610817565b84815282612b16611e05565b81830152828501015201612aed565b90612b2f82611a42565b612b3c6040519182610889565b8281528092612b4d601f1991611a42565b0190602036910137565b9060008051602061491583398151915291820391821161039e57565b9190820391821161039e57565b91908251918215612cd357336000526002602052604090604060002080549480861115612cc157600094855b8851871015612c6657612bdc612494612bd661ffff19612bcc8b8e611d8f565b511661ffff191690565b33613cef565b612c3357612bfb6001916124dc8b610e27610e12610e098d3394611d8f565b96612c2c612c148b610e27610e12610e09863394611d8f565b60036000918281558260018201558260028201550155565b0195612bac565b610f0e86612c44610e098a8d611d8f565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612cac93979450610d9f867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612ca56002870195865492612b73565b8655612b73565b612cbc6040519283923384612045565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612d8b575b15612d705761fffe1985169101600581901b870184018290529360021615612d68576060850152608084205492612d29565b508592612d29565b95935050945050608091506001830160051b01016040528252565b50841515612d36565b908151612da081612b25565b9060005b818110612db2575090925050565b60019061ffff19612dc38288611d8f565b5116612dcf8286611d8f565b5201612da4565b90612de082611a42565b612ded6040519182610889565b8281528092612dfe601f1991611a42565b019060005b828110612e0f57505050565b602090612e1a61201a565b82828501015201612e03565b929093919383519480519282518714801590612fbe575b610f1257612e4e84889794986120dd565b96612e61612e5b89612b25565b98612dd6565b9660009485925b898b848610612f16575050505050506000925b848410612e89575050505050565b612f0e600191612ea9612e9f61032d8888611d8f565b61033d838d611d8f565b612eb38685611d8f565b51612ebe828b611d8f565b51526020600081612ecf848d611d8f565b510152612edc8787611d8f565b51516060612eea848d611d8f565b510152612ef78787611d8f565b5101516080612f06838c611d8f565b5101526122c5565b930192612e7b565b97610347612fb4926040612fa384612f9d612f4b8c9f9c612f698c9d9e61033d8660019e9f612f58612f4b87610e7b93611d8f565b516001600160a01b031690565b60101b62010000600160b01b031690565b612f73818d611d8f565b51612f7e8589611d8f565b5152612f976020612f8f868a611d8f565b510160019052565b8c611d8f565b93611d8f565b516001600160a01b03909216910152565b9601929190612e68565b508051841415612e3d565b6001600160a01b039091168152606060208201819052610933939192612ff1918401906109b1565b916040818403910152610a28565b919283156127a057600093845b83518610156130355761301f8685611d8f565b5151810180911161039e5760019095019461300c565b90939194508381106131005782826130ce7f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1793613097612cbc977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613788565b50508251906130a46108b9565b91825286602083015260408201526111663360018060a01b03166000526002602052604060002090565b6130de6040519283923384612fc9565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b906131336020928281519485920161058b565b0190565b60208151910151811580613198575b6131795760408051602081019384528082019290925281529061316a606083610889565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b508015613146565b9190916131ab61201a565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff19909416606085018190526080909420549093901561322357613217929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109336001926120fd565b505060009190565b6000919082805b82518210156132ac5761ffff19918261324b8286611d8f565b511686526001602081815260408089203360009081529083528190209294919254820180921161039e576001946132a593612c14939761328b878b611d8f565b51168b525288203360009081526020919091526040902090565b0190613232565b93505050565b9161093393916132c1936139f8565b90929192613a86565b906108b7602e60405180946c1131b430b63632b733b2911d1160991b60208301526132ff815180926020602d8601910161058b565b8101601160f91b602d82015203600e810185520183610889565b805160201015611cf75760400190565b6040513d6000823e3d90fd5b602092919061334b84928281519485920161058b565b019081520190565b3d1561337e573d90613364826108c6565b916133726040519384610889565b82523d6000602084013e565b606090565b908160209103126101fd575190565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a883116135ac57602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346133ff835160608601516133f9816120c1565b91613b13565b8981519101200361359f5761341f61342491613419613b96565b90613e7f565b6132ca565b613439825160408501516133f98451826120dd565b888151910120908881519101200361357757600160f81b8061346c61345e8551613319565b516001600160f81b03191690565b1603613577576080820151151580613583575b6135775751866040519182806134986000958694613120565b039060025afa156135725786816134dd815194516134bd604051968792868401613335565b03946134d1601f1996878101835282610889565b60405191828092613120565b039060025afa15613572578051604080518981018381526020810187905291820187905260608201889052608082018990529193839290613522908260a08501611fed565b51906101005afa95613532613353565b9081519780613569575b61354c5750506109339550613bf5565b6001976135659750820181019550019250613383915050565b1490565b5087151561353c565b613329565b50505050505050600090565b50600160fa1b8061359761345e8551613319565b16141561347f565b5050505050505050600090565b505050505050600090565b600091929082916040516135ef8161293e6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ae565b51915afa906135fc613353565b82613624575b8261360c57505090565b9091506020818051810103126101fd57602001511490565b915060208251101591613602565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080902054801590811561366f575090565b600191501690565b6001909201805490929182156136fa578281106136d9575080820361369b57505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b80935081925010613709575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b90805182556001820190602081015190600282101561048757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612cd35782825103610f12576103e883116138aa57906000915b8383106137ba575050509190565b9091946137e16124946137db6137d3610e098a87611d8f565b61ffff191690565b33613dc8565b61389a576137ef8684611d8f565b5151158015613883575b6138455761383c60019161382a6138108987611d8f565b5161382533610e27610e12610e098e8b611d8f565b61372b565b6138348886611d8f565b5151906120dd565b950191906137ac565b5084610e7b610e098261385794611d8f565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f42406138928785611d8f565b5151116137f9565b610f0e610eeb610e098885611d8f565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612cd35783835103610f12576103e86138ef85836120dd565b116139705750906000915b838310613908575050509190565b9091946139216124946137db6137d3610e098a87611d8f565b61389a5761392f8684611d8f565b5151158015613959575b6138455761395060019161382a6138108987611d8f565b950191906138fa565b50620f42406139688785611d8f565b515111613939565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b811580156139ec575b6139bf5761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f4240821161399a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613a7057926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa156135725780516001600160a01b03811615613a6757918190565b50809160019190565b50505060009160039190565b6004111561048757565b613a8f81613a7c565b80613a98575050565b613aa181613a7c565b60018103613abb5760405163f645eedf60e01b8152600490fd5b613ac481613a7c565b60028103613ae55760405163fce698f760e01b815260048101839052602490fd5b80613af1600392613a7c565b14613af95750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613b8e575b81811115613b86575b50828110613b3a57505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613b6f57908290613b57565b505060008583016020015250603f01168201604052565b905038613b2d565b925082613b24565b60405190613ba382610837565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613cd7575b8015613ccf575b8015613cb7575b613cad57613c1f8386613f27565b15613cad5760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614915833981519152948560a084015260208360c0816005600019fa156101fd57613ca79386613ca1945181818909940991613fc8565b91612b57565b90081590565b5050505050600090565b50600080516020614915833981519152821015613c11565b508115613c0a565b50600080516020614915833981519152841015613c03565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613dc0575b613db7576001600060015b15613d8b575b50606084015260808320805460009161fffe198083169190898314613d6a57505091613d3d565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613dad575b5015613da35738613d43565b5060009450505050565b9050151538613d97565b50600093505050565b508015613d32565b9061ffff1916908115613e5057604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613e4757600160809252209182549283158015613e3d575b15613e3157600193505555600190565b90600217905555600190565b5060018416613e21565b50505050600090565b5050600090565b90613e61826108c6565b613e6e6040519182610889565b8281528092612b4d601f19916108c6565b805115613f1d57613eaa613ea5613e9e613e99845161209b565b6120cf565b6003900490565b613e57565b91602083019180805101906020820192835194600085525b838310613ed157505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301613ec2565b5050610933611b8d565b600160601b63ffffffff60c01b031990818110801590613fbe575b8015613fad575b613fa5577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b5080158015613f4957508215613f49565b5081831015613f42565b60009260ff929091848315806146d4575b61357757613fe783836146dc565b90958615806146cc575b61468e575b85811c60028a60fe1c16015b1561467457600186821c1660028a831c60011b16016001811461463b575b6002811461462e575b600314614621575b60009493929419019560019860015b88600019116140ad5750505050505050505060405191606083015260208252602080830152602060408301526000805160206149358339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa156101fd5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b0319808260008051602061493583398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156146035760018c600286838f841c16921c831b1601146145cc575b838c8c6002600182841c168185851c60011b1601146145b9575b6003926001600292841c16921c60011b1601146145b0575b861561459d57600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614387575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a0960008051602061493583398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b031992839081908184800990096000805160206149358339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b60001901979693959493614040565b8661425c57919a9198919550600160601b63ffffffff60c01b0319905080808360008051602061493583398151915209600160601b63ffffffff60c01b03198460008051602061493583398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b0319908180808560008051602061493583398151915209600160601b63ffffffff60c01b0319866000805160206149358339815191520909600160601b63ffffffff60c01b03198560008051602061493583398151915209090997600160601b63ffffffff60c01b03199081808460008051602061493583398151915209600160601b63ffffffff60c01b0319856000805160206149358339815191520909099a600160601b63ffffffff60c01b0319808c60008051602061493583398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b03199283908180808360008051602061493583398151915209600160601b63ffffffff60c01b0319846000805160206149358339815191520909600160601b63ffffffff60c01b03198360008051602061493583398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614378565b60019c50909a8c99509095509050614378565b5050828461421b565b508993508a92508591508d90508c614203565b50506000805160206148f58339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f56141e9565b50949a90999097600160601b63ffffffff60c01b0319039450614378565b9150955084958091614031565b9397508793859350614029565b6000805160206148f583398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59350614020565b60001901600160028188841c16918b841c901b1601614002565b9790946000805160206149158339815191529182039008936000978515806146c4575b15613ff657505050505050505050600090565b5060016146b1565b508115613ff1565b508615613fd9565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592916000805160206148f5833981519152918115614834578083148061482b575b156148145750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe816001840892080960030981808080866000805160206149358339815191520981858009089981600181818b099a099709810393898203900890090893915b60405190602082526020808301526020604083015260608201526000805160206149358339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa156101fd57838080935180950980099009930990565b90915061482292935061483a565b919392916147ae565b5081851461471e565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b9209089509089280808080878009968709948180886000805160206148f583398151915209918180808560008051602061493583398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220d586e4fd303dfab4216400fe9fa3ed6319112d27701f24d09905e2c95485692164736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0xaa", "chainId": "0xaa36a7" }, "additionalContracts": [], @@ -23,25 +25,25 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0x1a8fc45", + "cumulativeGasUsed": "0x12bf333", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xa1630bda9207f10820a7b3ea0ffaaf4e09fee56a996a7067e326a9f0771ad48d", - "transactionIndex": "0x43", - "blockHash": "0x49d9be172a939849c683f1d4ce20652fb93a5c245e0e524d621172f3b9c14eab", - "blockNumber": "0x67327e", - "gasUsed": "0x4070cd", - "effectiveGasPrice": "0x23bb54277d", - "from": "0xbcd75cbd82fc6c3e01e7b3793489ab2f879980ae", + "transactionHash": "0x889be83e853ab303270bb1861cd7f276bc6b514f7719096c2550937676ba3a1a", + "transactionIndex": "0x42", + "blockHash": "0xaa2a78bd64dfcc6b9eb17a433ff181a0aca87c9fb12a46c0a54a30fd058eb126", + "blockNumber": "0x69dbf8", + "gasUsed": "0x3f0a22", + "effectiveGasPrice": "0x41c89e64", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "contractAddress": "0x558498e7cd325b17be8c8a79884a1cacfd72a4aa" + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1727354370, + "timestamp": 1729794974, "chain": 11155111, - "commit": "1d2d26c" + "commit": "bf15fa9" } \ No newline at end of file diff --git a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/137/run-1729795089.json b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/137/run-1729795089.json new file mode 100644 index 0000000..68a77dd --- /dev/null +++ b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/137/run-1729795089.json @@ -0,0 +1,66 @@ +{ + "transactions": [ + { + "hash": "0xcd689785ff3d65d7333ac831707970c459157fa1ac0d057f99f34ea9b133b9c3", + "transactionType": "CREATE2", + "contractName": "WeightedWebauthnMultisigPlugin", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x570c61", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a0346200007757601f62004a1d38819003918201601f19168301916001600160401b038311848410176200007c578084926020946040528339810103126200007757516001600160a01b0381168103620000775760805260405161498a90816200009382396080518181816119a1015261290a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461018d5780630b96422d146101885780630c7ecd84146101425780630cdc271f146101835780631128186d1461017e578063118a53891461017957806315b76b84146101745780631626ba7e1461016f57806346d60eb2146101425780636bbefc891461016a5780636d61fe701461016557806371af817b1461016057806377102c351461015b578063852b67af14610156578063858e6ee4146101515780638a91b0e31461014c578063b139ec6314610147578063bfd151c114610142578063c4db8dd91461013d578063c776313014610138578063c8050ee414610133578063e8eb3cc61461012e578063ef4a7203146101295763f582bceb1461012457600080fd5b611a01565b6119d0565b61198b565b61194b565b61153b565b61126c565b61040e565b611209565b611089565b611020565b610f53565b610f24565b610d00565b610bb0565b610aad565b610936565b6107f3565b6106a9565b61054e565b6104c1565b610262565b346101fd5760203660031901126101fd5760043563ffffffff60e01b81168091036101fd576020906372d61afb60e01b81149081156101d2575b506040519015158152f35b63043140ed60e01b8114915081156101ec575b50386101c7565b6301ffc9a760e01b149050386101e5565b600080fd5b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460051b0101116101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460061b0101116101fd57565b346101fd5760603660031901126101fd576001600160401b036004358181116101fd57610293903690600401610202565b916024359081116101fd576102ac903690600401610232565b926102b633613632565b6103a3576102d1926102c9913691611a59565b923691611ab7565b81519181519182840180851161039e576102ed90949294612b25565b9360009283915b818310610354575050506000915b8383106103175761031560443586612b80565b005b61034c60019161034761033361032d8787611d8f565b51613137565b61033d838a611d8f565b9061ffff19169052565b6122c5565b920191610302565b91939091906001906103959061034761038b6001600160a01b036103788a88611d8f565b511660101b62010000600160b01b031690565b61033d838c611d8f565b940191906102f4565b61206f565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b03821682036101fd57565b600435906001600160a01b03821682036101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd57602083818601950101116101fd57565b346101fd5760803660031901126101fd5760043560ff811681036101fd576024356001600160a01b038116036101fd576064356001600160401b0381116101fd5761045d9036906004016103e1565b5050611b2a565b634e487b7160e01b600052602160045260246000fd5b9060028210156104875752565b610464565b91926104aa608094979695929760a08501988552602085019061047a565b6001600160a01b0316604083015260608201520152565b346101fd5760403660031901126101fd5760043561ffff1981168091036101fd57610513906104ee6103b5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361054a93600881901c6001600160a01b03169160ff909116908661048c565b0390f35b346101fd5760403660031901126101fd5760043560ff811681036101fd576024356001600160401b0381116101fd5761045d9036906004016103e1565b60005b83811061059e5750506000910152565b818101518382015260200161058e565b906020916105c78151809281855285808601910161058b565b601f01601f1916010190565b906020908183526105ef815160808486015260a08501906105ae565b9180820151916060610626610613601f1996604096888a83030160408b01526105ae565b60408401518789830301848a01526105ae565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061066057505050505050505090565b909192939495969786806106978387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ae565b9a01950195019396959492919061064e565b346101fd5760003660031901126101fd576106c2611b59565b5061054a6106ce611b59565b6106d6611bb0565b81526106e0611bf3565b60208201526106ed611c14565b60408201526107a26106fd611c4d565b6060830190815261073961070f611cae565b6107176108aa565b63852b67af60e01b815290602082015282519061073382611cea565b52611cea565b5061076f610745611da3565b61074d6108aa565b6371af817b60e01b815290602082015282519061076982611cfc565b52611cfc565b50610778611ddc565b906107816108aa565b630b96422d60e01b8152916020830152519061079c82611d0c565b52611d0c565b50604051918291826105d3565b906003196060818401126101fd5760043560ff811681036101fd5792602435916001600160401b0383116101fd5782610120920301126101fd576004019060443590565b346101fd5761045d366107af565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761083257604052565b610801565b606081019081106001600160401b0382111761083257604052565b60a081019081106001600160401b0382111761083257604052565b61012081019081106001600160401b0382111761083257604052565b90601f801991011681019081106001600160401b0382111761083257604052565b604051906108b782610817565b565b604051906108b782610837565b6001600160401b03811161083257601f01601f191660200190565b9291926108ed826108c6565b916108fb6040519384610889565b8294818452818301116101fd578281602093846000960137010152565b9080601f830112156101fd57816020610933933591016108e1565b90565b346101fd5760403660031901126101fd576024356001600160401b0381116101fd5761096961097d913690600401610918565b61097560043533611ed0565b3390806122d4565b50156109a1576020630b135d3f60e11b5b6040516001600160e01b03199091168152f35b60206001600160e01b031961098e565b90815180825260208080930193019160005b8281106109d1575050505090565b835161ffff1916855293810193928101926001016109c3565b6080809180518452610a046020820151602086019061047a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610a48575050505090565b909192938260a082610a5d60019489516109ea565b01950193929101610a3a565b91610a95604091610a8760809497969760a0875260a08701906109b1565b908582036020870152610a28565b94805182850152602081015160608501520151910152565b346101fd576020806003193601126101fd57610ac76103cb565b610acf611e05565b50610ae1610adc82612ce5565b612d94565b90610aec8251612dd6565b9260005b8351811015610b545760019061ffff19610b0a8287611d8f565b5116600090815282845260408082206001600160a01b03871683526020529020610b38906120fd565b6120fd565b610b428288611d8f565b52610b4d8187611d8f565b5001610af0565b505060018060a01b0316600052600260205261054a610b766040600020611e24565b60405193849384610a69565b60206003198201126101fd57600435906001600160401b0382116101fd57610bac916004016103e1565b9091565b346101fd57610bbe36610b82565b610bc733613632565b15610c6b5781019060a0818303126101fd576001600160401b0381358181116101fd57820183601f820112156101fd5783816020610c0793359101611a59565b9260208301358281116101fd5781610c20918501611e9a565b9360408401358381116101fd5782610c39918601611eb5565b60608501359384116101fd5761031595610c5a610c60946080968801611e9a565b92612e26565b919092013591612fff565b60405162dc149f60e41b8152600490fd5b60a06003198201126101fd576001600160401b03906004358281116101fd5781610ca891600401610202565b939093926024358181116101fd5783610cc391600401610202565b939093926044358381116101fd5782610cde91600401610232565b939093926064359182116101fd57610cf891600401610202565b909160843590565b346101fd57610d0e36610c7c565b97969094959293610d1e33613632565b6103a357610d43610c5a94610d3b610d539a610d4b953691611a59565b983691611e4c565b943691611ab7565b933691611e4c565b819291519181518303610f12576000808415159283610de4575b3360009081526002602052604090209495509293610da79390610d9f9093610d9a600286019485546120dd565b612b73565b809255613677565b610dad57005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610ddf6040519283923384612fc9565b0390a1005b60005b868110610df45750610d6d565b91610e3e33610e27610e12610e09878d611d8f565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610e498488611d8f565b51518115610edb57878a82841015610e97579260019492610d9a610e8993610e818a610e7b610e0982610e8f9b611d8f565b92611d8f565b515190613991565b906120dd565b925b01610de7565b8284939497959711610eb0575b50505050600190610e91565b92849792610d9a610e8993610e8188610e7b610e0960019b610ed19b611d8f565b939038878a610ea4565b610f0e610eeb610e09878d611d8f565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b346101fd5760403660031901126101fd576020610f4b610f426103cb565b60243590611ed0565b604051908152f35b346101fd57610f6136610c7c565b97969094959293610f7133613632565b6103a357610d43610c5a94610d3b610f8e9a610d4b953691611a59565b90336000526002602052604060002092610faa845484846138ca565b60028692960192835491820180921161039e57825496870180971161039e5781610ff8947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613677565b610ddf6040519283923384612fc9565b901515815260c0810192916108b791602001906109ea565b346101fd5760603660031901126101fd576110396103cb565b60403660231901126101fd576110799061107360405161105881610817565b6024358152604435602082015261106d61201a565b50613137565b906131a0565b9061054a60405192839283611008565b346101fd5761109736610b82565b50506110a5610adc33612ce5565b6000903382526002602052600180604084200154906110e3336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6111c3575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6111bd887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b6111816111456108b9565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b61118a8161322b565b9061119b6040519283923384612045565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156111e4575b87908352608085208861fffe198254169155916110ed565b9081161580611200575b156111fa5782906111cc565b806110f2565b508015156111ee565b346101fd5760803660031901126101fd576044356001600160a01b03811681036101fd576064356001600160401b0381116101fd5760409161125261125e923690600401610918565b906024356004356122d4565b825191151582526020820152f35b346101fd576020610f4b61127f366107af565b916127e4565b90815180825260208080930193019160005b8281106112a5575050505090565b83516001600160e01b03191685529381019392810192600101611297565b908082519081815260208091019281808460051b8301019501936000915b8483106112f15750505050505090565b9091929394958480611335600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611285565b98019301930191949392906112e1565b80516005811015610487576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061138b575050505090565b909192938260806001926113b383895163ffffffff60e01b8151168452015184830190611345565b0195019392910161137d565b90815180825260208080930193019160005b8281106113df575050505090565b909192938260e06001926114186040895163ffffffff851b815116845261140c8682015187860190611345565b01516080830190611345565b019501939291016113d1565b906109339160208152815190611448610180928360208401526101a0830190611285565b916114c261149661148261146e602088015196601f199788888303016040890152611285565b604088015187878303016060880152611285565b606087015186868303016080870152611285565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526112c3565b61152b6115146114fd6114e660e089015194610100958989830301878a015261136b565b93880151936101209488888303018689015261136b565b92870151926101409387878303018588015261136b565b91860151916101609286868303018487015261136b565b94015192828503019101526113bf565b346101fd576000806003193601126119485761054a906115596129ca565b5061193b6115656129ca565b916115f06115e4611574612a36565b6115936115876040880192808452611cea565b63852b67af60e01b9052565b6115ac6115a08251611cfc565b630b96422d60e01b9052565b6115c56115b98251611d0c565b6371af817b60e01b9052565b6115de6115d28251611d1c565b630b135d3f60e11b9052565b51611d2c565b6377102c3560e01b9052565b6115f86108b9565b600181529061176e6020928284820152826040820152611616612a61565b60e087019081526116436116286108aa565b63852b67af60e01b8152838782015282519061073382611cea565b5061166a61164f6108aa565b630b96422d60e01b8152838782015282519061076982611cfc565b506116916116766108aa565b6371af817b60e01b8152838782015282519061079c82611d0c565b506116be61169d6108aa565b635b0e93fb60e11b815283878201528251906116b882611d1c565b52611d1c565b506116eb6116ca6108aa565b631a7e6adf60e11b815283878201528251906116e582611d2c565b52611d2c565b506117186116f76108aa565b633e15cc3d60e21b8152838782015282519061171282611d3c565b52611d3c565b506117456117246108aa565b63c1a221f360e01b8152838782015282519061173f82611d4c565b52611d4c565b5061174e6108aa565b63278f794360e11b81529185830152519061176882611d5c565b52611d5c565b506117776108b9565b6003815290808383015280604083015261178f6108b9565b6001815290808483015260408201526117fc6117a9612ac3565b9261010087019384526117d86117bd6108aa565b630b135d3f60e11b8152828782015285519061073382611cea565b506117e16108aa565b6377102c3560e01b8152908582015283519061076982611cfc565b506118236118086108aa565b63852b67af60e01b8152828582015283519061079c82611d0c565b5061184a61182f6108aa565b630b96422d60e01b815282858201528351906116b882611d1c565b506118716118566108aa565b6371af817b60e01b815282858201528351906116e582611d2c565b5061189861187d6108aa565b635b0e93fb60e11b8152828582015283519061171282611d3c565b506118bf6118a46108aa565b631a7e6adf60e11b8152828582015283519061173f82611d4c565b506118e66118cb6108aa565b633e15cc3d60e21b8152828582015283519061176882611d5c565b506119136118f26108aa565b63c1a221f360e01b8152828582015283519061190d82611d6d565b52611d6d565b5061191c6108aa565b63278f794360e11b815292830152519061193582611d7e565b52611d7e565b5060405191829182611424565b80fd5b346101fd5760403660031901126101fd57602061197e60405161196d81610817565b600435815260243583820152613137565b6040519061ffff19168152f35b346101fd5760003660031901126101fd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101fd5760203660031901126101fd57602062010000600160b01b036119f56103cb565b60101b16604051908152f35b346101fd5760403660031901126101fd57611079611a1d6103cb565b611a256103b5565b611a2d61201a565b5060101b62010000600160b01b0316906131a0565b6001600160401b0381116108325760051b60200190565b9291611a6482611a42565b91611a726040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611a985750505050565b81356001600160a01b03811681036101fd578152908301908301611a8b565b929192611ac382611a42565b604092611ad36040519283610889565b819581835260208093019160061b8401938185116101fd57915b848310611afc57505050505050565b85838303126101fd578386918251611b1381610817565b853581528286013583820152815201920191611aed565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761083257604052606080838181528160208201528160408201520152565b60405190602082018281106001600160401b038211176108325760405260008252565b60405190611bbd82610837565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611c0082610817565b60058252640312e302e360dc1b6020830152565b60405190611c2182610817565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108325760405260038352829160009160005b606080821015611ca557825160209291611c9282610817565b8682528382015287820183015201611c79565b50505091925050565b60405190611cbb82610817565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611cf75760200190565b611cd4565b805160011015611cf75760400190565b805160021015611cf75760600190565b805160031015611cf75760800190565b805160041015611cf75760a00190565b805160051015611cf75760c00190565b805160061015611cf75760e00190565b805160071015611cf7576101000190565b805160081015611cf7576101200190565b805160091015611cf7576101400190565b8051821015611cf75760209160051b010190565b60405190611db082610817565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611de982610817565b600d82526c52656d6f7665204f776e65727360981b6020830152565b60405190611e1282610837565b60006040838281528260208201520152565b90604051611e3181610837565b60406002829480548452600181015460208501520154910152565b9291611e5782611a42565b91611e656040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611e8b5750505050565b81358152908301908301611e7e565b9080601f830112156101fd5781602061093393359101611e4c565b9080601f830112156101fd5781602061093393359101611ab7565b61093391611fed611ff9611f9b611f3094611ee9611bb0565b611ef1611bf3565b6040519788916020998a9182611f10818401978881519384920161058b565b8201611f248251809386808501910161058b565b01038084520182610889565b519020604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647289820190815260208101939093524691830191909152306060808401919091529290921b6bffffffffffffffffffffffff191660808201529091829060a0830190565b0391611faf601f1993848101835282610889565b51902094604051938491820195869190602060408401937f7dc7da30a002512936154da01baa79a3d1e54e35034ffdfa7c53c28b3091236d81520152565b03908101835282610889565b519020906042916040519161190160f01b8352600283015260228201522090565b6040519061202782610852565b60006080838281528260208201528260408201528260608201520152565b93929161206a9060409260018060a01b031686526060602087015260608601906109b1565b930152565b634e487b7160e01b600052601160045260246000fd5b9060418202918083046041149015171561039e57565b600281901b91906001600160fe1b0381160361039e57565b906041820180921161039e57565b906015820180921161039e57565b906002820180921161039e57565b9190820180921161039e57565b60ff601f199116019060ff821161039e57565b9060405161210a81610852565b80928054825260018101549060ff821690600282101561048757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061215e82610837565b6000604083815161216e81610852565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926121a3816108c6565b916121b16040519384610889565b8294828452828201116101fd5760206108b793019061058b565b9080601f830112156101fd57815161093392602001612196565b519081151582036101fd57565b60209081818403126101fd5780516001600160401b03918282116101fd57016060818503126101fd5760409283519461222a86610837565b82518481116101fd5783019360a0858303126101fd5785519161224c83610852565b85518281116101fd57860181601f820112156101fd5781818661227193519101612196565b8352838601519182116101fd57856122916080926122ad948a99016121cb565b85850152868101518785015260608101516060850152016121e5565b60808201528552808201519085015201519082015290565b600019811461039e5760010190565b939291909160009460418251106126d7576001600160a01b0383166000908152600260205260409020600101549384156127a05760009384928391828483146127945792979460ff60015b16976001995b878110612359575050505050505050508061233f57509190565b604051631007539160e31b81526004810191909152602490fd5b61236a61236584612085565b6120b3565b821515908161278a575b811561277f575b5061275e576123a0838a90604102016020810151906060604082015191015160001a92565b91979088602060ff82161061275457508d6123bb899a6120ea565b9d600019019d5b60ff8116806125d1575050506001600160a01b03811681116125bf578d9862010000600160b01b038260101b169960018060a01b0383168b61243360016124228d610e27838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b16036125a6575b508c518411801561259c575b61258a5761245c6020808f8701015101856120dd565b8d5110612578578e938d8782108015612570575b612566575b61249893612494939290910160200191906001600160a01b03166135b7565b1590565b61254b575b61ffff19808916911681119081159161250a575b506124f1575b506124e36124ea916124dc86610e278a61ffff19166000526001602052604060002090565b54906120dd565b95926122c5565b9194612325565b6124fc575b8a6124b7565b919b50600099508b916124f6565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff199190911660608201526080902054159050386124b1565b90612558575b8b9061249d565b9a509b50819b60009a612551565b9096508690612475565b508715612470565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b5060418410612446565b6125b1575b8e61243a565b9d509e50849e60009d6125ab565b60405163e6c4247b60e01b8152600490fd5b6002036126f357505061ffff199060101b1697612604610b3388610e278c61ffff19166000526001602052604060002090565b6080606082015191015191612617612151565b508d51851180156126e9575b61258a578d61263a602080888401015101876120dd565b9051106126d7578f948e88821080156126cf575b6126c5575b6126b49492826126a361268184602061249499976126959701015160409485809282850101019201016121f2565b928251948591602083019190602083019252565b03601f198101855284610889565b815190602083015192015192613392565b1561249d5790612558578b9061249d565b9097508790612653565b50881561264e565b60405163d245329360e01b8152600490fd5b5060418510612623565b612701939a949291946132b2565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b0390811692909161274291612422908b90610e27565b161461249d5790612558578b9061249d565b98508d8a996123c2565b505099979650505050505050600014612778575060009190565b6000925090565b90508951103861237b565b8381119150612374565b92979460ff600061231f565b60405163d349279d60e01b8152600490fd5b903590601e19813603018212156101fd57018035906001600160401b0382116101fd576020019181360383136101fd57565b9192909260ff83161561281e576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6128539192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612862828501856127b2565b908184519182372061297e61287a60608701876127b2565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470848201528381526128f48161086d565b5190208451602081019182526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016604082015246606082015261294c81608081015b03601f198101835282610889565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b928383146129ba575061299b856129a2926129aa969701906127b2565b36916108e1565b9133916122d4565b50156129b557600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108325760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610832576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b038211176108325760405260088352600083815b6101008110612a9a5750505050565b6020908451612aa881610817565b84815282612ab4611e05565b81830152828501015201612a8b565b6040906040519161016083018381106001600160401b0382111761083257604052600a8352600083815b6101408110612afc5750505050565b6020908451612b0a81610817565b84815282612b16611e05565b81830152828501015201612aed565b90612b2f82611a42565b612b3c6040519182610889565b8281528092612b4d601f1991611a42565b0190602036910137565b9060008051602061491583398151915291820391821161039e57565b9190820391821161039e57565b91908251918215612cd357336000526002602052604090604060002080549480861115612cc157600094855b8851871015612c6657612bdc612494612bd661ffff19612bcc8b8e611d8f565b511661ffff191690565b33613cef565b612c3357612bfb6001916124dc8b610e27610e12610e098d3394611d8f565b96612c2c612c148b610e27610e12610e09863394611d8f565b60036000918281558260018201558260028201550155565b0195612bac565b610f0e86612c44610e098a8d611d8f565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612cac93979450610d9f867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612ca56002870195865492612b73565b8655612b73565b612cbc6040519283923384612045565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612d8b575b15612d705761fffe1985169101600581901b870184018290529360021615612d68576060850152608084205492612d29565b508592612d29565b95935050945050608091506001830160051b01016040528252565b50841515612d36565b908151612da081612b25565b9060005b818110612db2575090925050565b60019061ffff19612dc38288611d8f565b5116612dcf8286611d8f565b5201612da4565b90612de082611a42565b612ded6040519182610889565b8281528092612dfe601f1991611a42565b019060005b828110612e0f57505050565b602090612e1a61201a565b82828501015201612e03565b929093919383519480519282518714801590612fbe575b610f1257612e4e84889794986120dd565b96612e61612e5b89612b25565b98612dd6565b9660009485925b898b848610612f16575050505050506000925b848410612e89575050505050565b612f0e600191612ea9612e9f61032d8888611d8f565b61033d838d611d8f565b612eb38685611d8f565b51612ebe828b611d8f565b51526020600081612ecf848d611d8f565b510152612edc8787611d8f565b51516060612eea848d611d8f565b510152612ef78787611d8f565b5101516080612f06838c611d8f565b5101526122c5565b930192612e7b565b97610347612fb4926040612fa384612f9d612f4b8c9f9c612f698c9d9e61033d8660019e9f612f58612f4b87610e7b93611d8f565b516001600160a01b031690565b60101b62010000600160b01b031690565b612f73818d611d8f565b51612f7e8589611d8f565b5152612f976020612f8f868a611d8f565b510160019052565b8c611d8f565b93611d8f565b516001600160a01b03909216910152565b9601929190612e68565b508051841415612e3d565b6001600160a01b039091168152606060208201819052610933939192612ff1918401906109b1565b916040818403910152610a28565b919283156127a057600093845b83518610156130355761301f8685611d8f565b5151810180911161039e5760019095019461300c565b90939194508381106131005782826130ce7f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1793613097612cbc977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613788565b50508251906130a46108b9565b91825286602083015260408201526111663360018060a01b03166000526002602052604060002090565b6130de6040519283923384612fc9565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b906131336020928281519485920161058b565b0190565b60208151910151811580613198575b6131795760408051602081019384528082019290925281529061316a606083610889565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b508015613146565b9190916131ab61201a565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff19909416606085018190526080909420549093901561322357613217929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109336001926120fd565b505060009190565b6000919082805b82518210156132ac5761ffff19918261324b8286611d8f565b511686526001602081815260408089203360009081529083528190209294919254820180921161039e576001946132a593612c14939761328b878b611d8f565b51168b525288203360009081526020919091526040902090565b0190613232565b93505050565b9161093393916132c1936139f8565b90929192613a86565b906108b7602e60405180946c1131b430b63632b733b2911d1160991b60208301526132ff815180926020602d8601910161058b565b8101601160f91b602d82015203600e810185520183610889565b805160201015611cf75760400190565b6040513d6000823e3d90fd5b602092919061334b84928281519485920161058b565b019081520190565b3d1561337e573d90613364826108c6565b916133726040519384610889565b82523d6000602084013e565b606090565b908160209103126101fd575190565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a883116135ac57602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346133ff835160608601516133f9816120c1565b91613b13565b8981519101200361359f5761341f61342491613419613b96565b90613e7f565b6132ca565b613439825160408501516133f98451826120dd565b888151910120908881519101200361357757600160f81b8061346c61345e8551613319565b516001600160f81b03191690565b1603613577576080820151151580613583575b6135775751866040519182806134986000958694613120565b039060025afa156135725786816134dd815194516134bd604051968792868401613335565b03946134d1601f1996878101835282610889565b60405191828092613120565b039060025afa15613572578051604080518981018381526020810187905291820187905260608201889052608082018990529193839290613522908260a08501611fed565b51906101005afa95613532613353565b9081519780613569575b61354c5750506109339550613bf5565b6001976135659750820181019550019250613383915050565b1490565b5087151561353c565b613329565b50505050505050600090565b50600160fa1b8061359761345e8551613319565b16141561347f565b5050505050505050600090565b505050505050600090565b600091929082916040516135ef8161293e6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ae565b51915afa906135fc613353565b82613624575b8261360c57505090565b9091506020818051810103126101fd57602001511490565b915060208251101591613602565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080902054801590811561366f575090565b600191501690565b6001909201805490929182156136fa578281106136d9575080820361369b57505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b80935081925010613709575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b90805182556001820190602081015190600282101561048757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612cd35782825103610f12576103e883116138aa57906000915b8383106137ba575050509190565b9091946137e16124946137db6137d3610e098a87611d8f565b61ffff191690565b33613dc8565b61389a576137ef8684611d8f565b5151158015613883575b6138455761383c60019161382a6138108987611d8f565b5161382533610e27610e12610e098e8b611d8f565b61372b565b6138348886611d8f565b5151906120dd565b950191906137ac565b5084610e7b610e098261385794611d8f565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f42406138928785611d8f565b5151116137f9565b610f0e610eeb610e098885611d8f565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612cd35783835103610f12576103e86138ef85836120dd565b116139705750906000915b838310613908575050509190565b9091946139216124946137db6137d3610e098a87611d8f565b61389a5761392f8684611d8f565b5151158015613959575b6138455761395060019161382a6138108987611d8f565b950191906138fa565b50620f42406139688785611d8f565b515111613939565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b811580156139ec575b6139bf5761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f4240821161399a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613a7057926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa156135725780516001600160a01b03811615613a6757918190565b50809160019190565b50505060009160039190565b6004111561048757565b613a8f81613a7c565b80613a98575050565b613aa181613a7c565b60018103613abb5760405163f645eedf60e01b8152600490fd5b613ac481613a7c565b60028103613ae55760405163fce698f760e01b815260048101839052602490fd5b80613af1600392613a7c565b14613af95750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613b8e575b81811115613b86575b50828110613b3a57505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613b6f57908290613b57565b505060008583016020015250603f01168201604052565b905038613b2d565b925082613b24565b60405190613ba382610837565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613cd7575b8015613ccf575b8015613cb7575b613cad57613c1f8386613f27565b15613cad5760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614915833981519152948560a084015260208360c0816005600019fa156101fd57613ca79386613ca1945181818909940991613fc8565b91612b57565b90081590565b5050505050600090565b50600080516020614915833981519152821015613c11565b508115613c0a565b50600080516020614915833981519152841015613c03565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613dc0575b613db7576001600060015b15613d8b575b50606084015260808320805460009161fffe198083169190898314613d6a57505091613d3d565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613dad575b5015613da35738613d43565b5060009450505050565b9050151538613d97565b50600093505050565b508015613d32565b9061ffff1916908115613e5057604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613e4757600160809252209182549283158015613e3d575b15613e3157600193505555600190565b90600217905555600190565b5060018416613e21565b50505050600090565b5050600090565b90613e61826108c6565b613e6e6040519182610889565b8281528092612b4d601f19916108c6565b805115613f1d57613eaa613ea5613e9e613e99845161209b565b6120cf565b6003900490565b613e57565b91602083019180805101906020820192835194600085525b838310613ed157505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301613ec2565b5050610933611b8d565b600160601b63ffffffff60c01b031990818110801590613fbe575b8015613fad575b613fa5577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b5080158015613f4957508215613f49565b5081831015613f42565b60009260ff929091848315806146d4575b61357757613fe783836146dc565b90958615806146cc575b61468e575b85811c60028a60fe1c16015b1561467457600186821c1660028a831c60011b16016001811461463b575b6002811461462e575b600314614621575b60009493929419019560019860015b88600019116140ad5750505050505050505060405191606083015260208252602080830152602060408301526000805160206149358339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa156101fd5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b0319808260008051602061493583398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156146035760018c600286838f841c16921c831b1601146145cc575b838c8c6002600182841c168185851c60011b1601146145b9575b6003926001600292841c16921c60011b1601146145b0575b861561459d57600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614387575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a0960008051602061493583398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b031992839081908184800990096000805160206149358339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b60001901979693959493614040565b8661425c57919a9198919550600160601b63ffffffff60c01b0319905080808360008051602061493583398151915209600160601b63ffffffff60c01b03198460008051602061493583398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b0319908180808560008051602061493583398151915209600160601b63ffffffff60c01b0319866000805160206149358339815191520909600160601b63ffffffff60c01b03198560008051602061493583398151915209090997600160601b63ffffffff60c01b03199081808460008051602061493583398151915209600160601b63ffffffff60c01b0319856000805160206149358339815191520909099a600160601b63ffffffff60c01b0319808c60008051602061493583398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b03199283908180808360008051602061493583398151915209600160601b63ffffffff60c01b0319846000805160206149358339815191520909600160601b63ffffffff60c01b03198360008051602061493583398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614378565b60019c50909a8c99509095509050614378565b5050828461421b565b508993508a92508591508d90508c614203565b50506000805160206148f58339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f56141e9565b50949a90999097600160601b63ffffffff60c01b0319039450614378565b9150955084958091614031565b9397508793859350614029565b6000805160206148f583398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59350614020565b60001901600160028188841c16918b841c901b1601614002565b9790946000805160206149158339815191529182039008936000978515806146c4575b15613ff657505050505050505050600090565b5060016146b1565b508115613ff1565b508615613fd9565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592916000805160206148f5833981519152918115614834578083148061482b575b156148145750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe816001840892080960030981808080866000805160206149358339815191520981858009089981600181818b099a099709810393898203900890090893915b60405190602082526020808301526020604083015260608201526000805160206149358339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa156101fd57838080935180950980099009930990565b90915061482292935061483a565b919392916147ae565b5081851461471e565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b9209089509089280808080878009968709948180886000805160206148f583398151915209918180808560008051602061493583398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220d586e4fd303dfab4216400fe9fa3ed6319112d27701f24d09905e2c95485692164736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x118", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x16ec312", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a1404d9e7646b0112c49ae0296d6347c956d0867", + "0x0000000000000000000000008842ea85732f94feeb9cf1ccc7d357c63658e7a4" + ], + "data": "0x00000000000000000000000000000000000000000000000001c002b77a4a994800000000000000000000000000000000000000000000000e1079c972bf6c31280000000000000000000000000000000000000000000007d19740d1edfd466c7600000000000000000000000000000000000000000000000e0eb9c6bb452197e00000000000000000000000000000000000000000000007d19900d4a5779105be", + "blockHash": "0xbc4e1ce45a8787cbcebb382191a5a31bcce1eb6b28fc5e0a02b519a51b9a769f", + "blockNumber": "0x3c80d41", + "transactionHash": "0xcd689785ff3d65d7333ac831707970c459157fa1ac0d057f99f34ea9b133b9c3", + "transactionIndex": "0x58", + "logIndex": "0x2a5", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000001040000000000000000000000000000000800000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000001000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000800000000000000000000100000", + "type": "0x2", + "transactionHash": "0xcd689785ff3d65d7333ac831707970c459157fa1ac0d057f99f34ea9b133b9c3", + "transactionIndex": "0x58", + "blockHash": "0xbc4e1ce45a8787cbcebb382191a5a31bcce1eb6b28fc5e0a02b519a51b9a769f", + "blockNumber": "0x3c80d41", + "gasUsed": "0x3f0a22", + "effectiveGasPrice": "0x77590dc23", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1729795089, + "chain": 137, + "commit": "bf15fa9" +} \ No newline at end of file diff --git a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/137/run-latest.json b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/137/run-latest.json new file mode 100644 index 0000000..68a77dd --- /dev/null +++ b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/137/run-latest.json @@ -0,0 +1,66 @@ +{ + "transactions": [ + { + "hash": "0xcd689785ff3d65d7333ac831707970c459157fa1ac0d057f99f34ea9b133b9c3", + "transactionType": "CREATE2", + "contractName": "WeightedWebauthnMultisigPlugin", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x570c61", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a0346200007757601f62004a1d38819003918201601f19168301916001600160401b038311848410176200007c578084926020946040528339810103126200007757516001600160a01b0381168103620000775760805260405161498a90816200009382396080518181816119a1015261290a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461018d5780630b96422d146101885780630c7ecd84146101425780630cdc271f146101835780631128186d1461017e578063118a53891461017957806315b76b84146101745780631626ba7e1461016f57806346d60eb2146101425780636bbefc891461016a5780636d61fe701461016557806371af817b1461016057806377102c351461015b578063852b67af14610156578063858e6ee4146101515780638a91b0e31461014c578063b139ec6314610147578063bfd151c114610142578063c4db8dd91461013d578063c776313014610138578063c8050ee414610133578063e8eb3cc61461012e578063ef4a7203146101295763f582bceb1461012457600080fd5b611a01565b6119d0565b61198b565b61194b565b61153b565b61126c565b61040e565b611209565b611089565b611020565b610f53565b610f24565b610d00565b610bb0565b610aad565b610936565b6107f3565b6106a9565b61054e565b6104c1565b610262565b346101fd5760203660031901126101fd5760043563ffffffff60e01b81168091036101fd576020906372d61afb60e01b81149081156101d2575b506040519015158152f35b63043140ed60e01b8114915081156101ec575b50386101c7565b6301ffc9a760e01b149050386101e5565b600080fd5b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460051b0101116101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460061b0101116101fd57565b346101fd5760603660031901126101fd576001600160401b036004358181116101fd57610293903690600401610202565b916024359081116101fd576102ac903690600401610232565b926102b633613632565b6103a3576102d1926102c9913691611a59565b923691611ab7565b81519181519182840180851161039e576102ed90949294612b25565b9360009283915b818310610354575050506000915b8383106103175761031560443586612b80565b005b61034c60019161034761033361032d8787611d8f565b51613137565b61033d838a611d8f565b9061ffff19169052565b6122c5565b920191610302565b91939091906001906103959061034761038b6001600160a01b036103788a88611d8f565b511660101b62010000600160b01b031690565b61033d838c611d8f565b940191906102f4565b61206f565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b03821682036101fd57565b600435906001600160a01b03821682036101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd57602083818601950101116101fd57565b346101fd5760803660031901126101fd5760043560ff811681036101fd576024356001600160a01b038116036101fd576064356001600160401b0381116101fd5761045d9036906004016103e1565b5050611b2a565b634e487b7160e01b600052602160045260246000fd5b9060028210156104875752565b610464565b91926104aa608094979695929760a08501988552602085019061047a565b6001600160a01b0316604083015260608201520152565b346101fd5760403660031901126101fd5760043561ffff1981168091036101fd57610513906104ee6103b5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361054a93600881901c6001600160a01b03169160ff909116908661048c565b0390f35b346101fd5760403660031901126101fd5760043560ff811681036101fd576024356001600160401b0381116101fd5761045d9036906004016103e1565b60005b83811061059e5750506000910152565b818101518382015260200161058e565b906020916105c78151809281855285808601910161058b565b601f01601f1916010190565b906020908183526105ef815160808486015260a08501906105ae565b9180820151916060610626610613601f1996604096888a83030160408b01526105ae565b60408401518789830301848a01526105ae565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061066057505050505050505090565b909192939495969786806106978387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ae565b9a01950195019396959492919061064e565b346101fd5760003660031901126101fd576106c2611b59565b5061054a6106ce611b59565b6106d6611bb0565b81526106e0611bf3565b60208201526106ed611c14565b60408201526107a26106fd611c4d565b6060830190815261073961070f611cae565b6107176108aa565b63852b67af60e01b815290602082015282519061073382611cea565b52611cea565b5061076f610745611da3565b61074d6108aa565b6371af817b60e01b815290602082015282519061076982611cfc565b52611cfc565b50610778611ddc565b906107816108aa565b630b96422d60e01b8152916020830152519061079c82611d0c565b52611d0c565b50604051918291826105d3565b906003196060818401126101fd5760043560ff811681036101fd5792602435916001600160401b0383116101fd5782610120920301126101fd576004019060443590565b346101fd5761045d366107af565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761083257604052565b610801565b606081019081106001600160401b0382111761083257604052565b60a081019081106001600160401b0382111761083257604052565b61012081019081106001600160401b0382111761083257604052565b90601f801991011681019081106001600160401b0382111761083257604052565b604051906108b782610817565b565b604051906108b782610837565b6001600160401b03811161083257601f01601f191660200190565b9291926108ed826108c6565b916108fb6040519384610889565b8294818452818301116101fd578281602093846000960137010152565b9080601f830112156101fd57816020610933933591016108e1565b90565b346101fd5760403660031901126101fd576024356001600160401b0381116101fd5761096961097d913690600401610918565b61097560043533611ed0565b3390806122d4565b50156109a1576020630b135d3f60e11b5b6040516001600160e01b03199091168152f35b60206001600160e01b031961098e565b90815180825260208080930193019160005b8281106109d1575050505090565b835161ffff1916855293810193928101926001016109c3565b6080809180518452610a046020820151602086019061047a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610a48575050505090565b909192938260a082610a5d60019489516109ea565b01950193929101610a3a565b91610a95604091610a8760809497969760a0875260a08701906109b1565b908582036020870152610a28565b94805182850152602081015160608501520151910152565b346101fd576020806003193601126101fd57610ac76103cb565b610acf611e05565b50610ae1610adc82612ce5565b612d94565b90610aec8251612dd6565b9260005b8351811015610b545760019061ffff19610b0a8287611d8f565b5116600090815282845260408082206001600160a01b03871683526020529020610b38906120fd565b6120fd565b610b428288611d8f565b52610b4d8187611d8f565b5001610af0565b505060018060a01b0316600052600260205261054a610b766040600020611e24565b60405193849384610a69565b60206003198201126101fd57600435906001600160401b0382116101fd57610bac916004016103e1565b9091565b346101fd57610bbe36610b82565b610bc733613632565b15610c6b5781019060a0818303126101fd576001600160401b0381358181116101fd57820183601f820112156101fd5783816020610c0793359101611a59565b9260208301358281116101fd5781610c20918501611e9a565b9360408401358381116101fd5782610c39918601611eb5565b60608501359384116101fd5761031595610c5a610c60946080968801611e9a565b92612e26565b919092013591612fff565b60405162dc149f60e41b8152600490fd5b60a06003198201126101fd576001600160401b03906004358281116101fd5781610ca891600401610202565b939093926024358181116101fd5783610cc391600401610202565b939093926044358381116101fd5782610cde91600401610232565b939093926064359182116101fd57610cf891600401610202565b909160843590565b346101fd57610d0e36610c7c565b97969094959293610d1e33613632565b6103a357610d43610c5a94610d3b610d539a610d4b953691611a59565b983691611e4c565b943691611ab7565b933691611e4c565b819291519181518303610f12576000808415159283610de4575b3360009081526002602052604090209495509293610da79390610d9f9093610d9a600286019485546120dd565b612b73565b809255613677565b610dad57005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610ddf6040519283923384612fc9565b0390a1005b60005b868110610df45750610d6d565b91610e3e33610e27610e12610e09878d611d8f565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610e498488611d8f565b51518115610edb57878a82841015610e97579260019492610d9a610e8993610e818a610e7b610e0982610e8f9b611d8f565b92611d8f565b515190613991565b906120dd565b925b01610de7565b8284939497959711610eb0575b50505050600190610e91565b92849792610d9a610e8993610e8188610e7b610e0960019b610ed19b611d8f565b939038878a610ea4565b610f0e610eeb610e09878d611d8f565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b346101fd5760403660031901126101fd576020610f4b610f426103cb565b60243590611ed0565b604051908152f35b346101fd57610f6136610c7c565b97969094959293610f7133613632565b6103a357610d43610c5a94610d3b610f8e9a610d4b953691611a59565b90336000526002602052604060002092610faa845484846138ca565b60028692960192835491820180921161039e57825496870180971161039e5781610ff8947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613677565b610ddf6040519283923384612fc9565b901515815260c0810192916108b791602001906109ea565b346101fd5760603660031901126101fd576110396103cb565b60403660231901126101fd576110799061107360405161105881610817565b6024358152604435602082015261106d61201a565b50613137565b906131a0565b9061054a60405192839283611008565b346101fd5761109736610b82565b50506110a5610adc33612ce5565b6000903382526002602052600180604084200154906110e3336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6111c3575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6111bd887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b6111816111456108b9565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b61118a8161322b565b9061119b6040519283923384612045565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156111e4575b87908352608085208861fffe198254169155916110ed565b9081161580611200575b156111fa5782906111cc565b806110f2565b508015156111ee565b346101fd5760803660031901126101fd576044356001600160a01b03811681036101fd576064356001600160401b0381116101fd5760409161125261125e923690600401610918565b906024356004356122d4565b825191151582526020820152f35b346101fd576020610f4b61127f366107af565b916127e4565b90815180825260208080930193019160005b8281106112a5575050505090565b83516001600160e01b03191685529381019392810192600101611297565b908082519081815260208091019281808460051b8301019501936000915b8483106112f15750505050505090565b9091929394958480611335600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611285565b98019301930191949392906112e1565b80516005811015610487576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061138b575050505090565b909192938260806001926113b383895163ffffffff60e01b8151168452015184830190611345565b0195019392910161137d565b90815180825260208080930193019160005b8281106113df575050505090565b909192938260e06001926114186040895163ffffffff851b815116845261140c8682015187860190611345565b01516080830190611345565b019501939291016113d1565b906109339160208152815190611448610180928360208401526101a0830190611285565b916114c261149661148261146e602088015196601f199788888303016040890152611285565b604088015187878303016060880152611285565b606087015186868303016080870152611285565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526112c3565b61152b6115146114fd6114e660e089015194610100958989830301878a015261136b565b93880151936101209488888303018689015261136b565b92870151926101409387878303018588015261136b565b91860151916101609286868303018487015261136b565b94015192828503019101526113bf565b346101fd576000806003193601126119485761054a906115596129ca565b5061193b6115656129ca565b916115f06115e4611574612a36565b6115936115876040880192808452611cea565b63852b67af60e01b9052565b6115ac6115a08251611cfc565b630b96422d60e01b9052565b6115c56115b98251611d0c565b6371af817b60e01b9052565b6115de6115d28251611d1c565b630b135d3f60e11b9052565b51611d2c565b6377102c3560e01b9052565b6115f86108b9565b600181529061176e6020928284820152826040820152611616612a61565b60e087019081526116436116286108aa565b63852b67af60e01b8152838782015282519061073382611cea565b5061166a61164f6108aa565b630b96422d60e01b8152838782015282519061076982611cfc565b506116916116766108aa565b6371af817b60e01b8152838782015282519061079c82611d0c565b506116be61169d6108aa565b635b0e93fb60e11b815283878201528251906116b882611d1c565b52611d1c565b506116eb6116ca6108aa565b631a7e6adf60e11b815283878201528251906116e582611d2c565b52611d2c565b506117186116f76108aa565b633e15cc3d60e21b8152838782015282519061171282611d3c565b52611d3c565b506117456117246108aa565b63c1a221f360e01b8152838782015282519061173f82611d4c565b52611d4c565b5061174e6108aa565b63278f794360e11b81529185830152519061176882611d5c565b52611d5c565b506117776108b9565b6003815290808383015280604083015261178f6108b9565b6001815290808483015260408201526117fc6117a9612ac3565b9261010087019384526117d86117bd6108aa565b630b135d3f60e11b8152828782015285519061073382611cea565b506117e16108aa565b6377102c3560e01b8152908582015283519061076982611cfc565b506118236118086108aa565b63852b67af60e01b8152828582015283519061079c82611d0c565b5061184a61182f6108aa565b630b96422d60e01b815282858201528351906116b882611d1c565b506118716118566108aa565b6371af817b60e01b815282858201528351906116e582611d2c565b5061189861187d6108aa565b635b0e93fb60e11b8152828582015283519061171282611d3c565b506118bf6118a46108aa565b631a7e6adf60e11b8152828582015283519061173f82611d4c565b506118e66118cb6108aa565b633e15cc3d60e21b8152828582015283519061176882611d5c565b506119136118f26108aa565b63c1a221f360e01b8152828582015283519061190d82611d6d565b52611d6d565b5061191c6108aa565b63278f794360e11b815292830152519061193582611d7e565b52611d7e565b5060405191829182611424565b80fd5b346101fd5760403660031901126101fd57602061197e60405161196d81610817565b600435815260243583820152613137565b6040519061ffff19168152f35b346101fd5760003660031901126101fd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101fd5760203660031901126101fd57602062010000600160b01b036119f56103cb565b60101b16604051908152f35b346101fd5760403660031901126101fd57611079611a1d6103cb565b611a256103b5565b611a2d61201a565b5060101b62010000600160b01b0316906131a0565b6001600160401b0381116108325760051b60200190565b9291611a6482611a42565b91611a726040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611a985750505050565b81356001600160a01b03811681036101fd578152908301908301611a8b565b929192611ac382611a42565b604092611ad36040519283610889565b819581835260208093019160061b8401938185116101fd57915b848310611afc57505050505050565b85838303126101fd578386918251611b1381610817565b853581528286013583820152815201920191611aed565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761083257604052606080838181528160208201528160408201520152565b60405190602082018281106001600160401b038211176108325760405260008252565b60405190611bbd82610837565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611c0082610817565b60058252640312e302e360dc1b6020830152565b60405190611c2182610817565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108325760405260038352829160009160005b606080821015611ca557825160209291611c9282610817565b8682528382015287820183015201611c79565b50505091925050565b60405190611cbb82610817565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611cf75760200190565b611cd4565b805160011015611cf75760400190565b805160021015611cf75760600190565b805160031015611cf75760800190565b805160041015611cf75760a00190565b805160051015611cf75760c00190565b805160061015611cf75760e00190565b805160071015611cf7576101000190565b805160081015611cf7576101200190565b805160091015611cf7576101400190565b8051821015611cf75760209160051b010190565b60405190611db082610817565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611de982610817565b600d82526c52656d6f7665204f776e65727360981b6020830152565b60405190611e1282610837565b60006040838281528260208201520152565b90604051611e3181610837565b60406002829480548452600181015460208501520154910152565b9291611e5782611a42565b91611e656040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611e8b5750505050565b81358152908301908301611e7e565b9080601f830112156101fd5781602061093393359101611e4c565b9080601f830112156101fd5781602061093393359101611ab7565b61093391611fed611ff9611f9b611f3094611ee9611bb0565b611ef1611bf3565b6040519788916020998a9182611f10818401978881519384920161058b565b8201611f248251809386808501910161058b565b01038084520182610889565b519020604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647289820190815260208101939093524691830191909152306060808401919091529290921b6bffffffffffffffffffffffff191660808201529091829060a0830190565b0391611faf601f1993848101835282610889565b51902094604051938491820195869190602060408401937f7dc7da30a002512936154da01baa79a3d1e54e35034ffdfa7c53c28b3091236d81520152565b03908101835282610889565b519020906042916040519161190160f01b8352600283015260228201522090565b6040519061202782610852565b60006080838281528260208201528260408201528260608201520152565b93929161206a9060409260018060a01b031686526060602087015260608601906109b1565b930152565b634e487b7160e01b600052601160045260246000fd5b9060418202918083046041149015171561039e57565b600281901b91906001600160fe1b0381160361039e57565b906041820180921161039e57565b906015820180921161039e57565b906002820180921161039e57565b9190820180921161039e57565b60ff601f199116019060ff821161039e57565b9060405161210a81610852565b80928054825260018101549060ff821690600282101561048757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061215e82610837565b6000604083815161216e81610852565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926121a3816108c6565b916121b16040519384610889565b8294828452828201116101fd5760206108b793019061058b565b9080601f830112156101fd57815161093392602001612196565b519081151582036101fd57565b60209081818403126101fd5780516001600160401b03918282116101fd57016060818503126101fd5760409283519461222a86610837565b82518481116101fd5783019360a0858303126101fd5785519161224c83610852565b85518281116101fd57860181601f820112156101fd5781818661227193519101612196565b8352838601519182116101fd57856122916080926122ad948a99016121cb565b85850152868101518785015260608101516060850152016121e5565b60808201528552808201519085015201519082015290565b600019811461039e5760010190565b939291909160009460418251106126d7576001600160a01b0383166000908152600260205260409020600101549384156127a05760009384928391828483146127945792979460ff60015b16976001995b878110612359575050505050505050508061233f57509190565b604051631007539160e31b81526004810191909152602490fd5b61236a61236584612085565b6120b3565b821515908161278a575b811561277f575b5061275e576123a0838a90604102016020810151906060604082015191015160001a92565b91979088602060ff82161061275457508d6123bb899a6120ea565b9d600019019d5b60ff8116806125d1575050506001600160a01b03811681116125bf578d9862010000600160b01b038260101b169960018060a01b0383168b61243360016124228d610e27838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b16036125a6575b508c518411801561259c575b61258a5761245c6020808f8701015101856120dd565b8d5110612578578e938d8782108015612570575b612566575b61249893612494939290910160200191906001600160a01b03166135b7565b1590565b61254b575b61ffff19808916911681119081159161250a575b506124f1575b506124e36124ea916124dc86610e278a61ffff19166000526001602052604060002090565b54906120dd565b95926122c5565b9194612325565b6124fc575b8a6124b7565b919b50600099508b916124f6565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff199190911660608201526080902054159050386124b1565b90612558575b8b9061249d565b9a509b50819b60009a612551565b9096508690612475565b508715612470565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b5060418410612446565b6125b1575b8e61243a565b9d509e50849e60009d6125ab565b60405163e6c4247b60e01b8152600490fd5b6002036126f357505061ffff199060101b1697612604610b3388610e278c61ffff19166000526001602052604060002090565b6080606082015191015191612617612151565b508d51851180156126e9575b61258a578d61263a602080888401015101876120dd565b9051106126d7578f948e88821080156126cf575b6126c5575b6126b49492826126a361268184602061249499976126959701015160409485809282850101019201016121f2565b928251948591602083019190602083019252565b03601f198101855284610889565b815190602083015192015192613392565b1561249d5790612558578b9061249d565b9097508790612653565b50881561264e565b60405163d245329360e01b8152600490fd5b5060418510612623565b612701939a949291946132b2565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b0390811692909161274291612422908b90610e27565b161461249d5790612558578b9061249d565b98508d8a996123c2565b505099979650505050505050600014612778575060009190565b6000925090565b90508951103861237b565b8381119150612374565b92979460ff600061231f565b60405163d349279d60e01b8152600490fd5b903590601e19813603018212156101fd57018035906001600160401b0382116101fd576020019181360383136101fd57565b9192909260ff83161561281e576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6128539192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612862828501856127b2565b908184519182372061297e61287a60608701876127b2565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470848201528381526128f48161086d565b5190208451602081019182526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016604082015246606082015261294c81608081015b03601f198101835282610889565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b928383146129ba575061299b856129a2926129aa969701906127b2565b36916108e1565b9133916122d4565b50156129b557600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108325760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610832576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b038211176108325760405260088352600083815b6101008110612a9a5750505050565b6020908451612aa881610817565b84815282612ab4611e05565b81830152828501015201612a8b565b6040906040519161016083018381106001600160401b0382111761083257604052600a8352600083815b6101408110612afc5750505050565b6020908451612b0a81610817565b84815282612b16611e05565b81830152828501015201612aed565b90612b2f82611a42565b612b3c6040519182610889565b8281528092612b4d601f1991611a42565b0190602036910137565b9060008051602061491583398151915291820391821161039e57565b9190820391821161039e57565b91908251918215612cd357336000526002602052604090604060002080549480861115612cc157600094855b8851871015612c6657612bdc612494612bd661ffff19612bcc8b8e611d8f565b511661ffff191690565b33613cef565b612c3357612bfb6001916124dc8b610e27610e12610e098d3394611d8f565b96612c2c612c148b610e27610e12610e09863394611d8f565b60036000918281558260018201558260028201550155565b0195612bac565b610f0e86612c44610e098a8d611d8f565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612cac93979450610d9f867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612ca56002870195865492612b73565b8655612b73565b612cbc6040519283923384612045565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612d8b575b15612d705761fffe1985169101600581901b870184018290529360021615612d68576060850152608084205492612d29565b508592612d29565b95935050945050608091506001830160051b01016040528252565b50841515612d36565b908151612da081612b25565b9060005b818110612db2575090925050565b60019061ffff19612dc38288611d8f565b5116612dcf8286611d8f565b5201612da4565b90612de082611a42565b612ded6040519182610889565b8281528092612dfe601f1991611a42565b019060005b828110612e0f57505050565b602090612e1a61201a565b82828501015201612e03565b929093919383519480519282518714801590612fbe575b610f1257612e4e84889794986120dd565b96612e61612e5b89612b25565b98612dd6565b9660009485925b898b848610612f16575050505050506000925b848410612e89575050505050565b612f0e600191612ea9612e9f61032d8888611d8f565b61033d838d611d8f565b612eb38685611d8f565b51612ebe828b611d8f565b51526020600081612ecf848d611d8f565b510152612edc8787611d8f565b51516060612eea848d611d8f565b510152612ef78787611d8f565b5101516080612f06838c611d8f565b5101526122c5565b930192612e7b565b97610347612fb4926040612fa384612f9d612f4b8c9f9c612f698c9d9e61033d8660019e9f612f58612f4b87610e7b93611d8f565b516001600160a01b031690565b60101b62010000600160b01b031690565b612f73818d611d8f565b51612f7e8589611d8f565b5152612f976020612f8f868a611d8f565b510160019052565b8c611d8f565b93611d8f565b516001600160a01b03909216910152565b9601929190612e68565b508051841415612e3d565b6001600160a01b039091168152606060208201819052610933939192612ff1918401906109b1565b916040818403910152610a28565b919283156127a057600093845b83518610156130355761301f8685611d8f565b5151810180911161039e5760019095019461300c565b90939194508381106131005782826130ce7f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1793613097612cbc977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613788565b50508251906130a46108b9565b91825286602083015260408201526111663360018060a01b03166000526002602052604060002090565b6130de6040519283923384612fc9565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b906131336020928281519485920161058b565b0190565b60208151910151811580613198575b6131795760408051602081019384528082019290925281529061316a606083610889565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b508015613146565b9190916131ab61201a565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff19909416606085018190526080909420549093901561322357613217929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109336001926120fd565b505060009190565b6000919082805b82518210156132ac5761ffff19918261324b8286611d8f565b511686526001602081815260408089203360009081529083528190209294919254820180921161039e576001946132a593612c14939761328b878b611d8f565b51168b525288203360009081526020919091526040902090565b0190613232565b93505050565b9161093393916132c1936139f8565b90929192613a86565b906108b7602e60405180946c1131b430b63632b733b2911d1160991b60208301526132ff815180926020602d8601910161058b565b8101601160f91b602d82015203600e810185520183610889565b805160201015611cf75760400190565b6040513d6000823e3d90fd5b602092919061334b84928281519485920161058b565b019081520190565b3d1561337e573d90613364826108c6565b916133726040519384610889565b82523d6000602084013e565b606090565b908160209103126101fd575190565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a883116135ac57602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346133ff835160608601516133f9816120c1565b91613b13565b8981519101200361359f5761341f61342491613419613b96565b90613e7f565b6132ca565b613439825160408501516133f98451826120dd565b888151910120908881519101200361357757600160f81b8061346c61345e8551613319565b516001600160f81b03191690565b1603613577576080820151151580613583575b6135775751866040519182806134986000958694613120565b039060025afa156135725786816134dd815194516134bd604051968792868401613335565b03946134d1601f1996878101835282610889565b60405191828092613120565b039060025afa15613572578051604080518981018381526020810187905291820187905260608201889052608082018990529193839290613522908260a08501611fed565b51906101005afa95613532613353565b9081519780613569575b61354c5750506109339550613bf5565b6001976135659750820181019550019250613383915050565b1490565b5087151561353c565b613329565b50505050505050600090565b50600160fa1b8061359761345e8551613319565b16141561347f565b5050505050505050600090565b505050505050600090565b600091929082916040516135ef8161293e6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ae565b51915afa906135fc613353565b82613624575b8261360c57505090565b9091506020818051810103126101fd57602001511490565b915060208251101591613602565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080902054801590811561366f575090565b600191501690565b6001909201805490929182156136fa578281106136d9575080820361369b57505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b80935081925010613709575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b90805182556001820190602081015190600282101561048757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612cd35782825103610f12576103e883116138aa57906000915b8383106137ba575050509190565b9091946137e16124946137db6137d3610e098a87611d8f565b61ffff191690565b33613dc8565b61389a576137ef8684611d8f565b5151158015613883575b6138455761383c60019161382a6138108987611d8f565b5161382533610e27610e12610e098e8b611d8f565b61372b565b6138348886611d8f565b5151906120dd565b950191906137ac565b5084610e7b610e098261385794611d8f565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f42406138928785611d8f565b5151116137f9565b610f0e610eeb610e098885611d8f565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612cd35783835103610f12576103e86138ef85836120dd565b116139705750906000915b838310613908575050509190565b9091946139216124946137db6137d3610e098a87611d8f565b61389a5761392f8684611d8f565b5151158015613959575b6138455761395060019161382a6138108987611d8f565b950191906138fa565b50620f42406139688785611d8f565b515111613939565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b811580156139ec575b6139bf5761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f4240821161399a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613a7057926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa156135725780516001600160a01b03811615613a6757918190565b50809160019190565b50505060009160039190565b6004111561048757565b613a8f81613a7c565b80613a98575050565b613aa181613a7c565b60018103613abb5760405163f645eedf60e01b8152600490fd5b613ac481613a7c565b60028103613ae55760405163fce698f760e01b815260048101839052602490fd5b80613af1600392613a7c565b14613af95750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613b8e575b81811115613b86575b50828110613b3a57505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613b6f57908290613b57565b505060008583016020015250603f01168201604052565b905038613b2d565b925082613b24565b60405190613ba382610837565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613cd7575b8015613ccf575b8015613cb7575b613cad57613c1f8386613f27565b15613cad5760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614915833981519152948560a084015260208360c0816005600019fa156101fd57613ca79386613ca1945181818909940991613fc8565b91612b57565b90081590565b5050505050600090565b50600080516020614915833981519152821015613c11565b508115613c0a565b50600080516020614915833981519152841015613c03565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613dc0575b613db7576001600060015b15613d8b575b50606084015260808320805460009161fffe198083169190898314613d6a57505091613d3d565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613dad575b5015613da35738613d43565b5060009450505050565b9050151538613d97565b50600093505050565b508015613d32565b9061ffff1916908115613e5057604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613e4757600160809252209182549283158015613e3d575b15613e3157600193505555600190565b90600217905555600190565b5060018416613e21565b50505050600090565b5050600090565b90613e61826108c6565b613e6e6040519182610889565b8281528092612b4d601f19916108c6565b805115613f1d57613eaa613ea5613e9e613e99845161209b565b6120cf565b6003900490565b613e57565b91602083019180805101906020820192835194600085525b838310613ed157505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301613ec2565b5050610933611b8d565b600160601b63ffffffff60c01b031990818110801590613fbe575b8015613fad575b613fa5577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b5080158015613f4957508215613f49565b5081831015613f42565b60009260ff929091848315806146d4575b61357757613fe783836146dc565b90958615806146cc575b61468e575b85811c60028a60fe1c16015b1561467457600186821c1660028a831c60011b16016001811461463b575b6002811461462e575b600314614621575b60009493929419019560019860015b88600019116140ad5750505050505050505060405191606083015260208252602080830152602060408301526000805160206149358339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa156101fd5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b0319808260008051602061493583398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156146035760018c600286838f841c16921c831b1601146145cc575b838c8c6002600182841c168185851c60011b1601146145b9575b6003926001600292841c16921c60011b1601146145b0575b861561459d57600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614387575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a0960008051602061493583398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b031992839081908184800990096000805160206149358339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b60001901979693959493614040565b8661425c57919a9198919550600160601b63ffffffff60c01b0319905080808360008051602061493583398151915209600160601b63ffffffff60c01b03198460008051602061493583398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b0319908180808560008051602061493583398151915209600160601b63ffffffff60c01b0319866000805160206149358339815191520909600160601b63ffffffff60c01b03198560008051602061493583398151915209090997600160601b63ffffffff60c01b03199081808460008051602061493583398151915209600160601b63ffffffff60c01b0319856000805160206149358339815191520909099a600160601b63ffffffff60c01b0319808c60008051602061493583398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b03199283908180808360008051602061493583398151915209600160601b63ffffffff60c01b0319846000805160206149358339815191520909600160601b63ffffffff60c01b03198360008051602061493583398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614378565b60019c50909a8c99509095509050614378565b5050828461421b565b508993508a92508591508d90508c614203565b50506000805160206148f58339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f56141e9565b50949a90999097600160601b63ffffffff60c01b0319039450614378565b9150955084958091614031565b9397508793859350614029565b6000805160206148f583398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59350614020565b60001901600160028188841c16918b841c901b1601614002565b9790946000805160206149158339815191529182039008936000978515806146c4575b15613ff657505050505050505050600090565b5060016146b1565b508115613ff1565b508615613fd9565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592916000805160206148f5833981519152918115614834578083148061482b575b156148145750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe816001840892080960030981808080866000805160206149358339815191520981858009089981600181818b099a099709810393898203900890090893915b60405190602082526020808301526020604083015260608201526000805160206149358339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa156101fd57838080935180950980099009930990565b90915061482292935061483a565b919392916147ae565b5081851461471e565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b9209089509089280808080878009968709948180886000805160206148f583398151915209918180808560008051602061493583398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220d586e4fd303dfab4216400fe9fa3ed6319112d27701f24d09905e2c95485692164736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x118", + "chainId": "0x89" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x16ec312", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a1404d9e7646b0112c49ae0296d6347c956d0867", + "0x0000000000000000000000008842ea85732f94feeb9cf1ccc7d357c63658e7a4" + ], + "data": "0x00000000000000000000000000000000000000000000000001c002b77a4a994800000000000000000000000000000000000000000000000e1079c972bf6c31280000000000000000000000000000000000000000000007d19740d1edfd466c7600000000000000000000000000000000000000000000000e0eb9c6bb452197e00000000000000000000000000000000000000000000007d19900d4a5779105be", + "blockHash": "0xbc4e1ce45a8787cbcebb382191a5a31bcce1eb6b28fc5e0a02b519a51b9a769f", + "blockNumber": "0x3c80d41", + "transactionHash": "0xcd689785ff3d65d7333ac831707970c459157fa1ac0d057f99f34ea9b133b9c3", + "transactionIndex": "0x58", + "logIndex": "0x2a5", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000001040000000000000000000000000000000800000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000001000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000800000000000000000000100000", + "type": "0x2", + "transactionHash": "0xcd689785ff3d65d7333ac831707970c459157fa1ac0d057f99f34ea9b133b9c3", + "transactionIndex": "0x58", + "blockHash": "0xbc4e1ce45a8787cbcebb382191a5a31bcce1eb6b28fc5e0a02b519a51b9a769f", + "blockNumber": "0x3c80d41", + "gasUsed": "0x3f0a22", + "effectiveGasPrice": "0x77590dc23", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1729795089, + "chain": 137, + "commit": "bf15fa9" +} \ No newline at end of file diff --git a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/42161/run-1729795217.json b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/42161/run-1729795217.json new file mode 100644 index 0000000..b17c769 --- /dev/null +++ b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/42161/run-1729795217.json @@ -0,0 +1,51 @@ +{ + "transactions": [ + { + "hash": "0x4150bf612ecad1efda612b3f2aa9df7f0854c4860a5a44439e9020dfc8e5c07b", + "transactionType": "CREATE2", + "contractName": "WeightedWebauthnMultisigPlugin", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xb57a7b", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a0346200007757601f62004a1d38819003918201601f19168301916001600160401b038311848410176200007c578084926020946040528339810103126200007757516001600160a01b0381168103620000775760805260405161498a90816200009382396080518181816119a1015261290a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461018d5780630b96422d146101885780630c7ecd84146101425780630cdc271f146101835780631128186d1461017e578063118a53891461017957806315b76b84146101745780631626ba7e1461016f57806346d60eb2146101425780636bbefc891461016a5780636d61fe701461016557806371af817b1461016057806377102c351461015b578063852b67af14610156578063858e6ee4146101515780638a91b0e31461014c578063b139ec6314610147578063bfd151c114610142578063c4db8dd91461013d578063c776313014610138578063c8050ee414610133578063e8eb3cc61461012e578063ef4a7203146101295763f582bceb1461012457600080fd5b611a01565b6119d0565b61198b565b61194b565b61153b565b61126c565b61040e565b611209565b611089565b611020565b610f53565b610f24565b610d00565b610bb0565b610aad565b610936565b6107f3565b6106a9565b61054e565b6104c1565b610262565b346101fd5760203660031901126101fd5760043563ffffffff60e01b81168091036101fd576020906372d61afb60e01b81149081156101d2575b506040519015158152f35b63043140ed60e01b8114915081156101ec575b50386101c7565b6301ffc9a760e01b149050386101e5565b600080fd5b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460051b0101116101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460061b0101116101fd57565b346101fd5760603660031901126101fd576001600160401b036004358181116101fd57610293903690600401610202565b916024359081116101fd576102ac903690600401610232565b926102b633613632565b6103a3576102d1926102c9913691611a59565b923691611ab7565b81519181519182840180851161039e576102ed90949294612b25565b9360009283915b818310610354575050506000915b8383106103175761031560443586612b80565b005b61034c60019161034761033361032d8787611d8f565b51613137565b61033d838a611d8f565b9061ffff19169052565b6122c5565b920191610302565b91939091906001906103959061034761038b6001600160a01b036103788a88611d8f565b511660101b62010000600160b01b031690565b61033d838c611d8f565b940191906102f4565b61206f565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b03821682036101fd57565b600435906001600160a01b03821682036101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd57602083818601950101116101fd57565b346101fd5760803660031901126101fd5760043560ff811681036101fd576024356001600160a01b038116036101fd576064356001600160401b0381116101fd5761045d9036906004016103e1565b5050611b2a565b634e487b7160e01b600052602160045260246000fd5b9060028210156104875752565b610464565b91926104aa608094979695929760a08501988552602085019061047a565b6001600160a01b0316604083015260608201520152565b346101fd5760403660031901126101fd5760043561ffff1981168091036101fd57610513906104ee6103b5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361054a93600881901c6001600160a01b03169160ff909116908661048c565b0390f35b346101fd5760403660031901126101fd5760043560ff811681036101fd576024356001600160401b0381116101fd5761045d9036906004016103e1565b60005b83811061059e5750506000910152565b818101518382015260200161058e565b906020916105c78151809281855285808601910161058b565b601f01601f1916010190565b906020908183526105ef815160808486015260a08501906105ae565b9180820151916060610626610613601f1996604096888a83030160408b01526105ae565b60408401518789830301848a01526105ae565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061066057505050505050505090565b909192939495969786806106978387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ae565b9a01950195019396959492919061064e565b346101fd5760003660031901126101fd576106c2611b59565b5061054a6106ce611b59565b6106d6611bb0565b81526106e0611bf3565b60208201526106ed611c14565b60408201526107a26106fd611c4d565b6060830190815261073961070f611cae565b6107176108aa565b63852b67af60e01b815290602082015282519061073382611cea565b52611cea565b5061076f610745611da3565b61074d6108aa565b6371af817b60e01b815290602082015282519061076982611cfc565b52611cfc565b50610778611ddc565b906107816108aa565b630b96422d60e01b8152916020830152519061079c82611d0c565b52611d0c565b50604051918291826105d3565b906003196060818401126101fd5760043560ff811681036101fd5792602435916001600160401b0383116101fd5782610120920301126101fd576004019060443590565b346101fd5761045d366107af565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761083257604052565b610801565b606081019081106001600160401b0382111761083257604052565b60a081019081106001600160401b0382111761083257604052565b61012081019081106001600160401b0382111761083257604052565b90601f801991011681019081106001600160401b0382111761083257604052565b604051906108b782610817565b565b604051906108b782610837565b6001600160401b03811161083257601f01601f191660200190565b9291926108ed826108c6565b916108fb6040519384610889565b8294818452818301116101fd578281602093846000960137010152565b9080601f830112156101fd57816020610933933591016108e1565b90565b346101fd5760403660031901126101fd576024356001600160401b0381116101fd5761096961097d913690600401610918565b61097560043533611ed0565b3390806122d4565b50156109a1576020630b135d3f60e11b5b6040516001600160e01b03199091168152f35b60206001600160e01b031961098e565b90815180825260208080930193019160005b8281106109d1575050505090565b835161ffff1916855293810193928101926001016109c3565b6080809180518452610a046020820151602086019061047a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610a48575050505090565b909192938260a082610a5d60019489516109ea565b01950193929101610a3a565b91610a95604091610a8760809497969760a0875260a08701906109b1565b908582036020870152610a28565b94805182850152602081015160608501520151910152565b346101fd576020806003193601126101fd57610ac76103cb565b610acf611e05565b50610ae1610adc82612ce5565b612d94565b90610aec8251612dd6565b9260005b8351811015610b545760019061ffff19610b0a8287611d8f565b5116600090815282845260408082206001600160a01b03871683526020529020610b38906120fd565b6120fd565b610b428288611d8f565b52610b4d8187611d8f565b5001610af0565b505060018060a01b0316600052600260205261054a610b766040600020611e24565b60405193849384610a69565b60206003198201126101fd57600435906001600160401b0382116101fd57610bac916004016103e1565b9091565b346101fd57610bbe36610b82565b610bc733613632565b15610c6b5781019060a0818303126101fd576001600160401b0381358181116101fd57820183601f820112156101fd5783816020610c0793359101611a59565b9260208301358281116101fd5781610c20918501611e9a565b9360408401358381116101fd5782610c39918601611eb5565b60608501359384116101fd5761031595610c5a610c60946080968801611e9a565b92612e26565b919092013591612fff565b60405162dc149f60e41b8152600490fd5b60a06003198201126101fd576001600160401b03906004358281116101fd5781610ca891600401610202565b939093926024358181116101fd5783610cc391600401610202565b939093926044358381116101fd5782610cde91600401610232565b939093926064359182116101fd57610cf891600401610202565b909160843590565b346101fd57610d0e36610c7c565b97969094959293610d1e33613632565b6103a357610d43610c5a94610d3b610d539a610d4b953691611a59565b983691611e4c565b943691611ab7565b933691611e4c565b819291519181518303610f12576000808415159283610de4575b3360009081526002602052604090209495509293610da79390610d9f9093610d9a600286019485546120dd565b612b73565b809255613677565b610dad57005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610ddf6040519283923384612fc9565b0390a1005b60005b868110610df45750610d6d565b91610e3e33610e27610e12610e09878d611d8f565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610e498488611d8f565b51518115610edb57878a82841015610e97579260019492610d9a610e8993610e818a610e7b610e0982610e8f9b611d8f565b92611d8f565b515190613991565b906120dd565b925b01610de7565b8284939497959711610eb0575b50505050600190610e91565b92849792610d9a610e8993610e8188610e7b610e0960019b610ed19b611d8f565b939038878a610ea4565b610f0e610eeb610e09878d611d8f565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b346101fd5760403660031901126101fd576020610f4b610f426103cb565b60243590611ed0565b604051908152f35b346101fd57610f6136610c7c565b97969094959293610f7133613632565b6103a357610d43610c5a94610d3b610f8e9a610d4b953691611a59565b90336000526002602052604060002092610faa845484846138ca565b60028692960192835491820180921161039e57825496870180971161039e5781610ff8947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613677565b610ddf6040519283923384612fc9565b901515815260c0810192916108b791602001906109ea565b346101fd5760603660031901126101fd576110396103cb565b60403660231901126101fd576110799061107360405161105881610817565b6024358152604435602082015261106d61201a565b50613137565b906131a0565b9061054a60405192839283611008565b346101fd5761109736610b82565b50506110a5610adc33612ce5565b6000903382526002602052600180604084200154906110e3336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6111c3575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6111bd887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b6111816111456108b9565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b61118a8161322b565b9061119b6040519283923384612045565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156111e4575b87908352608085208861fffe198254169155916110ed565b9081161580611200575b156111fa5782906111cc565b806110f2565b508015156111ee565b346101fd5760803660031901126101fd576044356001600160a01b03811681036101fd576064356001600160401b0381116101fd5760409161125261125e923690600401610918565b906024356004356122d4565b825191151582526020820152f35b346101fd576020610f4b61127f366107af565b916127e4565b90815180825260208080930193019160005b8281106112a5575050505090565b83516001600160e01b03191685529381019392810192600101611297565b908082519081815260208091019281808460051b8301019501936000915b8483106112f15750505050505090565b9091929394958480611335600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611285565b98019301930191949392906112e1565b80516005811015610487576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061138b575050505090565b909192938260806001926113b383895163ffffffff60e01b8151168452015184830190611345565b0195019392910161137d565b90815180825260208080930193019160005b8281106113df575050505090565b909192938260e06001926114186040895163ffffffff851b815116845261140c8682015187860190611345565b01516080830190611345565b019501939291016113d1565b906109339160208152815190611448610180928360208401526101a0830190611285565b916114c261149661148261146e602088015196601f199788888303016040890152611285565b604088015187878303016060880152611285565b606087015186868303016080870152611285565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526112c3565b61152b6115146114fd6114e660e089015194610100958989830301878a015261136b565b93880151936101209488888303018689015261136b565b92870151926101409387878303018588015261136b565b91860151916101609286868303018487015261136b565b94015192828503019101526113bf565b346101fd576000806003193601126119485761054a906115596129ca565b5061193b6115656129ca565b916115f06115e4611574612a36565b6115936115876040880192808452611cea565b63852b67af60e01b9052565b6115ac6115a08251611cfc565b630b96422d60e01b9052565b6115c56115b98251611d0c565b6371af817b60e01b9052565b6115de6115d28251611d1c565b630b135d3f60e11b9052565b51611d2c565b6377102c3560e01b9052565b6115f86108b9565b600181529061176e6020928284820152826040820152611616612a61565b60e087019081526116436116286108aa565b63852b67af60e01b8152838782015282519061073382611cea565b5061166a61164f6108aa565b630b96422d60e01b8152838782015282519061076982611cfc565b506116916116766108aa565b6371af817b60e01b8152838782015282519061079c82611d0c565b506116be61169d6108aa565b635b0e93fb60e11b815283878201528251906116b882611d1c565b52611d1c565b506116eb6116ca6108aa565b631a7e6adf60e11b815283878201528251906116e582611d2c565b52611d2c565b506117186116f76108aa565b633e15cc3d60e21b8152838782015282519061171282611d3c565b52611d3c565b506117456117246108aa565b63c1a221f360e01b8152838782015282519061173f82611d4c565b52611d4c565b5061174e6108aa565b63278f794360e11b81529185830152519061176882611d5c565b52611d5c565b506117776108b9565b6003815290808383015280604083015261178f6108b9565b6001815290808483015260408201526117fc6117a9612ac3565b9261010087019384526117d86117bd6108aa565b630b135d3f60e11b8152828782015285519061073382611cea565b506117e16108aa565b6377102c3560e01b8152908582015283519061076982611cfc565b506118236118086108aa565b63852b67af60e01b8152828582015283519061079c82611d0c565b5061184a61182f6108aa565b630b96422d60e01b815282858201528351906116b882611d1c565b506118716118566108aa565b6371af817b60e01b815282858201528351906116e582611d2c565b5061189861187d6108aa565b635b0e93fb60e11b8152828582015283519061171282611d3c565b506118bf6118a46108aa565b631a7e6adf60e11b8152828582015283519061173f82611d4c565b506118e66118cb6108aa565b633e15cc3d60e21b8152828582015283519061176882611d5c565b506119136118f26108aa565b63c1a221f360e01b8152828582015283519061190d82611d6d565b52611d6d565b5061191c6108aa565b63278f794360e11b815292830152519061193582611d7e565b52611d7e565b5060405191829182611424565b80fd5b346101fd5760403660031901126101fd57602061197e60405161196d81610817565b600435815260243583820152613137565b6040519061ffff19168152f35b346101fd5760003660031901126101fd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101fd5760203660031901126101fd57602062010000600160b01b036119f56103cb565b60101b16604051908152f35b346101fd5760403660031901126101fd57611079611a1d6103cb565b611a256103b5565b611a2d61201a565b5060101b62010000600160b01b0316906131a0565b6001600160401b0381116108325760051b60200190565b9291611a6482611a42565b91611a726040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611a985750505050565b81356001600160a01b03811681036101fd578152908301908301611a8b565b929192611ac382611a42565b604092611ad36040519283610889565b819581835260208093019160061b8401938185116101fd57915b848310611afc57505050505050565b85838303126101fd578386918251611b1381610817565b853581528286013583820152815201920191611aed565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761083257604052606080838181528160208201528160408201520152565b60405190602082018281106001600160401b038211176108325760405260008252565b60405190611bbd82610837565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611c0082610817565b60058252640312e302e360dc1b6020830152565b60405190611c2182610817565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108325760405260038352829160009160005b606080821015611ca557825160209291611c9282610817565b8682528382015287820183015201611c79565b50505091925050565b60405190611cbb82610817565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611cf75760200190565b611cd4565b805160011015611cf75760400190565b805160021015611cf75760600190565b805160031015611cf75760800190565b805160041015611cf75760a00190565b805160051015611cf75760c00190565b805160061015611cf75760e00190565b805160071015611cf7576101000190565b805160081015611cf7576101200190565b805160091015611cf7576101400190565b8051821015611cf75760209160051b010190565b60405190611db082610817565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611de982610817565b600d82526c52656d6f7665204f776e65727360981b6020830152565b60405190611e1282610837565b60006040838281528260208201520152565b90604051611e3181610837565b60406002829480548452600181015460208501520154910152565b9291611e5782611a42565b91611e656040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611e8b5750505050565b81358152908301908301611e7e565b9080601f830112156101fd5781602061093393359101611e4c565b9080601f830112156101fd5781602061093393359101611ab7565b61093391611fed611ff9611f9b611f3094611ee9611bb0565b611ef1611bf3565b6040519788916020998a9182611f10818401978881519384920161058b565b8201611f248251809386808501910161058b565b01038084520182610889565b519020604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647289820190815260208101939093524691830191909152306060808401919091529290921b6bffffffffffffffffffffffff191660808201529091829060a0830190565b0391611faf601f1993848101835282610889565b51902094604051938491820195869190602060408401937f7dc7da30a002512936154da01baa79a3d1e54e35034ffdfa7c53c28b3091236d81520152565b03908101835282610889565b519020906042916040519161190160f01b8352600283015260228201522090565b6040519061202782610852565b60006080838281528260208201528260408201528260608201520152565b93929161206a9060409260018060a01b031686526060602087015260608601906109b1565b930152565b634e487b7160e01b600052601160045260246000fd5b9060418202918083046041149015171561039e57565b600281901b91906001600160fe1b0381160361039e57565b906041820180921161039e57565b906015820180921161039e57565b906002820180921161039e57565b9190820180921161039e57565b60ff601f199116019060ff821161039e57565b9060405161210a81610852565b80928054825260018101549060ff821690600282101561048757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061215e82610837565b6000604083815161216e81610852565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926121a3816108c6565b916121b16040519384610889565b8294828452828201116101fd5760206108b793019061058b565b9080601f830112156101fd57815161093392602001612196565b519081151582036101fd57565b60209081818403126101fd5780516001600160401b03918282116101fd57016060818503126101fd5760409283519461222a86610837565b82518481116101fd5783019360a0858303126101fd5785519161224c83610852565b85518281116101fd57860181601f820112156101fd5781818661227193519101612196565b8352838601519182116101fd57856122916080926122ad948a99016121cb565b85850152868101518785015260608101516060850152016121e5565b60808201528552808201519085015201519082015290565b600019811461039e5760010190565b939291909160009460418251106126d7576001600160a01b0383166000908152600260205260409020600101549384156127a05760009384928391828483146127945792979460ff60015b16976001995b878110612359575050505050505050508061233f57509190565b604051631007539160e31b81526004810191909152602490fd5b61236a61236584612085565b6120b3565b821515908161278a575b811561277f575b5061275e576123a0838a90604102016020810151906060604082015191015160001a92565b91979088602060ff82161061275457508d6123bb899a6120ea565b9d600019019d5b60ff8116806125d1575050506001600160a01b03811681116125bf578d9862010000600160b01b038260101b169960018060a01b0383168b61243360016124228d610e27838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b16036125a6575b508c518411801561259c575b61258a5761245c6020808f8701015101856120dd565b8d5110612578578e938d8782108015612570575b612566575b61249893612494939290910160200191906001600160a01b03166135b7565b1590565b61254b575b61ffff19808916911681119081159161250a575b506124f1575b506124e36124ea916124dc86610e278a61ffff19166000526001602052604060002090565b54906120dd565b95926122c5565b9194612325565b6124fc575b8a6124b7565b919b50600099508b916124f6565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff199190911660608201526080902054159050386124b1565b90612558575b8b9061249d565b9a509b50819b60009a612551565b9096508690612475565b508715612470565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b5060418410612446565b6125b1575b8e61243a565b9d509e50849e60009d6125ab565b60405163e6c4247b60e01b8152600490fd5b6002036126f357505061ffff199060101b1697612604610b3388610e278c61ffff19166000526001602052604060002090565b6080606082015191015191612617612151565b508d51851180156126e9575b61258a578d61263a602080888401015101876120dd565b9051106126d7578f948e88821080156126cf575b6126c5575b6126b49492826126a361268184602061249499976126959701015160409485809282850101019201016121f2565b928251948591602083019190602083019252565b03601f198101855284610889565b815190602083015192015192613392565b1561249d5790612558578b9061249d565b9097508790612653565b50881561264e565b60405163d245329360e01b8152600490fd5b5060418510612623565b612701939a949291946132b2565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b0390811692909161274291612422908b90610e27565b161461249d5790612558578b9061249d565b98508d8a996123c2565b505099979650505050505050600014612778575060009190565b6000925090565b90508951103861237b565b8381119150612374565b92979460ff600061231f565b60405163d349279d60e01b8152600490fd5b903590601e19813603018212156101fd57018035906001600160401b0382116101fd576020019181360383136101fd57565b9192909260ff83161561281e576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6128539192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612862828501856127b2565b908184519182372061297e61287a60608701876127b2565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470848201528381526128f48161086d565b5190208451602081019182526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016604082015246606082015261294c81608081015b03601f198101835282610889565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b928383146129ba575061299b856129a2926129aa969701906127b2565b36916108e1565b9133916122d4565b50156129b557600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108325760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610832576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b038211176108325760405260088352600083815b6101008110612a9a5750505050565b6020908451612aa881610817565b84815282612ab4611e05565b81830152828501015201612a8b565b6040906040519161016083018381106001600160401b0382111761083257604052600a8352600083815b6101408110612afc5750505050565b6020908451612b0a81610817565b84815282612b16611e05565b81830152828501015201612aed565b90612b2f82611a42565b612b3c6040519182610889565b8281528092612b4d601f1991611a42565b0190602036910137565b9060008051602061491583398151915291820391821161039e57565b9190820391821161039e57565b91908251918215612cd357336000526002602052604090604060002080549480861115612cc157600094855b8851871015612c6657612bdc612494612bd661ffff19612bcc8b8e611d8f565b511661ffff191690565b33613cef565b612c3357612bfb6001916124dc8b610e27610e12610e098d3394611d8f565b96612c2c612c148b610e27610e12610e09863394611d8f565b60036000918281558260018201558260028201550155565b0195612bac565b610f0e86612c44610e098a8d611d8f565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612cac93979450610d9f867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612ca56002870195865492612b73565b8655612b73565b612cbc6040519283923384612045565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612d8b575b15612d705761fffe1985169101600581901b870184018290529360021615612d68576060850152608084205492612d29565b508592612d29565b95935050945050608091506001830160051b01016040528252565b50841515612d36565b908151612da081612b25565b9060005b818110612db2575090925050565b60019061ffff19612dc38288611d8f565b5116612dcf8286611d8f565b5201612da4565b90612de082611a42565b612ded6040519182610889565b8281528092612dfe601f1991611a42565b019060005b828110612e0f57505050565b602090612e1a61201a565b82828501015201612e03565b929093919383519480519282518714801590612fbe575b610f1257612e4e84889794986120dd565b96612e61612e5b89612b25565b98612dd6565b9660009485925b898b848610612f16575050505050506000925b848410612e89575050505050565b612f0e600191612ea9612e9f61032d8888611d8f565b61033d838d611d8f565b612eb38685611d8f565b51612ebe828b611d8f565b51526020600081612ecf848d611d8f565b510152612edc8787611d8f565b51516060612eea848d611d8f565b510152612ef78787611d8f565b5101516080612f06838c611d8f565b5101526122c5565b930192612e7b565b97610347612fb4926040612fa384612f9d612f4b8c9f9c612f698c9d9e61033d8660019e9f612f58612f4b87610e7b93611d8f565b516001600160a01b031690565b60101b62010000600160b01b031690565b612f73818d611d8f565b51612f7e8589611d8f565b5152612f976020612f8f868a611d8f565b510160019052565b8c611d8f565b93611d8f565b516001600160a01b03909216910152565b9601929190612e68565b508051841415612e3d565b6001600160a01b039091168152606060208201819052610933939192612ff1918401906109b1565b916040818403910152610a28565b919283156127a057600093845b83518610156130355761301f8685611d8f565b5151810180911161039e5760019095019461300c565b90939194508381106131005782826130ce7f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1793613097612cbc977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613788565b50508251906130a46108b9565b91825286602083015260408201526111663360018060a01b03166000526002602052604060002090565b6130de6040519283923384612fc9565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b906131336020928281519485920161058b565b0190565b60208151910151811580613198575b6131795760408051602081019384528082019290925281529061316a606083610889565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b508015613146565b9190916131ab61201a565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff19909416606085018190526080909420549093901561322357613217929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109336001926120fd565b505060009190565b6000919082805b82518210156132ac5761ffff19918261324b8286611d8f565b511686526001602081815260408089203360009081529083528190209294919254820180921161039e576001946132a593612c14939761328b878b611d8f565b51168b525288203360009081526020919091526040902090565b0190613232565b93505050565b9161093393916132c1936139f8565b90929192613a86565b906108b7602e60405180946c1131b430b63632b733b2911d1160991b60208301526132ff815180926020602d8601910161058b565b8101601160f91b602d82015203600e810185520183610889565b805160201015611cf75760400190565b6040513d6000823e3d90fd5b602092919061334b84928281519485920161058b565b019081520190565b3d1561337e573d90613364826108c6565b916133726040519384610889565b82523d6000602084013e565b606090565b908160209103126101fd575190565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a883116135ac57602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346133ff835160608601516133f9816120c1565b91613b13565b8981519101200361359f5761341f61342491613419613b96565b90613e7f565b6132ca565b613439825160408501516133f98451826120dd565b888151910120908881519101200361357757600160f81b8061346c61345e8551613319565b516001600160f81b03191690565b1603613577576080820151151580613583575b6135775751866040519182806134986000958694613120565b039060025afa156135725786816134dd815194516134bd604051968792868401613335565b03946134d1601f1996878101835282610889565b60405191828092613120565b039060025afa15613572578051604080518981018381526020810187905291820187905260608201889052608082018990529193839290613522908260a08501611fed565b51906101005afa95613532613353565b9081519780613569575b61354c5750506109339550613bf5565b6001976135659750820181019550019250613383915050565b1490565b5087151561353c565b613329565b50505050505050600090565b50600160fa1b8061359761345e8551613319565b16141561347f565b5050505050505050600090565b505050505050600090565b600091929082916040516135ef8161293e6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ae565b51915afa906135fc613353565b82613624575b8261360c57505090565b9091506020818051810103126101fd57602001511490565b915060208251101591613602565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080902054801590811561366f575090565b600191501690565b6001909201805490929182156136fa578281106136d9575080820361369b57505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b80935081925010613709575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b90805182556001820190602081015190600282101561048757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612cd35782825103610f12576103e883116138aa57906000915b8383106137ba575050509190565b9091946137e16124946137db6137d3610e098a87611d8f565b61ffff191690565b33613dc8565b61389a576137ef8684611d8f565b5151158015613883575b6138455761383c60019161382a6138108987611d8f565b5161382533610e27610e12610e098e8b611d8f565b61372b565b6138348886611d8f565b5151906120dd565b950191906137ac565b5084610e7b610e098261385794611d8f565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f42406138928785611d8f565b5151116137f9565b610f0e610eeb610e098885611d8f565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612cd35783835103610f12576103e86138ef85836120dd565b116139705750906000915b838310613908575050509190565b9091946139216124946137db6137d3610e098a87611d8f565b61389a5761392f8684611d8f565b5151158015613959575b6138455761395060019161382a6138108987611d8f565b950191906138fa565b50620f42406139688785611d8f565b515111613939565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b811580156139ec575b6139bf5761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f4240821161399a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613a7057926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa156135725780516001600160a01b03811615613a6757918190565b50809160019190565b50505060009160039190565b6004111561048757565b613a8f81613a7c565b80613a98575050565b613aa181613a7c565b60018103613abb5760405163f645eedf60e01b8152600490fd5b613ac481613a7c565b60028103613ae55760405163fce698f760e01b815260048101839052602490fd5b80613af1600392613a7c565b14613af95750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613b8e575b81811115613b86575b50828110613b3a57505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613b6f57908290613b57565b505060008583016020015250603f01168201604052565b905038613b2d565b925082613b24565b60405190613ba382610837565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613cd7575b8015613ccf575b8015613cb7575b613cad57613c1f8386613f27565b15613cad5760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614915833981519152948560a084015260208360c0816005600019fa156101fd57613ca79386613ca1945181818909940991613fc8565b91612b57565b90081590565b5050505050600090565b50600080516020614915833981519152821015613c11565b508115613c0a565b50600080516020614915833981519152841015613c03565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613dc0575b613db7576001600060015b15613d8b575b50606084015260808320805460009161fffe198083169190898314613d6a57505091613d3d565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613dad575b5015613da35738613d43565b5060009450505050565b9050151538613d97565b50600093505050565b508015613d32565b9061ffff1916908115613e5057604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613e4757600160809252209182549283158015613e3d575b15613e3157600193505555600190565b90600217905555600190565b5060018416613e21565b50505050600090565b5050600090565b90613e61826108c6565b613e6e6040519182610889565b8281528092612b4d601f19916108c6565b805115613f1d57613eaa613ea5613e9e613e99845161209b565b6120cf565b6003900490565b613e57565b91602083019180805101906020820192835194600085525b838310613ed157505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301613ec2565b5050610933611b8d565b600160601b63ffffffff60c01b031990818110801590613fbe575b8015613fad575b613fa5577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b5080158015613f4957508215613f49565b5081831015613f42565b60009260ff929091848315806146d4575b61357757613fe783836146dc565b90958615806146cc575b61468e575b85811c60028a60fe1c16015b1561467457600186821c1660028a831c60011b16016001811461463b575b6002811461462e575b600314614621575b60009493929419019560019860015b88600019116140ad5750505050505050505060405191606083015260208252602080830152602060408301526000805160206149358339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa156101fd5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b0319808260008051602061493583398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156146035760018c600286838f841c16921c831b1601146145cc575b838c8c6002600182841c168185851c60011b1601146145b9575b6003926001600292841c16921c60011b1601146145b0575b861561459d57600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614387575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a0960008051602061493583398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b031992839081908184800990096000805160206149358339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b60001901979693959493614040565b8661425c57919a9198919550600160601b63ffffffff60c01b0319905080808360008051602061493583398151915209600160601b63ffffffff60c01b03198460008051602061493583398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b0319908180808560008051602061493583398151915209600160601b63ffffffff60c01b0319866000805160206149358339815191520909600160601b63ffffffff60c01b03198560008051602061493583398151915209090997600160601b63ffffffff60c01b03199081808460008051602061493583398151915209600160601b63ffffffff60c01b0319856000805160206149358339815191520909099a600160601b63ffffffff60c01b0319808c60008051602061493583398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b03199283908180808360008051602061493583398151915209600160601b63ffffffff60c01b0319846000805160206149358339815191520909600160601b63ffffffff60c01b03198360008051602061493583398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614378565b60019c50909a8c99509095509050614378565b5050828461421b565b508993508a92508591508d90508c614203565b50506000805160206148f58339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f56141e9565b50949a90999097600160601b63ffffffff60c01b0319039450614378565b9150955084958091614031565b9397508793859350614029565b6000805160206148f583398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59350614020565b60001901600160028188841c16918b841c901b1601614002565b9790946000805160206149158339815191529182039008936000978515806146c4575b15613ff657505050505050505050600090565b5060016146b1565b508115613ff1565b508615613fd9565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592916000805160206148f5833981519152918115614834578083148061482b575b156148145750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe816001840892080960030981808080866000805160206149358339815191520981858009089981600181818b099a099709810393898203900890090893915b60405190602082526020808301526020604083015260608201526000805160206149358339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa156101fd57838080935180950980099009930990565b90915061482292935061483a565b919392916147ae565b5081851461471e565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b9209089509089280808080878009968709948180886000805160206148f583398151915209918180808560008051602061493583398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220d586e4fd303dfab4216400fe9fa3ed6319112d27701f24d09905e2c95485692164736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x1d", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x82b95e", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4150bf612ecad1efda612b3f2aa9df7f0854c4860a5a44439e9020dfc8e5c07b", + "transactionIndex": "0x1", + "blockHash": "0x6585971397b8dc96f2d3edc2243df757062885f4f2da1f2ec9e0daeb02bf574b", + "blockNumber": "0xfedead4", + "gasUsed": "0x82b95e", + "effectiveGasPrice": "0x989680", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", + "gasUsedForL1": "0x43af3c", + "l1BlockNumber": "0x14100fc" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1729795217, + "chain": 42161, + "commit": "bf15fa9" +} \ No newline at end of file diff --git a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/42161/run-latest.json b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/42161/run-latest.json new file mode 100644 index 0000000..b17c769 --- /dev/null +++ b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/42161/run-latest.json @@ -0,0 +1,51 @@ +{ + "transactions": [ + { + "hash": "0x4150bf612ecad1efda612b3f2aa9df7f0854c4860a5a44439e9020dfc8e5c07b", + "transactionType": "CREATE2", + "contractName": "WeightedWebauthnMultisigPlugin", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xb57a7b", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a0346200007757601f62004a1d38819003918201601f19168301916001600160401b038311848410176200007c578084926020946040528339810103126200007757516001600160a01b0381168103620000775760805260405161498a90816200009382396080518181816119a1015261290a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461018d5780630b96422d146101885780630c7ecd84146101425780630cdc271f146101835780631128186d1461017e578063118a53891461017957806315b76b84146101745780631626ba7e1461016f57806346d60eb2146101425780636bbefc891461016a5780636d61fe701461016557806371af817b1461016057806377102c351461015b578063852b67af14610156578063858e6ee4146101515780638a91b0e31461014c578063b139ec6314610147578063bfd151c114610142578063c4db8dd91461013d578063c776313014610138578063c8050ee414610133578063e8eb3cc61461012e578063ef4a7203146101295763f582bceb1461012457600080fd5b611a01565b6119d0565b61198b565b61194b565b61153b565b61126c565b61040e565b611209565b611089565b611020565b610f53565b610f24565b610d00565b610bb0565b610aad565b610936565b6107f3565b6106a9565b61054e565b6104c1565b610262565b346101fd5760203660031901126101fd5760043563ffffffff60e01b81168091036101fd576020906372d61afb60e01b81149081156101d2575b506040519015158152f35b63043140ed60e01b8114915081156101ec575b50386101c7565b6301ffc9a760e01b149050386101e5565b600080fd5b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460051b0101116101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460061b0101116101fd57565b346101fd5760603660031901126101fd576001600160401b036004358181116101fd57610293903690600401610202565b916024359081116101fd576102ac903690600401610232565b926102b633613632565b6103a3576102d1926102c9913691611a59565b923691611ab7565b81519181519182840180851161039e576102ed90949294612b25565b9360009283915b818310610354575050506000915b8383106103175761031560443586612b80565b005b61034c60019161034761033361032d8787611d8f565b51613137565b61033d838a611d8f565b9061ffff19169052565b6122c5565b920191610302565b91939091906001906103959061034761038b6001600160a01b036103788a88611d8f565b511660101b62010000600160b01b031690565b61033d838c611d8f565b940191906102f4565b61206f565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b03821682036101fd57565b600435906001600160a01b03821682036101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd57602083818601950101116101fd57565b346101fd5760803660031901126101fd5760043560ff811681036101fd576024356001600160a01b038116036101fd576064356001600160401b0381116101fd5761045d9036906004016103e1565b5050611b2a565b634e487b7160e01b600052602160045260246000fd5b9060028210156104875752565b610464565b91926104aa608094979695929760a08501988552602085019061047a565b6001600160a01b0316604083015260608201520152565b346101fd5760403660031901126101fd5760043561ffff1981168091036101fd57610513906104ee6103b5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361054a93600881901c6001600160a01b03169160ff909116908661048c565b0390f35b346101fd5760403660031901126101fd5760043560ff811681036101fd576024356001600160401b0381116101fd5761045d9036906004016103e1565b60005b83811061059e5750506000910152565b818101518382015260200161058e565b906020916105c78151809281855285808601910161058b565b601f01601f1916010190565b906020908183526105ef815160808486015260a08501906105ae565b9180820151916060610626610613601f1996604096888a83030160408b01526105ae565b60408401518789830301848a01526105ae565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061066057505050505050505090565b909192939495969786806106978387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ae565b9a01950195019396959492919061064e565b346101fd5760003660031901126101fd576106c2611b59565b5061054a6106ce611b59565b6106d6611bb0565b81526106e0611bf3565b60208201526106ed611c14565b60408201526107a26106fd611c4d565b6060830190815261073961070f611cae565b6107176108aa565b63852b67af60e01b815290602082015282519061073382611cea565b52611cea565b5061076f610745611da3565b61074d6108aa565b6371af817b60e01b815290602082015282519061076982611cfc565b52611cfc565b50610778611ddc565b906107816108aa565b630b96422d60e01b8152916020830152519061079c82611d0c565b52611d0c565b50604051918291826105d3565b906003196060818401126101fd5760043560ff811681036101fd5792602435916001600160401b0383116101fd5782610120920301126101fd576004019060443590565b346101fd5761045d366107af565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761083257604052565b610801565b606081019081106001600160401b0382111761083257604052565b60a081019081106001600160401b0382111761083257604052565b61012081019081106001600160401b0382111761083257604052565b90601f801991011681019081106001600160401b0382111761083257604052565b604051906108b782610817565b565b604051906108b782610837565b6001600160401b03811161083257601f01601f191660200190565b9291926108ed826108c6565b916108fb6040519384610889565b8294818452818301116101fd578281602093846000960137010152565b9080601f830112156101fd57816020610933933591016108e1565b90565b346101fd5760403660031901126101fd576024356001600160401b0381116101fd5761096961097d913690600401610918565b61097560043533611ed0565b3390806122d4565b50156109a1576020630b135d3f60e11b5b6040516001600160e01b03199091168152f35b60206001600160e01b031961098e565b90815180825260208080930193019160005b8281106109d1575050505090565b835161ffff1916855293810193928101926001016109c3565b6080809180518452610a046020820151602086019061047a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610a48575050505090565b909192938260a082610a5d60019489516109ea565b01950193929101610a3a565b91610a95604091610a8760809497969760a0875260a08701906109b1565b908582036020870152610a28565b94805182850152602081015160608501520151910152565b346101fd576020806003193601126101fd57610ac76103cb565b610acf611e05565b50610ae1610adc82612ce5565b612d94565b90610aec8251612dd6565b9260005b8351811015610b545760019061ffff19610b0a8287611d8f565b5116600090815282845260408082206001600160a01b03871683526020529020610b38906120fd565b6120fd565b610b428288611d8f565b52610b4d8187611d8f565b5001610af0565b505060018060a01b0316600052600260205261054a610b766040600020611e24565b60405193849384610a69565b60206003198201126101fd57600435906001600160401b0382116101fd57610bac916004016103e1565b9091565b346101fd57610bbe36610b82565b610bc733613632565b15610c6b5781019060a0818303126101fd576001600160401b0381358181116101fd57820183601f820112156101fd5783816020610c0793359101611a59565b9260208301358281116101fd5781610c20918501611e9a565b9360408401358381116101fd5782610c39918601611eb5565b60608501359384116101fd5761031595610c5a610c60946080968801611e9a565b92612e26565b919092013591612fff565b60405162dc149f60e41b8152600490fd5b60a06003198201126101fd576001600160401b03906004358281116101fd5781610ca891600401610202565b939093926024358181116101fd5783610cc391600401610202565b939093926044358381116101fd5782610cde91600401610232565b939093926064359182116101fd57610cf891600401610202565b909160843590565b346101fd57610d0e36610c7c565b97969094959293610d1e33613632565b6103a357610d43610c5a94610d3b610d539a610d4b953691611a59565b983691611e4c565b943691611ab7565b933691611e4c565b819291519181518303610f12576000808415159283610de4575b3360009081526002602052604090209495509293610da79390610d9f9093610d9a600286019485546120dd565b612b73565b809255613677565b610dad57005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610ddf6040519283923384612fc9565b0390a1005b60005b868110610df45750610d6d565b91610e3e33610e27610e12610e09878d611d8f565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610e498488611d8f565b51518115610edb57878a82841015610e97579260019492610d9a610e8993610e818a610e7b610e0982610e8f9b611d8f565b92611d8f565b515190613991565b906120dd565b925b01610de7565b8284939497959711610eb0575b50505050600190610e91565b92849792610d9a610e8993610e8188610e7b610e0960019b610ed19b611d8f565b939038878a610ea4565b610f0e610eeb610e09878d611d8f565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b346101fd5760403660031901126101fd576020610f4b610f426103cb565b60243590611ed0565b604051908152f35b346101fd57610f6136610c7c565b97969094959293610f7133613632565b6103a357610d43610c5a94610d3b610f8e9a610d4b953691611a59565b90336000526002602052604060002092610faa845484846138ca565b60028692960192835491820180921161039e57825496870180971161039e5781610ff8947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613677565b610ddf6040519283923384612fc9565b901515815260c0810192916108b791602001906109ea565b346101fd5760603660031901126101fd576110396103cb565b60403660231901126101fd576110799061107360405161105881610817565b6024358152604435602082015261106d61201a565b50613137565b906131a0565b9061054a60405192839283611008565b346101fd5761109736610b82565b50506110a5610adc33612ce5565b6000903382526002602052600180604084200154906110e3336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6111c3575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6111bd887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b6111816111456108b9565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b61118a8161322b565b9061119b6040519283923384612045565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156111e4575b87908352608085208861fffe198254169155916110ed565b9081161580611200575b156111fa5782906111cc565b806110f2565b508015156111ee565b346101fd5760803660031901126101fd576044356001600160a01b03811681036101fd576064356001600160401b0381116101fd5760409161125261125e923690600401610918565b906024356004356122d4565b825191151582526020820152f35b346101fd576020610f4b61127f366107af565b916127e4565b90815180825260208080930193019160005b8281106112a5575050505090565b83516001600160e01b03191685529381019392810192600101611297565b908082519081815260208091019281808460051b8301019501936000915b8483106112f15750505050505090565b9091929394958480611335600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611285565b98019301930191949392906112e1565b80516005811015610487576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061138b575050505090565b909192938260806001926113b383895163ffffffff60e01b8151168452015184830190611345565b0195019392910161137d565b90815180825260208080930193019160005b8281106113df575050505090565b909192938260e06001926114186040895163ffffffff851b815116845261140c8682015187860190611345565b01516080830190611345565b019501939291016113d1565b906109339160208152815190611448610180928360208401526101a0830190611285565b916114c261149661148261146e602088015196601f199788888303016040890152611285565b604088015187878303016060880152611285565b606087015186868303016080870152611285565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526112c3565b61152b6115146114fd6114e660e089015194610100958989830301878a015261136b565b93880151936101209488888303018689015261136b565b92870151926101409387878303018588015261136b565b91860151916101609286868303018487015261136b565b94015192828503019101526113bf565b346101fd576000806003193601126119485761054a906115596129ca565b5061193b6115656129ca565b916115f06115e4611574612a36565b6115936115876040880192808452611cea565b63852b67af60e01b9052565b6115ac6115a08251611cfc565b630b96422d60e01b9052565b6115c56115b98251611d0c565b6371af817b60e01b9052565b6115de6115d28251611d1c565b630b135d3f60e11b9052565b51611d2c565b6377102c3560e01b9052565b6115f86108b9565b600181529061176e6020928284820152826040820152611616612a61565b60e087019081526116436116286108aa565b63852b67af60e01b8152838782015282519061073382611cea565b5061166a61164f6108aa565b630b96422d60e01b8152838782015282519061076982611cfc565b506116916116766108aa565b6371af817b60e01b8152838782015282519061079c82611d0c565b506116be61169d6108aa565b635b0e93fb60e11b815283878201528251906116b882611d1c565b52611d1c565b506116eb6116ca6108aa565b631a7e6adf60e11b815283878201528251906116e582611d2c565b52611d2c565b506117186116f76108aa565b633e15cc3d60e21b8152838782015282519061171282611d3c565b52611d3c565b506117456117246108aa565b63c1a221f360e01b8152838782015282519061173f82611d4c565b52611d4c565b5061174e6108aa565b63278f794360e11b81529185830152519061176882611d5c565b52611d5c565b506117776108b9565b6003815290808383015280604083015261178f6108b9565b6001815290808483015260408201526117fc6117a9612ac3565b9261010087019384526117d86117bd6108aa565b630b135d3f60e11b8152828782015285519061073382611cea565b506117e16108aa565b6377102c3560e01b8152908582015283519061076982611cfc565b506118236118086108aa565b63852b67af60e01b8152828582015283519061079c82611d0c565b5061184a61182f6108aa565b630b96422d60e01b815282858201528351906116b882611d1c565b506118716118566108aa565b6371af817b60e01b815282858201528351906116e582611d2c565b5061189861187d6108aa565b635b0e93fb60e11b8152828582015283519061171282611d3c565b506118bf6118a46108aa565b631a7e6adf60e11b8152828582015283519061173f82611d4c565b506118e66118cb6108aa565b633e15cc3d60e21b8152828582015283519061176882611d5c565b506119136118f26108aa565b63c1a221f360e01b8152828582015283519061190d82611d6d565b52611d6d565b5061191c6108aa565b63278f794360e11b815292830152519061193582611d7e565b52611d7e565b5060405191829182611424565b80fd5b346101fd5760403660031901126101fd57602061197e60405161196d81610817565b600435815260243583820152613137565b6040519061ffff19168152f35b346101fd5760003660031901126101fd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101fd5760203660031901126101fd57602062010000600160b01b036119f56103cb565b60101b16604051908152f35b346101fd5760403660031901126101fd57611079611a1d6103cb565b611a256103b5565b611a2d61201a565b5060101b62010000600160b01b0316906131a0565b6001600160401b0381116108325760051b60200190565b9291611a6482611a42565b91611a726040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611a985750505050565b81356001600160a01b03811681036101fd578152908301908301611a8b565b929192611ac382611a42565b604092611ad36040519283610889565b819581835260208093019160061b8401938185116101fd57915b848310611afc57505050505050565b85838303126101fd578386918251611b1381610817565b853581528286013583820152815201920191611aed565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761083257604052606080838181528160208201528160408201520152565b60405190602082018281106001600160401b038211176108325760405260008252565b60405190611bbd82610837565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611c0082610817565b60058252640312e302e360dc1b6020830152565b60405190611c2182610817565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108325760405260038352829160009160005b606080821015611ca557825160209291611c9282610817565b8682528382015287820183015201611c79565b50505091925050565b60405190611cbb82610817565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611cf75760200190565b611cd4565b805160011015611cf75760400190565b805160021015611cf75760600190565b805160031015611cf75760800190565b805160041015611cf75760a00190565b805160051015611cf75760c00190565b805160061015611cf75760e00190565b805160071015611cf7576101000190565b805160081015611cf7576101200190565b805160091015611cf7576101400190565b8051821015611cf75760209160051b010190565b60405190611db082610817565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611de982610817565b600d82526c52656d6f7665204f776e65727360981b6020830152565b60405190611e1282610837565b60006040838281528260208201520152565b90604051611e3181610837565b60406002829480548452600181015460208501520154910152565b9291611e5782611a42565b91611e656040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611e8b5750505050565b81358152908301908301611e7e565b9080601f830112156101fd5781602061093393359101611e4c565b9080601f830112156101fd5781602061093393359101611ab7565b61093391611fed611ff9611f9b611f3094611ee9611bb0565b611ef1611bf3565b6040519788916020998a9182611f10818401978881519384920161058b565b8201611f248251809386808501910161058b565b01038084520182610889565b519020604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647289820190815260208101939093524691830191909152306060808401919091529290921b6bffffffffffffffffffffffff191660808201529091829060a0830190565b0391611faf601f1993848101835282610889565b51902094604051938491820195869190602060408401937f7dc7da30a002512936154da01baa79a3d1e54e35034ffdfa7c53c28b3091236d81520152565b03908101835282610889565b519020906042916040519161190160f01b8352600283015260228201522090565b6040519061202782610852565b60006080838281528260208201528260408201528260608201520152565b93929161206a9060409260018060a01b031686526060602087015260608601906109b1565b930152565b634e487b7160e01b600052601160045260246000fd5b9060418202918083046041149015171561039e57565b600281901b91906001600160fe1b0381160361039e57565b906041820180921161039e57565b906015820180921161039e57565b906002820180921161039e57565b9190820180921161039e57565b60ff601f199116019060ff821161039e57565b9060405161210a81610852565b80928054825260018101549060ff821690600282101561048757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061215e82610837565b6000604083815161216e81610852565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926121a3816108c6565b916121b16040519384610889565b8294828452828201116101fd5760206108b793019061058b565b9080601f830112156101fd57815161093392602001612196565b519081151582036101fd57565b60209081818403126101fd5780516001600160401b03918282116101fd57016060818503126101fd5760409283519461222a86610837565b82518481116101fd5783019360a0858303126101fd5785519161224c83610852565b85518281116101fd57860181601f820112156101fd5781818661227193519101612196565b8352838601519182116101fd57856122916080926122ad948a99016121cb565b85850152868101518785015260608101516060850152016121e5565b60808201528552808201519085015201519082015290565b600019811461039e5760010190565b939291909160009460418251106126d7576001600160a01b0383166000908152600260205260409020600101549384156127a05760009384928391828483146127945792979460ff60015b16976001995b878110612359575050505050505050508061233f57509190565b604051631007539160e31b81526004810191909152602490fd5b61236a61236584612085565b6120b3565b821515908161278a575b811561277f575b5061275e576123a0838a90604102016020810151906060604082015191015160001a92565b91979088602060ff82161061275457508d6123bb899a6120ea565b9d600019019d5b60ff8116806125d1575050506001600160a01b03811681116125bf578d9862010000600160b01b038260101b169960018060a01b0383168b61243360016124228d610e27838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b16036125a6575b508c518411801561259c575b61258a5761245c6020808f8701015101856120dd565b8d5110612578578e938d8782108015612570575b612566575b61249893612494939290910160200191906001600160a01b03166135b7565b1590565b61254b575b61ffff19808916911681119081159161250a575b506124f1575b506124e36124ea916124dc86610e278a61ffff19166000526001602052604060002090565b54906120dd565b95926122c5565b9194612325565b6124fc575b8a6124b7565b919b50600099508b916124f6565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff199190911660608201526080902054159050386124b1565b90612558575b8b9061249d565b9a509b50819b60009a612551565b9096508690612475565b508715612470565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b5060418410612446565b6125b1575b8e61243a565b9d509e50849e60009d6125ab565b60405163e6c4247b60e01b8152600490fd5b6002036126f357505061ffff199060101b1697612604610b3388610e278c61ffff19166000526001602052604060002090565b6080606082015191015191612617612151565b508d51851180156126e9575b61258a578d61263a602080888401015101876120dd565b9051106126d7578f948e88821080156126cf575b6126c5575b6126b49492826126a361268184602061249499976126959701015160409485809282850101019201016121f2565b928251948591602083019190602083019252565b03601f198101855284610889565b815190602083015192015192613392565b1561249d5790612558578b9061249d565b9097508790612653565b50881561264e565b60405163d245329360e01b8152600490fd5b5060418510612623565b612701939a949291946132b2565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b0390811692909161274291612422908b90610e27565b161461249d5790612558578b9061249d565b98508d8a996123c2565b505099979650505050505050600014612778575060009190565b6000925090565b90508951103861237b565b8381119150612374565b92979460ff600061231f565b60405163d349279d60e01b8152600490fd5b903590601e19813603018212156101fd57018035906001600160401b0382116101fd576020019181360383136101fd57565b9192909260ff83161561281e576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6128539192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612862828501856127b2565b908184519182372061297e61287a60608701876127b2565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470848201528381526128f48161086d565b5190208451602081019182526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016604082015246606082015261294c81608081015b03601f198101835282610889565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b928383146129ba575061299b856129a2926129aa969701906127b2565b36916108e1565b9133916122d4565b50156129b557600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108325760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610832576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b038211176108325760405260088352600083815b6101008110612a9a5750505050565b6020908451612aa881610817565b84815282612ab4611e05565b81830152828501015201612a8b565b6040906040519161016083018381106001600160401b0382111761083257604052600a8352600083815b6101408110612afc5750505050565b6020908451612b0a81610817565b84815282612b16611e05565b81830152828501015201612aed565b90612b2f82611a42565b612b3c6040519182610889565b8281528092612b4d601f1991611a42565b0190602036910137565b9060008051602061491583398151915291820391821161039e57565b9190820391821161039e57565b91908251918215612cd357336000526002602052604090604060002080549480861115612cc157600094855b8851871015612c6657612bdc612494612bd661ffff19612bcc8b8e611d8f565b511661ffff191690565b33613cef565b612c3357612bfb6001916124dc8b610e27610e12610e098d3394611d8f565b96612c2c612c148b610e27610e12610e09863394611d8f565b60036000918281558260018201558260028201550155565b0195612bac565b610f0e86612c44610e098a8d611d8f565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612cac93979450610d9f867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612ca56002870195865492612b73565b8655612b73565b612cbc6040519283923384612045565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612d8b575b15612d705761fffe1985169101600581901b870184018290529360021615612d68576060850152608084205492612d29565b508592612d29565b95935050945050608091506001830160051b01016040528252565b50841515612d36565b908151612da081612b25565b9060005b818110612db2575090925050565b60019061ffff19612dc38288611d8f565b5116612dcf8286611d8f565b5201612da4565b90612de082611a42565b612ded6040519182610889565b8281528092612dfe601f1991611a42565b019060005b828110612e0f57505050565b602090612e1a61201a565b82828501015201612e03565b929093919383519480519282518714801590612fbe575b610f1257612e4e84889794986120dd565b96612e61612e5b89612b25565b98612dd6565b9660009485925b898b848610612f16575050505050506000925b848410612e89575050505050565b612f0e600191612ea9612e9f61032d8888611d8f565b61033d838d611d8f565b612eb38685611d8f565b51612ebe828b611d8f565b51526020600081612ecf848d611d8f565b510152612edc8787611d8f565b51516060612eea848d611d8f565b510152612ef78787611d8f565b5101516080612f06838c611d8f565b5101526122c5565b930192612e7b565b97610347612fb4926040612fa384612f9d612f4b8c9f9c612f698c9d9e61033d8660019e9f612f58612f4b87610e7b93611d8f565b516001600160a01b031690565b60101b62010000600160b01b031690565b612f73818d611d8f565b51612f7e8589611d8f565b5152612f976020612f8f868a611d8f565b510160019052565b8c611d8f565b93611d8f565b516001600160a01b03909216910152565b9601929190612e68565b508051841415612e3d565b6001600160a01b039091168152606060208201819052610933939192612ff1918401906109b1565b916040818403910152610a28565b919283156127a057600093845b83518610156130355761301f8685611d8f565b5151810180911161039e5760019095019461300c565b90939194508381106131005782826130ce7f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1793613097612cbc977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613788565b50508251906130a46108b9565b91825286602083015260408201526111663360018060a01b03166000526002602052604060002090565b6130de6040519283923384612fc9565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b906131336020928281519485920161058b565b0190565b60208151910151811580613198575b6131795760408051602081019384528082019290925281529061316a606083610889565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b508015613146565b9190916131ab61201a565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff19909416606085018190526080909420549093901561322357613217929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109336001926120fd565b505060009190565b6000919082805b82518210156132ac5761ffff19918261324b8286611d8f565b511686526001602081815260408089203360009081529083528190209294919254820180921161039e576001946132a593612c14939761328b878b611d8f565b51168b525288203360009081526020919091526040902090565b0190613232565b93505050565b9161093393916132c1936139f8565b90929192613a86565b906108b7602e60405180946c1131b430b63632b733b2911d1160991b60208301526132ff815180926020602d8601910161058b565b8101601160f91b602d82015203600e810185520183610889565b805160201015611cf75760400190565b6040513d6000823e3d90fd5b602092919061334b84928281519485920161058b565b019081520190565b3d1561337e573d90613364826108c6565b916133726040519384610889565b82523d6000602084013e565b606090565b908160209103126101fd575190565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a883116135ac57602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346133ff835160608601516133f9816120c1565b91613b13565b8981519101200361359f5761341f61342491613419613b96565b90613e7f565b6132ca565b613439825160408501516133f98451826120dd565b888151910120908881519101200361357757600160f81b8061346c61345e8551613319565b516001600160f81b03191690565b1603613577576080820151151580613583575b6135775751866040519182806134986000958694613120565b039060025afa156135725786816134dd815194516134bd604051968792868401613335565b03946134d1601f1996878101835282610889565b60405191828092613120565b039060025afa15613572578051604080518981018381526020810187905291820187905260608201889052608082018990529193839290613522908260a08501611fed565b51906101005afa95613532613353565b9081519780613569575b61354c5750506109339550613bf5565b6001976135659750820181019550019250613383915050565b1490565b5087151561353c565b613329565b50505050505050600090565b50600160fa1b8061359761345e8551613319565b16141561347f565b5050505050505050600090565b505050505050600090565b600091929082916040516135ef8161293e6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ae565b51915afa906135fc613353565b82613624575b8261360c57505090565b9091506020818051810103126101fd57602001511490565b915060208251101591613602565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080902054801590811561366f575090565b600191501690565b6001909201805490929182156136fa578281106136d9575080820361369b57505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b80935081925010613709575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b90805182556001820190602081015190600282101561048757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612cd35782825103610f12576103e883116138aa57906000915b8383106137ba575050509190565b9091946137e16124946137db6137d3610e098a87611d8f565b61ffff191690565b33613dc8565b61389a576137ef8684611d8f565b5151158015613883575b6138455761383c60019161382a6138108987611d8f565b5161382533610e27610e12610e098e8b611d8f565b61372b565b6138348886611d8f565b5151906120dd565b950191906137ac565b5084610e7b610e098261385794611d8f565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f42406138928785611d8f565b5151116137f9565b610f0e610eeb610e098885611d8f565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612cd35783835103610f12576103e86138ef85836120dd565b116139705750906000915b838310613908575050509190565b9091946139216124946137db6137d3610e098a87611d8f565b61389a5761392f8684611d8f565b5151158015613959575b6138455761395060019161382a6138108987611d8f565b950191906138fa565b50620f42406139688785611d8f565b515111613939565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b811580156139ec575b6139bf5761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f4240821161399a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613a7057926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa156135725780516001600160a01b03811615613a6757918190565b50809160019190565b50505060009160039190565b6004111561048757565b613a8f81613a7c565b80613a98575050565b613aa181613a7c565b60018103613abb5760405163f645eedf60e01b8152600490fd5b613ac481613a7c565b60028103613ae55760405163fce698f760e01b815260048101839052602490fd5b80613af1600392613a7c565b14613af95750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613b8e575b81811115613b86575b50828110613b3a57505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613b6f57908290613b57565b505060008583016020015250603f01168201604052565b905038613b2d565b925082613b24565b60405190613ba382610837565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613cd7575b8015613ccf575b8015613cb7575b613cad57613c1f8386613f27565b15613cad5760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614915833981519152948560a084015260208360c0816005600019fa156101fd57613ca79386613ca1945181818909940991613fc8565b91612b57565b90081590565b5050505050600090565b50600080516020614915833981519152821015613c11565b508115613c0a565b50600080516020614915833981519152841015613c03565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613dc0575b613db7576001600060015b15613d8b575b50606084015260808320805460009161fffe198083169190898314613d6a57505091613d3d565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613dad575b5015613da35738613d43565b5060009450505050565b9050151538613d97565b50600093505050565b508015613d32565b9061ffff1916908115613e5057604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613e4757600160809252209182549283158015613e3d575b15613e3157600193505555600190565b90600217905555600190565b5060018416613e21565b50505050600090565b5050600090565b90613e61826108c6565b613e6e6040519182610889565b8281528092612b4d601f19916108c6565b805115613f1d57613eaa613ea5613e9e613e99845161209b565b6120cf565b6003900490565b613e57565b91602083019180805101906020820192835194600085525b838310613ed157505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301613ec2565b5050610933611b8d565b600160601b63ffffffff60c01b031990818110801590613fbe575b8015613fad575b613fa5577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b5080158015613f4957508215613f49565b5081831015613f42565b60009260ff929091848315806146d4575b61357757613fe783836146dc565b90958615806146cc575b61468e575b85811c60028a60fe1c16015b1561467457600186821c1660028a831c60011b16016001811461463b575b6002811461462e575b600314614621575b60009493929419019560019860015b88600019116140ad5750505050505050505060405191606083015260208252602080830152602060408301526000805160206149358339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa156101fd5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b0319808260008051602061493583398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156146035760018c600286838f841c16921c831b1601146145cc575b838c8c6002600182841c168185851c60011b1601146145b9575b6003926001600292841c16921c60011b1601146145b0575b861561459d57600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614387575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a0960008051602061493583398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b031992839081908184800990096000805160206149358339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b60001901979693959493614040565b8661425c57919a9198919550600160601b63ffffffff60c01b0319905080808360008051602061493583398151915209600160601b63ffffffff60c01b03198460008051602061493583398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b0319908180808560008051602061493583398151915209600160601b63ffffffff60c01b0319866000805160206149358339815191520909600160601b63ffffffff60c01b03198560008051602061493583398151915209090997600160601b63ffffffff60c01b03199081808460008051602061493583398151915209600160601b63ffffffff60c01b0319856000805160206149358339815191520909099a600160601b63ffffffff60c01b0319808c60008051602061493583398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b03199283908180808360008051602061493583398151915209600160601b63ffffffff60c01b0319846000805160206149358339815191520909600160601b63ffffffff60c01b03198360008051602061493583398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614378565b60019c50909a8c99509095509050614378565b5050828461421b565b508993508a92508591508d90508c614203565b50506000805160206148f58339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f56141e9565b50949a90999097600160601b63ffffffff60c01b0319039450614378565b9150955084958091614031565b9397508793859350614029565b6000805160206148f583398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59350614020565b60001901600160028188841c16918b841c901b1601614002565b9790946000805160206149158339815191529182039008936000978515806146c4575b15613ff657505050505050505050600090565b5060016146b1565b508115613ff1565b508615613fd9565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592916000805160206148f5833981519152918115614834578083148061482b575b156148145750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe816001840892080960030981808080866000805160206149358339815191520981858009089981600181818b099a099709810393898203900890090893915b60405190602082526020808301526020604083015260608201526000805160206149358339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa156101fd57838080935180950980099009930990565b90915061482292935061483a565b919392916147ae565b5081851461471e565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b9209089509089280808080878009968709948180886000805160206148f583398151915209918180808560008051602061493583398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220d586e4fd303dfab4216400fe9fa3ed6319112d27701f24d09905e2c95485692164736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x1d", + "chainId": "0xa4b1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x82b95e", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x4150bf612ecad1efda612b3f2aa9df7f0854c4860a5a44439e9020dfc8e5c07b", + "transactionIndex": "0x1", + "blockHash": "0x6585971397b8dc96f2d3edc2243df757062885f4f2da1f2ec9e0daeb02bf574b", + "blockNumber": "0xfedead4", + "gasUsed": "0x82b95e", + "effectiveGasPrice": "0x989680", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", + "gasUsedForL1": "0x43af3c", + "l1BlockNumber": "0x14100fc" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1729795217, + "chain": 42161, + "commit": "bf15fa9" +} \ No newline at end of file diff --git a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/421614/run-1729794812.json b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/421614/run-1729794812.json new file mode 100644 index 0000000..4192be1 --- /dev/null +++ b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/421614/run-1729794812.json @@ -0,0 +1,51 @@ +{ + "transactions": [ + { + "hash": "0xca475bbbb8a1a746835bf0e45a2b8c5c14d8266f0e72e8f6622f94bd205398d6", + "transactionType": "CREATE2", + "contractName": "WeightedWebauthnMultisigPlugin", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x53e5fc", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a0346200007757601f62004a1d38819003918201601f19168301916001600160401b038311848410176200007c578084926020946040528339810103126200007757516001600160a01b0381168103620000775760805260405161498a90816200009382396080518181816119a1015261290a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461018d5780630b96422d146101885780630c7ecd84146101425780630cdc271f146101835780631128186d1461017e578063118a53891461017957806315b76b84146101745780631626ba7e1461016f57806346d60eb2146101425780636bbefc891461016a5780636d61fe701461016557806371af817b1461016057806377102c351461015b578063852b67af14610156578063858e6ee4146101515780638a91b0e31461014c578063b139ec6314610147578063bfd151c114610142578063c4db8dd91461013d578063c776313014610138578063c8050ee414610133578063e8eb3cc61461012e578063ef4a7203146101295763f582bceb1461012457600080fd5b611a01565b6119d0565b61198b565b61194b565b61153b565b61126c565b61040e565b611209565b611089565b611020565b610f53565b610f24565b610d00565b610bb0565b610aad565b610936565b6107f3565b6106a9565b61054e565b6104c1565b610262565b346101fd5760203660031901126101fd5760043563ffffffff60e01b81168091036101fd576020906372d61afb60e01b81149081156101d2575b506040519015158152f35b63043140ed60e01b8114915081156101ec575b50386101c7565b6301ffc9a760e01b149050386101e5565b600080fd5b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460051b0101116101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460061b0101116101fd57565b346101fd5760603660031901126101fd576001600160401b036004358181116101fd57610293903690600401610202565b916024359081116101fd576102ac903690600401610232565b926102b633613632565b6103a3576102d1926102c9913691611a59565b923691611ab7565b81519181519182840180851161039e576102ed90949294612b25565b9360009283915b818310610354575050506000915b8383106103175761031560443586612b80565b005b61034c60019161034761033361032d8787611d8f565b51613137565b61033d838a611d8f565b9061ffff19169052565b6122c5565b920191610302565b91939091906001906103959061034761038b6001600160a01b036103788a88611d8f565b511660101b62010000600160b01b031690565b61033d838c611d8f565b940191906102f4565b61206f565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b03821682036101fd57565b600435906001600160a01b03821682036101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd57602083818601950101116101fd57565b346101fd5760803660031901126101fd5760043560ff811681036101fd576024356001600160a01b038116036101fd576064356001600160401b0381116101fd5761045d9036906004016103e1565b5050611b2a565b634e487b7160e01b600052602160045260246000fd5b9060028210156104875752565b610464565b91926104aa608094979695929760a08501988552602085019061047a565b6001600160a01b0316604083015260608201520152565b346101fd5760403660031901126101fd5760043561ffff1981168091036101fd57610513906104ee6103b5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361054a93600881901c6001600160a01b03169160ff909116908661048c565b0390f35b346101fd5760403660031901126101fd5760043560ff811681036101fd576024356001600160401b0381116101fd5761045d9036906004016103e1565b60005b83811061059e5750506000910152565b818101518382015260200161058e565b906020916105c78151809281855285808601910161058b565b601f01601f1916010190565b906020908183526105ef815160808486015260a08501906105ae565b9180820151916060610626610613601f1996604096888a83030160408b01526105ae565b60408401518789830301848a01526105ae565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061066057505050505050505090565b909192939495969786806106978387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ae565b9a01950195019396959492919061064e565b346101fd5760003660031901126101fd576106c2611b59565b5061054a6106ce611b59565b6106d6611bb0565b81526106e0611bf3565b60208201526106ed611c14565b60408201526107a26106fd611c4d565b6060830190815261073961070f611cae565b6107176108aa565b63852b67af60e01b815290602082015282519061073382611cea565b52611cea565b5061076f610745611da3565b61074d6108aa565b6371af817b60e01b815290602082015282519061076982611cfc565b52611cfc565b50610778611ddc565b906107816108aa565b630b96422d60e01b8152916020830152519061079c82611d0c565b52611d0c565b50604051918291826105d3565b906003196060818401126101fd5760043560ff811681036101fd5792602435916001600160401b0383116101fd5782610120920301126101fd576004019060443590565b346101fd5761045d366107af565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761083257604052565b610801565b606081019081106001600160401b0382111761083257604052565b60a081019081106001600160401b0382111761083257604052565b61012081019081106001600160401b0382111761083257604052565b90601f801991011681019081106001600160401b0382111761083257604052565b604051906108b782610817565b565b604051906108b782610837565b6001600160401b03811161083257601f01601f191660200190565b9291926108ed826108c6565b916108fb6040519384610889565b8294818452818301116101fd578281602093846000960137010152565b9080601f830112156101fd57816020610933933591016108e1565b90565b346101fd5760403660031901126101fd576024356001600160401b0381116101fd5761096961097d913690600401610918565b61097560043533611ed0565b3390806122d4565b50156109a1576020630b135d3f60e11b5b6040516001600160e01b03199091168152f35b60206001600160e01b031961098e565b90815180825260208080930193019160005b8281106109d1575050505090565b835161ffff1916855293810193928101926001016109c3565b6080809180518452610a046020820151602086019061047a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610a48575050505090565b909192938260a082610a5d60019489516109ea565b01950193929101610a3a565b91610a95604091610a8760809497969760a0875260a08701906109b1565b908582036020870152610a28565b94805182850152602081015160608501520151910152565b346101fd576020806003193601126101fd57610ac76103cb565b610acf611e05565b50610ae1610adc82612ce5565b612d94565b90610aec8251612dd6565b9260005b8351811015610b545760019061ffff19610b0a8287611d8f565b5116600090815282845260408082206001600160a01b03871683526020529020610b38906120fd565b6120fd565b610b428288611d8f565b52610b4d8187611d8f565b5001610af0565b505060018060a01b0316600052600260205261054a610b766040600020611e24565b60405193849384610a69565b60206003198201126101fd57600435906001600160401b0382116101fd57610bac916004016103e1565b9091565b346101fd57610bbe36610b82565b610bc733613632565b15610c6b5781019060a0818303126101fd576001600160401b0381358181116101fd57820183601f820112156101fd5783816020610c0793359101611a59565b9260208301358281116101fd5781610c20918501611e9a565b9360408401358381116101fd5782610c39918601611eb5565b60608501359384116101fd5761031595610c5a610c60946080968801611e9a565b92612e26565b919092013591612fff565b60405162dc149f60e41b8152600490fd5b60a06003198201126101fd576001600160401b03906004358281116101fd5781610ca891600401610202565b939093926024358181116101fd5783610cc391600401610202565b939093926044358381116101fd5782610cde91600401610232565b939093926064359182116101fd57610cf891600401610202565b909160843590565b346101fd57610d0e36610c7c565b97969094959293610d1e33613632565b6103a357610d43610c5a94610d3b610d539a610d4b953691611a59565b983691611e4c565b943691611ab7565b933691611e4c565b819291519181518303610f12576000808415159283610de4575b3360009081526002602052604090209495509293610da79390610d9f9093610d9a600286019485546120dd565b612b73565b809255613677565b610dad57005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610ddf6040519283923384612fc9565b0390a1005b60005b868110610df45750610d6d565b91610e3e33610e27610e12610e09878d611d8f565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610e498488611d8f565b51518115610edb57878a82841015610e97579260019492610d9a610e8993610e818a610e7b610e0982610e8f9b611d8f565b92611d8f565b515190613991565b906120dd565b925b01610de7565b8284939497959711610eb0575b50505050600190610e91565b92849792610d9a610e8993610e8188610e7b610e0960019b610ed19b611d8f565b939038878a610ea4565b610f0e610eeb610e09878d611d8f565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b346101fd5760403660031901126101fd576020610f4b610f426103cb565b60243590611ed0565b604051908152f35b346101fd57610f6136610c7c565b97969094959293610f7133613632565b6103a357610d43610c5a94610d3b610f8e9a610d4b953691611a59565b90336000526002602052604060002092610faa845484846138ca565b60028692960192835491820180921161039e57825496870180971161039e5781610ff8947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613677565b610ddf6040519283923384612fc9565b901515815260c0810192916108b791602001906109ea565b346101fd5760603660031901126101fd576110396103cb565b60403660231901126101fd576110799061107360405161105881610817565b6024358152604435602082015261106d61201a565b50613137565b906131a0565b9061054a60405192839283611008565b346101fd5761109736610b82565b50506110a5610adc33612ce5565b6000903382526002602052600180604084200154906110e3336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6111c3575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6111bd887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b6111816111456108b9565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b61118a8161322b565b9061119b6040519283923384612045565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156111e4575b87908352608085208861fffe198254169155916110ed565b9081161580611200575b156111fa5782906111cc565b806110f2565b508015156111ee565b346101fd5760803660031901126101fd576044356001600160a01b03811681036101fd576064356001600160401b0381116101fd5760409161125261125e923690600401610918565b906024356004356122d4565b825191151582526020820152f35b346101fd576020610f4b61127f366107af565b916127e4565b90815180825260208080930193019160005b8281106112a5575050505090565b83516001600160e01b03191685529381019392810192600101611297565b908082519081815260208091019281808460051b8301019501936000915b8483106112f15750505050505090565b9091929394958480611335600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611285565b98019301930191949392906112e1565b80516005811015610487576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061138b575050505090565b909192938260806001926113b383895163ffffffff60e01b8151168452015184830190611345565b0195019392910161137d565b90815180825260208080930193019160005b8281106113df575050505090565b909192938260e06001926114186040895163ffffffff851b815116845261140c8682015187860190611345565b01516080830190611345565b019501939291016113d1565b906109339160208152815190611448610180928360208401526101a0830190611285565b916114c261149661148261146e602088015196601f199788888303016040890152611285565b604088015187878303016060880152611285565b606087015186868303016080870152611285565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526112c3565b61152b6115146114fd6114e660e089015194610100958989830301878a015261136b565b93880151936101209488888303018689015261136b565b92870151926101409387878303018588015261136b565b91860151916101609286868303018487015261136b565b94015192828503019101526113bf565b346101fd576000806003193601126119485761054a906115596129ca565b5061193b6115656129ca565b916115f06115e4611574612a36565b6115936115876040880192808452611cea565b63852b67af60e01b9052565b6115ac6115a08251611cfc565b630b96422d60e01b9052565b6115c56115b98251611d0c565b6371af817b60e01b9052565b6115de6115d28251611d1c565b630b135d3f60e11b9052565b51611d2c565b6377102c3560e01b9052565b6115f86108b9565b600181529061176e6020928284820152826040820152611616612a61565b60e087019081526116436116286108aa565b63852b67af60e01b8152838782015282519061073382611cea565b5061166a61164f6108aa565b630b96422d60e01b8152838782015282519061076982611cfc565b506116916116766108aa565b6371af817b60e01b8152838782015282519061079c82611d0c565b506116be61169d6108aa565b635b0e93fb60e11b815283878201528251906116b882611d1c565b52611d1c565b506116eb6116ca6108aa565b631a7e6adf60e11b815283878201528251906116e582611d2c565b52611d2c565b506117186116f76108aa565b633e15cc3d60e21b8152838782015282519061171282611d3c565b52611d3c565b506117456117246108aa565b63c1a221f360e01b8152838782015282519061173f82611d4c565b52611d4c565b5061174e6108aa565b63278f794360e11b81529185830152519061176882611d5c565b52611d5c565b506117776108b9565b6003815290808383015280604083015261178f6108b9565b6001815290808483015260408201526117fc6117a9612ac3565b9261010087019384526117d86117bd6108aa565b630b135d3f60e11b8152828782015285519061073382611cea565b506117e16108aa565b6377102c3560e01b8152908582015283519061076982611cfc565b506118236118086108aa565b63852b67af60e01b8152828582015283519061079c82611d0c565b5061184a61182f6108aa565b630b96422d60e01b815282858201528351906116b882611d1c565b506118716118566108aa565b6371af817b60e01b815282858201528351906116e582611d2c565b5061189861187d6108aa565b635b0e93fb60e11b8152828582015283519061171282611d3c565b506118bf6118a46108aa565b631a7e6adf60e11b8152828582015283519061173f82611d4c565b506118e66118cb6108aa565b633e15cc3d60e21b8152828582015283519061176882611d5c565b506119136118f26108aa565b63c1a221f360e01b8152828582015283519061190d82611d6d565b52611d6d565b5061191c6108aa565b63278f794360e11b815292830152519061193582611d7e565b52611d7e565b5060405191829182611424565b80fd5b346101fd5760403660031901126101fd57602061197e60405161196d81610817565b600435815260243583820152613137565b6040519061ffff19168152f35b346101fd5760003660031901126101fd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101fd5760203660031901126101fd57602062010000600160b01b036119f56103cb565b60101b16604051908152f35b346101fd5760403660031901126101fd57611079611a1d6103cb565b611a256103b5565b611a2d61201a565b5060101b62010000600160b01b0316906131a0565b6001600160401b0381116108325760051b60200190565b9291611a6482611a42565b91611a726040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611a985750505050565b81356001600160a01b03811681036101fd578152908301908301611a8b565b929192611ac382611a42565b604092611ad36040519283610889565b819581835260208093019160061b8401938185116101fd57915b848310611afc57505050505050565b85838303126101fd578386918251611b1381610817565b853581528286013583820152815201920191611aed565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761083257604052606080838181528160208201528160408201520152565b60405190602082018281106001600160401b038211176108325760405260008252565b60405190611bbd82610837565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611c0082610817565b60058252640312e302e360dc1b6020830152565b60405190611c2182610817565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108325760405260038352829160009160005b606080821015611ca557825160209291611c9282610817565b8682528382015287820183015201611c79565b50505091925050565b60405190611cbb82610817565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611cf75760200190565b611cd4565b805160011015611cf75760400190565b805160021015611cf75760600190565b805160031015611cf75760800190565b805160041015611cf75760a00190565b805160051015611cf75760c00190565b805160061015611cf75760e00190565b805160071015611cf7576101000190565b805160081015611cf7576101200190565b805160091015611cf7576101400190565b8051821015611cf75760209160051b010190565b60405190611db082610817565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611de982610817565b600d82526c52656d6f7665204f776e65727360981b6020830152565b60405190611e1282610837565b60006040838281528260208201520152565b90604051611e3181610837565b60406002829480548452600181015460208501520154910152565b9291611e5782611a42565b91611e656040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611e8b5750505050565b81358152908301908301611e7e565b9080601f830112156101fd5781602061093393359101611e4c565b9080601f830112156101fd5781602061093393359101611ab7565b61093391611fed611ff9611f9b611f3094611ee9611bb0565b611ef1611bf3565b6040519788916020998a9182611f10818401978881519384920161058b565b8201611f248251809386808501910161058b565b01038084520182610889565b519020604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647289820190815260208101939093524691830191909152306060808401919091529290921b6bffffffffffffffffffffffff191660808201529091829060a0830190565b0391611faf601f1993848101835282610889565b51902094604051938491820195869190602060408401937f7dc7da30a002512936154da01baa79a3d1e54e35034ffdfa7c53c28b3091236d81520152565b03908101835282610889565b519020906042916040519161190160f01b8352600283015260228201522090565b6040519061202782610852565b60006080838281528260208201528260408201528260608201520152565b93929161206a9060409260018060a01b031686526060602087015260608601906109b1565b930152565b634e487b7160e01b600052601160045260246000fd5b9060418202918083046041149015171561039e57565b600281901b91906001600160fe1b0381160361039e57565b906041820180921161039e57565b906015820180921161039e57565b906002820180921161039e57565b9190820180921161039e57565b60ff601f199116019060ff821161039e57565b9060405161210a81610852565b80928054825260018101549060ff821690600282101561048757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061215e82610837565b6000604083815161216e81610852565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926121a3816108c6565b916121b16040519384610889565b8294828452828201116101fd5760206108b793019061058b565b9080601f830112156101fd57815161093392602001612196565b519081151582036101fd57565b60209081818403126101fd5780516001600160401b03918282116101fd57016060818503126101fd5760409283519461222a86610837565b82518481116101fd5783019360a0858303126101fd5785519161224c83610852565b85518281116101fd57860181601f820112156101fd5781818661227193519101612196565b8352838601519182116101fd57856122916080926122ad948a99016121cb565b85850152868101518785015260608101516060850152016121e5565b60808201528552808201519085015201519082015290565b600019811461039e5760010190565b939291909160009460418251106126d7576001600160a01b0383166000908152600260205260409020600101549384156127a05760009384928391828483146127945792979460ff60015b16976001995b878110612359575050505050505050508061233f57509190565b604051631007539160e31b81526004810191909152602490fd5b61236a61236584612085565b6120b3565b821515908161278a575b811561277f575b5061275e576123a0838a90604102016020810151906060604082015191015160001a92565b91979088602060ff82161061275457508d6123bb899a6120ea565b9d600019019d5b60ff8116806125d1575050506001600160a01b03811681116125bf578d9862010000600160b01b038260101b169960018060a01b0383168b61243360016124228d610e27838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b16036125a6575b508c518411801561259c575b61258a5761245c6020808f8701015101856120dd565b8d5110612578578e938d8782108015612570575b612566575b61249893612494939290910160200191906001600160a01b03166135b7565b1590565b61254b575b61ffff19808916911681119081159161250a575b506124f1575b506124e36124ea916124dc86610e278a61ffff19166000526001602052604060002090565b54906120dd565b95926122c5565b9194612325565b6124fc575b8a6124b7565b919b50600099508b916124f6565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff199190911660608201526080902054159050386124b1565b90612558575b8b9061249d565b9a509b50819b60009a612551565b9096508690612475565b508715612470565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b5060418410612446565b6125b1575b8e61243a565b9d509e50849e60009d6125ab565b60405163e6c4247b60e01b8152600490fd5b6002036126f357505061ffff199060101b1697612604610b3388610e278c61ffff19166000526001602052604060002090565b6080606082015191015191612617612151565b508d51851180156126e9575b61258a578d61263a602080888401015101876120dd565b9051106126d7578f948e88821080156126cf575b6126c5575b6126b49492826126a361268184602061249499976126959701015160409485809282850101019201016121f2565b928251948591602083019190602083019252565b03601f198101855284610889565b815190602083015192015192613392565b1561249d5790612558578b9061249d565b9097508790612653565b50881561264e565b60405163d245329360e01b8152600490fd5b5060418510612623565b612701939a949291946132b2565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b0390811692909161274291612422908b90610e27565b161461249d5790612558578b9061249d565b98508d8a996123c2565b505099979650505050505050600014612778575060009190565b6000925090565b90508951103861237b565b8381119150612374565b92979460ff600061231f565b60405163d349279d60e01b8152600490fd5b903590601e19813603018212156101fd57018035906001600160401b0382116101fd576020019181360383136101fd57565b9192909260ff83161561281e576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6128539192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612862828501856127b2565b908184519182372061297e61287a60608701876127b2565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470848201528381526128f48161086d565b5190208451602081019182526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016604082015246606082015261294c81608081015b03601f198101835282610889565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b928383146129ba575061299b856129a2926129aa969701906127b2565b36916108e1565b9133916122d4565b50156129b557600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108325760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610832576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b038211176108325760405260088352600083815b6101008110612a9a5750505050565b6020908451612aa881610817565b84815282612ab4611e05565b81830152828501015201612a8b565b6040906040519161016083018381106001600160401b0382111761083257604052600a8352600083815b6101408110612afc5750505050565b6020908451612b0a81610817565b84815282612b16611e05565b81830152828501015201612aed565b90612b2f82611a42565b612b3c6040519182610889565b8281528092612b4d601f1991611a42565b0190602036910137565b9060008051602061491583398151915291820391821161039e57565b9190820391821161039e57565b91908251918215612cd357336000526002602052604090604060002080549480861115612cc157600094855b8851871015612c6657612bdc612494612bd661ffff19612bcc8b8e611d8f565b511661ffff191690565b33613cef565b612c3357612bfb6001916124dc8b610e27610e12610e098d3394611d8f565b96612c2c612c148b610e27610e12610e09863394611d8f565b60036000918281558260018201558260028201550155565b0195612bac565b610f0e86612c44610e098a8d611d8f565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612cac93979450610d9f867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612ca56002870195865492612b73565b8655612b73565b612cbc6040519283923384612045565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612d8b575b15612d705761fffe1985169101600581901b870184018290529360021615612d68576060850152608084205492612d29565b508592612d29565b95935050945050608091506001830160051b01016040528252565b50841515612d36565b908151612da081612b25565b9060005b818110612db2575090925050565b60019061ffff19612dc38288611d8f565b5116612dcf8286611d8f565b5201612da4565b90612de082611a42565b612ded6040519182610889565b8281528092612dfe601f1991611a42565b019060005b828110612e0f57505050565b602090612e1a61201a565b82828501015201612e03565b929093919383519480519282518714801590612fbe575b610f1257612e4e84889794986120dd565b96612e61612e5b89612b25565b98612dd6565b9660009485925b898b848610612f16575050505050506000925b848410612e89575050505050565b612f0e600191612ea9612e9f61032d8888611d8f565b61033d838d611d8f565b612eb38685611d8f565b51612ebe828b611d8f565b51526020600081612ecf848d611d8f565b510152612edc8787611d8f565b51516060612eea848d611d8f565b510152612ef78787611d8f565b5101516080612f06838c611d8f565b5101526122c5565b930192612e7b565b97610347612fb4926040612fa384612f9d612f4b8c9f9c612f698c9d9e61033d8660019e9f612f58612f4b87610e7b93611d8f565b516001600160a01b031690565b60101b62010000600160b01b031690565b612f73818d611d8f565b51612f7e8589611d8f565b5152612f976020612f8f868a611d8f565b510160019052565b8c611d8f565b93611d8f565b516001600160a01b03909216910152565b9601929190612e68565b508051841415612e3d565b6001600160a01b039091168152606060208201819052610933939192612ff1918401906109b1565b916040818403910152610a28565b919283156127a057600093845b83518610156130355761301f8685611d8f565b5151810180911161039e5760019095019461300c565b90939194508381106131005782826130ce7f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1793613097612cbc977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613788565b50508251906130a46108b9565b91825286602083015260408201526111663360018060a01b03166000526002602052604060002090565b6130de6040519283923384612fc9565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b906131336020928281519485920161058b565b0190565b60208151910151811580613198575b6131795760408051602081019384528082019290925281529061316a606083610889565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b508015613146565b9190916131ab61201a565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff19909416606085018190526080909420549093901561322357613217929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109336001926120fd565b505060009190565b6000919082805b82518210156132ac5761ffff19918261324b8286611d8f565b511686526001602081815260408089203360009081529083528190209294919254820180921161039e576001946132a593612c14939761328b878b611d8f565b51168b525288203360009081526020919091526040902090565b0190613232565b93505050565b9161093393916132c1936139f8565b90929192613a86565b906108b7602e60405180946c1131b430b63632b733b2911d1160991b60208301526132ff815180926020602d8601910161058b565b8101601160f91b602d82015203600e810185520183610889565b805160201015611cf75760400190565b6040513d6000823e3d90fd5b602092919061334b84928281519485920161058b565b019081520190565b3d1561337e573d90613364826108c6565b916133726040519384610889565b82523d6000602084013e565b606090565b908160209103126101fd575190565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a883116135ac57602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346133ff835160608601516133f9816120c1565b91613b13565b8981519101200361359f5761341f61342491613419613b96565b90613e7f565b6132ca565b613439825160408501516133f98451826120dd565b888151910120908881519101200361357757600160f81b8061346c61345e8551613319565b516001600160f81b03191690565b1603613577576080820151151580613583575b6135775751866040519182806134986000958694613120565b039060025afa156135725786816134dd815194516134bd604051968792868401613335565b03946134d1601f1996878101835282610889565b60405191828092613120565b039060025afa15613572578051604080518981018381526020810187905291820187905260608201889052608082018990529193839290613522908260a08501611fed565b51906101005afa95613532613353565b9081519780613569575b61354c5750506109339550613bf5565b6001976135659750820181019550019250613383915050565b1490565b5087151561353c565b613329565b50505050505050600090565b50600160fa1b8061359761345e8551613319565b16141561347f565b5050505050505050600090565b505050505050600090565b600091929082916040516135ef8161293e6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ae565b51915afa906135fc613353565b82613624575b8261360c57505090565b9091506020818051810103126101fd57602001511490565b915060208251101591613602565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080902054801590811561366f575090565b600191501690565b6001909201805490929182156136fa578281106136d9575080820361369b57505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b80935081925010613709575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b90805182556001820190602081015190600282101561048757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612cd35782825103610f12576103e883116138aa57906000915b8383106137ba575050509190565b9091946137e16124946137db6137d3610e098a87611d8f565b61ffff191690565b33613dc8565b61389a576137ef8684611d8f565b5151158015613883575b6138455761383c60019161382a6138108987611d8f565b5161382533610e27610e12610e098e8b611d8f565b61372b565b6138348886611d8f565b5151906120dd565b950191906137ac565b5084610e7b610e098261385794611d8f565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f42406138928785611d8f565b5151116137f9565b610f0e610eeb610e098885611d8f565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612cd35783835103610f12576103e86138ef85836120dd565b116139705750906000915b838310613908575050509190565b9091946139216124946137db6137d3610e098a87611d8f565b61389a5761392f8684611d8f565b5151158015613959575b6138455761395060019161382a6138108987611d8f565b950191906138fa565b50620f42406139688785611d8f565b515111613939565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b811580156139ec575b6139bf5761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f4240821161399a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613a7057926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa156135725780516001600160a01b03811615613a6757918190565b50809160019190565b50505060009160039190565b6004111561048757565b613a8f81613a7c565b80613a98575050565b613aa181613a7c565b60018103613abb5760405163f645eedf60e01b8152600490fd5b613ac481613a7c565b60028103613ae55760405163fce698f760e01b815260048101839052602490fd5b80613af1600392613a7c565b14613af95750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613b8e575b81811115613b86575b50828110613b3a57505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613b6f57908290613b57565b505060008583016020015250603f01168201604052565b905038613b2d565b925082613b24565b60405190613ba382610837565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613cd7575b8015613ccf575b8015613cb7575b613cad57613c1f8386613f27565b15613cad5760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614915833981519152948560a084015260208360c0816005600019fa156101fd57613ca79386613ca1945181818909940991613fc8565b91612b57565b90081590565b5050505050600090565b50600080516020614915833981519152821015613c11565b508115613c0a565b50600080516020614915833981519152841015613c03565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613dc0575b613db7576001600060015b15613d8b575b50606084015260808320805460009161fffe198083169190898314613d6a57505091613d3d565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613dad575b5015613da35738613d43565b5060009450505050565b9050151538613d97565b50600093505050565b508015613d32565b9061ffff1916908115613e5057604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613e4757600160809252209182549283158015613e3d575b15613e3157600193505555600190565b90600217905555600190565b5060018416613e21565b50505050600090565b5050600090565b90613e61826108c6565b613e6e6040519182610889565b8281528092612b4d601f19916108c6565b805115613f1d57613eaa613ea5613e9e613e99845161209b565b6120cf565b6003900490565b613e57565b91602083019180805101906020820192835194600085525b838310613ed157505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301613ec2565b5050610933611b8d565b600160601b63ffffffff60c01b031990818110801590613fbe575b8015613fad575b613fa5577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b5080158015613f4957508215613f49565b5081831015613f42565b60009260ff929091848315806146d4575b61357757613fe783836146dc565b90958615806146cc575b61468e575b85811c60028a60fe1c16015b1561467457600186821c1660028a831c60011b16016001811461463b575b6002811461462e575b600314614621575b60009493929419019560019860015b88600019116140ad5750505050505050505060405191606083015260208252602080830152602060408301526000805160206149358339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa156101fd5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b0319808260008051602061493583398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156146035760018c600286838f841c16921c831b1601146145cc575b838c8c6002600182841c168185851c60011b1601146145b9575b6003926001600292841c16921c60011b1601146145b0575b861561459d57600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614387575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a0960008051602061493583398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b031992839081908184800990096000805160206149358339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b60001901979693959493614040565b8661425c57919a9198919550600160601b63ffffffff60c01b0319905080808360008051602061493583398151915209600160601b63ffffffff60c01b03198460008051602061493583398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b0319908180808560008051602061493583398151915209600160601b63ffffffff60c01b0319866000805160206149358339815191520909600160601b63ffffffff60c01b03198560008051602061493583398151915209090997600160601b63ffffffff60c01b03199081808460008051602061493583398151915209600160601b63ffffffff60c01b0319856000805160206149358339815191520909099a600160601b63ffffffff60c01b0319808c60008051602061493583398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b03199283908180808360008051602061493583398151915209600160601b63ffffffff60c01b0319846000805160206149358339815191520909600160601b63ffffffff60c01b03198360008051602061493583398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614378565b60019c50909a8c99509095509050614378565b5050828461421b565b508993508a92508591508d90508c614203565b50506000805160206148f58339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f56141e9565b50949a90999097600160601b63ffffffff60c01b0319039450614378565b9150955084958091614031565b9397508793859350614029565b6000805160206148f583398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59350614020565b60001901600160028188841c16918b841c901b1601614002565b9790946000805160206149158339815191529182039008936000978515806146c4575b15613ff657505050505050505050600090565b5060016146b1565b508115613ff1565b508615613fd9565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592916000805160206148f5833981519152918115614834578083148061482b575b156148145750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe816001840892080960030981808080866000805160206149358339815191520981858009089981600181818b099a099709810393898203900890090893915b60405190602082526020808301526020604083015260608201526000805160206149358339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa156101fd57838080935180950980099009930990565b90915061482292935061483a565b919392916147ae565b5081851461471e565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b9209089509089280808080878009968709948180886000805160206148f583398151915209918180808560008051602061493583398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220d586e4fd303dfab4216400fe9fa3ed6319112d27701f24d09905e2c95485692164736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x2a", + "chainId": "0x66eee" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x3f728c", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xca475bbbb8a1a746835bf0e45a2b8c5c14d8266f0e72e8f6622f94bd205398d6", + "transactionIndex": "0x1", + "blockHash": "0x8ded949bad743f313413416114a035b59ea31b6c4ad0931188ebf419396206ee", + "blockNumber": "0x5722988", + "gasUsed": "0x3f728c", + "effectiveGasPrice": "0x5f5e100", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", + "gasUsedForL1": "0x686a", + "l1BlockNumber": "0x69dbed" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1729794812, + "chain": 421614, + "commit": "bf15fa9" +} \ No newline at end of file diff --git a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/421614/run-latest.json b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/421614/run-latest.json index f93e803..4192be1 100644 --- a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/421614/run-latest.json +++ b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/421614/run-latest.json @@ -1,19 +1,21 @@ { "transactions": [ { - "hash": "0xb33f1d07ed2b88d85c780902a929eb8d2d359e617c912b375575455a2d0cb4e8", + "hash": "0xca475bbbb8a1a746835bf0e45a2b8c5c14d8266f0e72e8f6622f94bd205398d6", "transactionType": "CREATE2", - "contractName": null, - "contractAddress": "0x558498e7cd325b17be8c8a79884a1cacfd72a4aa", + "contractName": "WeightedWebauthnMultisigPlugin", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", "function": null, - "arguments": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], "transaction": { - "from": "0xbcd75cbd82fc6c3e01e7b3793489ab2f879980ae", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x775433", + "gas": "0x53e5fc", "value": "0x0", - "input": "0x000000000000000000000000000000000000000000000000000000000000000060c0346200009857601f62004be838819003918201601f19168301916001600160401b038311848410176200009d578084926020946040528339810103126200009857516001600160a01b038116810362000098576080523060601b6001600160601b03191660a052604051614b349081620000b48239608051818181611ba00152612aae015260a0518181816110c701526120e80152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146101ad5780630b96422d146101a85780630c7ecd84146101585780630cdc271f146101a35780631128186d1461019e578063118a53891461019957806315b76b84146101945780631626ba7e1461018f578063197ea35b1461018a57806346d60eb2146101585780636bbefc89146101855780636d61fe701461018057806371af817b1461017b57806384b0196e14610176578063852b67af14610171578063858e6ee41461016c5780638616d61d146101675780638a91b0e314610162578063b139ec631461015d578063bfd151c114610158578063c4db8dd914610153578063c77631301461014e578063c8050ee414610149578063e8eb3cc614610144578063ef4a72031461013f5763f582bceb1461013a57600080fd5b611c00565b611bcf565b611b8a565b611b4a565b61173a565b611463565b61042e565b611400565b611280565b61125f565b6111f6565b611129565b611052565b610e2f565b610cdf565b610be9565b610ad5565b61098c565b610813565b6106c9565b61056e565b6104e1565b610282565b3461021d57602036600319011261021d5760043563ffffffff60e01b811680910361021d576020906372d61afb60e01b81149081156101f2575b506040519015158152f35b63043140ed60e01b81149150811561020c575b50386101e7565b6301ffc9a760e01b14905038610205565b600080fd5b9181601f8401121561021d578235916001600160401b03831161021d576020808501948460051b01011161021d57565b9181601f8401121561021d578235916001600160401b03831161021d576020808501948460061b01011161021d57565b3461021d57606036600319011261021d576001600160401b0360043581811161021d576102b3903690600401610222565b9160243590811161021d576102cc903690600401610252565b926102d6336137dc565b6103c3576102f1926102e9913691611c58565b923691611cb6565b8151918151918284018085116103be5761030d90949294612ce3565b9360009283915b818310610374575050506000915b8383106103375761033560443586612d3e565b005b61036c60019161036761035361034d8787611f7e565b516132e6565b61035d838a611f7e565b9061ffff19169052565b612469565b920191610322565b91939091906001906103b5906103676103ab6001600160a01b036103988a88611f7e565b511660101b62010000600160b01b031690565b61035d838c611f7e565b94019190610314565b612213565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b038216820361021d57565b600435906001600160a01b038216820361021d57565b9181601f8401121561021d578235916001600160401b03831161021d576020838186019501011161021d57565b3461021d57608036600319011261021d5760043560ff8116810361021d576024356001600160a01b0381160361021d576064356001600160401b03811161021d5761047d903690600401610401565b5050611d29565b634e487b7160e01b600052602160045260246000fd5b9060028210156104a75752565b610484565b91926104ca608094979695929760a08501988552602085019061049a565b6001600160a01b0316604083015260608201520152565b3461021d57604036600319011261021d5760043561ffff19811680910361021d576105339061050e6103d5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361056a93600881901c6001600160a01b03169160ff90911690866104ac565b0390f35b3461021d57604036600319011261021d5760043560ff8116810361021d576024356001600160401b03811161021d5761047d903690600401610401565b60005b8381106105be5750506000910152565b81810151838201526020016105ae565b906020916105e7815180928185528580860191016105ab565b601f01601f1916010190565b9060209081835261060f815160808486015260a08501906105ce565b9180820151916060610646610633601f1996604096888a83030160408b01526105ce565b60408401518789830301848a01526105ce565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061068057505050505050505090565b909192939495969786806106b78387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ce565b9a01950195019396959492919061066e565b3461021d57600036600319011261021d576106e2611d58565b5061056a6106ee611d58565b6106f6611d9f565b8152610700611de2565b602082015261070d611e03565b60408201526107c261071d611e3c565b6060830190815261075961072f611e9d565b610737610900565b63852b67af60e01b815290602082015282519061075382611ed9565b52611ed9565b5061078f610765611f92565b61076d610900565b6371af817b60e01b815290602082015282519061078982611eeb565b52611eeb565b50610798611fcb565b906107a1610900565b630b96422d60e01b815291602083015251906107bc82611efb565b52611efb565b50604051918291826105f3565b9060031960608184011261021d5760043560ff8116810361021d5792602435916001600160401b03831161021d57826101209203011261021d576004019060443590565b3461021d5761047d366107cf565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761085257604052565b610821565b60a081019081106001600160401b0382111761085257604052565b606081019081106001600160401b0382111761085257604052565b602081019081106001600160401b0382111761085257604052565b60e081019081106001600160401b0382111761085257604052565b61012081019081106001600160401b0382111761085257604052565b90601f801991011681019081106001600160401b0382111761085257604052565b6040519061090d82610837565b565b6040519061090d82610872565b6001600160401b03811161085257601f01601f191660200190565b9291926109438261091c565b9161095160405193846108df565b82948184528183011161021d578281602093846000960137010152565b9080601f8301121561021d5781602061098993359101610937565b90565b3461021d57604036600319011261021d576024356001600160401b03811161021d576109bf610a0491369060040161096e565b60206040516109e9816109db6004358583019190602083019252565b03601f1981018352826108df565b60405180948192638616d61d60e01b83523360048401612003565b0381305afa8015610a9157610a2492600091610a62575b50339080612478565b5015610a515761056a630b135d3f60e11b5b6040516001600160e01b031990911681529081906020820190565b61056a6001600160e01b0319610a36565b610a84915060203d602011610a8a575b610a7c81836108df565b810190611ff4565b38610a1b565b503d610a72565b612025565b90604060031983011261021d576004356001600160a01b038116810361021d5791602435906001600160401b03821161021d576109899160040161096e565b3461021d5761056a610aef610ae936610a96565b90612031565b6040519182916020835260208301906105ce565b90815180825260208080930193019160005b828110610b23575050505090565b835161ffff191685529381019392810192600101610b15565b6080809180518452610b566020820151602086019061049a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610b9a575050505090565b909192938260a082610baf6001948951610b3c565b01950193929101610b8c565b939291610be490610bd6604093606088526060880190610b03565b908682036020880152610b7a565b930152565b3461021d5760208060031936011261021d57610c036103eb565b610c14610c0f82612eab565b612f5a565b90610c1f8251612f9c565b9260005b8351811015610c875760019061ffff19610c3d8287611f7e565b5116600090815282845260408082206001600160a01b03871683526020529020610c6b906122a1565b6122a1565b610c758288611f7e565b52610c808187611f7e565b5001610c23565b505060018060a01b0316600052600260205261056a60016040600020015460405193849384610bbb565b602060031982011261021d57600435906001600160401b03821161021d57610cdb91600401610401565b9091565b3461021d57610ced36610cb1565b610cf6336137dc565b15610d9a5781019060a08183031261021d576001600160401b03813581811161021d57820183601f8201121561021d5783816020610d3693359101611c58565b92602083013582811161021d5781610d4f91850161218d565b93604084013583811161021d5782610d689186016121a8565b606085013593841161021d5761033595610d89610d8f94608096880161218d565b92612fec565b9190920135916131c5565b60405162dc149f60e41b8152600490fd5b60a060031982011261021d576001600160401b039060043582811161021d5781610dd791600401610222565b9390939260243581811161021d5783610df291600401610222565b9390939260443583811161021d5782610e0d91600401610252565b9390939260643591821161021d57610e2791600401610222565b909160843590565b3461021d57610e3d36610dab565b97969094959293610e4d336137dc565b6103c357610e72610d8994610e6a610e829a610e7a953691611c58565b98369161213f565b943691611cb6565b93369161213f565b9091825190825182036110405760009060008315159384610f0f575b50336000908152600260205260409020610ed2939291610ecc91610ec790946002860154612281565b612d31565b90613821565b610ed857005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610f0a604051928392338461318f565b0390a1005b6000905b808210610f205750610e9e565b9093610f6b33610f54610f3f610f36898d611f7e565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610f768689611f7e565b5151811561100957888a82841015610fc5579260019492610ec7610fb693610fae8c610fa8610f3682610fbc9b611f7e565b92611f7e565b515190613b3b565b90612281565b945b0190610f13565b8284939499959911610fde575b50505050600190610fbe565b92849692610ec7610fb693610fae88610fa8610f3660019b610fff9b611f7e565b929038888a610fd2565b61103c611019610f36898d611f7e565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b3461021d57600036600319011261021d576110ab61106e611d9f565b611076611de2565b604051906110838261088d565b600082526110b9602091604051958695601f60f81b875260e0602088015260e08701906105ce565b9085820360408701526105ce565b4660608501523360808501527f000000000000000000000000000000000000000000000000000000000000000060a085015283810360c08501526020808451928381520193019160005b82811061111257505050500390f35b835185528695509381019392810192600101611103565b3461021d5761113736610dab565b97969094959293611147336137dc565b6103c357610e72610d8994610e6a6111649a610e7a953691611c58565b9033600052600260205260406000209261118084548484613a74565b6002869296019283549182018092116103be5782549687018097116103be57816111ce947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613821565b610f0a604051928392338461318f565b901515815260c08101929161090d9160200190610b3c565b3461021d57606036600319011261021d5761120f6103eb565b604036602319011261021d5761124f9061124960405161122e81610837565b602435815260443560208201526112436121c3565b506132e6565b9061334f565b9061056a604051928392836111de565b3461021d576020611272610ae936610a96565b818151910120604051908152f35b3461021d5761128e36610cb1565b505061129c610c0f33612eab565b6000903382526002602052600180604084200154906112da336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6113ba575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6113b4887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b61137861133c61090f565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b611381816133da565b9061139260405192839233846121ee565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156113db575b87908352608085208861fffe198254169155916112e4565b90811615806113f7575b156113f15782906113c3565b806112e9565b508015156113e5565b3461021d57608036600319011261021d576044356001600160a01b038116810361021d576064356001600160401b03811161021d5760409161144961145592369060040161096e565b90602435600435612478565b825191151582526020820152f35b3461021d57602061147c611476366107cf565b91612988565b604051908152f35b90815180825260208080930193019160005b8281106114a4575050505090565b83516001600160e01b03191685529381019392810192600101611496565b908082519081815260208091019281808460051b8301019501936000915b8483106114f05750505050505090565b9091929394958480611534600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611484565b98019301930191949392906114e0565b805160058110156104a7576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061158a575050505090565b909192938260806001926115b283895163ffffffff60e01b8151168452015184830190611544565b0195019392910161157c565b90815180825260208080930193019160005b8281106115de575050505090565b909192938260e06001926116176040895163ffffffff851b815116845261160b8682015187860190611544565b01516080830190611544565b019501939291016115d0565b906109899160208152815190611647610180928360208401526101a0830190611484565b916116c161169561168161166d602088015196601f199788888303016040890152611484565b604088015187878303016060880152611484565b606087015186868303016080870152611484565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526114c2565b61172a6117136116fc6116e560e089015194610100958989830301878a015261156a565b93880151936101209488888303018689015261156a565b92870151926101409387878303018588015261156a565b91860151916101609286868303018487015261156a565b94015192828503019101526115be565b3461021d57600080600319360112611b475761056a90611758612b64565b50611b3a611764612b64565b916117ef6117e3611773612bd0565b6117926117866040880192808452611ed9565b63852b67af60e01b9052565b6117ab61179f8251611eeb565b630b96422d60e01b9052565b6117c46117b88251611efb565b6371af817b60e01b9052565b6117dd6117d18251611f0b565b6342580cb760e11b9052565b51611f1b565b630b135d3f60e11b9052565b6117f761090f565b600181529061196d6020928284820152826040820152611815612bfb565b60e08701908152611842611827610900565b63852b67af60e01b8152838782015282519061075382611ed9565b5061186961184e610900565b630b96422d60e01b8152838782015282519061078982611eeb565b50611890611875610900565b6371af817b60e01b815283878201528251906107bc82611efb565b506118bd61189c610900565b635b0e93fb60e11b815283878201528251906118b782611f0b565b52611f0b565b506118ea6118c9610900565b631a7e6adf60e11b815283878201528251906118e482611f1b565b52611f1b565b506119176118f6610900565b633e15cc3d60e21b8152838782015282519061191182611f2b565b52611f2b565b50611944611923610900565b63c1a221f360e01b8152838782015282519061193e82611f3b565b52611f3b565b5061194d610900565b63278f794360e11b81529185830152519061196782611f4b565b52611f4b565b5061197661090f565b6003815290808383015280604083015261198e61090f565b6001815290808483015260408201526119fb6119a8612c6f565b9261010087019384526119d76119bc610900565b630b135d3f60e11b8152828782015285519061075382611ed9565b506119e0610900565b6342580cb760e11b8152908582015283519061078982611eeb565b50611a22611a07610900565b63852b67af60e01b815282858201528351906107bc82611efb565b50611a49611a2e610900565b630b96422d60e01b815282858201528351906118b782611f0b565b50611a70611a55610900565b6371af817b60e01b815282858201528351906118e482611f1b565b50611a97611a7c610900565b635b0e93fb60e11b8152828582015283519061191182611f2b565b50611abe611aa3610900565b631a7e6adf60e11b8152828582015283519061193e82611f3b565b50611ae5611aca610900565b633e15cc3d60e21b8152828582015283519061196782611f4b565b50611b12611af1610900565b63c1a221f360e01b81528285820152835190611b0c82611f5c565b52611f5c565b50611b1b610900565b63278f794360e11b8152928301525190611b3482611f6d565b52611f6d565b5060405191829182611623565b80fd5b3461021d57604036600319011261021d576020611b7d604051611b6c81610837565b6004358152602435838201526132e6565b6040519061ffff19168152f35b3461021d57600036600319011261021d576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461021d57602036600319011261021d57602062010000600160b01b03611bf46103eb565b60101b16604051908152f35b3461021d57604036600319011261021d5761124f611c1c6103eb565b611c246103d5565b611c2c6121c3565b5060101b62010000600160b01b03169061334f565b6001600160401b0381116108525760051b60200190565b9291611c6382611c41565b91611c7160405193846108df565b829481845260208094019160051b810192831161021d57905b828210611c975750505050565b81356001600160a01b038116810361021d578152908301908301611c8a565b929192611cc282611c41565b604092611cd260405192836108df565b819581835260208093019160061b84019381851161021d57915b848310611cfb57505050505050565b858383031261021d578386918251611d1281610837565b853581528286013583820152815201920191611cec565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761085257604052606080838181528160208201528160408201520152565b60405190611d998261088d565b60008252565b60405190611dac82610872565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611def82610837565b60058252640312e302e360dc1b6020830152565b60405190611e1082610837565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108525760405260038352829160009160005b606080821015611e9457825160209291611e8182610837565b8682528382015287820183015201611e68565b50505091925050565b60405190611eaa82610837565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611ee65760200190565b611ec3565b805160011015611ee65760400190565b805160021015611ee65760600190565b805160031015611ee65760800190565b805160041015611ee65760a00190565b805160051015611ee65760c00190565b805160061015611ee65760e00190565b805160071015611ee6576101000190565b805160081015611ee6576101200190565b805160091015611ee6576101400190565b8051821015611ee65760209160051b010190565b60405190611f9f82610837565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611fd882610837565b600d82526c52656d6f7665204f776e65727360981b6020830152565b9081602091031261021d575190565b6001600160a01b039091168152604060208201819052610989929101906105ce565b6040513d6000823e3d90fd5b90610989906109db8151602080930120936040948551848101917fdfaf7f6d857ee2904b406c7ecdfdb06d93e4b009b03139affd7852a5636a95a483528782015286815261207e81610872565b5190209061208a611d9f565b84815191012090612099611de2565b85815191012090875191868301937fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472855289840152606083015246608083015260018060a01b031660a08201527f000000000000000000000000000000000000000000000000000000000000000060c082015260c08152612119816108a8565b519020945161190160f01b93810193845260028401959095526022830152839160420190565b929161214a82611c41565b9161215860405193846108df565b829481845260208094019160051b810192831161021d57905b82821061217e5750505050565b81358152908301908301612171565b9080601f8301121561021d578160206109899335910161213f565b9080601f8301121561021d5781602061098993359101611cb6565b604051906121d082610857565b60006080838281528260208201528260408201528260608201520152565b939291610be49060409260018060a01b03168652606060208701526060860190610b03565b634e487b7160e01b600052601160045260246000fd5b906041820291808304604114901517156103be57565b600281901b91906001600160fe1b038116036103be57565b90604182018092116103be57565b90601582018092116103be57565b90600282018092116103be57565b919082018092116103be57565b60ff601f199116019060ff82116103be57565b906040516122ae81610857565b80928054825260018101549060ff82169060028210156104a757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061230282610872565b6000604083815161231281610857565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926123478161091c565b9161235560405193846108df565b82948284528282011161021d57602061090d9301906105ab565b9080601f8301121561021d5781516109899260200161233a565b5190811515820361021d57565b602090818184031261021d5780516001600160401b039182821161021d570160608185031261021d576040928351946123ce86610872565b825184811161021d5783019360a08583031261021d578551916123f083610857565b855182811161021d57860181601f8201121561021d578181866124159351910161233a565b83528386015191821161021d5785612435608092612451948a990161236f565b8585015286810151878501526060810151606085015201612389565b60808201528552808201519085015201519082015290565b60001981146103be5760010190565b9392919091600094604182511061287b576001600160a01b0383166000908152600260205260409020600101549384156129445760009384928391828483146129385792979460ff60015b16976001995b8781106124fd57505050505050505050806124e357509190565b604051631007539160e31b81526004810191909152602490fd5b61250e61250984612229565b612257565b821515908161292e575b8115612923575b5061290257612544838a90604102016020810151906060604082015191015160001a92565b91979088602060ff8216106128f857508d61255f899a61228e565b9d600019019d5b60ff811680612775575050506001600160a01b0381168111612763578d9862010000600160b01b038260101b169960018060a01b0383168b6125d760016125c68d610f54838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b160361274a575b508c5184118015612740575b61272e576126006020808f870101510185612281565b8d511061271c578e938d8782108015612714575b61270a575b61263c93612638939290910160200191906001600160a01b0316613764565b1590565b6126ef575b61ffff1980891691168111908115916126ae575b50612695575b5061268761268e9161268086610f548a61ffff19166000526001602052604060002090565b5490612281565b9592612469565b91946124c9565b6126a0575b8a61265b565b919b50600099508b9161269a565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff19919091166060820152608090205415905038612655565b906126fc575b8b90612641565b9a509b50819b60009a6126f5565b9096508690612619565b508715612614565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b50604184106125ea565b612755575b8e6125de565b9d509e50849e60009d61274f565b60405163e6c4247b60e01b8152600490fd5b60020361289757505061ffff199060101b16976127a8610c6688610f548c61ffff19166000526001602052604060002090565b60806060820151910151916127bb6122f5565b508d518511801561288d575b61272e578d6127de60208088840101510187612281565b90511061287b578f948e8882108015612873575b612869575b6128589492826128476128258460206126389997612839970101516040948580928285010101920101612396565b928251948591602083019190602083019252565b03601f1981018552846108df565b81519060208301519201519261353d565b1561264157906126fc578b90612641565b90975087906127f7565b5088156127f2565b60405163d245329360e01b8152600490fd5b50604185106127c7565b6128a5939a94929194613461565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b039081169290916128e6916125c6908b90610f54565b161461264157906126fc578b90612641565b98508d8a99612566565b50509997965050505050505060001461291c575060009190565b6000925090565b90508951103861251f565b8381119150612518565b92979460ff60006124c3565b60405163d349279d60e01b8152600490fd5b903590601e198136030182121561021d57018035906001600160401b03821161021d5760200191813603831361021d57565b9192909260ff8316156129c2576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6129f79192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612a0682850185612956565b9081845191823720612b18612a1e6060870187612956565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47084820152838152612a98816108c3565b5190208451602081019182526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166040820152466060820152612ae681608081016109db565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b92838314612b545750612b3585612b3c92612b4496970190612956565b3691610937565b913391612478565b5015612b4f57600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108525760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610852576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b0382111761085257604052600883528260005b6101008110612c3257505050565b6020908351612c4081610837565b60008152828551612c5081610872565b6000815260008282015260008782015281830152828501015201612c24565b6040906040519161016083018381106001600160401b0382111761085257604052600a83528260005b6101408110612ca657505050565b6020908351612cb481610837565b60008152828551612cc481610872565b6000815260008282015260008782015281830152828501015201612c98565b90612ced82611c41565b612cfa60405191826108df565b8281528092612d0b601f1991611c41565b0190602036910137565b90600080516020614abf8339815191529182039182116103be57565b919082039182116103be57565b91908251918215612e9957336000526002602052604090604060002080549480861115612e8757600094855b8851871015612e2457612d9a612638612d9461ffff19612d8a8b8e611f7e565b511661ffff191690565b33613e99565b612df157612db96001916126808b610f54610f3f610f368d3394611f7e565b96612dea612dd28b610f54610f3f610f36863394611f7e565b60036000918281558260018201558260028201550155565b0195612d6a565b61103c86612e02610f368a8d611f7e565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612e7293979450612e6a867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612e636002870195865492612d31565b8655612d31565b809255613821565b612e8260405192839233846121ee565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612f51575b15612f365761fffe1985169101600581901b870184018290529360021615612f2e576060850152608084205492612eef565b508592612eef565b95935050945050608091506001830160051b01016040528252565b50841515612efc565b908151612f6681612ce3565b9060005b818110612f78575090925050565b60019061ffff19612f898288611f7e565b5116612f958286611f7e565b5201612f6a565b90612fa682611c41565b612fb360405191826108df565b8281528092612fc4601f1991611c41565b019060005b828110612fd557505050565b602090612fe06121c3565b82828501015201612fc9565b929093919383519480519282518714801590613184575b611040576130148488979498612281565b9661302761302189612ce3565b98612f9c565b9660009485925b898b8486106130dc575050505050506000925b84841061304f575050505050565b6130d460019161306f61306561034d8888611f7e565b61035d838d611f7e565b6130798685611f7e565b51613084828b611f7e565b51526020600081613095848d611f7e565b5101526130a28787611f7e565b515160606130b0848d611f7e565b5101526130bd8787611f7e565b51015160806130cc838c611f7e565b510152612469565b930192613041565b9761036761317a926040613169846131636131118c9f9c61312f8c9d9e61035d8660019e9f61311e61311187610fa893611f7e565b516001600160a01b031690565b60101b62010000600160b01b031690565b613139818d611f7e565b516131448589611f7e565b515261315d6020613155868a611f7e565b510160019052565b8c611f7e565b93611f7e565b516001600160a01b03909216910152565b960192919061302e565b508051841415613003565b6001600160a01b0390911681526060602082018190526109899391926131b791840190610b03565b916040818403910152610b7a565b9192831561294457600093845b83518610156131fb576131e58685611f7e565b515181018091116103be576001909501946131d2565b90939194508381106132c65782826132947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f179361325d612e82977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613932565b505082519061326a61090f565b918252866020830152604082015261135d3360018060a01b03166000526002602052604060002090565b6132a4604051928392338461318f565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b60208151910151811580613347575b613328576040805160208101938452808201929092528152906133196060836108df565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b5080156132f5565b91909161335a6121c3565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff1990941660608501819052608090942054909390156133d2576133c6929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109896001926122a1565b505060009190565b6000919082805b825182101561345b5761ffff1991826133fa8286611f7e565b51168652600160208181526040808920336000908152908352819020929491925482018092116103be5760019461345493612dd2939761343a878b611f7e565b51168b525288203360009081526020919091526040902090565b01906133e1565b93505050565b91610989939161347093613ba2565b90929192613c30565b9061348c602092828151948592016105ab565b0190565b9061090d602e60405180946c1131b430b63632b733b2911d1160991b60208301526134c5815180926020602d860191016105ab565b8101601160f91b602d82015203600e8101855201836108df565b805160201015611ee65760400190565b60209291906135058492828151948592016105ab565b019081520190565b3d15613538573d9061351e8261091c565b9161352c60405193846108df565b82523d6000602084013e565b606090565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8831161375957602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346135aa835160608601516135a481612265565b91613cbd565b8981519101200361374c576135ca6135cf916135c4613d40565b90614029565b613490565b6135e4825160408501516135a4845182612281565b888151910120908881519101200361372457600160f81b8061361761360985516134df565b516001600160f81b03191690565b1603613724576080820151151580613730575b6137245751866040519182806136436000958694613479565b039060025afa15610a91578681613688815194516136686040519687928684016134ef565b039461367c601f19968781018352826108df565b60405191828092613479565b039060025afa15610a915780516040805189810183815260208101879052918201879052606082018890526080820189905291938392906136d4908260a08501039081018352826108df565b51906101005afa956136e461350d565b908151978061371b575b6136fe5750506109899550613d9f565b6001976137179750820181019550019250611ff4915050565b1490565b508715156136ee565b50505050505050600090565b50600160fa1b8061374461360985516134df565b16141561362a565b5050505050505050600090565b505050505050600090565b6000919290829160405161379c816109db6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ce565b51915afa906137a961350d565b826137ce575b826137b957505090565b61371791925060208082518301019101611ff4565b9150602082511015916137af565b604080516001600160a01b039092168252637c9c64bb60e11b60208301526000908201526001606082015260809020548015908115613819575090565b600191501690565b6001909201805490929182156138a457828110613883575080820361384557505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b809350819250106138b3575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b9080518255600182019060208101519060028210156104a757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612e995782825103611040576103e88311613a5457906000915b838310613964575050509190565b90919461398b61263861398561397d610f368a87611f7e565b61ffff191690565b33613f72565b613a44576139998684611f7e565b5151158015613a2d575b6139ef576139e66001916139d46139ba8987611f7e565b516139cf33610f54610f3f610f368e8b611f7e565b6138d5565b6139de8886611f7e565b515190612281565b95019190613956565b5084610fa8610f3682613a0194611f7e565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f4240613a3c8785611f7e565b5151116139a3565b61103c611019610f368885611f7e565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612e995783835103611040576103e8613a998583612281565b11613b1a5750906000915b838310613ab2575050509190565b909194613acb61263861398561397d610f368a87611f7e565b613a4457613ad98684611f7e565b5151158015613b03575b6139ef57613afa6001916139d46139ba8987611f7e565b95019190613aa4565b50620f4240613b128785611f7e565b515111613ae3565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b81158015613b96575b613b695761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f42408211613b44565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613c1a57926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa15610a915780516001600160a01b03811615613c1157918190565b50809160019190565b50505060009160039190565b600411156104a757565b613c3981613c26565b80613c42575050565b613c4b81613c26565b60018103613c655760405163f645eedf60e01b8152600490fd5b613c6e81613c26565b60028103613c8f5760405163fce698f760e01b815260048101839052602490fd5b80613c9b600392613c26565b14613ca35750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613d38575b81811115613d30575b50828110613ce457505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613d1957908290613d01565b505060008583016020015250603f01168201604052565b905038613cd7565b925082613cce565b60405190613d4d82610872565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613e81575b8015613e79575b8015613e61575b613e5757613dc983866140d1565b15613e575760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614abf833981519152948560a084015260208360c0816005600019fa1561021d57613e519386613e4b945181818909940991614172565b91612d15565b90081590565b5050505050600090565b50600080516020614abf833981519152821015613dbb565b508115613db4565b50600080516020614abf833981519152841015613dad565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613f6a575b613f61576001600060015b15613f35575b50606084015260808320805460009161fffe198083169190898314613f1457505091613ee7565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613f57575b5015613f4d5738613eed565b5060009450505050565b9050151538613f41565b50600093505050565b508015613edc565b9061ffff1916908115613ffa57604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613ff157600160809252209182549283158015613fe7575b15613fdb57600193505555600190565b90600217905555600190565b5060018416613fcb565b50505050600090565b5050600090565b9061400b8261091c565b61401860405191826108df565b8281528092612d0b601f199161091c565b8051156140c75761405461404f614048614043845161223f565b612273565b6003900490565b614001565b91602083019180805101906020820192835194600085525b83831061407b57505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c168801015160028601531685010151908201530161406c565b5050610989611d8c565b600160601b63ffffffff60c01b031990818110801590614168575b8015614157575b61414f577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b50801580156140f3575082156140f3565b50818310156140ec565b60009260ff9290918483158061487e575b613724576141918383614886565b9095861580614876575b614838575b85811c60028a60fe1c16015b1561481e57600186821c1660028a831c60011b1601600181146147e5575b600281146147d8575b6003146147cb575b60009493929419019560019860015b8860001911614257575050505050505050506040519160608301526020825260208083015260206040830152600080516020614adf8339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa1561021d5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b03198082600080516020614adf83398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156147ad5760018c600286838f841c16921c831b160114614776575b838c8c6002600182841c168185851c60011b160114614763575b6003926001600292841c16921c60011b16011461475a575b861561474757600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614531575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a09600080516020614adf83398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b03199283908190818480099009600080516020614adf8339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b600019019796939594936141ea565b8661440657919a9198919550600160601b63ffffffff60c01b03199050808083600080516020614adf83398151915209600160601b63ffffffff60c01b031984600080516020614adf83398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b03199081808085600080516020614adf83398151915209600160601b63ffffffff60c01b031986600080516020614adf8339815191520909600160601b63ffffffff60c01b031985600080516020614adf83398151915209090997600160601b63ffffffff60c01b031990818084600080516020614adf83398151915209600160601b63ffffffff60c01b031985600080516020614adf8339815191520909099a600160601b63ffffffff60c01b0319808c600080516020614adf83398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b031992839081808083600080516020614adf83398151915209600160601b63ffffffff60c01b031984600080516020614adf8339815191520909600160601b63ffffffff60c01b031983600080516020614adf83398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614522565b60019c50909a8c99509095509050614522565b505082846143c5565b508993508a92508591508d90508c6143ad565b5050600080516020614a9f8339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5614393565b50949a90999097600160601b63ffffffff60c01b0319039450614522565b91509550849580916141db565b93975087938593506141d3565b600080516020614a9f83398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593506141ca565b60001901600160028188841c16918b841c901b16016141ac565b979094600080516020614abf83398151915291820390089360009785158061486e575b156141a057505050505050505050600090565b50600161485b565b50811561419b565b508615614183565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59291600080516020614a9f8339815191529181156149de57808314806149d5575b156149be5750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe81600184089208096003098180808086600080516020614adf8339815191520981858009089981600181818b099a099709810393898203900890090893915b6040519060208252602080830152602060408301526060820152600080516020614adf8339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa1561021d57838080935180950980099009930990565b9091506149cc9293506149e4565b91939291614958565b508185146148c8565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b920908950908928080808087800996870994818088600080516020614a9f833981519152099181808085600080516020614adf83398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220a0c290e5eb0e1be3796190b1960f3ad7cc5d8855b9eace513efe20d88fbbab0664736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", - "nonce": "0x4", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a0346200007757601f62004a1d38819003918201601f19168301916001600160401b038311848410176200007c578084926020946040528339810103126200007757516001600160a01b0381168103620000775760805260405161498a90816200009382396080518181816119a1015261290a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461018d5780630b96422d146101885780630c7ecd84146101425780630cdc271f146101835780631128186d1461017e578063118a53891461017957806315b76b84146101745780631626ba7e1461016f57806346d60eb2146101425780636bbefc891461016a5780636d61fe701461016557806371af817b1461016057806377102c351461015b578063852b67af14610156578063858e6ee4146101515780638a91b0e31461014c578063b139ec6314610147578063bfd151c114610142578063c4db8dd91461013d578063c776313014610138578063c8050ee414610133578063e8eb3cc61461012e578063ef4a7203146101295763f582bceb1461012457600080fd5b611a01565b6119d0565b61198b565b61194b565b61153b565b61126c565b61040e565b611209565b611089565b611020565b610f53565b610f24565b610d00565b610bb0565b610aad565b610936565b6107f3565b6106a9565b61054e565b6104c1565b610262565b346101fd5760203660031901126101fd5760043563ffffffff60e01b81168091036101fd576020906372d61afb60e01b81149081156101d2575b506040519015158152f35b63043140ed60e01b8114915081156101ec575b50386101c7565b6301ffc9a760e01b149050386101e5565b600080fd5b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460051b0101116101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460061b0101116101fd57565b346101fd5760603660031901126101fd576001600160401b036004358181116101fd57610293903690600401610202565b916024359081116101fd576102ac903690600401610232565b926102b633613632565b6103a3576102d1926102c9913691611a59565b923691611ab7565b81519181519182840180851161039e576102ed90949294612b25565b9360009283915b818310610354575050506000915b8383106103175761031560443586612b80565b005b61034c60019161034761033361032d8787611d8f565b51613137565b61033d838a611d8f565b9061ffff19169052565b6122c5565b920191610302565b91939091906001906103959061034761038b6001600160a01b036103788a88611d8f565b511660101b62010000600160b01b031690565b61033d838c611d8f565b940191906102f4565b61206f565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b03821682036101fd57565b600435906001600160a01b03821682036101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd57602083818601950101116101fd57565b346101fd5760803660031901126101fd5760043560ff811681036101fd576024356001600160a01b038116036101fd576064356001600160401b0381116101fd5761045d9036906004016103e1565b5050611b2a565b634e487b7160e01b600052602160045260246000fd5b9060028210156104875752565b610464565b91926104aa608094979695929760a08501988552602085019061047a565b6001600160a01b0316604083015260608201520152565b346101fd5760403660031901126101fd5760043561ffff1981168091036101fd57610513906104ee6103b5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361054a93600881901c6001600160a01b03169160ff909116908661048c565b0390f35b346101fd5760403660031901126101fd5760043560ff811681036101fd576024356001600160401b0381116101fd5761045d9036906004016103e1565b60005b83811061059e5750506000910152565b818101518382015260200161058e565b906020916105c78151809281855285808601910161058b565b601f01601f1916010190565b906020908183526105ef815160808486015260a08501906105ae565b9180820151916060610626610613601f1996604096888a83030160408b01526105ae565b60408401518789830301848a01526105ae565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061066057505050505050505090565b909192939495969786806106978387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ae565b9a01950195019396959492919061064e565b346101fd5760003660031901126101fd576106c2611b59565b5061054a6106ce611b59565b6106d6611bb0565b81526106e0611bf3565b60208201526106ed611c14565b60408201526107a26106fd611c4d565b6060830190815261073961070f611cae565b6107176108aa565b63852b67af60e01b815290602082015282519061073382611cea565b52611cea565b5061076f610745611da3565b61074d6108aa565b6371af817b60e01b815290602082015282519061076982611cfc565b52611cfc565b50610778611ddc565b906107816108aa565b630b96422d60e01b8152916020830152519061079c82611d0c565b52611d0c565b50604051918291826105d3565b906003196060818401126101fd5760043560ff811681036101fd5792602435916001600160401b0383116101fd5782610120920301126101fd576004019060443590565b346101fd5761045d366107af565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761083257604052565b610801565b606081019081106001600160401b0382111761083257604052565b60a081019081106001600160401b0382111761083257604052565b61012081019081106001600160401b0382111761083257604052565b90601f801991011681019081106001600160401b0382111761083257604052565b604051906108b782610817565b565b604051906108b782610837565b6001600160401b03811161083257601f01601f191660200190565b9291926108ed826108c6565b916108fb6040519384610889565b8294818452818301116101fd578281602093846000960137010152565b9080601f830112156101fd57816020610933933591016108e1565b90565b346101fd5760403660031901126101fd576024356001600160401b0381116101fd5761096961097d913690600401610918565b61097560043533611ed0565b3390806122d4565b50156109a1576020630b135d3f60e11b5b6040516001600160e01b03199091168152f35b60206001600160e01b031961098e565b90815180825260208080930193019160005b8281106109d1575050505090565b835161ffff1916855293810193928101926001016109c3565b6080809180518452610a046020820151602086019061047a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610a48575050505090565b909192938260a082610a5d60019489516109ea565b01950193929101610a3a565b91610a95604091610a8760809497969760a0875260a08701906109b1565b908582036020870152610a28565b94805182850152602081015160608501520151910152565b346101fd576020806003193601126101fd57610ac76103cb565b610acf611e05565b50610ae1610adc82612ce5565b612d94565b90610aec8251612dd6565b9260005b8351811015610b545760019061ffff19610b0a8287611d8f565b5116600090815282845260408082206001600160a01b03871683526020529020610b38906120fd565b6120fd565b610b428288611d8f565b52610b4d8187611d8f565b5001610af0565b505060018060a01b0316600052600260205261054a610b766040600020611e24565b60405193849384610a69565b60206003198201126101fd57600435906001600160401b0382116101fd57610bac916004016103e1565b9091565b346101fd57610bbe36610b82565b610bc733613632565b15610c6b5781019060a0818303126101fd576001600160401b0381358181116101fd57820183601f820112156101fd5783816020610c0793359101611a59565b9260208301358281116101fd5781610c20918501611e9a565b9360408401358381116101fd5782610c39918601611eb5565b60608501359384116101fd5761031595610c5a610c60946080968801611e9a565b92612e26565b919092013591612fff565b60405162dc149f60e41b8152600490fd5b60a06003198201126101fd576001600160401b03906004358281116101fd5781610ca891600401610202565b939093926024358181116101fd5783610cc391600401610202565b939093926044358381116101fd5782610cde91600401610232565b939093926064359182116101fd57610cf891600401610202565b909160843590565b346101fd57610d0e36610c7c565b97969094959293610d1e33613632565b6103a357610d43610c5a94610d3b610d539a610d4b953691611a59565b983691611e4c565b943691611ab7565b933691611e4c565b819291519181518303610f12576000808415159283610de4575b3360009081526002602052604090209495509293610da79390610d9f9093610d9a600286019485546120dd565b612b73565b809255613677565b610dad57005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610ddf6040519283923384612fc9565b0390a1005b60005b868110610df45750610d6d565b91610e3e33610e27610e12610e09878d611d8f565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610e498488611d8f565b51518115610edb57878a82841015610e97579260019492610d9a610e8993610e818a610e7b610e0982610e8f9b611d8f565b92611d8f565b515190613991565b906120dd565b925b01610de7565b8284939497959711610eb0575b50505050600190610e91565b92849792610d9a610e8993610e8188610e7b610e0960019b610ed19b611d8f565b939038878a610ea4565b610f0e610eeb610e09878d611d8f565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b346101fd5760403660031901126101fd576020610f4b610f426103cb565b60243590611ed0565b604051908152f35b346101fd57610f6136610c7c565b97969094959293610f7133613632565b6103a357610d43610c5a94610d3b610f8e9a610d4b953691611a59565b90336000526002602052604060002092610faa845484846138ca565b60028692960192835491820180921161039e57825496870180971161039e5781610ff8947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613677565b610ddf6040519283923384612fc9565b901515815260c0810192916108b791602001906109ea565b346101fd5760603660031901126101fd576110396103cb565b60403660231901126101fd576110799061107360405161105881610817565b6024358152604435602082015261106d61201a565b50613137565b906131a0565b9061054a60405192839283611008565b346101fd5761109736610b82565b50506110a5610adc33612ce5565b6000903382526002602052600180604084200154906110e3336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6111c3575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6111bd887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b6111816111456108b9565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b61118a8161322b565b9061119b6040519283923384612045565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156111e4575b87908352608085208861fffe198254169155916110ed565b9081161580611200575b156111fa5782906111cc565b806110f2565b508015156111ee565b346101fd5760803660031901126101fd576044356001600160a01b03811681036101fd576064356001600160401b0381116101fd5760409161125261125e923690600401610918565b906024356004356122d4565b825191151582526020820152f35b346101fd576020610f4b61127f366107af565b916127e4565b90815180825260208080930193019160005b8281106112a5575050505090565b83516001600160e01b03191685529381019392810192600101611297565b908082519081815260208091019281808460051b8301019501936000915b8483106112f15750505050505090565b9091929394958480611335600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611285565b98019301930191949392906112e1565b80516005811015610487576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061138b575050505090565b909192938260806001926113b383895163ffffffff60e01b8151168452015184830190611345565b0195019392910161137d565b90815180825260208080930193019160005b8281106113df575050505090565b909192938260e06001926114186040895163ffffffff851b815116845261140c8682015187860190611345565b01516080830190611345565b019501939291016113d1565b906109339160208152815190611448610180928360208401526101a0830190611285565b916114c261149661148261146e602088015196601f199788888303016040890152611285565b604088015187878303016060880152611285565b606087015186868303016080870152611285565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526112c3565b61152b6115146114fd6114e660e089015194610100958989830301878a015261136b565b93880151936101209488888303018689015261136b565b92870151926101409387878303018588015261136b565b91860151916101609286868303018487015261136b565b94015192828503019101526113bf565b346101fd576000806003193601126119485761054a906115596129ca565b5061193b6115656129ca565b916115f06115e4611574612a36565b6115936115876040880192808452611cea565b63852b67af60e01b9052565b6115ac6115a08251611cfc565b630b96422d60e01b9052565b6115c56115b98251611d0c565b6371af817b60e01b9052565b6115de6115d28251611d1c565b630b135d3f60e11b9052565b51611d2c565b6377102c3560e01b9052565b6115f86108b9565b600181529061176e6020928284820152826040820152611616612a61565b60e087019081526116436116286108aa565b63852b67af60e01b8152838782015282519061073382611cea565b5061166a61164f6108aa565b630b96422d60e01b8152838782015282519061076982611cfc565b506116916116766108aa565b6371af817b60e01b8152838782015282519061079c82611d0c565b506116be61169d6108aa565b635b0e93fb60e11b815283878201528251906116b882611d1c565b52611d1c565b506116eb6116ca6108aa565b631a7e6adf60e11b815283878201528251906116e582611d2c565b52611d2c565b506117186116f76108aa565b633e15cc3d60e21b8152838782015282519061171282611d3c565b52611d3c565b506117456117246108aa565b63c1a221f360e01b8152838782015282519061173f82611d4c565b52611d4c565b5061174e6108aa565b63278f794360e11b81529185830152519061176882611d5c565b52611d5c565b506117776108b9565b6003815290808383015280604083015261178f6108b9565b6001815290808483015260408201526117fc6117a9612ac3565b9261010087019384526117d86117bd6108aa565b630b135d3f60e11b8152828782015285519061073382611cea565b506117e16108aa565b6377102c3560e01b8152908582015283519061076982611cfc565b506118236118086108aa565b63852b67af60e01b8152828582015283519061079c82611d0c565b5061184a61182f6108aa565b630b96422d60e01b815282858201528351906116b882611d1c565b506118716118566108aa565b6371af817b60e01b815282858201528351906116e582611d2c565b5061189861187d6108aa565b635b0e93fb60e11b8152828582015283519061171282611d3c565b506118bf6118a46108aa565b631a7e6adf60e11b8152828582015283519061173f82611d4c565b506118e66118cb6108aa565b633e15cc3d60e21b8152828582015283519061176882611d5c565b506119136118f26108aa565b63c1a221f360e01b8152828582015283519061190d82611d6d565b52611d6d565b5061191c6108aa565b63278f794360e11b815292830152519061193582611d7e565b52611d7e565b5060405191829182611424565b80fd5b346101fd5760403660031901126101fd57602061197e60405161196d81610817565b600435815260243583820152613137565b6040519061ffff19168152f35b346101fd5760003660031901126101fd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101fd5760203660031901126101fd57602062010000600160b01b036119f56103cb565b60101b16604051908152f35b346101fd5760403660031901126101fd57611079611a1d6103cb565b611a256103b5565b611a2d61201a565b5060101b62010000600160b01b0316906131a0565b6001600160401b0381116108325760051b60200190565b9291611a6482611a42565b91611a726040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611a985750505050565b81356001600160a01b03811681036101fd578152908301908301611a8b565b929192611ac382611a42565b604092611ad36040519283610889565b819581835260208093019160061b8401938185116101fd57915b848310611afc57505050505050565b85838303126101fd578386918251611b1381610817565b853581528286013583820152815201920191611aed565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761083257604052606080838181528160208201528160408201520152565b60405190602082018281106001600160401b038211176108325760405260008252565b60405190611bbd82610837565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611c0082610817565b60058252640312e302e360dc1b6020830152565b60405190611c2182610817565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108325760405260038352829160009160005b606080821015611ca557825160209291611c9282610817565b8682528382015287820183015201611c79565b50505091925050565b60405190611cbb82610817565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611cf75760200190565b611cd4565b805160011015611cf75760400190565b805160021015611cf75760600190565b805160031015611cf75760800190565b805160041015611cf75760a00190565b805160051015611cf75760c00190565b805160061015611cf75760e00190565b805160071015611cf7576101000190565b805160081015611cf7576101200190565b805160091015611cf7576101400190565b8051821015611cf75760209160051b010190565b60405190611db082610817565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611de982610817565b600d82526c52656d6f7665204f776e65727360981b6020830152565b60405190611e1282610837565b60006040838281528260208201520152565b90604051611e3181610837565b60406002829480548452600181015460208501520154910152565b9291611e5782611a42565b91611e656040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611e8b5750505050565b81358152908301908301611e7e565b9080601f830112156101fd5781602061093393359101611e4c565b9080601f830112156101fd5781602061093393359101611ab7565b61093391611fed611ff9611f9b611f3094611ee9611bb0565b611ef1611bf3565b6040519788916020998a9182611f10818401978881519384920161058b565b8201611f248251809386808501910161058b565b01038084520182610889565b519020604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647289820190815260208101939093524691830191909152306060808401919091529290921b6bffffffffffffffffffffffff191660808201529091829060a0830190565b0391611faf601f1993848101835282610889565b51902094604051938491820195869190602060408401937f7dc7da30a002512936154da01baa79a3d1e54e35034ffdfa7c53c28b3091236d81520152565b03908101835282610889565b519020906042916040519161190160f01b8352600283015260228201522090565b6040519061202782610852565b60006080838281528260208201528260408201528260608201520152565b93929161206a9060409260018060a01b031686526060602087015260608601906109b1565b930152565b634e487b7160e01b600052601160045260246000fd5b9060418202918083046041149015171561039e57565b600281901b91906001600160fe1b0381160361039e57565b906041820180921161039e57565b906015820180921161039e57565b906002820180921161039e57565b9190820180921161039e57565b60ff601f199116019060ff821161039e57565b9060405161210a81610852565b80928054825260018101549060ff821690600282101561048757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061215e82610837565b6000604083815161216e81610852565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926121a3816108c6565b916121b16040519384610889565b8294828452828201116101fd5760206108b793019061058b565b9080601f830112156101fd57815161093392602001612196565b519081151582036101fd57565b60209081818403126101fd5780516001600160401b03918282116101fd57016060818503126101fd5760409283519461222a86610837565b82518481116101fd5783019360a0858303126101fd5785519161224c83610852565b85518281116101fd57860181601f820112156101fd5781818661227193519101612196565b8352838601519182116101fd57856122916080926122ad948a99016121cb565b85850152868101518785015260608101516060850152016121e5565b60808201528552808201519085015201519082015290565b600019811461039e5760010190565b939291909160009460418251106126d7576001600160a01b0383166000908152600260205260409020600101549384156127a05760009384928391828483146127945792979460ff60015b16976001995b878110612359575050505050505050508061233f57509190565b604051631007539160e31b81526004810191909152602490fd5b61236a61236584612085565b6120b3565b821515908161278a575b811561277f575b5061275e576123a0838a90604102016020810151906060604082015191015160001a92565b91979088602060ff82161061275457508d6123bb899a6120ea565b9d600019019d5b60ff8116806125d1575050506001600160a01b03811681116125bf578d9862010000600160b01b038260101b169960018060a01b0383168b61243360016124228d610e27838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b16036125a6575b508c518411801561259c575b61258a5761245c6020808f8701015101856120dd565b8d5110612578578e938d8782108015612570575b612566575b61249893612494939290910160200191906001600160a01b03166135b7565b1590565b61254b575b61ffff19808916911681119081159161250a575b506124f1575b506124e36124ea916124dc86610e278a61ffff19166000526001602052604060002090565b54906120dd565b95926122c5565b9194612325565b6124fc575b8a6124b7565b919b50600099508b916124f6565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff199190911660608201526080902054159050386124b1565b90612558575b8b9061249d565b9a509b50819b60009a612551565b9096508690612475565b508715612470565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b5060418410612446565b6125b1575b8e61243a565b9d509e50849e60009d6125ab565b60405163e6c4247b60e01b8152600490fd5b6002036126f357505061ffff199060101b1697612604610b3388610e278c61ffff19166000526001602052604060002090565b6080606082015191015191612617612151565b508d51851180156126e9575b61258a578d61263a602080888401015101876120dd565b9051106126d7578f948e88821080156126cf575b6126c5575b6126b49492826126a361268184602061249499976126959701015160409485809282850101019201016121f2565b928251948591602083019190602083019252565b03601f198101855284610889565b815190602083015192015192613392565b1561249d5790612558578b9061249d565b9097508790612653565b50881561264e565b60405163d245329360e01b8152600490fd5b5060418510612623565b612701939a949291946132b2565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b0390811692909161274291612422908b90610e27565b161461249d5790612558578b9061249d565b98508d8a996123c2565b505099979650505050505050600014612778575060009190565b6000925090565b90508951103861237b565b8381119150612374565b92979460ff600061231f565b60405163d349279d60e01b8152600490fd5b903590601e19813603018212156101fd57018035906001600160401b0382116101fd576020019181360383136101fd57565b9192909260ff83161561281e576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6128539192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612862828501856127b2565b908184519182372061297e61287a60608701876127b2565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470848201528381526128f48161086d565b5190208451602081019182526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016604082015246606082015261294c81608081015b03601f198101835282610889565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b928383146129ba575061299b856129a2926129aa969701906127b2565b36916108e1565b9133916122d4565b50156129b557600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108325760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610832576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b038211176108325760405260088352600083815b6101008110612a9a5750505050565b6020908451612aa881610817565b84815282612ab4611e05565b81830152828501015201612a8b565b6040906040519161016083018381106001600160401b0382111761083257604052600a8352600083815b6101408110612afc5750505050565b6020908451612b0a81610817565b84815282612b16611e05565b81830152828501015201612aed565b90612b2f82611a42565b612b3c6040519182610889565b8281528092612b4d601f1991611a42565b0190602036910137565b9060008051602061491583398151915291820391821161039e57565b9190820391821161039e57565b91908251918215612cd357336000526002602052604090604060002080549480861115612cc157600094855b8851871015612c6657612bdc612494612bd661ffff19612bcc8b8e611d8f565b511661ffff191690565b33613cef565b612c3357612bfb6001916124dc8b610e27610e12610e098d3394611d8f565b96612c2c612c148b610e27610e12610e09863394611d8f565b60036000918281558260018201558260028201550155565b0195612bac565b610f0e86612c44610e098a8d611d8f565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612cac93979450610d9f867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612ca56002870195865492612b73565b8655612b73565b612cbc6040519283923384612045565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612d8b575b15612d705761fffe1985169101600581901b870184018290529360021615612d68576060850152608084205492612d29565b508592612d29565b95935050945050608091506001830160051b01016040528252565b50841515612d36565b908151612da081612b25565b9060005b818110612db2575090925050565b60019061ffff19612dc38288611d8f565b5116612dcf8286611d8f565b5201612da4565b90612de082611a42565b612ded6040519182610889565b8281528092612dfe601f1991611a42565b019060005b828110612e0f57505050565b602090612e1a61201a565b82828501015201612e03565b929093919383519480519282518714801590612fbe575b610f1257612e4e84889794986120dd565b96612e61612e5b89612b25565b98612dd6565b9660009485925b898b848610612f16575050505050506000925b848410612e89575050505050565b612f0e600191612ea9612e9f61032d8888611d8f565b61033d838d611d8f565b612eb38685611d8f565b51612ebe828b611d8f565b51526020600081612ecf848d611d8f565b510152612edc8787611d8f565b51516060612eea848d611d8f565b510152612ef78787611d8f565b5101516080612f06838c611d8f565b5101526122c5565b930192612e7b565b97610347612fb4926040612fa384612f9d612f4b8c9f9c612f698c9d9e61033d8660019e9f612f58612f4b87610e7b93611d8f565b516001600160a01b031690565b60101b62010000600160b01b031690565b612f73818d611d8f565b51612f7e8589611d8f565b5152612f976020612f8f868a611d8f565b510160019052565b8c611d8f565b93611d8f565b516001600160a01b03909216910152565b9601929190612e68565b508051841415612e3d565b6001600160a01b039091168152606060208201819052610933939192612ff1918401906109b1565b916040818403910152610a28565b919283156127a057600093845b83518610156130355761301f8685611d8f565b5151810180911161039e5760019095019461300c565b90939194508381106131005782826130ce7f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1793613097612cbc977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613788565b50508251906130a46108b9565b91825286602083015260408201526111663360018060a01b03166000526002602052604060002090565b6130de6040519283923384612fc9565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b906131336020928281519485920161058b565b0190565b60208151910151811580613198575b6131795760408051602081019384528082019290925281529061316a606083610889565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b508015613146565b9190916131ab61201a565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff19909416606085018190526080909420549093901561322357613217929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109336001926120fd565b505060009190565b6000919082805b82518210156132ac5761ffff19918261324b8286611d8f565b511686526001602081815260408089203360009081529083528190209294919254820180921161039e576001946132a593612c14939761328b878b611d8f565b51168b525288203360009081526020919091526040902090565b0190613232565b93505050565b9161093393916132c1936139f8565b90929192613a86565b906108b7602e60405180946c1131b430b63632b733b2911d1160991b60208301526132ff815180926020602d8601910161058b565b8101601160f91b602d82015203600e810185520183610889565b805160201015611cf75760400190565b6040513d6000823e3d90fd5b602092919061334b84928281519485920161058b565b019081520190565b3d1561337e573d90613364826108c6565b916133726040519384610889565b82523d6000602084013e565b606090565b908160209103126101fd575190565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a883116135ac57602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346133ff835160608601516133f9816120c1565b91613b13565b8981519101200361359f5761341f61342491613419613b96565b90613e7f565b6132ca565b613439825160408501516133f98451826120dd565b888151910120908881519101200361357757600160f81b8061346c61345e8551613319565b516001600160f81b03191690565b1603613577576080820151151580613583575b6135775751866040519182806134986000958694613120565b039060025afa156135725786816134dd815194516134bd604051968792868401613335565b03946134d1601f1996878101835282610889565b60405191828092613120565b039060025afa15613572578051604080518981018381526020810187905291820187905260608201889052608082018990529193839290613522908260a08501611fed565b51906101005afa95613532613353565b9081519780613569575b61354c5750506109339550613bf5565b6001976135659750820181019550019250613383915050565b1490565b5087151561353c565b613329565b50505050505050600090565b50600160fa1b8061359761345e8551613319565b16141561347f565b5050505050505050600090565b505050505050600090565b600091929082916040516135ef8161293e6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ae565b51915afa906135fc613353565b82613624575b8261360c57505090565b9091506020818051810103126101fd57602001511490565b915060208251101591613602565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080902054801590811561366f575090565b600191501690565b6001909201805490929182156136fa578281106136d9575080820361369b57505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b80935081925010613709575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b90805182556001820190602081015190600282101561048757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612cd35782825103610f12576103e883116138aa57906000915b8383106137ba575050509190565b9091946137e16124946137db6137d3610e098a87611d8f565b61ffff191690565b33613dc8565b61389a576137ef8684611d8f565b5151158015613883575b6138455761383c60019161382a6138108987611d8f565b5161382533610e27610e12610e098e8b611d8f565b61372b565b6138348886611d8f565b5151906120dd565b950191906137ac565b5084610e7b610e098261385794611d8f565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f42406138928785611d8f565b5151116137f9565b610f0e610eeb610e098885611d8f565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612cd35783835103610f12576103e86138ef85836120dd565b116139705750906000915b838310613908575050509190565b9091946139216124946137db6137d3610e098a87611d8f565b61389a5761392f8684611d8f565b5151158015613959575b6138455761395060019161382a6138108987611d8f565b950191906138fa565b50620f42406139688785611d8f565b515111613939565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b811580156139ec575b6139bf5761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f4240821161399a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613a7057926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa156135725780516001600160a01b03811615613a6757918190565b50809160019190565b50505060009160039190565b6004111561048757565b613a8f81613a7c565b80613a98575050565b613aa181613a7c565b60018103613abb5760405163f645eedf60e01b8152600490fd5b613ac481613a7c565b60028103613ae55760405163fce698f760e01b815260048101839052602490fd5b80613af1600392613a7c565b14613af95750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613b8e575b81811115613b86575b50828110613b3a57505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613b6f57908290613b57565b505060008583016020015250603f01168201604052565b905038613b2d565b925082613b24565b60405190613ba382610837565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613cd7575b8015613ccf575b8015613cb7575b613cad57613c1f8386613f27565b15613cad5760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614915833981519152948560a084015260208360c0816005600019fa156101fd57613ca79386613ca1945181818909940991613fc8565b91612b57565b90081590565b5050505050600090565b50600080516020614915833981519152821015613c11565b508115613c0a565b50600080516020614915833981519152841015613c03565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613dc0575b613db7576001600060015b15613d8b575b50606084015260808320805460009161fffe198083169190898314613d6a57505091613d3d565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613dad575b5015613da35738613d43565b5060009450505050565b9050151538613d97565b50600093505050565b508015613d32565b9061ffff1916908115613e5057604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613e4757600160809252209182549283158015613e3d575b15613e3157600193505555600190565b90600217905555600190565b5060018416613e21565b50505050600090565b5050600090565b90613e61826108c6565b613e6e6040519182610889565b8281528092612b4d601f19916108c6565b805115613f1d57613eaa613ea5613e9e613e99845161209b565b6120cf565b6003900490565b613e57565b91602083019180805101906020820192835194600085525b838310613ed157505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301613ec2565b5050610933611b8d565b600160601b63ffffffff60c01b031990818110801590613fbe575b8015613fad575b613fa5577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b5080158015613f4957508215613f49565b5081831015613f42565b60009260ff929091848315806146d4575b61357757613fe783836146dc565b90958615806146cc575b61468e575b85811c60028a60fe1c16015b1561467457600186821c1660028a831c60011b16016001811461463b575b6002811461462e575b600314614621575b60009493929419019560019860015b88600019116140ad5750505050505050505060405191606083015260208252602080830152602060408301526000805160206149358339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa156101fd5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b0319808260008051602061493583398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156146035760018c600286838f841c16921c831b1601146145cc575b838c8c6002600182841c168185851c60011b1601146145b9575b6003926001600292841c16921c60011b1601146145b0575b861561459d57600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614387575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a0960008051602061493583398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b031992839081908184800990096000805160206149358339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b60001901979693959493614040565b8661425c57919a9198919550600160601b63ffffffff60c01b0319905080808360008051602061493583398151915209600160601b63ffffffff60c01b03198460008051602061493583398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b0319908180808560008051602061493583398151915209600160601b63ffffffff60c01b0319866000805160206149358339815191520909600160601b63ffffffff60c01b03198560008051602061493583398151915209090997600160601b63ffffffff60c01b03199081808460008051602061493583398151915209600160601b63ffffffff60c01b0319856000805160206149358339815191520909099a600160601b63ffffffff60c01b0319808c60008051602061493583398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b03199283908180808360008051602061493583398151915209600160601b63ffffffff60c01b0319846000805160206149358339815191520909600160601b63ffffffff60c01b03198360008051602061493583398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614378565b60019c50909a8c99509095509050614378565b5050828461421b565b508993508a92508591508d90508c614203565b50506000805160206148f58339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f56141e9565b50949a90999097600160601b63ffffffff60c01b0319039450614378565b9150955084958091614031565b9397508793859350614029565b6000805160206148f583398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59350614020565b60001901600160028188841c16918b841c901b1601614002565b9790946000805160206149158339815191529182039008936000978515806146c4575b15613ff657505050505050505050600090565b5060016146b1565b508115613ff1565b508615613fd9565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592916000805160206148f5833981519152918115614834578083148061482b575b156148145750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe816001840892080960030981808080866000805160206149358339815191520981858009089981600181818b099a099709810393898203900890090893915b60405190602082526020808301526020604083015260608201526000805160206149358339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa156101fd57838080935180950980099009930990565b90915061482292935061483a565b919392916147ae565b5081851461471e565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b9209089509089280808080878009968709948180886000805160206148f583398151915209918180808560008051602061493583398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220d586e4fd303dfab4216400fe9fa3ed6319112d27701f24d09905e2c95485692164736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0x2a", "chainId": "0x66eee" }, "additionalContracts": [], @@ -23,27 +25,27 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0x5545fa", + "cumulativeGasUsed": "0x3f728c", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0xb33f1d07ed2b88d85c780902a929eb8d2d359e617c912b375575455a2d0cb4e8", + "transactionHash": "0xca475bbbb8a1a746835bf0e45a2b8c5c14d8266f0e72e8f6622f94bd205398d6", "transactionIndex": "0x1", - "blockHash": "0x3a6040d6da19f8f54994001d4ee8801052857f7a9786f2eea2dc0e87d2bcdeee", - "blockNumber": "0x506997a", - "gasUsed": "0x5545fa", - "effectiveGasPrice": "0xf940980", - "from": "0xbcd75cbd82fc6c3e01e7b3793489ab2f879980ae", + "blockHash": "0x8ded949bad743f313413416114a035b59ea31b6c4ad0931188ebf419396206ee", + "blockNumber": "0x5722988", + "gasUsed": "0x3f728c", + "effectiveGasPrice": "0x5f5e100", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "contractAddress": "0x558498e7cd325b17be8c8a79884a1cacfd72a4aa", - "gasUsedForL1": "0x14d52d", - "l1BlockNumber": "0x6737fa" + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", + "gasUsedForL1": "0x686a", + "l1BlockNumber": "0x69dbed" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1727374681, + "timestamp": 1729794812, "chain": 421614, - "commit": "e9c0223" + "commit": "bf15fa9" } \ No newline at end of file diff --git a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/80002/run-1729794657.json b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/80002/run-1729794657.json new file mode 100644 index 0000000..552aed7 --- /dev/null +++ b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/80002/run-1729794657.json @@ -0,0 +1,66 @@ +{ + "transactions": [ + { + "hash": "0x38aac58cbe6d4ae088383cfe218ae30bfa0da150e5fbfd3b1fd3bf0fd8e6a9fa", + "transactionType": "CREATE2", + "contractName": "WeightedWebauthnMultisigPlugin", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", + "function": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], + "transaction": { + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x570c61", + "value": "0x0", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a0346200007757601f62004a1d38819003918201601f19168301916001600160401b038311848410176200007c578084926020946040528339810103126200007757516001600160a01b0381168103620000775760805260405161498a90816200009382396080518181816119a1015261290a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461018d5780630b96422d146101885780630c7ecd84146101425780630cdc271f146101835780631128186d1461017e578063118a53891461017957806315b76b84146101745780631626ba7e1461016f57806346d60eb2146101425780636bbefc891461016a5780636d61fe701461016557806371af817b1461016057806377102c351461015b578063852b67af14610156578063858e6ee4146101515780638a91b0e31461014c578063b139ec6314610147578063bfd151c114610142578063c4db8dd91461013d578063c776313014610138578063c8050ee414610133578063e8eb3cc61461012e578063ef4a7203146101295763f582bceb1461012457600080fd5b611a01565b6119d0565b61198b565b61194b565b61153b565b61126c565b61040e565b611209565b611089565b611020565b610f53565b610f24565b610d00565b610bb0565b610aad565b610936565b6107f3565b6106a9565b61054e565b6104c1565b610262565b346101fd5760203660031901126101fd5760043563ffffffff60e01b81168091036101fd576020906372d61afb60e01b81149081156101d2575b506040519015158152f35b63043140ed60e01b8114915081156101ec575b50386101c7565b6301ffc9a760e01b149050386101e5565b600080fd5b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460051b0101116101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460061b0101116101fd57565b346101fd5760603660031901126101fd576001600160401b036004358181116101fd57610293903690600401610202565b916024359081116101fd576102ac903690600401610232565b926102b633613632565b6103a3576102d1926102c9913691611a59565b923691611ab7565b81519181519182840180851161039e576102ed90949294612b25565b9360009283915b818310610354575050506000915b8383106103175761031560443586612b80565b005b61034c60019161034761033361032d8787611d8f565b51613137565b61033d838a611d8f565b9061ffff19169052565b6122c5565b920191610302565b91939091906001906103959061034761038b6001600160a01b036103788a88611d8f565b511660101b62010000600160b01b031690565b61033d838c611d8f565b940191906102f4565b61206f565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b03821682036101fd57565b600435906001600160a01b03821682036101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd57602083818601950101116101fd57565b346101fd5760803660031901126101fd5760043560ff811681036101fd576024356001600160a01b038116036101fd576064356001600160401b0381116101fd5761045d9036906004016103e1565b5050611b2a565b634e487b7160e01b600052602160045260246000fd5b9060028210156104875752565b610464565b91926104aa608094979695929760a08501988552602085019061047a565b6001600160a01b0316604083015260608201520152565b346101fd5760403660031901126101fd5760043561ffff1981168091036101fd57610513906104ee6103b5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361054a93600881901c6001600160a01b03169160ff909116908661048c565b0390f35b346101fd5760403660031901126101fd5760043560ff811681036101fd576024356001600160401b0381116101fd5761045d9036906004016103e1565b60005b83811061059e5750506000910152565b818101518382015260200161058e565b906020916105c78151809281855285808601910161058b565b601f01601f1916010190565b906020908183526105ef815160808486015260a08501906105ae565b9180820151916060610626610613601f1996604096888a83030160408b01526105ae565b60408401518789830301848a01526105ae565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061066057505050505050505090565b909192939495969786806106978387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ae565b9a01950195019396959492919061064e565b346101fd5760003660031901126101fd576106c2611b59565b5061054a6106ce611b59565b6106d6611bb0565b81526106e0611bf3565b60208201526106ed611c14565b60408201526107a26106fd611c4d565b6060830190815261073961070f611cae565b6107176108aa565b63852b67af60e01b815290602082015282519061073382611cea565b52611cea565b5061076f610745611da3565b61074d6108aa565b6371af817b60e01b815290602082015282519061076982611cfc565b52611cfc565b50610778611ddc565b906107816108aa565b630b96422d60e01b8152916020830152519061079c82611d0c565b52611d0c565b50604051918291826105d3565b906003196060818401126101fd5760043560ff811681036101fd5792602435916001600160401b0383116101fd5782610120920301126101fd576004019060443590565b346101fd5761045d366107af565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761083257604052565b610801565b606081019081106001600160401b0382111761083257604052565b60a081019081106001600160401b0382111761083257604052565b61012081019081106001600160401b0382111761083257604052565b90601f801991011681019081106001600160401b0382111761083257604052565b604051906108b782610817565b565b604051906108b782610837565b6001600160401b03811161083257601f01601f191660200190565b9291926108ed826108c6565b916108fb6040519384610889565b8294818452818301116101fd578281602093846000960137010152565b9080601f830112156101fd57816020610933933591016108e1565b90565b346101fd5760403660031901126101fd576024356001600160401b0381116101fd5761096961097d913690600401610918565b61097560043533611ed0565b3390806122d4565b50156109a1576020630b135d3f60e11b5b6040516001600160e01b03199091168152f35b60206001600160e01b031961098e565b90815180825260208080930193019160005b8281106109d1575050505090565b835161ffff1916855293810193928101926001016109c3565b6080809180518452610a046020820151602086019061047a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610a48575050505090565b909192938260a082610a5d60019489516109ea565b01950193929101610a3a565b91610a95604091610a8760809497969760a0875260a08701906109b1565b908582036020870152610a28565b94805182850152602081015160608501520151910152565b346101fd576020806003193601126101fd57610ac76103cb565b610acf611e05565b50610ae1610adc82612ce5565b612d94565b90610aec8251612dd6565b9260005b8351811015610b545760019061ffff19610b0a8287611d8f565b5116600090815282845260408082206001600160a01b03871683526020529020610b38906120fd565b6120fd565b610b428288611d8f565b52610b4d8187611d8f565b5001610af0565b505060018060a01b0316600052600260205261054a610b766040600020611e24565b60405193849384610a69565b60206003198201126101fd57600435906001600160401b0382116101fd57610bac916004016103e1565b9091565b346101fd57610bbe36610b82565b610bc733613632565b15610c6b5781019060a0818303126101fd576001600160401b0381358181116101fd57820183601f820112156101fd5783816020610c0793359101611a59565b9260208301358281116101fd5781610c20918501611e9a565b9360408401358381116101fd5782610c39918601611eb5565b60608501359384116101fd5761031595610c5a610c60946080968801611e9a565b92612e26565b919092013591612fff565b60405162dc149f60e41b8152600490fd5b60a06003198201126101fd576001600160401b03906004358281116101fd5781610ca891600401610202565b939093926024358181116101fd5783610cc391600401610202565b939093926044358381116101fd5782610cde91600401610232565b939093926064359182116101fd57610cf891600401610202565b909160843590565b346101fd57610d0e36610c7c565b97969094959293610d1e33613632565b6103a357610d43610c5a94610d3b610d539a610d4b953691611a59565b983691611e4c565b943691611ab7565b933691611e4c565b819291519181518303610f12576000808415159283610de4575b3360009081526002602052604090209495509293610da79390610d9f9093610d9a600286019485546120dd565b612b73565b809255613677565b610dad57005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610ddf6040519283923384612fc9565b0390a1005b60005b868110610df45750610d6d565b91610e3e33610e27610e12610e09878d611d8f565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610e498488611d8f565b51518115610edb57878a82841015610e97579260019492610d9a610e8993610e818a610e7b610e0982610e8f9b611d8f565b92611d8f565b515190613991565b906120dd565b925b01610de7565b8284939497959711610eb0575b50505050600190610e91565b92849792610d9a610e8993610e8188610e7b610e0960019b610ed19b611d8f565b939038878a610ea4565b610f0e610eeb610e09878d611d8f565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b346101fd5760403660031901126101fd576020610f4b610f426103cb565b60243590611ed0565b604051908152f35b346101fd57610f6136610c7c565b97969094959293610f7133613632565b6103a357610d43610c5a94610d3b610f8e9a610d4b953691611a59565b90336000526002602052604060002092610faa845484846138ca565b60028692960192835491820180921161039e57825496870180971161039e5781610ff8947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613677565b610ddf6040519283923384612fc9565b901515815260c0810192916108b791602001906109ea565b346101fd5760603660031901126101fd576110396103cb565b60403660231901126101fd576110799061107360405161105881610817565b6024358152604435602082015261106d61201a565b50613137565b906131a0565b9061054a60405192839283611008565b346101fd5761109736610b82565b50506110a5610adc33612ce5565b6000903382526002602052600180604084200154906110e3336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6111c3575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6111bd887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b6111816111456108b9565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b61118a8161322b565b9061119b6040519283923384612045565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156111e4575b87908352608085208861fffe198254169155916110ed565b9081161580611200575b156111fa5782906111cc565b806110f2565b508015156111ee565b346101fd5760803660031901126101fd576044356001600160a01b03811681036101fd576064356001600160401b0381116101fd5760409161125261125e923690600401610918565b906024356004356122d4565b825191151582526020820152f35b346101fd576020610f4b61127f366107af565b916127e4565b90815180825260208080930193019160005b8281106112a5575050505090565b83516001600160e01b03191685529381019392810192600101611297565b908082519081815260208091019281808460051b8301019501936000915b8483106112f15750505050505090565b9091929394958480611335600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611285565b98019301930191949392906112e1565b80516005811015610487576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061138b575050505090565b909192938260806001926113b383895163ffffffff60e01b8151168452015184830190611345565b0195019392910161137d565b90815180825260208080930193019160005b8281106113df575050505090565b909192938260e06001926114186040895163ffffffff851b815116845261140c8682015187860190611345565b01516080830190611345565b019501939291016113d1565b906109339160208152815190611448610180928360208401526101a0830190611285565b916114c261149661148261146e602088015196601f199788888303016040890152611285565b604088015187878303016060880152611285565b606087015186868303016080870152611285565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526112c3565b61152b6115146114fd6114e660e089015194610100958989830301878a015261136b565b93880151936101209488888303018689015261136b565b92870151926101409387878303018588015261136b565b91860151916101609286868303018487015261136b565b94015192828503019101526113bf565b346101fd576000806003193601126119485761054a906115596129ca565b5061193b6115656129ca565b916115f06115e4611574612a36565b6115936115876040880192808452611cea565b63852b67af60e01b9052565b6115ac6115a08251611cfc565b630b96422d60e01b9052565b6115c56115b98251611d0c565b6371af817b60e01b9052565b6115de6115d28251611d1c565b630b135d3f60e11b9052565b51611d2c565b6377102c3560e01b9052565b6115f86108b9565b600181529061176e6020928284820152826040820152611616612a61565b60e087019081526116436116286108aa565b63852b67af60e01b8152838782015282519061073382611cea565b5061166a61164f6108aa565b630b96422d60e01b8152838782015282519061076982611cfc565b506116916116766108aa565b6371af817b60e01b8152838782015282519061079c82611d0c565b506116be61169d6108aa565b635b0e93fb60e11b815283878201528251906116b882611d1c565b52611d1c565b506116eb6116ca6108aa565b631a7e6adf60e11b815283878201528251906116e582611d2c565b52611d2c565b506117186116f76108aa565b633e15cc3d60e21b8152838782015282519061171282611d3c565b52611d3c565b506117456117246108aa565b63c1a221f360e01b8152838782015282519061173f82611d4c565b52611d4c565b5061174e6108aa565b63278f794360e11b81529185830152519061176882611d5c565b52611d5c565b506117776108b9565b6003815290808383015280604083015261178f6108b9565b6001815290808483015260408201526117fc6117a9612ac3565b9261010087019384526117d86117bd6108aa565b630b135d3f60e11b8152828782015285519061073382611cea565b506117e16108aa565b6377102c3560e01b8152908582015283519061076982611cfc565b506118236118086108aa565b63852b67af60e01b8152828582015283519061079c82611d0c565b5061184a61182f6108aa565b630b96422d60e01b815282858201528351906116b882611d1c565b506118716118566108aa565b6371af817b60e01b815282858201528351906116e582611d2c565b5061189861187d6108aa565b635b0e93fb60e11b8152828582015283519061171282611d3c565b506118bf6118a46108aa565b631a7e6adf60e11b8152828582015283519061173f82611d4c565b506118e66118cb6108aa565b633e15cc3d60e21b8152828582015283519061176882611d5c565b506119136118f26108aa565b63c1a221f360e01b8152828582015283519061190d82611d6d565b52611d6d565b5061191c6108aa565b63278f794360e11b815292830152519061193582611d7e565b52611d7e565b5060405191829182611424565b80fd5b346101fd5760403660031901126101fd57602061197e60405161196d81610817565b600435815260243583820152613137565b6040519061ffff19168152f35b346101fd5760003660031901126101fd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101fd5760203660031901126101fd57602062010000600160b01b036119f56103cb565b60101b16604051908152f35b346101fd5760403660031901126101fd57611079611a1d6103cb565b611a256103b5565b611a2d61201a565b5060101b62010000600160b01b0316906131a0565b6001600160401b0381116108325760051b60200190565b9291611a6482611a42565b91611a726040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611a985750505050565b81356001600160a01b03811681036101fd578152908301908301611a8b565b929192611ac382611a42565b604092611ad36040519283610889565b819581835260208093019160061b8401938185116101fd57915b848310611afc57505050505050565b85838303126101fd578386918251611b1381610817565b853581528286013583820152815201920191611aed565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761083257604052606080838181528160208201528160408201520152565b60405190602082018281106001600160401b038211176108325760405260008252565b60405190611bbd82610837565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611c0082610817565b60058252640312e302e360dc1b6020830152565b60405190611c2182610817565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108325760405260038352829160009160005b606080821015611ca557825160209291611c9282610817565b8682528382015287820183015201611c79565b50505091925050565b60405190611cbb82610817565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611cf75760200190565b611cd4565b805160011015611cf75760400190565b805160021015611cf75760600190565b805160031015611cf75760800190565b805160041015611cf75760a00190565b805160051015611cf75760c00190565b805160061015611cf75760e00190565b805160071015611cf7576101000190565b805160081015611cf7576101200190565b805160091015611cf7576101400190565b8051821015611cf75760209160051b010190565b60405190611db082610817565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611de982610817565b600d82526c52656d6f7665204f776e65727360981b6020830152565b60405190611e1282610837565b60006040838281528260208201520152565b90604051611e3181610837565b60406002829480548452600181015460208501520154910152565b9291611e5782611a42565b91611e656040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611e8b5750505050565b81358152908301908301611e7e565b9080601f830112156101fd5781602061093393359101611e4c565b9080601f830112156101fd5781602061093393359101611ab7565b61093391611fed611ff9611f9b611f3094611ee9611bb0565b611ef1611bf3565b6040519788916020998a9182611f10818401978881519384920161058b565b8201611f248251809386808501910161058b565b01038084520182610889565b519020604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647289820190815260208101939093524691830191909152306060808401919091529290921b6bffffffffffffffffffffffff191660808201529091829060a0830190565b0391611faf601f1993848101835282610889565b51902094604051938491820195869190602060408401937f7dc7da30a002512936154da01baa79a3d1e54e35034ffdfa7c53c28b3091236d81520152565b03908101835282610889565b519020906042916040519161190160f01b8352600283015260228201522090565b6040519061202782610852565b60006080838281528260208201528260408201528260608201520152565b93929161206a9060409260018060a01b031686526060602087015260608601906109b1565b930152565b634e487b7160e01b600052601160045260246000fd5b9060418202918083046041149015171561039e57565b600281901b91906001600160fe1b0381160361039e57565b906041820180921161039e57565b906015820180921161039e57565b906002820180921161039e57565b9190820180921161039e57565b60ff601f199116019060ff821161039e57565b9060405161210a81610852565b80928054825260018101549060ff821690600282101561048757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061215e82610837565b6000604083815161216e81610852565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926121a3816108c6565b916121b16040519384610889565b8294828452828201116101fd5760206108b793019061058b565b9080601f830112156101fd57815161093392602001612196565b519081151582036101fd57565b60209081818403126101fd5780516001600160401b03918282116101fd57016060818503126101fd5760409283519461222a86610837565b82518481116101fd5783019360a0858303126101fd5785519161224c83610852565b85518281116101fd57860181601f820112156101fd5781818661227193519101612196565b8352838601519182116101fd57856122916080926122ad948a99016121cb565b85850152868101518785015260608101516060850152016121e5565b60808201528552808201519085015201519082015290565b600019811461039e5760010190565b939291909160009460418251106126d7576001600160a01b0383166000908152600260205260409020600101549384156127a05760009384928391828483146127945792979460ff60015b16976001995b878110612359575050505050505050508061233f57509190565b604051631007539160e31b81526004810191909152602490fd5b61236a61236584612085565b6120b3565b821515908161278a575b811561277f575b5061275e576123a0838a90604102016020810151906060604082015191015160001a92565b91979088602060ff82161061275457508d6123bb899a6120ea565b9d600019019d5b60ff8116806125d1575050506001600160a01b03811681116125bf578d9862010000600160b01b038260101b169960018060a01b0383168b61243360016124228d610e27838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b16036125a6575b508c518411801561259c575b61258a5761245c6020808f8701015101856120dd565b8d5110612578578e938d8782108015612570575b612566575b61249893612494939290910160200191906001600160a01b03166135b7565b1590565b61254b575b61ffff19808916911681119081159161250a575b506124f1575b506124e36124ea916124dc86610e278a61ffff19166000526001602052604060002090565b54906120dd565b95926122c5565b9194612325565b6124fc575b8a6124b7565b919b50600099508b916124f6565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff199190911660608201526080902054159050386124b1565b90612558575b8b9061249d565b9a509b50819b60009a612551565b9096508690612475565b508715612470565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b5060418410612446565b6125b1575b8e61243a565b9d509e50849e60009d6125ab565b60405163e6c4247b60e01b8152600490fd5b6002036126f357505061ffff199060101b1697612604610b3388610e278c61ffff19166000526001602052604060002090565b6080606082015191015191612617612151565b508d51851180156126e9575b61258a578d61263a602080888401015101876120dd565b9051106126d7578f948e88821080156126cf575b6126c5575b6126b49492826126a361268184602061249499976126959701015160409485809282850101019201016121f2565b928251948591602083019190602083019252565b03601f198101855284610889565b815190602083015192015192613392565b1561249d5790612558578b9061249d565b9097508790612653565b50881561264e565b60405163d245329360e01b8152600490fd5b5060418510612623565b612701939a949291946132b2565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b0390811692909161274291612422908b90610e27565b161461249d5790612558578b9061249d565b98508d8a996123c2565b505099979650505050505050600014612778575060009190565b6000925090565b90508951103861237b565b8381119150612374565b92979460ff600061231f565b60405163d349279d60e01b8152600490fd5b903590601e19813603018212156101fd57018035906001600160401b0382116101fd576020019181360383136101fd57565b9192909260ff83161561281e576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6128539192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612862828501856127b2565b908184519182372061297e61287a60608701876127b2565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470848201528381526128f48161086d565b5190208451602081019182526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016604082015246606082015261294c81608081015b03601f198101835282610889565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b928383146129ba575061299b856129a2926129aa969701906127b2565b36916108e1565b9133916122d4565b50156129b557600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108325760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610832576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b038211176108325760405260088352600083815b6101008110612a9a5750505050565b6020908451612aa881610817565b84815282612ab4611e05565b81830152828501015201612a8b565b6040906040519161016083018381106001600160401b0382111761083257604052600a8352600083815b6101408110612afc5750505050565b6020908451612b0a81610817565b84815282612b16611e05565b81830152828501015201612aed565b90612b2f82611a42565b612b3c6040519182610889565b8281528092612b4d601f1991611a42565b0190602036910137565b9060008051602061491583398151915291820391821161039e57565b9190820391821161039e57565b91908251918215612cd357336000526002602052604090604060002080549480861115612cc157600094855b8851871015612c6657612bdc612494612bd661ffff19612bcc8b8e611d8f565b511661ffff191690565b33613cef565b612c3357612bfb6001916124dc8b610e27610e12610e098d3394611d8f565b96612c2c612c148b610e27610e12610e09863394611d8f565b60036000918281558260018201558260028201550155565b0195612bac565b610f0e86612c44610e098a8d611d8f565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612cac93979450610d9f867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612ca56002870195865492612b73565b8655612b73565b612cbc6040519283923384612045565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612d8b575b15612d705761fffe1985169101600581901b870184018290529360021615612d68576060850152608084205492612d29565b508592612d29565b95935050945050608091506001830160051b01016040528252565b50841515612d36565b908151612da081612b25565b9060005b818110612db2575090925050565b60019061ffff19612dc38288611d8f565b5116612dcf8286611d8f565b5201612da4565b90612de082611a42565b612ded6040519182610889565b8281528092612dfe601f1991611a42565b019060005b828110612e0f57505050565b602090612e1a61201a565b82828501015201612e03565b929093919383519480519282518714801590612fbe575b610f1257612e4e84889794986120dd565b96612e61612e5b89612b25565b98612dd6565b9660009485925b898b848610612f16575050505050506000925b848410612e89575050505050565b612f0e600191612ea9612e9f61032d8888611d8f565b61033d838d611d8f565b612eb38685611d8f565b51612ebe828b611d8f565b51526020600081612ecf848d611d8f565b510152612edc8787611d8f565b51516060612eea848d611d8f565b510152612ef78787611d8f565b5101516080612f06838c611d8f565b5101526122c5565b930192612e7b565b97610347612fb4926040612fa384612f9d612f4b8c9f9c612f698c9d9e61033d8660019e9f612f58612f4b87610e7b93611d8f565b516001600160a01b031690565b60101b62010000600160b01b031690565b612f73818d611d8f565b51612f7e8589611d8f565b5152612f976020612f8f868a611d8f565b510160019052565b8c611d8f565b93611d8f565b516001600160a01b03909216910152565b9601929190612e68565b508051841415612e3d565b6001600160a01b039091168152606060208201819052610933939192612ff1918401906109b1565b916040818403910152610a28565b919283156127a057600093845b83518610156130355761301f8685611d8f565b5151810180911161039e5760019095019461300c565b90939194508381106131005782826130ce7f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1793613097612cbc977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613788565b50508251906130a46108b9565b91825286602083015260408201526111663360018060a01b03166000526002602052604060002090565b6130de6040519283923384612fc9565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b906131336020928281519485920161058b565b0190565b60208151910151811580613198575b6131795760408051602081019384528082019290925281529061316a606083610889565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b508015613146565b9190916131ab61201a565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff19909416606085018190526080909420549093901561322357613217929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109336001926120fd565b505060009190565b6000919082805b82518210156132ac5761ffff19918261324b8286611d8f565b511686526001602081815260408089203360009081529083528190209294919254820180921161039e576001946132a593612c14939761328b878b611d8f565b51168b525288203360009081526020919091526040902090565b0190613232565b93505050565b9161093393916132c1936139f8565b90929192613a86565b906108b7602e60405180946c1131b430b63632b733b2911d1160991b60208301526132ff815180926020602d8601910161058b565b8101601160f91b602d82015203600e810185520183610889565b805160201015611cf75760400190565b6040513d6000823e3d90fd5b602092919061334b84928281519485920161058b565b019081520190565b3d1561337e573d90613364826108c6565b916133726040519384610889565b82523d6000602084013e565b606090565b908160209103126101fd575190565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a883116135ac57602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346133ff835160608601516133f9816120c1565b91613b13565b8981519101200361359f5761341f61342491613419613b96565b90613e7f565b6132ca565b613439825160408501516133f98451826120dd565b888151910120908881519101200361357757600160f81b8061346c61345e8551613319565b516001600160f81b03191690565b1603613577576080820151151580613583575b6135775751866040519182806134986000958694613120565b039060025afa156135725786816134dd815194516134bd604051968792868401613335565b03946134d1601f1996878101835282610889565b60405191828092613120565b039060025afa15613572578051604080518981018381526020810187905291820187905260608201889052608082018990529193839290613522908260a08501611fed565b51906101005afa95613532613353565b9081519780613569575b61354c5750506109339550613bf5565b6001976135659750820181019550019250613383915050565b1490565b5087151561353c565b613329565b50505050505050600090565b50600160fa1b8061359761345e8551613319565b16141561347f565b5050505050505050600090565b505050505050600090565b600091929082916040516135ef8161293e6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ae565b51915afa906135fc613353565b82613624575b8261360c57505090565b9091506020818051810103126101fd57602001511490565b915060208251101591613602565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080902054801590811561366f575090565b600191501690565b6001909201805490929182156136fa578281106136d9575080820361369b57505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b80935081925010613709575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b90805182556001820190602081015190600282101561048757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612cd35782825103610f12576103e883116138aa57906000915b8383106137ba575050509190565b9091946137e16124946137db6137d3610e098a87611d8f565b61ffff191690565b33613dc8565b61389a576137ef8684611d8f565b5151158015613883575b6138455761383c60019161382a6138108987611d8f565b5161382533610e27610e12610e098e8b611d8f565b61372b565b6138348886611d8f565b5151906120dd565b950191906137ac565b5084610e7b610e098261385794611d8f565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f42406138928785611d8f565b5151116137f9565b610f0e610eeb610e098885611d8f565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612cd35783835103610f12576103e86138ef85836120dd565b116139705750906000915b838310613908575050509190565b9091946139216124946137db6137d3610e098a87611d8f565b61389a5761392f8684611d8f565b5151158015613959575b6138455761395060019161382a6138108987611d8f565b950191906138fa565b50620f42406139688785611d8f565b515111613939565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b811580156139ec575b6139bf5761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f4240821161399a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613a7057926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa156135725780516001600160a01b03811615613a6757918190565b50809160019190565b50505060009160039190565b6004111561048757565b613a8f81613a7c565b80613a98575050565b613aa181613a7c565b60018103613abb5760405163f645eedf60e01b8152600490fd5b613ac481613a7c565b60028103613ae55760405163fce698f760e01b815260048101839052602490fd5b80613af1600392613a7c565b14613af95750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613b8e575b81811115613b86575b50828110613b3a57505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613b6f57908290613b57565b505060008583016020015250603f01168201604052565b905038613b2d565b925082613b24565b60405190613ba382610837565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613cd7575b8015613ccf575b8015613cb7575b613cad57613c1f8386613f27565b15613cad5760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614915833981519152948560a084015260208360c0816005600019fa156101fd57613ca79386613ca1945181818909940991613fc8565b91612b57565b90081590565b5050505050600090565b50600080516020614915833981519152821015613c11565b508115613c0a565b50600080516020614915833981519152841015613c03565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613dc0575b613db7576001600060015b15613d8b575b50606084015260808320805460009161fffe198083169190898314613d6a57505091613d3d565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613dad575b5015613da35738613d43565b5060009450505050565b9050151538613d97565b50600093505050565b508015613d32565b9061ffff1916908115613e5057604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613e4757600160809252209182549283158015613e3d575b15613e3157600193505555600190565b90600217905555600190565b5060018416613e21565b50505050600090565b5050600090565b90613e61826108c6565b613e6e6040519182610889565b8281528092612b4d601f19916108c6565b805115613f1d57613eaa613ea5613e9e613e99845161209b565b6120cf565b6003900490565b613e57565b91602083019180805101906020820192835194600085525b838310613ed157505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301613ec2565b5050610933611b8d565b600160601b63ffffffff60c01b031990818110801590613fbe575b8015613fad575b613fa5577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b5080158015613f4957508215613f49565b5081831015613f42565b60009260ff929091848315806146d4575b61357757613fe783836146dc565b90958615806146cc575b61468e575b85811c60028a60fe1c16015b1561467457600186821c1660028a831c60011b16016001811461463b575b6002811461462e575b600314614621575b60009493929419019560019860015b88600019116140ad5750505050505050505060405191606083015260208252602080830152602060408301526000805160206149358339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa156101fd5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b0319808260008051602061493583398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156146035760018c600286838f841c16921c831b1601146145cc575b838c8c6002600182841c168185851c60011b1601146145b9575b6003926001600292841c16921c60011b1601146145b0575b861561459d57600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614387575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a0960008051602061493583398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b031992839081908184800990096000805160206149358339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b60001901979693959493614040565b8661425c57919a9198919550600160601b63ffffffff60c01b0319905080808360008051602061493583398151915209600160601b63ffffffff60c01b03198460008051602061493583398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b0319908180808560008051602061493583398151915209600160601b63ffffffff60c01b0319866000805160206149358339815191520909600160601b63ffffffff60c01b03198560008051602061493583398151915209090997600160601b63ffffffff60c01b03199081808460008051602061493583398151915209600160601b63ffffffff60c01b0319856000805160206149358339815191520909099a600160601b63ffffffff60c01b0319808c60008051602061493583398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b03199283908180808360008051602061493583398151915209600160601b63ffffffff60c01b0319846000805160206149358339815191520909600160601b63ffffffff60c01b03198360008051602061493583398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614378565b60019c50909a8c99509095509050614378565b5050828461421b565b508993508a92508591508d90508c614203565b50506000805160206148f58339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f56141e9565b50949a90999097600160601b63ffffffff60c01b0319039450614378565b9150955084958091614031565b9397508793859350614029565b6000805160206148f583398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59350614020565b60001901600160028188841c16918b841c901b1601614002565b9790946000805160206149158339815191529182039008936000978515806146c4575b15613ff657505050505050505050600090565b5060016146b1565b508115613ff1565b508615613fd9565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592916000805160206148f5833981519152918115614834578083148061482b575b156148145750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe816001840892080960030981808080866000805160206149358339815191520981858009089981600181818b099a099709810393898203900890090893915b60405190602082526020808301526020604083015260608201526000805160206149358339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa156101fd57838080935180950980099009930990565b90915061482292935061483a565b919392916147ae565b5081851461471e565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b9209089509089280808080878009968709948180886000805160206148f583398151915209918180808560008051602061493583398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220d586e4fd303dfab4216400fe9fa3ed6319112d27701f24d09905e2c95485692164736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0xaa", + "chainId": "0x13882" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x3f5c2a", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000a1404d9e7646b0112c49ae0296d6347c956d0867", + "0x0000000000000000000000004ad84f7014b7b44f723f284a85b1662337971439" + ], + "data": "0x00000000000000000000000000000000000000000000000001b8538e3574d8000000000000000000000000000000000000000000000002463a08066c4f3c11980000000000000000000000000000000000000000000003886b95560ac832fa1c000000000000000000000000000000000000000000000246384fb2de19c739980000000000000000000000000000000000000000000003886d4da998fda7d21c", + "blockHash": "0x29371913ce7cb423cfc9f0ce6845d9073e8db672ec64ccf63c4ae94e72b504fe", + "blockNumber": "0xcf22b6", + "transactionHash": "0x38aac58cbe6d4ae088383cfe218ae30bfa0da150e5fbfd3b1fd3bf0fd8e6a9fa", + "transactionIndex": "0x1", + "logIndex": "0x2", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000400000000000000000000000000000000000800000000000000000000100001000000000000000000000000000000000000000000000000000000080000000000000000000000000000000001000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000008000000800000000000000000000100000", + "type": "0x2", + "transactionHash": "0x38aac58cbe6d4ae088383cfe218ae30bfa0da150e5fbfd3b1fd3bf0fd8e6a9fa", + "transactionIndex": "0x1", + "blockHash": "0x29371913ce7cb423cfc9f0ce6845d9073e8db672ec64ccf63c4ae94e72b504fe", + "blockNumber": "0xcf22b6", + "gasUsed": "0x3f0a22", + "effectiveGasPrice": "0x6fc23ac0f", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1729794657, + "chain": 80002, + "commit": "bf15fa9" +} \ No newline at end of file diff --git a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/80002/run-latest.json b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/80002/run-latest.json index 7a431ef..552aed7 100644 --- a/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/80002/run-latest.json +++ b/broadcast/008_DeployWeightedWebauthnMultisigPlugin.s.sol/80002/run-latest.json @@ -1,19 +1,21 @@ { "transactions": [ { - "hash": "0xd6000be27b6920d4748a11e9337182ac5edb28bbed7e703ea1ac0eaa6ecd3b21", + "hash": "0x38aac58cbe6d4ae088383cfe218ae30bfa0da150e5fbfd3b1fd3bf0fd8e6a9fa", "transactionType": "CREATE2", - "contractName": null, - "contractAddress": "0x558498e7cd325b17be8c8a79884a1cacfd72a4aa", + "contractName": "WeightedWebauthnMultisigPlugin", + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b", "function": null, - "arguments": null, + "arguments": [ + "0x0000000071727De22E5E9d8BAf0edAc6f37da032" + ], "transaction": { - "from": "0xbcd75cbd82fc6c3e01e7b3793489ab2f879980ae", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x5e379c", + "gas": "0x570c61", "value": "0x0", - "input": "0x000000000000000000000000000000000000000000000000000000000000000060c0346200009857601f62004be838819003918201601f19168301916001600160401b038311848410176200009d578084926020946040528339810103126200009857516001600160a01b038116810362000098576080523060601b6001600160601b03191660a052604051614b349081620000b48239608051818181611ba00152612aae015260a0518181816110c701526120e80152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a7146101ad5780630b96422d146101a85780630c7ecd84146101585780630cdc271f146101a35780631128186d1461019e578063118a53891461019957806315b76b84146101945780631626ba7e1461018f578063197ea35b1461018a57806346d60eb2146101585780636bbefc89146101855780636d61fe701461018057806371af817b1461017b57806384b0196e14610176578063852b67af14610171578063858e6ee41461016c5780638616d61d146101675780638a91b0e314610162578063b139ec631461015d578063bfd151c114610158578063c4db8dd914610153578063c77631301461014e578063c8050ee414610149578063e8eb3cc614610144578063ef4a72031461013f5763f582bceb1461013a57600080fd5b611c00565b611bcf565b611b8a565b611b4a565b61173a565b611463565b61042e565b611400565b611280565b61125f565b6111f6565b611129565b611052565b610e2f565b610cdf565b610be9565b610ad5565b61098c565b610813565b6106c9565b61056e565b6104e1565b610282565b3461021d57602036600319011261021d5760043563ffffffff60e01b811680910361021d576020906372d61afb60e01b81149081156101f2575b506040519015158152f35b63043140ed60e01b81149150811561020c575b50386101e7565b6301ffc9a760e01b14905038610205565b600080fd5b9181601f8401121561021d578235916001600160401b03831161021d576020808501948460051b01011161021d57565b9181601f8401121561021d578235916001600160401b03831161021d576020808501948460061b01011161021d57565b3461021d57606036600319011261021d576001600160401b0360043581811161021d576102b3903690600401610222565b9160243590811161021d576102cc903690600401610252565b926102d6336137dc565b6103c3576102f1926102e9913691611c58565b923691611cb6565b8151918151918284018085116103be5761030d90949294612ce3565b9360009283915b818310610374575050506000915b8383106103375761033560443586612d3e565b005b61036c60019161036761035361034d8787611f7e565b516132e6565b61035d838a611f7e565b9061ffff19169052565b612469565b920191610322565b91939091906001906103b5906103676103ab6001600160a01b036103988a88611f7e565b511660101b62010000600160b01b031690565b61035d838c611f7e565b94019190610314565b612213565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b038216820361021d57565b600435906001600160a01b038216820361021d57565b9181601f8401121561021d578235916001600160401b03831161021d576020838186019501011161021d57565b3461021d57608036600319011261021d5760043560ff8116810361021d576024356001600160a01b0381160361021d576064356001600160401b03811161021d5761047d903690600401610401565b5050611d29565b634e487b7160e01b600052602160045260246000fd5b9060028210156104a75752565b610484565b91926104ca608094979695929760a08501988552602085019061049a565b6001600160a01b0316604083015260608201520152565b3461021d57604036600319011261021d5760043561ffff19811680910361021d576105339061050e6103d5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361056a93600881901c6001600160a01b03169160ff90911690866104ac565b0390f35b3461021d57604036600319011261021d5760043560ff8116810361021d576024356001600160401b03811161021d5761047d903690600401610401565b60005b8381106105be5750506000910152565b81810151838201526020016105ae565b906020916105e7815180928185528580860191016105ab565b601f01601f1916010190565b9060209081835261060f815160808486015260a08501906105ce565b9180820151916060610646610633601f1996604096888a83030160408b01526105ce565b60408401518789830301848a01526105ce565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061068057505050505050505090565b909192939495969786806106b78387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ce565b9a01950195019396959492919061066e565b3461021d57600036600319011261021d576106e2611d58565b5061056a6106ee611d58565b6106f6611d9f565b8152610700611de2565b602082015261070d611e03565b60408201526107c261071d611e3c565b6060830190815261075961072f611e9d565b610737610900565b63852b67af60e01b815290602082015282519061075382611ed9565b52611ed9565b5061078f610765611f92565b61076d610900565b6371af817b60e01b815290602082015282519061078982611eeb565b52611eeb565b50610798611fcb565b906107a1610900565b630b96422d60e01b815291602083015251906107bc82611efb565b52611efb565b50604051918291826105f3565b9060031960608184011261021d5760043560ff8116810361021d5792602435916001600160401b03831161021d57826101209203011261021d576004019060443590565b3461021d5761047d366107cf565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761085257604052565b610821565b60a081019081106001600160401b0382111761085257604052565b606081019081106001600160401b0382111761085257604052565b602081019081106001600160401b0382111761085257604052565b60e081019081106001600160401b0382111761085257604052565b61012081019081106001600160401b0382111761085257604052565b90601f801991011681019081106001600160401b0382111761085257604052565b6040519061090d82610837565b565b6040519061090d82610872565b6001600160401b03811161085257601f01601f191660200190565b9291926109438261091c565b9161095160405193846108df565b82948184528183011161021d578281602093846000960137010152565b9080601f8301121561021d5781602061098993359101610937565b90565b3461021d57604036600319011261021d576024356001600160401b03811161021d576109bf610a0491369060040161096e565b60206040516109e9816109db6004358583019190602083019252565b03601f1981018352826108df565b60405180948192638616d61d60e01b83523360048401612003565b0381305afa8015610a9157610a2492600091610a62575b50339080612478565b5015610a515761056a630b135d3f60e11b5b6040516001600160e01b031990911681529081906020820190565b61056a6001600160e01b0319610a36565b610a84915060203d602011610a8a575b610a7c81836108df565b810190611ff4565b38610a1b565b503d610a72565b612025565b90604060031983011261021d576004356001600160a01b038116810361021d5791602435906001600160401b03821161021d576109899160040161096e565b3461021d5761056a610aef610ae936610a96565b90612031565b6040519182916020835260208301906105ce565b90815180825260208080930193019160005b828110610b23575050505090565b835161ffff191685529381019392810192600101610b15565b6080809180518452610b566020820151602086019061049a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610b9a575050505090565b909192938260a082610baf6001948951610b3c565b01950193929101610b8c565b939291610be490610bd6604093606088526060880190610b03565b908682036020880152610b7a565b930152565b3461021d5760208060031936011261021d57610c036103eb565b610c14610c0f82612eab565b612f5a565b90610c1f8251612f9c565b9260005b8351811015610c875760019061ffff19610c3d8287611f7e565b5116600090815282845260408082206001600160a01b03871683526020529020610c6b906122a1565b6122a1565b610c758288611f7e565b52610c808187611f7e565b5001610c23565b505060018060a01b0316600052600260205261056a60016040600020015460405193849384610bbb565b602060031982011261021d57600435906001600160401b03821161021d57610cdb91600401610401565b9091565b3461021d57610ced36610cb1565b610cf6336137dc565b15610d9a5781019060a08183031261021d576001600160401b03813581811161021d57820183601f8201121561021d5783816020610d3693359101611c58565b92602083013582811161021d5781610d4f91850161218d565b93604084013583811161021d5782610d689186016121a8565b606085013593841161021d5761033595610d89610d8f94608096880161218d565b92612fec565b9190920135916131c5565b60405162dc149f60e41b8152600490fd5b60a060031982011261021d576001600160401b039060043582811161021d5781610dd791600401610222565b9390939260243581811161021d5783610df291600401610222565b9390939260443583811161021d5782610e0d91600401610252565b9390939260643591821161021d57610e2791600401610222565b909160843590565b3461021d57610e3d36610dab565b97969094959293610e4d336137dc565b6103c357610e72610d8994610e6a610e829a610e7a953691611c58565b98369161213f565b943691611cb6565b93369161213f565b9091825190825182036110405760009060008315159384610f0f575b50336000908152600260205260409020610ed2939291610ecc91610ec790946002860154612281565b612d31565b90613821565b610ed857005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610f0a604051928392338461318f565b0390a1005b6000905b808210610f205750610e9e565b9093610f6b33610f54610f3f610f36898d611f7e565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610f768689611f7e565b5151811561100957888a82841015610fc5579260019492610ec7610fb693610fae8c610fa8610f3682610fbc9b611f7e565b92611f7e565b515190613b3b565b90612281565b945b0190610f13565b8284939499959911610fde575b50505050600190610fbe565b92849692610ec7610fb693610fae88610fa8610f3660019b610fff9b611f7e565b929038888a610fd2565b61103c611019610f36898d611f7e565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b3461021d57600036600319011261021d576110ab61106e611d9f565b611076611de2565b604051906110838261088d565b600082526110b9602091604051958695601f60f81b875260e0602088015260e08701906105ce565b9085820360408701526105ce565b4660608501523360808501527f000000000000000000000000000000000000000000000000000000000000000060a085015283810360c08501526020808451928381520193019160005b82811061111257505050500390f35b835185528695509381019392810192600101611103565b3461021d5761113736610dab565b97969094959293611147336137dc565b6103c357610e72610d8994610e6a6111649a610e7a953691611c58565b9033600052600260205260406000209261118084548484613a74565b6002869296019283549182018092116103be5782549687018097116103be57816111ce947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613821565b610f0a604051928392338461318f565b901515815260c08101929161090d9160200190610b3c565b3461021d57606036600319011261021d5761120f6103eb565b604036602319011261021d5761124f9061124960405161122e81610837565b602435815260443560208201526112436121c3565b506132e6565b9061334f565b9061056a604051928392836111de565b3461021d576020611272610ae936610a96565b818151910120604051908152f35b3461021d5761128e36610cb1565b505061129c610c0f33612eab565b6000903382526002602052600180604084200154906112da336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6113ba575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6113b4887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b61137861133c61090f565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b611381816133da565b9061139260405192839233846121ee565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156113db575b87908352608085208861fffe198254169155916112e4565b90811615806113f7575b156113f15782906113c3565b806112e9565b508015156113e5565b3461021d57608036600319011261021d576044356001600160a01b038116810361021d576064356001600160401b03811161021d5760409161144961145592369060040161096e565b90602435600435612478565b825191151582526020820152f35b3461021d57602061147c611476366107cf565b91612988565b604051908152f35b90815180825260208080930193019160005b8281106114a4575050505090565b83516001600160e01b03191685529381019392810192600101611496565b908082519081815260208091019281808460051b8301019501936000915b8483106114f05750505050505090565b9091929394958480611534600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611484565b98019301930191949392906114e0565b805160058110156104a7576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061158a575050505090565b909192938260806001926115b283895163ffffffff60e01b8151168452015184830190611544565b0195019392910161157c565b90815180825260208080930193019160005b8281106115de575050505090565b909192938260e06001926116176040895163ffffffff851b815116845261160b8682015187860190611544565b01516080830190611544565b019501939291016115d0565b906109899160208152815190611647610180928360208401526101a0830190611484565b916116c161169561168161166d602088015196601f199788888303016040890152611484565b604088015187878303016060880152611484565b606087015186868303016080870152611484565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526114c2565b61172a6117136116fc6116e560e089015194610100958989830301878a015261156a565b93880151936101209488888303018689015261156a565b92870151926101409387878303018588015261156a565b91860151916101609286868303018487015261156a565b94015192828503019101526115be565b3461021d57600080600319360112611b475761056a90611758612b64565b50611b3a611764612b64565b916117ef6117e3611773612bd0565b6117926117866040880192808452611ed9565b63852b67af60e01b9052565b6117ab61179f8251611eeb565b630b96422d60e01b9052565b6117c46117b88251611efb565b6371af817b60e01b9052565b6117dd6117d18251611f0b565b6342580cb760e11b9052565b51611f1b565b630b135d3f60e11b9052565b6117f761090f565b600181529061196d6020928284820152826040820152611815612bfb565b60e08701908152611842611827610900565b63852b67af60e01b8152838782015282519061075382611ed9565b5061186961184e610900565b630b96422d60e01b8152838782015282519061078982611eeb565b50611890611875610900565b6371af817b60e01b815283878201528251906107bc82611efb565b506118bd61189c610900565b635b0e93fb60e11b815283878201528251906118b782611f0b565b52611f0b565b506118ea6118c9610900565b631a7e6adf60e11b815283878201528251906118e482611f1b565b52611f1b565b506119176118f6610900565b633e15cc3d60e21b8152838782015282519061191182611f2b565b52611f2b565b50611944611923610900565b63c1a221f360e01b8152838782015282519061193e82611f3b565b52611f3b565b5061194d610900565b63278f794360e11b81529185830152519061196782611f4b565b52611f4b565b5061197661090f565b6003815290808383015280604083015261198e61090f565b6001815290808483015260408201526119fb6119a8612c6f565b9261010087019384526119d76119bc610900565b630b135d3f60e11b8152828782015285519061075382611ed9565b506119e0610900565b6342580cb760e11b8152908582015283519061078982611eeb565b50611a22611a07610900565b63852b67af60e01b815282858201528351906107bc82611efb565b50611a49611a2e610900565b630b96422d60e01b815282858201528351906118b782611f0b565b50611a70611a55610900565b6371af817b60e01b815282858201528351906118e482611f1b565b50611a97611a7c610900565b635b0e93fb60e11b8152828582015283519061191182611f2b565b50611abe611aa3610900565b631a7e6adf60e11b8152828582015283519061193e82611f3b565b50611ae5611aca610900565b633e15cc3d60e21b8152828582015283519061196782611f4b565b50611b12611af1610900565b63c1a221f360e01b81528285820152835190611b0c82611f5c565b52611f5c565b50611b1b610900565b63278f794360e11b8152928301525190611b3482611f6d565b52611f6d565b5060405191829182611623565b80fd5b3461021d57604036600319011261021d576020611b7d604051611b6c81610837565b6004358152602435838201526132e6565b6040519061ffff19168152f35b3461021d57600036600319011261021d576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461021d57602036600319011261021d57602062010000600160b01b03611bf46103eb565b60101b16604051908152f35b3461021d57604036600319011261021d5761124f611c1c6103eb565b611c246103d5565b611c2c6121c3565b5060101b62010000600160b01b03169061334f565b6001600160401b0381116108525760051b60200190565b9291611c6382611c41565b91611c7160405193846108df565b829481845260208094019160051b810192831161021d57905b828210611c975750505050565b81356001600160a01b038116810361021d578152908301908301611c8a565b929192611cc282611c41565b604092611cd260405192836108df565b819581835260208093019160061b84019381851161021d57915b848310611cfb57505050505050565b858383031261021d578386918251611d1281610837565b853581528286013583820152815201920191611cec565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761085257604052606080838181528160208201528160408201520152565b60405190611d998261088d565b60008252565b60405190611dac82610872565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611def82610837565b60058252640312e302e360dc1b6020830152565b60405190611e1082610837565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108525760405260038352829160009160005b606080821015611e9457825160209291611e8182610837565b8682528382015287820183015201611e68565b50505091925050565b60405190611eaa82610837565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611ee65760200190565b611ec3565b805160011015611ee65760400190565b805160021015611ee65760600190565b805160031015611ee65760800190565b805160041015611ee65760a00190565b805160051015611ee65760c00190565b805160061015611ee65760e00190565b805160071015611ee6576101000190565b805160081015611ee6576101200190565b805160091015611ee6576101400190565b8051821015611ee65760209160051b010190565b60405190611f9f82610837565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611fd882610837565b600d82526c52656d6f7665204f776e65727360981b6020830152565b9081602091031261021d575190565b6001600160a01b039091168152604060208201819052610989929101906105ce565b6040513d6000823e3d90fd5b90610989906109db8151602080930120936040948551848101917fdfaf7f6d857ee2904b406c7ecdfdb06d93e4b009b03139affd7852a5636a95a483528782015286815261207e81610872565b5190209061208a611d9f565b84815191012090612099611de2565b85815191012090875191868301937fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472855289840152606083015246608083015260018060a01b031660a08201527f000000000000000000000000000000000000000000000000000000000000000060c082015260c08152612119816108a8565b519020945161190160f01b93810193845260028401959095526022830152839160420190565b929161214a82611c41565b9161215860405193846108df565b829481845260208094019160051b810192831161021d57905b82821061217e5750505050565b81358152908301908301612171565b9080601f8301121561021d578160206109899335910161213f565b9080601f8301121561021d5781602061098993359101611cb6565b604051906121d082610857565b60006080838281528260208201528260408201528260608201520152565b939291610be49060409260018060a01b03168652606060208701526060860190610b03565b634e487b7160e01b600052601160045260246000fd5b906041820291808304604114901517156103be57565b600281901b91906001600160fe1b038116036103be57565b90604182018092116103be57565b90601582018092116103be57565b90600282018092116103be57565b919082018092116103be57565b60ff601f199116019060ff82116103be57565b906040516122ae81610857565b80928054825260018101549060ff82169060028210156104a757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061230282610872565b6000604083815161231281610857565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926123478161091c565b9161235560405193846108df565b82948284528282011161021d57602061090d9301906105ab565b9080601f8301121561021d5781516109899260200161233a565b5190811515820361021d57565b602090818184031261021d5780516001600160401b039182821161021d570160608185031261021d576040928351946123ce86610872565b825184811161021d5783019360a08583031261021d578551916123f083610857565b855182811161021d57860181601f8201121561021d578181866124159351910161233a565b83528386015191821161021d5785612435608092612451948a990161236f565b8585015286810151878501526060810151606085015201612389565b60808201528552808201519085015201519082015290565b60001981146103be5760010190565b9392919091600094604182511061287b576001600160a01b0383166000908152600260205260409020600101549384156129445760009384928391828483146129385792979460ff60015b16976001995b8781106124fd57505050505050505050806124e357509190565b604051631007539160e31b81526004810191909152602490fd5b61250e61250984612229565b612257565b821515908161292e575b8115612923575b5061290257612544838a90604102016020810151906060604082015191015160001a92565b91979088602060ff8216106128f857508d61255f899a61228e565b9d600019019d5b60ff811680612775575050506001600160a01b0381168111612763578d9862010000600160b01b038260101b169960018060a01b0383168b6125d760016125c68d610f54838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b160361274a575b508c5184118015612740575b61272e576126006020808f870101510185612281565b8d511061271c578e938d8782108015612714575b61270a575b61263c93612638939290910160200191906001600160a01b0316613764565b1590565b6126ef575b61ffff1980891691168111908115916126ae575b50612695575b5061268761268e9161268086610f548a61ffff19166000526001602052604060002090565b5490612281565b9592612469565b91946124c9565b6126a0575b8a61265b565b919b50600099508b9161269a565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff19919091166060820152608090205415905038612655565b906126fc575b8b90612641565b9a509b50819b60009a6126f5565b9096508690612619565b508715612614565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b50604184106125ea565b612755575b8e6125de565b9d509e50849e60009d61274f565b60405163e6c4247b60e01b8152600490fd5b60020361289757505061ffff199060101b16976127a8610c6688610f548c61ffff19166000526001602052604060002090565b60806060820151910151916127bb6122f5565b508d518511801561288d575b61272e578d6127de60208088840101510187612281565b90511061287b578f948e8882108015612873575b612869575b6128589492826128476128258460206126389997612839970101516040948580928285010101920101612396565b928251948591602083019190602083019252565b03601f1981018552846108df565b81519060208301519201519261353d565b1561264157906126fc578b90612641565b90975087906127f7565b5088156127f2565b60405163d245329360e01b8152600490fd5b50604185106127c7565b6128a5939a94929194613461565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b039081169290916128e6916125c6908b90610f54565b161461264157906126fc578b90612641565b98508d8a99612566565b50509997965050505050505060001461291c575060009190565b6000925090565b90508951103861251f565b8381119150612518565b92979460ff60006124c3565b60405163d349279d60e01b8152600490fd5b903590601e198136030182121561021d57018035906001600160401b03821161021d5760200191813603831361021d57565b9192909260ff8316156129c2576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6129f79192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612a0682850185612956565b9081845191823720612b18612a1e6060870187612956565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47084820152838152612a98816108c3565b5190208451602081019182526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166040820152466060820152612ae681608081016109db565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b92838314612b545750612b3585612b3c92612b4496970190612956565b3691610937565b913391612478565b5015612b4f57600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108525760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610852576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b0382111761085257604052600883528260005b6101008110612c3257505050565b6020908351612c4081610837565b60008152828551612c5081610872565b6000815260008282015260008782015281830152828501015201612c24565b6040906040519161016083018381106001600160401b0382111761085257604052600a83528260005b6101408110612ca657505050565b6020908351612cb481610837565b60008152828551612cc481610872565b6000815260008282015260008782015281830152828501015201612c98565b90612ced82611c41565b612cfa60405191826108df565b8281528092612d0b601f1991611c41565b0190602036910137565b90600080516020614abf8339815191529182039182116103be57565b919082039182116103be57565b91908251918215612e9957336000526002602052604090604060002080549480861115612e8757600094855b8851871015612e2457612d9a612638612d9461ffff19612d8a8b8e611f7e565b511661ffff191690565b33613e99565b612df157612db96001916126808b610f54610f3f610f368d3394611f7e565b96612dea612dd28b610f54610f3f610f36863394611f7e565b60036000918281558260018201558260028201550155565b0195612d6a565b61103c86612e02610f368a8d611f7e565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612e7293979450612e6a867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612e636002870195865492612d31565b8655612d31565b809255613821565b612e8260405192839233846121ee565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612f51575b15612f365761fffe1985169101600581901b870184018290529360021615612f2e576060850152608084205492612eef565b508592612eef565b95935050945050608091506001830160051b01016040528252565b50841515612efc565b908151612f6681612ce3565b9060005b818110612f78575090925050565b60019061ffff19612f898288611f7e565b5116612f958286611f7e565b5201612f6a565b90612fa682611c41565b612fb360405191826108df565b8281528092612fc4601f1991611c41565b019060005b828110612fd557505050565b602090612fe06121c3565b82828501015201612fc9565b929093919383519480519282518714801590613184575b611040576130148488979498612281565b9661302761302189612ce3565b98612f9c565b9660009485925b898b8486106130dc575050505050506000925b84841061304f575050505050565b6130d460019161306f61306561034d8888611f7e565b61035d838d611f7e565b6130798685611f7e565b51613084828b611f7e565b51526020600081613095848d611f7e565b5101526130a28787611f7e565b515160606130b0848d611f7e565b5101526130bd8787611f7e565b51015160806130cc838c611f7e565b510152612469565b930192613041565b9761036761317a926040613169846131636131118c9f9c61312f8c9d9e61035d8660019e9f61311e61311187610fa893611f7e565b516001600160a01b031690565b60101b62010000600160b01b031690565b613139818d611f7e565b516131448589611f7e565b515261315d6020613155868a611f7e565b510160019052565b8c611f7e565b93611f7e565b516001600160a01b03909216910152565b960192919061302e565b508051841415613003565b6001600160a01b0390911681526060602082018190526109899391926131b791840190610b03565b916040818403910152610b7a565b9192831561294457600093845b83518610156131fb576131e58685611f7e565b515181018091116103be576001909501946131d2565b90939194508381106132c65782826132947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f179361325d612e82977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613932565b505082519061326a61090f565b918252866020830152604082015261135d3360018060a01b03166000526002602052604060002090565b6132a4604051928392338461318f565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b60208151910151811580613347575b613328576040805160208101938452808201929092528152906133196060836108df565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b5080156132f5565b91909161335a6121c3565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff1990941660608501819052608090942054909390156133d2576133c6929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109896001926122a1565b505060009190565b6000919082805b825182101561345b5761ffff1991826133fa8286611f7e565b51168652600160208181526040808920336000908152908352819020929491925482018092116103be5760019461345493612dd2939761343a878b611f7e565b51168b525288203360009081526020919091526040902090565b01906133e1565b93505050565b91610989939161347093613ba2565b90929192613c30565b9061348c602092828151948592016105ab565b0190565b9061090d602e60405180946c1131b430b63632b733b2911d1160991b60208301526134c5815180926020602d860191016105ab565b8101601160f91b602d82015203600e8101855201836108df565b805160201015611ee65760400190565b60209291906135058492828151948592016105ab565b019081520190565b3d15613538573d9061351e8261091c565b9161352c60405193846108df565b82523d6000602084013e565b606090565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a8831161375957602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346135aa835160608601516135a481612265565b91613cbd565b8981519101200361374c576135ca6135cf916135c4613d40565b90614029565b613490565b6135e4825160408501516135a4845182612281565b888151910120908881519101200361372457600160f81b8061361761360985516134df565b516001600160f81b03191690565b1603613724576080820151151580613730575b6137245751866040519182806136436000958694613479565b039060025afa15610a91578681613688815194516136686040519687928684016134ef565b039461367c601f19968781018352826108df565b60405191828092613479565b039060025afa15610a915780516040805189810183815260208101879052918201879052606082018890526080820189905291938392906136d4908260a08501039081018352826108df565b51906101005afa956136e461350d565b908151978061371b575b6136fe5750506109899550613d9f565b6001976137179750820181019550019250611ff4915050565b1490565b508715156136ee565b50505050505050600090565b50600160fa1b8061374461360985516134df565b16141561362a565b5050505050505050600090565b505050505050600090565b6000919290829160405161379c816109db6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ce565b51915afa906137a961350d565b826137ce575b826137b957505090565b61371791925060208082518301019101611ff4565b9150602082511015916137af565b604080516001600160a01b039092168252637c9c64bb60e11b60208301526000908201526001606082015260809020548015908115613819575090565b600191501690565b6001909201805490929182156138a457828110613883575080820361384557505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b809350819250106138b3575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b9080518255600182019060208101519060028210156104a757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612e995782825103611040576103e88311613a5457906000915b838310613964575050509190565b90919461398b61263861398561397d610f368a87611f7e565b61ffff191690565b33613f72565b613a44576139998684611f7e565b5151158015613a2d575b6139ef576139e66001916139d46139ba8987611f7e565b516139cf33610f54610f3f610f368e8b611f7e565b6138d5565b6139de8886611f7e565b515190612281565b95019190613956565b5084610fa8610f3682613a0194611f7e565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f4240613a3c8785611f7e565b5151116139a3565b61103c611019610f368885611f7e565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612e995783835103611040576103e8613a998583612281565b11613b1a5750906000915b838310613ab2575050509190565b909194613acb61263861398561397d610f368a87611f7e565b613a4457613ad98684611f7e565b5151158015613b03575b6139ef57613afa6001916139d46139ba8987611f7e565b95019190613aa4565b50620f4240613b128785611f7e565b515111613ae3565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b81158015613b96575b613b695761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f42408211613b44565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613c1a57926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa15610a915780516001600160a01b03811615613c1157918190565b50809160019190565b50505060009160039190565b600411156104a757565b613c3981613c26565b80613c42575050565b613c4b81613c26565b60018103613c655760405163f645eedf60e01b8152600490fd5b613c6e81613c26565b60028103613c8f5760405163fce698f760e01b815260048101839052602490fd5b80613c9b600392613c26565b14613ca35750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613d38575b81811115613d30575b50828110613ce457505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613d1957908290613d01565b505060008583016020015250603f01168201604052565b905038613cd7565b925082613cce565b60405190613d4d82610872565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613e81575b8015613e79575b8015613e61575b613e5757613dc983866140d1565b15613e575760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614abf833981519152948560a084015260208360c0816005600019fa1561021d57613e519386613e4b945181818909940991614172565b91612d15565b90081590565b5050505050600090565b50600080516020614abf833981519152821015613dbb565b508115613db4565b50600080516020614abf833981519152841015613dad565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613f6a575b613f61576001600060015b15613f35575b50606084015260808320805460009161fffe198083169190898314613f1457505091613ee7565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613f57575b5015613f4d5738613eed565b5060009450505050565b9050151538613f41565b50600093505050565b508015613edc565b9061ffff1916908115613ffa57604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613ff157600160809252209182549283158015613fe7575b15613fdb57600193505555600190565b90600217905555600190565b5060018416613fcb565b50505050600090565b5050600090565b9061400b8261091c565b61401860405191826108df565b8281528092612d0b601f199161091c565b8051156140c75761405461404f614048614043845161223f565b612273565b6003900490565b614001565b91602083019180805101906020820192835194600085525b83831061407b57505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c168801015160028601531685010151908201530161406c565b5050610989611d8c565b600160601b63ffffffff60c01b031990818110801590614168575b8015614157575b61414f577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b50801580156140f3575082156140f3565b50818310156140ec565b60009260ff9290918483158061487e575b613724576141918383614886565b9095861580614876575b614838575b85811c60028a60fe1c16015b1561481e57600186821c1660028a831c60011b1601600181146147e5575b600281146147d8575b6003146147cb575b60009493929419019560019860015b8860001911614257575050505050505050506040519160608301526020825260208083015260206040830152600080516020614adf8339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa1561021d5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b03198082600080516020614adf83398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156147ad5760018c600286838f841c16921c831b160114614776575b838c8c6002600182841c168185851c60011b160114614763575b6003926001600292841c16921c60011b16011461475a575b861561474757600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614531575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a09600080516020614adf83398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b03199283908190818480099009600080516020614adf8339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b600019019796939594936141ea565b8661440657919a9198919550600160601b63ffffffff60c01b03199050808083600080516020614adf83398151915209600160601b63ffffffff60c01b031984600080516020614adf83398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b03199081808085600080516020614adf83398151915209600160601b63ffffffff60c01b031986600080516020614adf8339815191520909600160601b63ffffffff60c01b031985600080516020614adf83398151915209090997600160601b63ffffffff60c01b031990818084600080516020614adf83398151915209600160601b63ffffffff60c01b031985600080516020614adf8339815191520909099a600160601b63ffffffff60c01b0319808c600080516020614adf83398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b031992839081808083600080516020614adf83398151915209600160601b63ffffffff60c01b031984600080516020614adf8339815191520909600160601b63ffffffff60c01b031983600080516020614adf83398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614522565b60019c50909a8c99509095509050614522565b505082846143c5565b508993508a92508591508d90508c6143ad565b5050600080516020614a9f8339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5614393565b50949a90999097600160601b63ffffffff60c01b0319039450614522565b91509550849580916141db565b93975087938593506141d3565b600080516020614a9f83398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f593506141ca565b60001901600160028188841c16918b841c901b16016141ac565b979094600080516020614abf83398151915291820390089360009785158061486e575b156141a057505050505050505050600090565b50600161485b565b50811561419b565b508615614183565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59291600080516020614a9f8339815191529181156149de57808314806149d5575b156149be5750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe81600184089208096003098180808086600080516020614adf8339815191520981858009089981600181818b099a099709810393898203900890090893915b6040519060208252602080830152602060408301526060820152600080516020614adf8339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa1561021d57838080935180950980099009930990565b9091506149cc9293506149e4565b91939291614958565b508185146148c8565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b920908950908928080808087800996870994818088600080516020614a9f833981519152099181808085600080516020614adf83398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220a0c290e5eb0e1be3796190b1960f3ad7cc5d8855b9eace513efe20d88fbbab0664736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", - "nonce": "0x6", + "input": "0x000000000000000000000000000000000000000000000000000000000000000060a0346200007757601f62004a1d38819003918201601f19168301916001600160401b038311848410176200007c578084926020946040528339810103126200007757516001600160a01b0381168103620000775760805260405161498a90816200009382396080518181816119a1015261290a0152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461018d5780630b96422d146101885780630c7ecd84146101425780630cdc271f146101835780631128186d1461017e578063118a53891461017957806315b76b84146101745780631626ba7e1461016f57806346d60eb2146101425780636bbefc891461016a5780636d61fe701461016557806371af817b1461016057806377102c351461015b578063852b67af14610156578063858e6ee4146101515780638a91b0e31461014c578063b139ec6314610147578063bfd151c114610142578063c4db8dd91461013d578063c776313014610138578063c8050ee414610133578063e8eb3cc61461012e578063ef4a7203146101295763f582bceb1461012457600080fd5b611a01565b6119d0565b61198b565b61194b565b61153b565b61126c565b61040e565b611209565b611089565b611020565b610f53565b610f24565b610d00565b610bb0565b610aad565b610936565b6107f3565b6106a9565b61054e565b6104c1565b610262565b346101fd5760203660031901126101fd5760043563ffffffff60e01b81168091036101fd576020906372d61afb60e01b81149081156101d2575b506040519015158152f35b63043140ed60e01b8114915081156101ec575b50386101c7565b6301ffc9a760e01b149050386101e5565b600080fd5b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460051b0101116101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd576020808501948460061b0101116101fd57565b346101fd5760603660031901126101fd576001600160401b036004358181116101fd57610293903690600401610202565b916024359081116101fd576102ac903690600401610232565b926102b633613632565b6103a3576102d1926102c9913691611a59565b923691611ab7565b81519181519182840180851161039e576102ed90949294612b25565b9360009283915b818310610354575050506000915b8383106103175761031560443586612b80565b005b61034c60019161034761033361032d8787611d8f565b51613137565b61033d838a611d8f565b9061ffff19169052565b6122c5565b920191610302565b91939091906001906103959061034761038b6001600160a01b036103788a88611d8f565b511660101b62010000600160b01b031690565b61033d838c611d8f565b940191906102f4565b61206f565b6040516321c4e35760e21b8152600490fd5b602435906001600160a01b03821682036101fd57565b600435906001600160a01b03821682036101fd57565b9181601f840112156101fd578235916001600160401b0383116101fd57602083818601950101116101fd57565b346101fd5760803660031901126101fd5760043560ff811681036101fd576024356001600160a01b038116036101fd576064356001600160401b0381116101fd5761045d9036906004016103e1565b5050611b2a565b634e487b7160e01b600052602160045260246000fd5b9060028210156104875752565b610464565b91926104aa608094979695929760a08501988552602085019061047a565b6001600160a01b0316604083015260608201520152565b346101fd5760403660031901126101fd5760043561ffff1981168091036101fd57610513906104ee6103b5565b90600052600160205260406000209060018060a01b0316600052602052604060002090565b80546001820154600283015460039093015460405193849361054a93600881901c6001600160a01b03169160ff909116908661048c565b0390f35b346101fd5760403660031901126101fd5760043560ff811681036101fd576024356001600160401b0381116101fd5761045d9036906004016103e1565b60005b83811061059e5750506000910152565b818101518382015260200161058e565b906020916105c78151809281855285808601910161058b565b601f01601f1916010190565b906020908183526105ef815160808486015260a08501906105ae565b9180820151916060610626610613601f1996604096888a83030160408b01526105ae565b60408401518789830301848a01526105ae565b91015194608085828403019101528451928382528282019083808660051b8501019701956000935b86851061066057505050505050505090565b909192939495969786806106978387838e898960019903018c525163ffffffff60e01b8151168452015191818582015201906105ae565b9a01950195019396959492919061064e565b346101fd5760003660031901126101fd576106c2611b59565b5061054a6106ce611b59565b6106d6611bb0565b81526106e0611bf3565b60208201526106ed611c14565b60408201526107a26106fd611c4d565b6060830190815261073961070f611cae565b6107176108aa565b63852b67af60e01b815290602082015282519061073382611cea565b52611cea565b5061076f610745611da3565b61074d6108aa565b6371af817b60e01b815290602082015282519061076982611cfc565b52611cfc565b50610778611ddc565b906107816108aa565b630b96422d60e01b8152916020830152519061079c82611d0c565b52611d0c565b50604051918291826105d3565b906003196060818401126101fd5760043560ff811681036101fd5792602435916001600160401b0383116101fd5782610120920301126101fd576004019060443590565b346101fd5761045d366107af565b634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b0382111761083257604052565b610801565b606081019081106001600160401b0382111761083257604052565b60a081019081106001600160401b0382111761083257604052565b61012081019081106001600160401b0382111761083257604052565b90601f801991011681019081106001600160401b0382111761083257604052565b604051906108b782610817565b565b604051906108b782610837565b6001600160401b03811161083257601f01601f191660200190565b9291926108ed826108c6565b916108fb6040519384610889565b8294818452818301116101fd578281602093846000960137010152565b9080601f830112156101fd57816020610933933591016108e1565b90565b346101fd5760403660031901126101fd576024356001600160401b0381116101fd5761096961097d913690600401610918565b61097560043533611ed0565b3390806122d4565b50156109a1576020630b135d3f60e11b5b6040516001600160e01b03199091168152f35b60206001600160e01b031961098e565b90815180825260208080930193019160005b8281106109d1575050505090565b835161ffff1916855293810193928101926001016109c3565b6080809180518452610a046020820151602086019061047a565b6040818101516001600160a01b031690850152606080820151908501520151910152565b90815180825260208080930193019160005b828110610a48575050505090565b909192938260a082610a5d60019489516109ea565b01950193929101610a3a565b91610a95604091610a8760809497969760a0875260a08701906109b1565b908582036020870152610a28565b94805182850152602081015160608501520151910152565b346101fd576020806003193601126101fd57610ac76103cb565b610acf611e05565b50610ae1610adc82612ce5565b612d94565b90610aec8251612dd6565b9260005b8351811015610b545760019061ffff19610b0a8287611d8f565b5116600090815282845260408082206001600160a01b03871683526020529020610b38906120fd565b6120fd565b610b428288611d8f565b52610b4d8187611d8f565b5001610af0565b505060018060a01b0316600052600260205261054a610b766040600020611e24565b60405193849384610a69565b60206003198201126101fd57600435906001600160401b0382116101fd57610bac916004016103e1565b9091565b346101fd57610bbe36610b82565b610bc733613632565b15610c6b5781019060a0818303126101fd576001600160401b0381358181116101fd57820183601f820112156101fd5783816020610c0793359101611a59565b9260208301358281116101fd5781610c20918501611e9a565b9360408401358381116101fd5782610c39918601611eb5565b60608501359384116101fd5761031595610c5a610c60946080968801611e9a565b92612e26565b919092013591612fff565b60405162dc149f60e41b8152600490fd5b60a06003198201126101fd576001600160401b03906004358281116101fd5781610ca891600401610202565b939093926024358181116101fd5783610cc391600401610202565b939093926044358381116101fd5782610cde91600401610232565b939093926064359182116101fd57610cf891600401610202565b909160843590565b346101fd57610d0e36610c7c565b97969094959293610d1e33613632565b6103a357610d43610c5a94610d3b610d539a610d4b953691611a59565b983691611e4c565b943691611ab7565b933691611e4c565b819291519181518303610f12576000808415159283610de4575b3360009081526002602052604090209495509293610da79390610d9f9093610d9a600286019485546120dd565b612b73565b809255613677565b610dad57005b7f3b86bcc79bcf940dd733e98d88a2fb3d56cb59eab03971578162d018d2682a2d91610ddf6040519283923384612fc9565b0390a1005b60005b868110610df45750610d6d565b91610e3e33610e27610e12610e09878d611d8f565b5161ffff191690565b61ffff19166000526001602052604060002090565b9060018060a01b0316600052602052604060002090565b54610e498488611d8f565b51518115610edb57878a82841015610e97579260019492610d9a610e8993610e818a610e7b610e0982610e8f9b611d8f565b92611d8f565b515190613991565b906120dd565b925b01610de7565b8284939497959711610eb0575b50505050600190610e91565b92849792610d9a610e8993610e8188610e7b610e0960019b610ed19b611d8f565b939038878a610ea4565b610f0e610eeb610e09878d611d8f565b604051632dfb424360e21b815261ffff1990911660048201529081906024820190565b0390fd5b604051630210e39560e61b8152600490fd5b346101fd5760403660031901126101fd576020610f4b610f426103cb565b60243590611ed0565b604051908152f35b346101fd57610f6136610c7c565b97969094959293610f7133613632565b6103a357610d43610c5a94610d3b610f8e9a610d4b953691611a59565b90336000526002602052604060002092610faa845484846138ca565b60028692960192835491820180921161039e57825496870180971161039e5781610ff8947f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1798855555613677565b610ddf6040519283923384612fc9565b901515815260c0810192916108b791602001906109ea565b346101fd5760603660031901126101fd576110396103cb565b60403660231901126101fd576110799061107360405161105881610817565b6024358152604435602082015261106d61201a565b50613137565b906131a0565b9061054a60405192839283611008565b346101fd5761109736610b82565b50506110a5610adc33612ce5565b6000903382526002602052600180604084200154906110e3336040519060018060a01b03168152637c9c64bb60e11b60208201526000604082015290565b9060608201600180835b6111c3575b877f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f6111bd887fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba5828b6111816111456108b9565b878152602080820189905260408083018a9052336000908152600290925290205b90604060029180518455602081015160018501550151910155565b61118a8161322b565b9061119b6040519283923384612045565b0390a16040805133815260208101929092526000908201529081906060820190565b0390a180f35b908391156111e4575b87908352608085208861fffe198254169155916110ed565b9081161580611200575b156111fa5782906111cc565b806110f2565b508015156111ee565b346101fd5760803660031901126101fd576044356001600160a01b03811681036101fd576064356001600160401b0381116101fd5760409161125261125e923690600401610918565b906024356004356122d4565b825191151582526020820152f35b346101fd576020610f4b61127f366107af565b916127e4565b90815180825260208080930193019160005b8281106112a5575050505090565b83516001600160e01b03191685529381019392810192600101611297565b908082519081815260208091019281808460051b8301019501936000915b8483106112f15750505050505090565b9091929394958480611335600193601f198682030187528a5190606090868060a01b0383511681528483015115158582015281604080940151938201520190611285565b98019301930191949392906112e1565b80516005811015610487576040918291845260ff60208201511660208501520151910152565b90815180825260208080930193019160005b82811061138b575050505090565b909192938260806001926113b383895163ffffffff60e01b8151168452015184830190611345565b0195019392910161137d565b90815180825260208080930193019160005b8281106113df575050505090565b909192938260e06001926114186040895163ffffffff851b815116845261140c8682015187860190611345565b01516080830190611345565b019501939291016113d1565b906109339160208152815190611448610180928360208401526101a0830190611285565b916114c261149661148261146e602088015196601f199788888303016040890152611285565b604088015187878303016060880152611285565b606087015186868303016080870152611285565b6080860151151560a085015260a0860151151560c085015260c0860151858583030160e08601526112c3565b61152b6115146114fd6114e660e089015194610100958989830301878a015261136b565b93880151936101209488888303018689015261136b565b92870151926101409387878303018588015261136b565b91860151916101609286868303018487015261136b565b94015192828503019101526113bf565b346101fd576000806003193601126119485761054a906115596129ca565b5061193b6115656129ca565b916115f06115e4611574612a36565b6115936115876040880192808452611cea565b63852b67af60e01b9052565b6115ac6115a08251611cfc565b630b96422d60e01b9052565b6115c56115b98251611d0c565b6371af817b60e01b9052565b6115de6115d28251611d1c565b630b135d3f60e11b9052565b51611d2c565b6377102c3560e01b9052565b6115f86108b9565b600181529061176e6020928284820152826040820152611616612a61565b60e087019081526116436116286108aa565b63852b67af60e01b8152838782015282519061073382611cea565b5061166a61164f6108aa565b630b96422d60e01b8152838782015282519061076982611cfc565b506116916116766108aa565b6371af817b60e01b8152838782015282519061079c82611d0c565b506116be61169d6108aa565b635b0e93fb60e11b815283878201528251906116b882611d1c565b52611d1c565b506116eb6116ca6108aa565b631a7e6adf60e11b815283878201528251906116e582611d2c565b52611d2c565b506117186116f76108aa565b633e15cc3d60e21b8152838782015282519061171282611d3c565b52611d3c565b506117456117246108aa565b63c1a221f360e01b8152838782015282519061173f82611d4c565b52611d4c565b5061174e6108aa565b63278f794360e11b81529185830152519061176882611d5c565b52611d5c565b506117776108b9565b6003815290808383015280604083015261178f6108b9565b6001815290808483015260408201526117fc6117a9612ac3565b9261010087019384526117d86117bd6108aa565b630b135d3f60e11b8152828782015285519061073382611cea565b506117e16108aa565b6377102c3560e01b8152908582015283519061076982611cfc565b506118236118086108aa565b63852b67af60e01b8152828582015283519061079c82611d0c565b5061184a61182f6108aa565b630b96422d60e01b815282858201528351906116b882611d1c565b506118716118566108aa565b6371af817b60e01b815282858201528351906116e582611d2c565b5061189861187d6108aa565b635b0e93fb60e11b8152828582015283519061171282611d3c565b506118bf6118a46108aa565b631a7e6adf60e11b8152828582015283519061173f82611d4c565b506118e66118cb6108aa565b633e15cc3d60e21b8152828582015283519061176882611d5c565b506119136118f26108aa565b63c1a221f360e01b8152828582015283519061190d82611d6d565b52611d6d565b5061191c6108aa565b63278f794360e11b815292830152519061193582611d7e565b52611d7e565b5060405191829182611424565b80fd5b346101fd5760403660031901126101fd57602061197e60405161196d81610817565b600435815260243583820152613137565b6040519061ffff19168152f35b346101fd5760003660031901126101fd576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101fd5760203660031901126101fd57602062010000600160b01b036119f56103cb565b60101b16604051908152f35b346101fd5760403660031901126101fd57611079611a1d6103cb565b611a256103b5565b611a2d61201a565b5060101b62010000600160b01b0316906131a0565b6001600160401b0381116108325760051b60200190565b9291611a6482611a42565b91611a726040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611a985750505050565b81356001600160a01b03811681036101fd578152908301908301611a8b565b929192611ac382611a42565b604092611ad36040519283610889565b819581835260208093019160061b8401938185116101fd57915b848310611afc57505050505050565b85838303126101fd578386918251611b1381610817565b853581528286013583820152815201920191611aed565b6040516384b9b37960e01b81526001600160e01b031960003516600482015260ff919091166024820152604490fd5b60405190608082018281106001600160401b0382111761083257604052606080838181528160208201528160408201520152565b60405190602082018281106001600160401b038211176108325760405260008252565b60405190611bbd82610837565b60218252603760f91b6040837f5765696768746564204d756c746973696720576562617574686e20506c75676960208201520152565b60405190611c0082610817565b60058252640312e302e360dc1b6020830152565b60405190611c2182610817565b601982527f436972636c6520496e7465726e65742046696e616e6369616c000000000000006020830152565b60409060405191608083018381106001600160401b038211176108325760405260038352829160009160005b606080821015611ca557825160209291611c9282610817565b8682528382015287820183015201611c79565b50505091925050565b60405190611cbb82610817565b600a825269416464204f776e65727360b01b6020830152565b634e487b7160e01b600052603260045260246000fd5b805115611cf75760200190565b611cd4565b805160011015611cf75760400190565b805160021015611cf75760600190565b805160031015611cf75760800190565b805160041015611cf75760a00190565b805160051015611cf75760c00190565b805160061015611cf75760e00190565b805160071015611cf7576101000190565b805160081015611cf7576101200190565b805160091015611cf7576101400190565b8051821015611cf75760209160051b010190565b60405190611db082610817565b601782527f557064617465204d756c746973696720576569676874730000000000000000006020830152565b60405190611de982610817565b600d82526c52656d6f7665204f776e65727360981b6020830152565b60405190611e1282610837565b60006040838281528260208201520152565b90604051611e3181610837565b60406002829480548452600181015460208501520154910152565b9291611e5782611a42565b91611e656040519384610889565b829481845260208094019160051b81019283116101fd57905b828210611e8b5750505050565b81358152908301908301611e7e565b9080601f830112156101fd5781602061093393359101611e4c565b9080601f830112156101fd5781602061093393359101611ab7565b61093391611fed611ff9611f9b611f3094611ee9611bb0565b611ef1611bf3565b6040519788916020998a9182611f10818401978881519384920161058b565b8201611f248251809386808501910161058b565b01038084520182610889565b519020604080517fd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac5647289820190815260208101939093524691830191909152306060808401919091529290921b6bffffffffffffffffffffffff191660808201529091829060a0830190565b0391611faf601f1993848101835282610889565b51902094604051938491820195869190602060408401937f7dc7da30a002512936154da01baa79a3d1e54e35034ffdfa7c53c28b3091236d81520152565b03908101835282610889565b519020906042916040519161190160f01b8352600283015260228201522090565b6040519061202782610852565b60006080838281528260208201528260408201528260608201520152565b93929161206a9060409260018060a01b031686526060602087015260608601906109b1565b930152565b634e487b7160e01b600052601160045260246000fd5b9060418202918083046041149015171561039e57565b600281901b91906001600160fe1b0381160361039e57565b906041820180921161039e57565b906015820180921161039e57565b906002820180921161039e57565b9190820180921161039e57565b60ff601f199116019060ff821161039e57565b9060405161210a81610852565b80928054825260018101549060ff821690600282101561048757608092600392602086015260018060a01b039060081c166040850152600281015460608501520154910152565b6040519061215e82610837565b6000604083815161216e81610852565b6060815260606020820152838382015283606082015283608082015281528260208201520152565b909291926121a3816108c6565b916121b16040519384610889565b8294828452828201116101fd5760206108b793019061058b565b9080601f830112156101fd57815161093392602001612196565b519081151582036101fd57565b60209081818403126101fd5780516001600160401b03918282116101fd57016060818503126101fd5760409283519461222a86610837565b82518481116101fd5783019360a0858303126101fd5785519161224c83610852565b85518281116101fd57860181601f820112156101fd5781818661227193519101612196565b8352838601519182116101fd57856122916080926122ad948a99016121cb565b85850152868101518785015260608101516060850152016121e5565b60808201528552808201519085015201519082015290565b600019811461039e5760010190565b939291909160009460418251106126d7576001600160a01b0383166000908152600260205260409020600101549384156127a05760009384928391828483146127945792979460ff60015b16976001995b878110612359575050505050505050508061233f57509190565b604051631007539160e31b81526004810191909152602490fd5b61236a61236584612085565b6120b3565b821515908161278a575b811561277f575b5061275e576123a0838a90604102016020810151906060604082015191015160001a92565b91979088602060ff82161061275457508d6123bb899a6120ea565b9d600019019d5b60ff8116806125d1575050506001600160a01b03811681116125bf578d9862010000600160b01b038260101b169960018060a01b0383168b61243360016124228d610e27838060a01b039561ffff19166000526001602052604060002090565b015460081c6001600160a01b031690565b16036125a6575b508c518411801561259c575b61258a5761245c6020808f8701015101856120dd565b8d5110612578578e938d8782108015612570575b612566575b61249893612494939290910160200191906001600160a01b03166135b7565b1590565b61254b575b61ffff19808916911681119081159161250a575b506124f1575b506124e36124ea916124dc86610e278a61ffff19166000526001602052604060002090565b54906120dd565b95926122c5565b9194612325565b6124fc575b8a6124b7565b919b50600099508b916124f6565b604080516001600160a01b0389168152637c9c64bb60e11b602082015260009181019190915261ffff199190911660608201526080902054159050386124b1565b90612558575b8b9061249d565b9a509b50819b60009a612551565b9096508690612475565b508715612470565b604051633b28c31760e01b8152600490fd5b604051635a3cc6f560e01b8152600490fd5b5060418410612446565b6125b1575b8e61243a565b9d509e50849e60009d6125ab565b60405163e6c4247b60e01b8152600490fd5b6002036126f357505061ffff199060101b1697612604610b3388610e278c61ffff19166000526001602052604060002090565b6080606082015191015191612617612151565b508d51851180156126e9575b61258a578d61263a602080888401015101876120dd565b9051106126d7578f948e88821080156126cf575b6126c5575b6126b49492826126a361268184602061249499976126959701015160409485809282850101019201016121f2565b928251948591602083019190602083019252565b03601f198101855284610889565b815190602083015192015192613392565b1561249d5790612558578b9061249d565b9097508790612653565b50881561264e565b60405163d245329360e01b8152600490fd5b5060418510612623565b612701939a949291946132b2565b601081901b62010000600160b01b031660008181526001602081905260409091209199926001600160a01b0390811692909161274291612422908b90610e27565b161461249d5790612558578b9061249d565b98508d8a996123c2565b505099979650505050505050600014612778575060009190565b6000925090565b90508951103861237b565b8381119150612374565b92979460ff600061231f565b60405163d349279d60e01b8152600490fd5b903590601e19813603018212156101fd57018035906001600160401b0382116101fd576020019181360383136101fd57565b9192909260ff83161561281e576040516384b9b37960e01b81526001600160e01b031960003516600482015260ff84166024820152604490fd5b6128539192507f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b604090612862828501856127b2565b908184519182372061297e61287a60608701876127b2565b908186519182372091845192602084019160018060a01b03893516835260208901358786015260608501526080840152600060a0840152600060c0840152600060e0840152610100927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470848201528381526128f48161086d565b5190208451602081019182526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016604082015246606082015261294c81608081015b03601f198101835282610889565b5190207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b928383146129ba575061299b856129a2926129aa969701906127b2565b36916108e1565b9133916122d4565b50156129b557600090565b600190565b51635b019f7d60e11b8152600490fd5b6040519061018082018281106001600160401b038211176108325760405281610160606091828152826020820152826040820152828082015260006080820152600060a08201528260c08201528260e08201528261010082015282610120820152826101408201520152565b6040519060c082018281106001600160401b03821117610832576040526005825260a0366020840137565b6040906040519161012083018381106001600160401b038211176108325760405260088352600083815b6101008110612a9a5750505050565b6020908451612aa881610817565b84815282612ab4611e05565b81830152828501015201612a8b565b6040906040519161016083018381106001600160401b0382111761083257604052600a8352600083815b6101408110612afc5750505050565b6020908451612b0a81610817565b84815282612b16611e05565b81830152828501015201612aed565b90612b2f82611a42565b612b3c6040519182610889565b8281528092612b4d601f1991611a42565b0190602036910137565b9060008051602061491583398151915291820391821161039e57565b9190820391821161039e57565b91908251918215612cd357336000526002602052604090604060002080549480861115612cc157600094855b8851871015612c6657612bdc612494612bd661ffff19612bcc8b8e611d8f565b511661ffff191690565b33613cef565b612c3357612bfb6001916124dc8b610e27610e12610e098d3394611d8f565b96612c2c612c148b610e27610e12610e09863394611d8f565b60036000918281558260018201558260028201550155565b0195612bac565b610f0e86612c44610e098a8d611d8f565b9051633af2c11760e11b815261ffff1990911660048201529081906024820190565b9550612cac93979450610d9f867fe81e1ec357e3c9a743825f13a44b813d8805d072a92c4477fcf36ce0dceba58298612ca56002870195865492612b73565b8655612b73565b612cbc6040519283923384612045565b0390a1565b604051639aa6ffc360e01b8152600490fd5b60405163114ab5ed60e11b8152600490fd5b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080812060009283929091546040519260809060808501965b6001908185161580612d8b575b15612d705761fffe1985169101600581901b870184018290529360021615612d68576060850152608084205492612d29565b508592612d29565b95935050945050608091506001830160051b01016040528252565b50841515612d36565b908151612da081612b25565b9060005b818110612db2575090925050565b60019061ffff19612dc38288611d8f565b5116612dcf8286611d8f565b5201612da4565b90612de082611a42565b612ded6040519182610889565b8281528092612dfe601f1991611a42565b019060005b828110612e0f57505050565b602090612e1a61201a565b82828501015201612e03565b929093919383519480519282518714801590612fbe575b610f1257612e4e84889794986120dd565b96612e61612e5b89612b25565b98612dd6565b9660009485925b898b848610612f16575050505050506000925b848410612e89575050505050565b612f0e600191612ea9612e9f61032d8888611d8f565b61033d838d611d8f565b612eb38685611d8f565b51612ebe828b611d8f565b51526020600081612ecf848d611d8f565b510152612edc8787611d8f565b51516060612eea848d611d8f565b510152612ef78787611d8f565b5101516080612f06838c611d8f565b5101526122c5565b930192612e7b565b97610347612fb4926040612fa384612f9d612f4b8c9f9c612f698c9d9e61033d8660019e9f612f58612f4b87610e7b93611d8f565b516001600160a01b031690565b60101b62010000600160b01b031690565b612f73818d611d8f565b51612f7e8589611d8f565b5152612f976020612f8f868a611d8f565b510160019052565b8c611d8f565b93611d8f565b516001600160a01b03909216910152565b9601929190612e68565b508051841415612e3d565b6001600160a01b039091168152606060208201819052610933939192612ff1918401906109b1565b916040818403910152610a28565b919283156127a057600093845b83518610156130355761301f8685611d8f565b5151810180911161039e5760019095019461300c565b90939194508381106131005782826130ce7f6bcc79f3790a680c839a139da8da45daa854ba5d3ec308ec1ec89d3f12bb3f1793613097612cbc977f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f9997613788565b50508251906130a46108b9565b91825286602083015260408201526111663360018060a01b03166000526002602052604060002090565b6130de6040519283923384612fc9565b0390a16040805133815260006020820152908101919091529081906060820190565b604051632cdc99e960e21b81526000600482015260248101859052604490fd5b906131336020928281519485920161058b565b0190565b60208151910151811580613198575b6131795760408051602081019384528082019290925281529061316a606083610889565b9051902060101b61ffff191690565b604051632989640f60e21b815260048101929092526024820152604490fd5b508015613146565b9190916131ab61201a565b604080516001600160a01b0384168152637c9c64bb60e11b602082015260009181019190915261ffff19909416606085018190526080909420549093901561322357613217929350600052600160205260406000209060018060a01b0316600052602052604060002090565b906109336001926120fd565b505060009190565b6000919082805b82518210156132ac5761ffff19918261324b8286611d8f565b511686526001602081815260408089203360009081529083528190209294919254820180921161039e576001946132a593612c14939761328b878b611d8f565b51168b525288203360009081526020919091526040902090565b0190613232565b93505050565b9161093393916132c1936139f8565b90929192613a86565b906108b7602e60405180946c1131b430b63632b733b2911d1160991b60208301526132ff815180926020602d8601910161058b565b8101601160f91b602d82015203600e810185520183610889565b805160201015611cf75760400190565b6040513d6000823e3d90fd5b602092919061334b84928281519485920161058b565b019081520190565b3d1561337e573d90613364826108c6565b916133726040519384610889565b82523d6000602084013e565b606090565b908160209103126101fd575190565b94939291907f7fffffff800000007fffffffffffffffde737d56d38bcf4279dce5617e3192a883116135ac57602095868201907fff1a2a9176d650e4a99dedb58f1793003935130579fe17b5a3f698ac5b00e6346133ff835160608601516133f9816120c1565b91613b13565b8981519101200361359f5761341f61342491613419613b96565b90613e7f565b6132ca565b613439825160408501516133f98451826120dd565b888151910120908881519101200361357757600160f81b8061346c61345e8551613319565b516001600160f81b03191690565b1603613577576080820151151580613583575b6135775751866040519182806134986000958694613120565b039060025afa156135725786816134dd815194516134bd604051968792868401613335565b03946134d1601f1996878101835282610889565b60405191828092613120565b039060025afa15613572578051604080518981018381526020810187905291820187905260608201889052608082018990529193839290613522908260a08501611fed565b51906101005afa95613532613353565b9081519780613569575b61354c5750506109339550613bf5565b6001976135659750820181019550019250613383915050565b1490565b5087151561353c565b613329565b50505050505050600090565b50600160fa1b8061359761345e8551613319565b16141561347f565b5050505050505050600090565b505050505050600090565b600091929082916040516135ef8161293e6020820194630b135d3f60e11b998a875260248401526040604484015260648301906105ae565b51915afa906135fc613353565b82613624575b8261360c57505090565b9091506020818051810103126101fd57602001511490565b915060208251101591613602565b604080516001600160a01b039092168252637c9c64bb60e11b6020830152600090820152600160608201526080902054801590811561366f575090565b600191501690565b6001909201805490929182156136fa578281106136d9575080820361369b57505050565b918190556040805133815260208101939093528201527f249fd5fdc7ce39ccac456eaa5ab294c64fb6f518db9555154897318aaa308b4f90606090a1565b604051632cdc99e960e21b8152600481018490526024810191909152604490fd5b80935081925010613709575050565b604051632cdc99e960e21b815260048101919091526024810191909152604490fd5b90805182556001820190602081015190600282101561048757826080926003945460ff610100600160a81b03604086015160081b169216906affffffffffffffffffffff60a81b1617179055606081015160028501550151910155565b91908251906000938215612cd35782825103610f12576103e883116138aa57906000915b8383106137ba575050509190565b9091946137e16124946137db6137d3610e098a87611d8f565b61ffff191690565b33613dc8565b61389a576137ef8684611d8f565b5151158015613883575b6138455761383c60019161382a6138108987611d8f565b5161382533610e27610e12610e098e8b611d8f565b61372b565b6138348886611d8f565b5151906120dd565b950191906137ac565b5084610e7b610e098261385794611d8f565b5151604051634d7f725b60e11b815261ffff199290921660048301523360248301526044820152606490fd5b50620f42406138928785611d8f565b5151116137f9565b610f0e610eeb610e098885611d8f565b604051632103b34b60e11b81526000600482015260248101849052604490fd5b909291928151916000948315612cd35783835103610f12576103e86138ef85836120dd565b116139705750906000915b838310613908575050509190565b9091946139216124946137db6137d3610e098a87611d8f565b61389a5761392f8684611d8f565b5151158015613959575b6138455761395060019161382a6138108987611d8f565b950191906138fa565b50620f42406139688785611d8f565b515111613939565b604051632103b34b60e11b8152600481019190915260248101849052604490fd5b811580156139ec575b6139bf5761ffff19166000908152600160209081526040808320338452909152902055565b604051634d7f725b60e11b815261ffff199190911660048201523360248201526044810191909152606490fd5b50620f4240821161399a565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411613a7057926020929160ff608095604051948552168484015260408301526060820152600092839182805260015afa156135725780516001600160a01b03811615613a6757918190565b50809160019190565b50505060009160039190565b6004111561048757565b613a8f81613a7c565b80613a98575050565b613aa181613a7c565b60018103613abb5760405163f645eedf60e01b8152600490fd5b613ac481613a7c565b60028103613ae55760405163fce698f760e01b815260048101839052602490fd5b80613af1600392613a7c565b14613af95750565b6040516335e2f38360e21b81526004810191909152602490fd5b805160609493929083811115613b8e575b81811115613b86575b50828110613b3a57505050565b60405192819003808452929450601f19929183910181601f840181165b808301518189015201908115613b6f57908290613b57565b505060008583016020015250603f01168201604052565b905038613b2d565b925082613b24565b60405190613ba382610837565b604082527f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f6040837f4142434445464748494a4b4c4d4e4f505152535455565758595a61626364656660208201520152565b939190929383158015613cd7575b8015613ccf575b8015613cb7575b613cad57613c1f8386613f27565b15613cad5760405191602083526020808401526020604084015260608301527fffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc63254f6080830152600080516020614915833981519152948560a084015260208360c0816005600019fa156101fd57613ca79386613ca1945181818909940991613fc8565b91612b57565b90081590565b5050505050600090565b50600080516020614915833981519152821015613c11565b508115613c0a565b50600080516020614915833981519152841015613c03565b604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015261ffff1990911691906060810183905260808120805484158015613dc0575b613db7576001600060015b15613d8b575b50606084015260808320805460009161fffe198083169190898314613d6a57505091613d3d565b9294809498995060029196975061fffc925016931691161717905555600190565b60018116159081613dad575b5015613da35738613d43565b5060009450505050565b9050151538613d97565b50600093505050565b508015613d32565b9061ffff1916908115613e5057604080516001600160a01b039092168252637c9c64bb60e11b602083015260009082015260608101828152608082208054909290613e4757600160809252209182549283158015613e3d575b15613e3157600193505555600190565b90600217905555600190565b5060018416613e21565b50505050600090565b5050600090565b90613e61826108c6565b613e6e6040519182610889565b8281528092612b4d601f19916108c6565b805115613f1d57613eaa613ea5613e9e613e99845161209b565b6120cf565b6003900490565b613e57565b91602083019180805101906020820192835194600085525b838310613ed157505050505290565b6004906003809401938451600190603f9082828260121c16880101518553828282600c1c16880101518386015382828260061c1688010151600286015316850101519082015301613ec2565b5050610933611b8d565b600160601b63ffffffff60c01b031990818110801590613fbe575b8015613fad575b613fa5577f5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b828281807fffffffff00000001000000000000000000000000fffffffffffffffffffffffc81960991818180090908089180091490565b505050600090565b5080158015613f4957508215613f49565b5081831015613f42565b60009260ff929091848315806146d4575b61357757613fe783836146dc565b90958615806146cc575b61468e575b85811c60028a60fe1c16015b1561467457600186821c1660028a831c60011b16016001811461463b575b6002811461462e575b600314614621575b60009493929419019560019860015b88600019116140ad5750505050505050505060405191606083015260208252602080830152602060408301526000805160206149358339815191526080830152600163ffffffff60601b0360601b19918260a082015260208160c0816005600019fa156101fd5751900990565b600163ffffffff60601b0360609a95969798999a1b198860020994600160601b63ffffffff60c01b0319868009600160601b63ffffffff60c01b031981830996600160601b63ffffffff60c01b03199082900991600160601b63ffffffff60c01b03199081908f8281830891600160601b63ffffffff60c01b031991820390080960030992600160601b63ffffffff60c01b03199083099c600160601b63ffffffff60c01b0319910995600160601b63ffffffff60c01b0319808260008051602061493583398151915209600160601b63ffffffff60c01b03198580090892600160601b63ffffffff60c01b031991829081038508900998600160601b63ffffffff60c01b0319908a908290840908988a8c1c600116848d1c60011b60021601156146035760018c600286838f841c16921c831b1601146145cc575b838c8c6002600182841c168185851c60011b1601146145b9575b6003926001600292841c16921c60011b1601146145b0575b861561459d57600160601b63ffffffff60c01b0319908a9082908f90090890600160601b63ffffffff60c01b03199083820390829089900908958115614387575b600160601b63ffffffff60c01b0319908188800990099b600160601b63ffffffff60c01b03199081888181800909900998600160601b63ffffffff60c01b0319908190818981818009099009600160601b63ffffffff60c01b03198381808080808e80098a0960008051602061493583398151915209600160601b63ffffffff60c01b0319808e8181800909600160601b63ffffffff60c01b0319908103908680090808600160601b63ffffffff60c01b031990810390808d8009890908090895600160601b63ffffffff60c01b031992839081908184800990096000805160206149358339815191520991600160601b63ffffffff60c01b03199182908181800909600160601b63ffffffff60c01b03199081039180090808985b60001901979693959493614040565b8661425c57919a9198919550600160601b63ffffffff60c01b0319905080808360008051602061493583398151915209600160601b63ffffffff60c01b03198460008051602061493583398151915209098b0999600160601b63ffffffff60c01b031990818a8103820890600160601b63ffffffff60c01b0319908b9008099a600160601b63ffffffff60c01b0319908180808560008051602061493583398151915209600160601b63ffffffff60c01b0319866000805160206149358339815191520909600160601b63ffffffff60c01b03198560008051602061493583398151915209090997600160601b63ffffffff60c01b03199081808460008051602061493583398151915209600160601b63ffffffff60c01b0319856000805160206149358339815191520909099a600160601b63ffffffff60c01b0319808c60008051602061493583398151915209600160601b63ffffffff60c01b03198084600309600160601b63ffffffff60c01b03198560030909089a600160601b63ffffffff60c01b03199283908180808360008051602061493583398151915209600160601b63ffffffff60c01b0319846000805160206149358339815191520909600160601b63ffffffff60c01b03198360008051602061493583398151915209090991600160601b63ffffffff60c01b03199182908e8203900890600160601b63ffffffff60c01b031990600309090893614378565b60019c50909a8c99509095509050614378565b5050828461421b565b508993508a92508591508d90508c614203565b50506000805160206148f58339815191527f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f56141e9565b50949a90999097600160601b63ffffffff60c01b0319039450614378565b9150955084958091614031565b9397508793859350614029565b6000805160206148f583398151915298507f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f59350614020565b60001901600160028188841c16918b841c901b1601614002565b9790946000805160206149158339815191529182039008936000978515806146c4575b15613ff657505050505050505050600090565b5060016146b1565b508115613ff1565b508615613fd9565b7f4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f592916000805160206148f5833981519152918115614834578083148061482b575b156148145750600160601b63ffffffff60c01b03199190508184600209918083800992818080808781818909950995817fffffffff00000001000000000000000000000000fffffffffffffffffffffffe816001840892080960030981808080866000805160206149358339815191520981858009089981600181818b099a099709810393898203900890090893915b60405190602082526020808301526020604083015260608201526000805160206149358339815191526080820152600163ffffffff60601b0360601b19928360a083015260208260c0816005600019fa156101fd57838080935180950980099009930990565b90915061482292935061483a565b919392916147ae565b5081851461471e565b50509190565b60019283927f94e82e0c1ed3bdb90743191a9c5bbf0d88fc827fd214cc5f0b5ec6ba27673d69600163ffffffff60601b0360601b198095818094817fb01cbd1c01e58065711814b583f061e9d431cca994cea1313449bf97c840ae0a9a8b9209089509089280808080878009968709948180886000805160206148f583398151915209918180808560008051602061493583398151915209818b810381868009080893818a869d099482039008090894600109926001099056fe6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551ffffffff00000001000000000000000000000000fffffffffffffffffffffffda2646970667358221220d586e4fd303dfab4216400fe9fa3ed6319112d27701f24d09905e2c95485692164736f6c634300081800330000000000000000000000000000000071727de22e5e9d8baf0edac6f37da032", + "nonce": "0xaa", "chainId": "0x13882" }, "additionalContracts": [], @@ -23,42 +25,42 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0x421907", + "cumulativeGasUsed": "0x3f5c2a", "logs": [ { "address": "0x0000000000000000000000000000000000001010", "topics": [ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x000000000000000000000000bcd75cbd82fc6c3e01e7b3793489ab2f879980ae", - "0x0000000000000000000000004ca9ff871c7aa1e7b64e1eae110835f68d6a0bd4" + "0x000000000000000000000000a1404d9e7646b0112c49ae0296d6347c956d0867", + "0x0000000000000000000000004ad84f7014b7b44f723f284a85b1662337971439" ], - "data": "0x00000000000000000000000000000000000000000000000001c21cd283d0bc0000000000000000000000000000000000000000000000000003dcbddc1266542700000000000000000000000000000000000000000000000cd63150f72e8634eb000000000000000000000000000000000000000000000000021aa1098e95982700000000000000000000000000000000000000000000000cd7f36dc9b256f0eb", - "blockHash": "0x58185476981ed91fafe8da152fdb566af2d6b1032f77004a7953a2069da37607", - "blockNumber": "0xbd724f", - "transactionHash": "0xd6000be27b6920d4748a11e9337182ac5edb28bbed7e703ea1ac0eaa6ecd3b21", + "data": "0x00000000000000000000000000000000000000000000000001b8538e3574d8000000000000000000000000000000000000000000000002463a08066c4f3c11980000000000000000000000000000000000000000000003886b95560ac832fa1c000000000000000000000000000000000000000000000246384fb2de19c739980000000000000000000000000000000000000000000003886d4da998fda7d21c", + "blockHash": "0x29371913ce7cb423cfc9f0ce6845d9073e8db672ec64ccf63c4ae94e72b504fe", + "blockNumber": "0xcf22b6", + "transactionHash": "0x38aac58cbe6d4ae088383cfe218ae30bfa0da150e5fbfd3b1fd3bf0fd8e6a9fa", "transactionIndex": "0x1", - "logIndex": "0x3", + "logIndex": "0x2", "removed": false } ], - "logsBloom": "0x00000000000000000000000000080000000000000000000000000000000000000000001000000000000000000000000020008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000008000000000000000000000000000200000000000040000000000000000000000100000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000400000000000000000000000000000000000800000000000000000000100001000000000000000000000000000000000000000000000000000000080000000000000000000000000000000001000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000000000000000100000000000000000000000000000000000000000008000000800000000000000000000100000", "type": "0x2", - "transactionHash": "0xd6000be27b6920d4748a11e9337182ac5edb28bbed7e703ea1ac0eaa6ecd3b21", + "transactionHash": "0x38aac58cbe6d4ae088383cfe218ae30bfa0da150e5fbfd3b1fd3bf0fd8e6a9fa", "transactionIndex": "0x1", - "blockHash": "0x58185476981ed91fafe8da152fdb566af2d6b1032f77004a7953a2069da37607", - "blockNumber": "0xbd724f", - "gasUsed": "0x4070cd", + "blockHash": "0x29371913ce7cb423cfc9f0ce6845d9073e8db672ec64ccf63c4ae94e72b504fe", + "blockNumber": "0xcf22b6", + "gasUsed": "0x3f0a22", "effectiveGasPrice": "0x6fc23ac0f", - "from": "0xbcd75cbd82fc6c3e01e7b3793489ab2f879980ae", + "from": "0xa1404d9e7646b0112c49ae0296d6347c956d0867", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "contractAddress": "0x558498e7cd325b17be8c8a79884a1cacfd72a4aa" + "contractAddress": "0x5a2262d58eb72b84701d6efbf6bb6586c793a65b" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1727294910, + "timestamp": 1729794657, "chain": 80002, - "commit": "1d2d26c" + "commit": "bf15fa9" } \ No newline at end of file diff --git a/script/000_ContractAddress.sol b/script/000_ContractAddress.sol index 54f12d1..83fdaf5 100644 --- a/script/000_ContractAddress.sol +++ b/script/000_ContractAddress.sol @@ -25,7 +25,7 @@ address constant PLUGIN_MANAGER_ADDRESS = 0xBc17c439278c4E64C333beE4A890DE6d1f86 address constant UPGRADABLE_MSCA_FACTORY_ADDRESS = 0x3e6b66A72B76850c372FBDf29f53268ad636B320; address constant SINGLE_OWNER_PLUGIN_ADDRESS = 0x7af5E9DBe3e50F023a5b99f44002697cF8e1de2e; address constant COLD_STORAGE_ADDRESS_BOOK_PLUGIN_ADDRESS = 0x3c95978Af08B6B2Fd82659B393be86AfB4bd3D6F; -address constant WEIGHTED_MULTISIG_PLUGIN_ADDRESS = 0x558498E7CD325b17be8c8A79884A1cAcfD72a4AA; +address constant WEIGHTED_MULTISIG_PLUGIN_ADDRESS = 0x5a2262d58eB72B84701D6efBf6bB6586C793A65b; address constant DEFAULT_TOKEN_CALLBACK_PLUGIN_ADDRESS = 0x03431Fb00fB2e26b5bC502DFeF8dA30E1C8643b8; address constant PAYMASTER_ADDRESS = 0x36058Cc257967db1912FC276F9CBEC072CD572cb; diff --git a/script/verify/WeightedWebauthnMultisigPlugin.json b/script/verify/WeightedWebauthnMultisigPlugin.json new file mode 100644 index 0000000..85c6d90 --- /dev/null +++ b/script/verify/WeightedWebauthnMultisigPlugin.json @@ -0,0 +1 @@ +{"language":"Solidity","sources":{"src/msca/6900/v0.7/plugins/v1_0_0/multisig/WeightedWebauthnMultisigPlugin.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\npragma solidity 0.8.24;\n\nimport {\n EIP1271_INVALID_SIGNATURE,\n EIP1271_VALID_SIGNATURE,\n PLUGIN_AUTHOR,\n PLUGIN_VERSION_1\n} from \"../../../../../../common/Constants.sol\";\nimport {BaseMSCA} from \"../../../account/BaseMSCA.sol\";\nimport {\n ManifestAssociatedFunction,\n ManifestAssociatedFunctionType,\n ManifestFunction,\n PluginManifest,\n PluginMetadata,\n SelectorPermission\n} from \"../../../common/PluginManifest.sol\";\nimport {BaseWeightedMultisigPlugin} from \"./BaseWeightedMultisigPlugin.sol\";\nimport {IWeightedMultisigPlugin} from \"./IWeightedMultisigPlugin.sol\";\n\nimport {\n AssociatedLinkedListSet,\n AssociatedLinkedListSetLib\n} from \"@modular-account-libs/libraries/AssociatedLinkedListSetLib.sol\";\nimport {SetValue} from \"@modular-account-libs/libraries/Constants.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {IERC1271} from \"@openzeppelin/contracts/interfaces/IERC1271.sol\";\nimport {ECDSA} from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\n\nimport {OwnerData, PublicKey, WebAuthnSigDynamicPart} from \"../../../../../../common/CommonStructs.sol\";\nimport {AddressBytesLib} from \"../../../../../../libs/AddressBytesLib.sol\";\nimport {PublicKeyLib} from \"../../../../../../libs/PublicKeyLib.sol\";\nimport {WebAuthnLib} from \"../../../../../../libs/WebAuthnLib.sol\";\n\nimport {BaseERC712CompliantModule} from \"../../../../shared/erc712/BaseERC712CompliantModule.sol\";\nimport {IStandardExecutor} from \"../../../interfaces/IStandardExecutor.sol\";\nimport {SignatureChecker} from \"@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol\";\n\n/// @title Weighted Multisig Plugin That Supports Additional Webauthn Authentication\n/// @author Circle\n/// @notice This plugin adds a weighted threshold ownership scheme to a ERC6900 smart contract account.\ncontract WeightedWebauthnMultisigPlugin is BaseWeightedMultisigPlugin, BaseERC712CompliantModule {\n using ECDSA for bytes32;\n using AssociatedLinkedListSetLib for AssociatedLinkedListSet;\n using PublicKeyLib for PublicKey[];\n using PublicKeyLib for PublicKey;\n using AddressBytesLib for address;\n\n string internal constant _NAME = \"Weighted Multisig Webauthn Plugin\";\n bytes32 private constant _MULTISIG_PLUGIN_TYPEHASH =\n keccak256(\"CircleWeightedWebauthnMultisigMessage(bytes32 hash)\");\n\n constructor(address entryPoint) BaseWeightedMultisigPlugin(entryPoint) {}\n\n // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n // ┃ Execution functions ┃\n // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n /// @inheritdoc IWeightedMultisigPlugin\n function addOwners(\n address[] calldata ownersToAdd,\n uint256[] calldata weightsToAdd,\n PublicKey[] calldata publicKeyOwnersToAdd,\n uint256[] calldata pubicKeyWeightsToAdd,\n uint256 newThresholdWeight\n ) external override isInitialized(msg.sender) {\n (bytes30[] memory _totalOwners, OwnerData[] memory _ownersData) =\n _mergeOwnersData(ownersToAdd, weightsToAdd, publicKeyOwnersToAdd, pubicKeyWeightsToAdd);\n _addOwnersAndUpdateMultisigMetadata(_totalOwners, _ownersData, newThresholdWeight);\n }\n\n /// @inheritdoc IWeightedMultisigPlugin\n function removeOwners(\n address[] calldata ownersToRemove,\n PublicKey[] calldata publicKeyOwnersToRemove,\n uint256 newThresholdWeight\n ) external override isInitialized(msg.sender) {\n bytes30[] memory _totalOwners = _mergeOwners(ownersToRemove, publicKeyOwnersToRemove);\n _removeOwners(_totalOwners, newThresholdWeight);\n }\n\n /// @inheritdoc IWeightedMultisigPlugin\n function updateMultisigWeights(\n address[] calldata ownersToUpdate,\n uint256[] calldata newWeightsToUpdate,\n PublicKey[] calldata publicKeyOwnersToUpdate,\n uint256[] calldata pubicKeyNewWeightsToUpdate,\n uint256 newThresholdWeight\n ) external override isInitialized(msg.sender) {\n (bytes30[] memory _totalOwners, OwnerData[] memory _ownersData) =\n _mergeOwnersData(ownersToUpdate, newWeightsToUpdate, publicKeyOwnersToUpdate, pubicKeyNewWeightsToUpdate);\n _updateMultisigWeights(_totalOwners, _ownersData, newThresholdWeight);\n }\n\n // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n // ┃ Execution view functions ┃\n // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n /// @inheritdoc IERC1271\n function isValidSignature(bytes32 digest, bytes memory signature) external view override returns (bytes4) {\n bytes32 wrappedDigest = getReplaySafeMessageHash(msg.sender, digest);\n (bool success,) = checkNSignatures(wrappedDigest, wrappedDigest, msg.sender, signature);\n\n return success ? EIP1271_VALID_SIGNATURE : EIP1271_INVALID_SIGNATURE;\n }\n\n // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n // ┃ Plugin interface functions ┃\n // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n /// @notice Initialize plugin data for the modular account.\n /// @dev Called by the modular account during `installPlugin`.\n /// Constraints:\n /// - initialOwners must be non-empty\n /// - length of ownerWeights must == length of initialOwners\n /// - each weight must be between [1, 1000000], inclusive.\n /// each owner in ownersToAdd must not be address(0) or an existing owner.\n /// thresholdWeight must be nonzero.\n /// @param data bytes array to be decoded and used by the plugin to setup initial plugin data for the modular\n /// account. Format:\n /// address[] memory initialOwners, PublicKey[] memory initialPublicKeyOwners, uint256[] memory ownerWeights,\n /// uint256[] memory publicKeyOwnerWeights, uint256 thresholdWeight\n /// @dev The owner array cannot have 0 or duplicated addresses.\n function onInstall(bytes calldata data) external override isNotInitialized(msg.sender) {\n (\n address[] memory initialOwners,\n uint256[] memory ownerWeights,\n PublicKey[] memory initialPublicKeyOwners,\n uint256[] memory publicKeyOwnerWeights,\n uint256 thresholdWeight\n ) = abi.decode(data, (address[], uint256[], PublicKey[], uint256[], uint256));\n (bytes30[] memory _totalOwners, OwnerData[] memory _ownersData) =\n _mergeOwnersData(initialOwners, ownerWeights, initialPublicKeyOwners, publicKeyOwnerWeights);\n _onInstall(_totalOwners, _ownersData, thresholdWeight);\n }\n\n /// @notice Describe the contents and intended configuration of the plugin.\n /// @dev The manifest MUST stay constant over time.\n /// @return A manifest describing the contents and intended configuration of the plugin.\n function pluginManifest() external pure virtual override returns (PluginManifest memory) {\n PluginManifest memory manifest;\n\n manifest.executionFunctions = new bytes4[](5);\n manifest.executionFunctions[0] = this.addOwners.selector;\n manifest.executionFunctions[1] = this.removeOwners.selector;\n manifest.executionFunctions[2] = this.updateMultisigWeights.selector;\n manifest.executionFunctions[3] = this.isValidSignature.selector;\n manifest.executionFunctions[4] = this.getReplaySafeMessageHash.selector;\n\n ManifestFunction memory ownerUserOpValidationFunction = ManifestFunction({\n functionType: ManifestAssociatedFunctionType.SELF,\n functionId: uint8(FunctionId.USER_OP_VALIDATION_OWNER),\n dependencyIndex: 0 // Unused.\n });\n\n // Update native functions to use userOpValidationFunction provided by this plugin\n // The view functions `isValidSignature` and `getReplaySafeMessageHash` are excluded from being assigned a user\n // operation validation function since they should only be called via the runtime path.\n manifest.userOpValidationFunctions = new ManifestAssociatedFunction[](8);\n manifest.userOpValidationFunctions[0] = ManifestAssociatedFunction({\n executionSelector: this.addOwners.selector,\n associatedFunction: ownerUserOpValidationFunction\n });\n\n manifest.userOpValidationFunctions[1] = ManifestAssociatedFunction({\n executionSelector: this.removeOwners.selector,\n associatedFunction: ownerUserOpValidationFunction\n });\n\n manifest.userOpValidationFunctions[2] = ManifestAssociatedFunction({\n executionSelector: this.updateMultisigWeights.selector,\n associatedFunction: ownerUserOpValidationFunction\n });\n\n manifest.userOpValidationFunctions[3] = ManifestAssociatedFunction({\n executionSelector: IStandardExecutor.execute.selector,\n associatedFunction: ownerUserOpValidationFunction\n });\n manifest.userOpValidationFunctions[4] = ManifestAssociatedFunction({\n executionSelector: IStandardExecutor.executeBatch.selector,\n associatedFunction: ownerUserOpValidationFunction\n });\n\n manifest.userOpValidationFunctions[5] = ManifestAssociatedFunction({\n executionSelector: BaseMSCA.installPlugin.selector,\n associatedFunction: ownerUserOpValidationFunction\n });\n manifest.userOpValidationFunctions[6] = ManifestAssociatedFunction({\n executionSelector: BaseMSCA.uninstallPlugin.selector,\n associatedFunction: ownerUserOpValidationFunction\n });\n manifest.userOpValidationFunctions[7] = ManifestAssociatedFunction({\n executionSelector: UUPSUpgradeable.upgradeToAndCall.selector,\n associatedFunction: ownerUserOpValidationFunction\n });\n\n ManifestFunction memory alwaysAllowFunction = ManifestFunction({\n functionType: ManifestAssociatedFunctionType.RUNTIME_VALIDATION_ALWAYS_ALLOW,\n functionId: 0, // Unused.\n dependencyIndex: 0 // Unused.\n });\n\n ManifestFunction memory alwaysRevertFunction = ManifestFunction({\n functionType: ManifestAssociatedFunctionType.SELF,\n functionId: 0,\n dependencyIndex: 0 // Unused.\n });\n manifest.runtimeValidationFunctions = new ManifestAssociatedFunction[](10);\n\n manifest.runtimeValidationFunctions[0] = ManifestAssociatedFunction({\n executionSelector: this.isValidSignature.selector,\n associatedFunction: alwaysAllowFunction\n });\n manifest.runtimeValidationFunctions[1] = ManifestAssociatedFunction({\n executionSelector: this.getReplaySafeMessageHash.selector,\n associatedFunction: alwaysAllowFunction\n });\n manifest.runtimeValidationFunctions[2] = ManifestAssociatedFunction({\n executionSelector: this.addOwners.selector,\n associatedFunction: alwaysRevertFunction\n });\n manifest.runtimeValidationFunctions[3] = ManifestAssociatedFunction({\n executionSelector: this.removeOwners.selector,\n associatedFunction: alwaysRevertFunction\n });\n manifest.runtimeValidationFunctions[4] = ManifestAssociatedFunction({\n executionSelector: this.updateMultisigWeights.selector,\n associatedFunction: alwaysRevertFunction\n });\n manifest.runtimeValidationFunctions[5] = ManifestAssociatedFunction({\n executionSelector: IStandardExecutor.execute.selector,\n associatedFunction: alwaysRevertFunction\n });\n manifest.runtimeValidationFunctions[6] = ManifestAssociatedFunction({\n executionSelector: IStandardExecutor.executeBatch.selector,\n associatedFunction: alwaysRevertFunction\n });\n manifest.runtimeValidationFunctions[7] = ManifestAssociatedFunction({\n executionSelector: BaseMSCA.installPlugin.selector,\n associatedFunction: alwaysRevertFunction\n });\n manifest.runtimeValidationFunctions[8] = ManifestAssociatedFunction({\n executionSelector: BaseMSCA.uninstallPlugin.selector,\n associatedFunction: alwaysRevertFunction\n });\n manifest.runtimeValidationFunctions[9] = ManifestAssociatedFunction({\n executionSelector: UUPSUpgradeable.upgradeToAndCall.selector,\n associatedFunction: alwaysRevertFunction\n });\n\n return manifest;\n }\n\n /// @notice Describe the metadata of the plugin.\n /// @dev This metadata MUST stay constant over time.\n /// @return A metadata struct describing the plugin.\n function pluginMetadata() external pure override returns (PluginMetadata memory) {\n PluginMetadata memory metadata;\n metadata.name = _NAME;\n metadata.version = PLUGIN_VERSION_1;\n metadata.author = PLUGIN_AUTHOR;\n\n // Permission descriptions\n metadata.permissionDescriptors = new SelectorPermission[](3);\n metadata.permissionDescriptors[0] = SelectorPermission({\n functionSelector: this.addOwners.selector,\n permissionDescription: ADD_OWNERS_PERMISSION\n });\n metadata.permissionDescriptors[1] = SelectorPermission({\n functionSelector: this.updateMultisigWeights.selector,\n permissionDescription: UPDATE_MULTISIG_WEIGHTS_PERMISSION\n });\n metadata.permissionDescriptors[2] = SelectorPermission({\n functionSelector: this.removeOwners.selector,\n permissionDescription: REMOVE_OWNERS_PERMISSION\n });\n\n return metadata;\n }\n\n // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n // ┃ Plugin only view functions ┃\n // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n /// @inheritdoc IWeightedMultisigPlugin\n function checkNSignatures(bytes32 actualDigest, bytes32 minimalDigest, address account, bytes memory signatures)\n public\n view\n override\n returns (bool success, uint256 firstFailure)\n {\n if (signatures.length < _INDIVIDUAL_SIGNATURE_BYTES_LEN) {\n revert InvalidSigLength();\n }\n\n uint256 thresholdWeight = _ownerMetadata[account].thresholdWeight;\n // (Account is not initialized)\n if (thresholdWeight == 0) {\n revert InvalidThresholdWeight();\n }\n\n uint256 accumulatedWeight;\n uint256 signatureCount;\n bytes30 lastOwner;\n bytes30 currentOwner;\n // first32Bytes of signature constant part\n bytes32 first32Bytes;\n // second32Bytes of signature constant part\n bytes32 second32Bytes;\n // lastByte of signature constant part\n uint8 sigType;\n // lowestOffset of signature dynamic part, must locate after the signature constant part\n // 0 means we only have EOA signer so far\n uint256 lowestSigDynamicPartOffset = 0;\n // if the digests differ, make sure we have exactly 1 sig on the actual digest\n uint256 numSigsOnActualDigest = (actualDigest != minimalDigest) ? 1 : 0;\n\n // tracks whether `signatures` is a complete and valid multisig signature\n success = true;\n while (accumulatedWeight < thresholdWeight) {\n // Fail if the next 65 bytes would exceed signature length\n // or lowest dynamic part signature offset, where next 65 bytes is defined as\n // [signatureCount _INDIVIDUAL_SIGNATURE_BYTES_LEN, signatureCount _INDIVIDUAL_SIGNATURE_BYTES_LEN +\n // _INDIVIDUAL_SIGNATURE_BYTES_LEN)\n // exclusive\n uint256 sigConstantPartEndPos =\n signatureCount * _INDIVIDUAL_SIGNATURE_BYTES_LEN + _INDIVIDUAL_SIGNATURE_BYTES_LEN;\n // do not fail if only have EOA signer so far\n if (\n (lowestSigDynamicPartOffset != 0 && sigConstantPartEndPos > lowestSigDynamicPartOffset)\n || sigConstantPartEndPos > signatures.length\n ) {\n if (success) {\n return (false, signatureCount);\n } else {\n return (false, firstFailure);\n }\n }\n\n (sigType, first32Bytes, second32Bytes) = _signatureSplit(signatures, signatureCount);\n\n // sigType >= 32 implies it's signed over the actual digest, so we deduct it according to encoding rule\n // if sigType > 60, it will eventually fail the ecdsa recover check below\n bytes32 digest;\n if (sigType >= 32) {\n digest = actualDigest;\n sigType -= 32;\n // can have unchecked since we check against zero at the end\n // underflow would wrap the value to 2 ^ 256 - 1\n unchecked {\n // we now have one sig on actual digest\n numSigsOnActualDigest -= 1;\n }\n } else {\n digest = minimalDigest;\n }\n\n // sigType == 0 is the contract signature case\n if (sigType == 0) {\n // first32Bytes contains the address to perform 1271 validation on\n address contractAddress = address(uint160(uint256(first32Bytes)));\n // make sure upper bits are clean\n if (uint256(first32Bytes) > uint256(uint160(contractAddress))) {\n revert InvalidAddress();\n }\n currentOwner = contractAddress.toBytes30();\n if (ownerDataPerAccount[currentOwner][account].addr != contractAddress) {\n if (success) {\n firstFailure = signatureCount;\n success = false;\n }\n }\n // retrieve contract signature\n bytes memory contractSignature;\n {\n // offset of current signature dynamic part\n // second32Bytes is the memory offset containing the signature\n uint256 sigDynamicPartOffset = uint256(second32Bytes);\n if (\n sigDynamicPartOffset > signatures.length\n || sigDynamicPartOffset < _INDIVIDUAL_SIGNATURE_BYTES_LEN\n ) {\n revert InvalidSigOffset();\n }\n // total length of current signature dynamic part\n uint256 sigDynamicPartTotalLen;\n // 1. load contractSignature content starting from the correct memory offset\n // 2. calculate total length including the content and the prefix storing the length\n assembly (\"memory-safe\") {\n contractSignature := add(add(signatures, sigDynamicPartOffset), 0x20)\n sigDynamicPartTotalLen := add(mload(contractSignature), 0x20)\n }\n // signature dynamic part should not exceed the total signature length\n if (sigDynamicPartOffset + sigDynamicPartTotalLen > signatures.length) {\n revert InvalidContractSigLength();\n }\n if (sigDynamicPartOffset < lowestSigDynamicPartOffset || lowestSigDynamicPartOffset == 0) {\n lowestSigDynamicPartOffset = sigDynamicPartOffset;\n }\n }\n if (!SignatureChecker.isValidERC1271SignatureNow(contractAddress, digest, contractSignature)) {\n if (success) {\n firstFailure = signatureCount;\n success = false;\n }\n }\n } else if (sigType == 2) {\n // secp256r1 sig, webauthn and public key data bytes\n bytes memory sigDynamicPartBytes;\n // first32Bytes stores public key on-chain identifier\n currentOwner = bytes30(uint240(uint256(first32Bytes)));\n OwnerData memory currentOwnerData = ownerDataPerAccount[currentOwner][account];\n uint256 x = currentOwnerData.publicKeyX;\n uint256 y = currentOwnerData.publicKeyY;\n // retrieve sig dynamic part bytes\n WebAuthnSigDynamicPart memory sigDynamicPart;\n {\n // second32Bytes is the memory offset containing the sigDynamicPart\n uint256 sigDynamicPartOffset = uint256(second32Bytes);\n if (\n sigDynamicPartOffset > signatures.length\n || sigDynamicPartOffset < _INDIVIDUAL_SIGNATURE_BYTES_LEN\n ) {\n revert InvalidSigOffset();\n }\n uint256 sigDynamicPartTotalLen;\n // 1. load the content starting from the correct memory offset\n // 2. calculate total length including the content and the prefix storing the length\n assembly (\"memory-safe\") {\n sigDynamicPartBytes := add(add(signatures, sigDynamicPartOffset), 0x20)\n sigDynamicPartTotalLen := add(mload(sigDynamicPartBytes), 0x20)\n }\n if (sigDynamicPartOffset + sigDynamicPartTotalLen > signatures.length) {\n revert InvalidSigLength();\n }\n if (sigDynamicPartOffset < lowestSigDynamicPartOffset || lowestSigDynamicPartOffset == 0) {\n lowestSigDynamicPartOffset = sigDynamicPartOffset;\n }\n sigDynamicPart = abi.decode(sigDynamicPartBytes, (WebAuthnSigDynamicPart));\n }\n if (\n !WebAuthnLib.verify({\n challenge: abi.encode(digest),\n webAuthnData: sigDynamicPart.webAuthnData,\n r: sigDynamicPart.r,\n s: sigDynamicPart.s,\n x: x,\n y: y\n })\n ) {\n if (success) {\n firstFailure = signatureCount;\n success = false;\n }\n }\n } else {\n // reverts if signature has the wrong s value, wrong v value, or if it's a bad point on the k1 curve\n address signer = digest.recover(sigType, first32Bytes, second32Bytes);\n currentOwner = signer.toBytes30();\n if (ownerDataPerAccount[currentOwner][account].addr != signer) {\n if (success) {\n firstFailure = signatureCount;\n success = false;\n }\n }\n }\n\n if (\n // if the signature is out of order or duplicate\n // or is not an owner\n currentOwner <= lastOwner || !_owners.contains(account, SetValue.wrap(currentOwner))\n ) {\n if (success) {\n firstFailure = signatureCount;\n success = false;\n }\n }\n\n accumulatedWeight += ownerDataPerAccount[currentOwner][account].weight;\n lastOwner = currentOwner;\n signatureCount++;\n }\n\n // if we need a signature on the actual digest, and we didn't get exactly one, revert\n // we avoid reverting early to facilitate fee estimation\n if (numSigsOnActualDigest != 0) {\n revert InvalidNumSigsOnActualDigest(numSigsOnActualDigest);\n }\n return (success, firstFailure);\n }\n\n /// @inheritdoc BaseERC712CompliantModule\n function _getModuleTypeHash() internal pure override returns (bytes32) {\n return _MULTISIG_PLUGIN_TYPEHASH;\n }\n\n /// @inheritdoc BaseERC712CompliantModule\n function _getModuleIdHash() internal pure override returns (bytes32) {\n return keccak256(abi.encodePacked(_NAME, PLUGIN_VERSION_1));\n }\n}\n"},"src/common/Constants.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\n// ERC4337 constants\n\n// return value in case of signature failure, with no time-range.\n// equivalent to _packValidationData(true,0,0);\nuint256 constant SIG_VALIDATION_FAILED = 1;\nuint256 constant SIG_VALIDATION_SUCCEEDED = 0;\n\n// sentinel values\n// any values less than or equal to this will not be allowed in storage\nbytes21 constant SENTINEL_BYTES21 = bytes21(0);\nbytes23 constant SENTINEL_BYTES23 = bytes23(0);\nbytes4 constant SENTINEL_BYTES4 = bytes4(0);\nbytes32 constant SENTINEL_BYTES32 = bytes32(0);\n\n// empty or unset function reference\n// we don't store the empty function reference\nbytes21 constant EMPTY_FUNCTION_REFERENCE = bytes21(0);\n\n// wallet constants\nstring constant WALLET_AUTHOR = \"Circle Internet Financial\";\nstring constant WALLET_VERSION_1 = \"1.0.0\";\n\n// plugin constants\nstring constant PLUGIN_AUTHOR = \"Circle Internet Financial\";\nstring constant PLUGIN_VERSION_1 = \"1.0.0\";\n\n// bytes4(keccak256(\"isValidSignature(bytes32,bytes)\")\nbytes4 constant EIP1271_VALID_SIGNATURE = 0x1626ba7e;\nbytes4 constant EIP1271_INVALID_SIGNATURE = 0xffffffff;\n\n// keccak256('')\nbytes32 constant EMPTY_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;\n\nuint256 constant ZERO = 0;\n\nbytes32 constant ZERO_BYTES32 = bytes32(0);\nbytes24 constant EMPTY_MODULE_ENTITY = bytes24(0);\n"},"src/msca/6900/v0.7/account/BaseMSCA.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {\n EMPTY_FUNCTION_REFERENCE,\n SENTINEL_BYTES21,\n WALLET_AUTHOR,\n WALLET_VERSION_1\n} from \"../../../../common/Constants.sol\";\nimport {ExecutionUtils} from \"../../../../utils/ExecutionUtils.sol\";\nimport {\n InvalidAuthorizer,\n InvalidExecutionFunction,\n InvalidValidationFunctionId,\n NotFoundSelector,\n UnauthorizedCaller\n} from \"../../shared/common/Errors.sol\";\nimport {AddressDLL, ValidationData} from \"../../shared/common/Structs.sol\";\nimport {AddressDLLLib} from \"../../shared/libs/AddressDLLLib.sol\";\nimport {ValidationDataLib} from \"../../shared/libs/ValidationDataLib.sol\";\nimport {\n PRE_HOOK_ALWAYS_DENY_FUNCTION_REFERENCE,\n RUNTIME_VALIDATION_ALWAYS_ALLOW_FUNCTION_REFERENCE\n} from \"../common/Constants.sol\";\nimport \"../common/Structs.sol\";\nimport {IAccountLoupe} from \"../interfaces/IAccountLoupe.sol\";\nimport {IPlugin} from \"../interfaces/IPlugin.sol\";\nimport {IPluginExecutor} from \"../interfaces/IPluginExecutor.sol\";\nimport {IPluginManager} from \"../interfaces/IPluginManager.sol\";\nimport {IStandardExecutor} from \"../interfaces/IStandardExecutor.sol\";\nimport {ExecutionHookLib} from \"../libs/ExecutionHookLib.sol\";\nimport {FunctionReferenceLib} from \"../libs/FunctionReferenceLib.sol\";\nimport {RepeatableFunctionReferenceDLLLib} from \"../libs/RepeatableFunctionReferenceDLLLib.sol\";\n\nimport {SelectorRegistryLib} from \"../libs/SelectorRegistryLib.sol\";\nimport {WalletStorageV1Lib} from \"../libs/WalletStorageV1Lib.sol\";\nimport {PluginExecutor} from \"../managers/PluginExecutor.sol\";\nimport {PluginManager} from \"../managers/PluginManager.sol\";\nimport {StandardExecutor} from \"../managers/StandardExecutor.sol\";\n\nimport {WalletStorageInitializable} from \"./WalletStorageInitializable.sol\";\nimport {IEntryPoint} from \"@account-abstraction/contracts/interfaces/IEntryPoint.sol\";\nimport {PackedUserOperation} from \"@account-abstraction/contracts/interfaces/PackedUserOperation.sol\";\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\n/**\n * @dev Base MSCA implementation with **authentication**.\n * This contract provides the basic logic for implementing the MSCA interfaces;\n * specific account implementation should inherit this contract.\n */\nabstract contract BaseMSCA is\n WalletStorageInitializable,\n IPluginManager,\n IAccountLoupe,\n IStandardExecutor,\n IPluginExecutor,\n IERC165\n{\n using RepeatableFunctionReferenceDLLLib for RepeatableBytes21DLL;\n using FunctionReferenceLib for bytes21;\n using FunctionReferenceLib for FunctionReference;\n using ExecutionHookLib for HookGroup;\n using ExecutionHookLib for PostExecHookToRun[];\n using ExecutionUtils for address;\n using PluginExecutor for bytes;\n using StandardExecutor for address;\n using StandardExecutor for Call[];\n using AddressDLLLib for AddressDLL;\n using ValidationDataLib for ValidationData;\n using SelectorRegistryLib for bytes4;\n\n string public constant author = WALLET_AUTHOR;\n string public constant version = WALLET_VERSION_1;\n // 4337 related immutable storage\n IEntryPoint public immutable entryPoint;\n PluginManager public immutable pluginManager;\n\n error NotNativeFunctionSelector(bytes4 selector);\n error InvalidHookFunctionId(uint8 functionId);\n error PreRuntimeValidationHookFailed(address plugin, uint8 functionId, bytes revertReason);\n error RuntimeValidationFailed(address plugin, uint8 functionId, bytes revertReason);\n\n /**\n * @dev Wraps execution of a native function (as opposed to a function added by plugins) with runtime validations\n * (not from EP)\n * and hooks. Used by execute, executeBatch, installPlugin, uninstallPlugin, upgradeTo and upgradeToAndCall.\n * If the call is from entry point, then validateUserOp will run.\n * https://eips.ethereum.org/assets/eip-6900/Modular_Account_Call_Flow.svg\n */\n modifier validateNativeFunction() {\n PostExecHookToRun[] memory postExecHooks = _processPreExecHooks();\n _;\n postExecHooks._processPostExecHooks();\n }\n\n /**\n * @dev This function allows entry point or SA itself to execute certain actions.\n * If the caller is not authorized, the function will revert with an error message.\n */\n modifier onlyFromEntryPointOrSelf() {\n _checkAccessRuleFromEPOrAcctItself();\n _;\n }\n\n constructor(IEntryPoint _newEntryPoint, PluginManager _newPluginManager) {\n entryPoint = _newEntryPoint;\n pluginManager = _newPluginManager;\n // lock the implementation contract so it can only be called from proxies\n _disableWalletStorageInitializers();\n }\n\n receive() external payable {}\n\n /// @notice Manage fallback calls made to the plugins.\n /// @dev Route calls to execution functions based on incoming msg.sig\n /// If there's no plugin associated with this function selector, revert\n fallback(bytes calldata) external payable returns (bytes memory result) {\n // run runtime validation before we load the executionDetail because validation may update account state\n if (msg.sender != address(entryPoint)) {\n // entryPoint should go through validateUserOp flow which calls userOpValidationFunction\n _processPreRuntimeHooksAndValidation(msg.sig);\n }\n // load the executionDetail before we run the preExecHooks because they may modify the plugins\n ExecutionDetail storage executionDetail = WalletStorageV1Lib.getLayout().executionDetails[msg.sig];\n address executionFunctionPlugin = executionDetail.plugin;\n // valid plugin address should not be 0\n if (executionFunctionPlugin == address(0)) {\n revert InvalidExecutionFunction(msg.sig);\n }\n PostExecHookToRun[] memory postExecHooks = executionDetail.executionHooks._processPreExecHooks(msg.data);\n result = ExecutionUtils.callWithReturnDataOrRevert(executionFunctionPlugin, msg.value, msg.data);\n postExecHooks._processPostExecHooks();\n return result;\n }\n\n /**\n * @dev Return the entryPoint used by this account.\n * subclass should return the current entryPoint used by this account.\n */\n function getEntryPoint() external view returns (IEntryPoint) {\n return entryPoint;\n }\n\n /**\n * @dev Validate user's signature and nonce.\n * subclass doesn't need to override this method. Instead, it should override the specific internal validation\n * methods.\n */\n function validateUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds)\n external\n virtual\n returns (uint256 validationData)\n {\n if (msg.sender != address(entryPoint)) {\n revert UnauthorizedCaller();\n }\n validationData = _authenticateAndAuthorizeUserOp(userOp, userOpHash);\n if (missingAccountFunds != 0) {\n (bool success,) = payable(msg.sender).call{value: missingAccountFunds, gas: type(uint256).max}(\"\");\n (success);\n // ignore failure (its EntryPoint's job to verify, not account.)\n }\n }\n\n /// @notice ERC165 introspection https://eips.ethereum.org/EIPS/eip-165\n /// @dev returns true for `IERC165.interfaceId` and false for `0xFFFFFFFF`\n /// @param interfaceId interface id to check against\n /// @return bool support for specific interface\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n if (interfaceId == 0xffffffff) {\n return false;\n }\n if (interfaceId == type(IERC165).interfaceId) {\n return true;\n }\n return WalletStorageV1Lib.getLayout().supportedInterfaces[interfaceId] > 0;\n }\n\n /**\n * @dev Return the account nonce.\n * This method returns the next sequential nonce.\n * For a nonce of a specific key, use `entrypoint.getNonce(account, key)`\n */\n function getNonce() public view virtual returns (uint256) {\n return entryPoint.getNonce(address(this), 0);\n }\n\n function installPlugin(\n address plugin,\n bytes32 manifestHash,\n bytes memory pluginInstallData,\n FunctionReference[] memory dependencies\n ) external override validateNativeFunction {\n bytes memory data = abi.encodeCall(\n PluginManager.install, (plugin, manifestHash, pluginInstallData, dependencies, address(this))\n );\n address(pluginManager).delegateCall(data);\n emit PluginInstalled(plugin, manifestHash, dependencies);\n }\n\n function uninstallPlugin(address plugin, bytes memory config, bytes memory pluginUninstallData)\n external\n override\n validateNativeFunction\n {\n bytes memory data = abi.encodeCall(PluginManager.uninstall, (plugin, config, pluginUninstallData));\n address(pluginManager).delegateCall(data);\n emit PluginUninstalled(plugin, true);\n }\n\n function execute(address target, uint256 value, bytes calldata data)\n external\n payable\n override\n validateNativeFunction\n returns (bytes memory returnData)\n {\n return target.execute(value, data);\n }\n\n function executeBatch(Call[] calldata calls)\n external\n payable\n override\n validateNativeFunction\n returns (bytes[] memory returnData)\n {\n return calls.executeBatch();\n }\n\n function executeFromPlugin(bytes calldata data) external payable override returns (bytes memory) {\n return data.executeFromPlugin();\n }\n\n function executeFromPluginExternal(address target, uint256 value, bytes calldata data)\n external\n payable\n override\n returns (bytes memory)\n {\n return data.executeFromPluginToExternal(target, value);\n }\n\n /// @notice Gets the validation functions and plugin address for a selector\n /// @dev If the selector is a native function, the plugin address will be the address of the account\n /// @param selector The selector to get the configuration for\n /// @return executionFunctionConfig The configuration for this selector\n function getExecutionFunctionConfig(bytes4 selector)\n external\n view\n returns (ExecutionFunctionConfig memory executionFunctionConfig)\n {\n WalletStorageV1Lib.Layout storage walletStorage = WalletStorageV1Lib.getLayout();\n if (selector._isNativeFunctionSelector()) {\n executionFunctionConfig.plugin = address(this);\n } else {\n executionFunctionConfig.plugin = walletStorage.executionDetails[selector].plugin;\n }\n executionFunctionConfig.userOpValidationFunction =\n walletStorage.executionDetails[selector].userOpValidationFunction;\n executionFunctionConfig.runtimeValidationFunction =\n walletStorage.executionDetails[selector].runtimeValidationFunction;\n return executionFunctionConfig;\n }\n\n /// @notice Gets the pre and post execution hooks for a selector\n /// @param selector The selector to get the hooks for\n /// @return executionHooks The pre and post execution hooks for this selector\n function getExecutionHooks(bytes4 selector) external view returns (ExecutionHooks[] memory executionHooks) {\n return WalletStorageV1Lib.getLayout().executionDetails[selector].executionHooks._getExecutionHooks();\n }\n\n /// @notice Gets the pre user op and runtime validation hooks associated with a selector\n /// @param selector The selector to get the hooks for\n /// @return preUserOpValidationHooks The pre user op validation hooks for this selector\n /// @return preRuntimeValidationHooks The pre runtime validation hooks for this selector\n function getPreValidationHooks(bytes4 selector)\n external\n view\n returns (\n FunctionReference[] memory preUserOpValidationHooks,\n FunctionReference[] memory preRuntimeValidationHooks\n )\n {\n preUserOpValidationHooks =\n WalletStorageV1Lib.getLayout().executionDetails[selector].preUserOpValidationHooks.getAll();\n preRuntimeValidationHooks =\n WalletStorageV1Lib.getLayout().executionDetails[selector].preRuntimeValidationHooks.getAll();\n return (preUserOpValidationHooks, preRuntimeValidationHooks);\n }\n\n /// @notice Gets an array of all installed plugins\n /// @return pluginAddresses The addresses of all installed plugins\n function getInstalledPlugins() external view returns (address[] memory pluginAddresses) {\n return WalletStorageV1Lib.getLayout().installedPlugins.getAll();\n }\n\n /**\n * Check current account deposit in the entryPoint.\n */\n function getDeposit() public view returns (uint256) {\n return entryPoint.balanceOf(address(this));\n }\n\n /**\n * Deposit more funds for this account in the entryPoint.\n */\n function addDeposit() public payable {\n entryPoint.depositTo{value: msg.value}(address(this));\n }\n\n /**\n * Withdraw value from the account's deposit.\n * @param withdrawAddress target to send to\n * @param amount to withdraw\n */\n function withdrawDepositTo(address payable withdrawAddress, uint256 amount) public onlyFromEntryPointOrSelf {\n entryPoint.withdrawTo(withdrawAddress, amount);\n }\n\n /**\n * @dev Authenticate and authorize this userOp. OnlyFromEntryPoint is applied in the caller.\n * @param userOp validate the userOp.signature field\n * @param userOpHash convenient field: the hash of the request, to check the signature against\n * (also hashes the entrypoint and chain id)\n * @return validationData signature and time-range of this operation\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * otherwise, an address of an \"authorizer\" contract.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * If the account doesn't use time-range, it is enough to return SIG_VALIDATION_FAILED value (1) for signature\n * failure.\n * Note that the validation code cannot use block.timestamp (or block.number) directly due to the storage rule.\n */\n function _authenticateAndAuthorizeUserOp(PackedUserOperation calldata userOp, bytes32 userOpHash)\n internal\n virtual\n returns (uint256 validationData)\n {\n // onlyFromEntryPoint is applied in the caller\n // if there is no function defined for the selector, or if userOp.callData.length < 4, then execution MUST\n // revert\n if (userOp.callData.length < 4) {\n revert NotFoundSelector();\n }\n bytes4 selector = bytes4(userOp.callData[0:4]);\n if (selector == bytes4(0)) {\n revert NotFoundSelector();\n }\n ExecutionDetail storage executionDetail = WalletStorageV1Lib.getLayout().executionDetails[selector];\n FunctionReference memory validationFunction = executionDetail.userOpValidationFunction;\n bytes21 packedValidationFunction = validationFunction.pack();\n if (\n packedValidationFunction == EMPTY_FUNCTION_REFERENCE\n || packedValidationFunction == RUNTIME_VALIDATION_ALWAYS_ALLOW_FUNCTION_REFERENCE\n || packedValidationFunction == PRE_HOOK_ALWAYS_DENY_FUNCTION_REFERENCE\n ) {\n revert InvalidValidationFunctionId(validationFunction.functionId);\n }\n // pre hook\n ValidationData memory unpackedValidationData =\n _processPreUserOpValidationHooks(executionDetail, userOp, userOpHash);\n IPlugin userOpValidatorPlugin = IPlugin(validationFunction.plugin);\n // execute the validation function with the user operation and its hash as parameters using the call opcode\n uint256 currentValidationData = userOpValidatorPlugin.userOpValidationFunction(\n executionDetail.userOpValidationFunction.functionId, userOp, userOpHash\n );\n // intercept with validation function call\n unpackedValidationData = unpackedValidationData._intersectValidationData(currentValidationData);\n if (unpackedValidationData.authorizer != address(0) && unpackedValidationData.authorizer != address(1)) {\n // only revert on unexpected values\n revert InvalidAuthorizer();\n }\n validationData = unpackedValidationData._packValidationData();\n }\n\n /**\n * @dev Default validation logic is from installed plugins. However, you can override this validation logic in MSCA\n * implementations. For instance, semi MSCA such as single owner semi MSCA may want to honor the validation\n * from native owner.\n */\n function _processPreRuntimeHooksAndValidation(bytes4 selector) internal virtual {\n FunctionReference memory validationFunction =\n WalletStorageV1Lib.getLayout().executionDetails[selector].runtimeValidationFunction;\n bytes21 packedValidationFunction = validationFunction.pack();\n if (\n packedValidationFunction == EMPTY_FUNCTION_REFERENCE\n || packedValidationFunction == PRE_HOOK_ALWAYS_DENY_FUNCTION_REFERENCE\n ) {\n revert InvalidValidationFunctionId(validationFunction.functionId);\n }\n RepeatableBytes21DLL storage preRuntimeValidationHooksDLL =\n WalletStorageV1Lib.getLayout().executionDetails[selector].preRuntimeValidationHooks;\n uint256 totalUniqueHookCount = preRuntimeValidationHooksDLL.getUniqueItems();\n FunctionReference memory startHook = EMPTY_FUNCTION_REFERENCE.unpack();\n FunctionReference[] memory preRuntimeValidationHooks;\n FunctionReference memory nextHook;\n for (uint256 i = 0; i < totalUniqueHookCount; ++i) {\n (preRuntimeValidationHooks, nextHook) = preRuntimeValidationHooksDLL.getPaginated(startHook, 10);\n for (uint256 j = 0; j < preRuntimeValidationHooks.length; ++j) {\n // revert on EMPTY_FUNCTION_REFERENCE, RUNTIME_VALIDATION_ALWAYS_ALLOW_FUNCTION_REFERENCE,\n // PRE_HOOK_ALWAYS_DENY_FUNCTION_REFERENCE\n // if any revert, the outer call MUST revert\n bytes21 packedPreRuntimeValidationHook = preRuntimeValidationHooks[j].pack();\n if (\n packedPreRuntimeValidationHook == EMPTY_FUNCTION_REFERENCE\n || packedPreRuntimeValidationHook == RUNTIME_VALIDATION_ALWAYS_ALLOW_FUNCTION_REFERENCE\n || packedPreRuntimeValidationHook == PRE_HOOK_ALWAYS_DENY_FUNCTION_REFERENCE\n ) {\n revert InvalidValidationFunctionId(preRuntimeValidationHooks[j].functionId);\n }\n IPlugin preRuntimeValidationHookPlugin = IPlugin(preRuntimeValidationHooks[j].plugin);\n try preRuntimeValidationHookPlugin.preRuntimeValidationHook(\n preRuntimeValidationHooks[j].functionId, msg.sender, msg.value, msg.data\n ) {} catch (bytes memory revertReason) {\n revert PreRuntimeValidationHookFailed(\n preRuntimeValidationHooks[j].plugin, preRuntimeValidationHooks[j].functionId, revertReason\n );\n }\n }\n if (nextHook.pack() == SENTINEL_BYTES21) {\n break;\n }\n startHook = nextHook;\n }\n // call runtimeValidationFunction if it's not always allowed\n if (packedValidationFunction != RUNTIME_VALIDATION_ALWAYS_ALLOW_FUNCTION_REFERENCE) {\n try IPlugin(validationFunction.plugin).runtimeValidationFunction(\n validationFunction.functionId, msg.sender, msg.value, msg.data\n ) {} catch (bytes memory revertReason) {\n revert RuntimeValidationFailed(validationFunction.plugin, validationFunction.functionId, revertReason);\n }\n }\n }\n\n /// @dev Also runs runtime hooks and validation if msg.sender is not from entry point.\n function _processPreExecHooks() internal returns (PostExecHookToRun[] memory) {\n if (!msg.sig._isNativeFunctionSelector()) {\n revert NotNativeFunctionSelector(msg.sig);\n }\n if (msg.sender != address(entryPoint)) {\n // entryPoint should go through validateUserOp flow which calls userOpValidationFunction\n _processPreRuntimeHooksAndValidation(msg.sig);\n }\n return WalletStorageV1Lib.getLayout().executionDetails[msg.sig].executionHooks._processPreExecHooks(msg.data);\n }\n\n function _processPreUserOpValidationHooks(\n ExecutionDetail storage executionDetail,\n PackedUserOperation calldata userOp,\n bytes32 userOpHash\n ) internal virtual returns (ValidationData memory unpackedValidationData) {\n unpackedValidationData = ValidationData(0, 0xFFFFFFFFFFFF, address(0));\n // if the function selector has associated pre user operation validation hooks, then those hooks MUST be run\n // sequentially\n uint256 totalUniqueHookCount = executionDetail.preUserOpValidationHooks.getUniqueItems();\n FunctionReference memory startHook = EMPTY_FUNCTION_REFERENCE.unpack();\n FunctionReference[] memory preUserOpValidatorHooks;\n FunctionReference memory nextHook;\n uint256 currentValidationData;\n for (uint256 i = 0; i < totalUniqueHookCount; ++i) {\n (preUserOpValidatorHooks, nextHook) = executionDetail.preUserOpValidationHooks.getPaginated(startHook, 10);\n for (uint256 j = 0; j < preUserOpValidatorHooks.length; ++j) {\n bytes21 packedUserOpValidatorHook = preUserOpValidatorHooks[j].pack();\n // if any revert, the outer call MUST revert\n if (\n packedUserOpValidatorHook == EMPTY_FUNCTION_REFERENCE\n || packedUserOpValidatorHook == RUNTIME_VALIDATION_ALWAYS_ALLOW_FUNCTION_REFERENCE\n || packedUserOpValidatorHook == PRE_HOOK_ALWAYS_DENY_FUNCTION_REFERENCE\n ) {\n revert InvalidHookFunctionId(preUserOpValidatorHooks[j].functionId);\n }\n IPlugin preUserOpValidationHookPlugin = IPlugin(preUserOpValidatorHooks[j].plugin);\n currentValidationData = preUserOpValidationHookPlugin.preUserOpValidationHook(\n preUserOpValidatorHooks[j].functionId, userOp, userOpHash\n );\n unpackedValidationData = unpackedValidationData._intersectValidationData(currentValidationData);\n // if any return an authorizer value other than 0 or 1, execution MUST revert\n if (unpackedValidationData.authorizer != address(0) && unpackedValidationData.authorizer != address(1))\n {\n revert InvalidAuthorizer();\n }\n }\n if (nextHook.pack() == SENTINEL_BYTES21) {\n break;\n }\n startHook = nextHook;\n }\n return unpackedValidationData;\n }\n\n function _checkAccessRuleFromEPOrAcctItself() internal view {\n if (msg.sender != address(entryPoint) && msg.sender != address(this)) {\n revert UnauthorizedCaller();\n }\n }\n}\n"},"src/msca/6900/v0.7/common/PluginManifest.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\n// Plugin Manifest\nenum ManifestAssociatedFunctionType {\n // Function is not defined.\n NONE,\n // Function belongs to this plugin.\n SELF,\n // Function belongs to an external plugin provided as a dependency during plugin installation.\n DEPENDENCY,\n // Resolves to a magic value to always bypass runtime validation for a given function.\n // This is only assignable on runtime validation functions. If it were to be used on a user op validation function,\n // it would risk burning gas from the account. When used as a hook in any hook location, it is equivalent to not\n // setting a hook and is therefore disallowed.\n RUNTIME_VALIDATION_ALWAYS_ALLOW,\n // Resolves to a magic value to always fail in a hook for a given function.\n // This is only assignable to pre hooks (pre validation and pre execution). It should not be used on\n // validation functions themselves, because this is equivalent to leaving the validation functions unset.\n // It should not be used in post-exec hooks, because if it is known to always revert, that should happen\n // as early as possible to save gas.\n PRE_HOOK_ALWAYS_DENY\n}\n\n/// @dev For functions of type `ManifestAssociatedFunctionType.DEPENDENCY`, the MSCA MUST find the plugin address\n/// of the function at `dependencies[dependencyIndex]` during the call to `installPlugin(config)`.\nstruct ManifestFunction {\n ManifestAssociatedFunctionType functionType;\n uint8 functionId;\n uint256 dependencyIndex;\n}\n\nstruct ManifestAssociatedFunction {\n bytes4 executionSelector;\n ManifestFunction associatedFunction;\n}\n\nstruct ManifestExecutionHook {\n bytes4 selector;\n ManifestFunction preExecHook;\n ManifestFunction postExecHook;\n}\n\nstruct ManifestExternalCallPermission {\n address externalAddress;\n bool permitAnySelector;\n bytes4[] selectors;\n}\n\nstruct SelectorPermission {\n bytes4 functionSelector;\n string permissionDescription;\n}\n\n/// @dev A struct holding fields to describe the plugin in a purely view context. Intended for front end clients.\nstruct PluginMetadata {\n // A human-readable name of the plugin.\n string name;\n // The version of the plugin, following the semantic versioning scheme.\n string version;\n // The author field SHOULD be a username representing the identity of the user or organization\n // that created this plugin.\n string author;\n // String descriptions of the relative sensitivity of specific functions. The selectors MUST be selectors for\n // functions implemented by this plugin.\n SelectorPermission[] permissionDescriptors;\n}\n\n/// @dev A struct describing how the plugin should be installed on a modular account.\nstruct PluginManifest {\n // List of ERC-165 interface IDs to add to account to support introspection checks. This MUST NOT include\n // IPlugin's interface ID.\n bytes4[] interfaceIds;\n // If this plugin depends on other plugins' validation functions, the interface IDs of those plugins MUST be\n // provided here, with its position in the array matching the `dependencyIndex` members of `ManifestFunction`\n bytes4[] dependencyInterfaceIds;\n // Execution functions defined in this plugin to be installed on the MSCA.\n bytes4[] executionFunctions;\n // Plugin execution functions already installed on the MSCA that this plugin will be able to call.\n bytes4[] permittedExecutionSelectors;\n // Boolean to indicate whether the plugin can call any external address.\n bool permitAnyExternalAddress;\n // Boolean to indicate whether the plugin needs access to spend native tokens of the account. If false, the\n // plugin MUST still be able to spend up to the balance that it sends to the account in the same call.\n bool canSpendNativeToken;\n // More granular control\n ManifestExternalCallPermission[] permittedExternalCalls;\n ManifestAssociatedFunction[] userOpValidationFunctions;\n ManifestAssociatedFunction[] runtimeValidationFunctions;\n ManifestAssociatedFunction[] preUserOpValidationHooks;\n ManifestAssociatedFunction[] preRuntimeValidationHooks;\n // for executionFunctions\n ManifestExecutionHook[] executionHooks;\n}\n"},"src/msca/6900/v0.7/plugins/v1_0_0/multisig/BaseWeightedMultisigPlugin.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\npragma solidity 0.8.24;\n\nimport {CredentialType, OwnerData, OwnershipMetadata, PublicKey} from \"../../../../../../common/CommonStructs.sol\";\n\nimport {AddressBytesLib} from \"../../../../../../libs/AddressBytesLib.sol\";\nimport {PublicKeyLib} from \"../../../../../../libs/PublicKeyLib.sol\";\nimport {SetValueLib} from \"../../../../../../libs/SetValueLib.sol\";\nimport {NotImplemented} from \"../../../../shared/common/Errors.sol\";\nimport {BasePlugin} from \"../../BasePlugin.sol\";\nimport {BaseMultisigPlugin} from \"./BaseMultisigPlugin.sol\";\nimport {IWeightedMultisigPlugin} from \"./IWeightedMultisigPlugin.sol\";\n\nimport {\n AssociatedLinkedListSet,\n AssociatedLinkedListSetLib\n} from \"@modular-account-libs/libraries/AssociatedLinkedListSetLib.sol\";\nimport {SetValue} from \"@modular-account-libs/libraries/Constants.sol\";\nimport {IERC1271} from \"@openzeppelin/contracts/interfaces/IERC1271.sol\";\n\n/// @title Base Weighted Multisig Plugin\n/// @author Circle\n/// @notice This plugin adds a weighted threshold ownership scheme to a ERC6900 smart contract account.\nabstract contract BaseWeightedMultisigPlugin is BaseMultisigPlugin, IWeightedMultisigPlugin, IERC1271 {\n using AssociatedLinkedListSetLib for AssociatedLinkedListSet;\n using PublicKeyLib for PublicKey;\n using SetValueLib for SetValue[];\n using AddressBytesLib for address;\n using AddressBytesLib for address[];\n\n // Mapping of owner identifier => associated account => weight\n // ownerDataPerAccount[hash][account] is in account associated storage\n mapping(bytes30 => mapping(address => OwnerData)) public ownerDataPerAccount;\n\n /// Mapping of associated account => OwnershipMetadata\n mapping(address => OwnershipMetadata) internal _ownerMetadata;\n\n uint256 internal constant _MAX_OWNERS = 1000;\n uint256 internal constant _MAX_WEIGHT = 1000000;\n uint256 internal constant _INDIVIDUAL_SIGNATURE_BYTES_LEN = 65;\n bytes32 internal constant _TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)\");\n // reference:\n // https://github.com/ethereum/EIPs/blob/30fec793f3cb6769cb44d2d0daa5238451f67c48/EIPS/eip-712.md#specification\n bytes2 internal constant EIP712_PREFIX = \"\\x19\\x01\";\n\n constructor(address entryPoint) BaseMultisigPlugin(entryPoint) {}\n\n // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n // ┃ Execution functions ┃\n // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n function addOwners(\n address[] calldata ownersToAdd,\n uint256[] calldata weightsToAdd,\n PublicKey[] calldata publicKeyOwnersToAdd,\n uint256[] calldata pubicKeyWeightsToAdd,\n uint256 newThresholdWeight\n ) external virtual {\n (ownersToAdd, weightsToAdd, publicKeyOwnersToAdd, pubicKeyWeightsToAdd, newThresholdWeight);\n revert NotImplemented(msg.sig, 0);\n }\n\n function removeOwners(\n address[] calldata ownersToRemove,\n PublicKey[] calldata publicKeyOwnersToRemove,\n uint256 newThresholdWeight\n ) external virtual {\n (ownersToRemove, publicKeyOwnersToRemove, newThresholdWeight);\n revert NotImplemented(msg.sig, 0);\n }\n\n function updateMultisigWeights(\n address[] calldata ownersToUpdate,\n uint256[] calldata newWeightsToUpdate,\n PublicKey[] calldata publicKeyOwnersToUpdate,\n uint256[] calldata pubicKeyNewWeightsToUpdate,\n uint256 newThresholdWeight\n ) external virtual {\n (ownersToUpdate, newWeightsToUpdate, publicKeyOwnersToUpdate, pubicKeyNewWeightsToUpdate, newThresholdWeight);\n revert NotImplemented(msg.sig, 0);\n }\n\n // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n // ┃ Execution view functions ┃\n // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n /// @inheritdoc IERC1271\n function isValidSignature(bytes32 digest, bytes memory signature) external view virtual returns (bytes4);\n\n // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n // ┃ Plugin interface functions ┃\n // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n function onUninstall(bytes calldata) external override {\n bytes30[] memory _ownersToRemove = _owners.getAll(msg.sender).toBytes30Array();\n uint256 _oldThresholdWeight = _ownerMetadata[msg.sender].thresholdWeight;\n\n _owners.clear(msg.sender);\n _ownerMetadata[msg.sender] = OwnershipMetadata(0, 0, 0);\n uint256 _totalWeightRemoved = _deleteWeights(_ownersToRemove);\n\n emit OwnersRemoved(msg.sender, _ownersToRemove, _totalWeightRemoved);\n emit ThresholdUpdated(msg.sender, _oldThresholdWeight, 0);\n }\n\n // ┏━━━━━━━━━━━━━━━┓\n // ┃ EIP-165 ┃\n // ┗━━━━━━━━━━━━━━━┛\n\n /// @inheritdoc BasePlugin\n function supportsInterface(bytes4 interfaceId) public view override returns (bool) {\n return interfaceId == type(IWeightedMultisigPlugin).interfaceId || super.supportsInterface(interfaceId);\n }\n\n // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n // ┃ Plugin only view functions ┃\n // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n /// @inheritdoc IWeightedMultisigPlugin\n function getOwnerId(address ownerToCheck) external pure returns (bytes30) {\n return ownerToCheck.toBytes30();\n }\n\n /// @inheritdoc IWeightedMultisigPlugin\n function getOwnerId(PublicKey memory pubKeyOwnerToCheck) external pure returns (bytes30) {\n return pubKeyOwnerToCheck.toBytes30();\n }\n\n /// @inheritdoc IWeightedMultisigPlugin\n function isOwnerOf(address account, address ownerToCheck) external view returns (bool, OwnerData memory) {\n return _isOwnerOf(account, ownerToCheck.toBytes30());\n }\n\n /// @inheritdoc IWeightedMultisigPlugin\n function isOwnerOf(address account, PublicKey memory pubKeyOwnerToCheck)\n external\n view\n returns (bool, OwnerData memory)\n {\n return _isOwnerOf(account, pubKeyOwnerToCheck.toBytes30());\n }\n\n /// @inheritdoc IWeightedMultisigPlugin\n function ownershipInfoOf(address account)\n external\n view\n returns (\n bytes30[] memory ownerAddresses,\n OwnerData[] memory ownersData,\n OwnershipMetadata memory ownershipMetadata\n )\n {\n ownerAddresses = _owners.getAll(account).toBytes30Array();\n ownersData = _getOwnersData(ownerAddresses, account);\n\n return (ownerAddresses, ownersData, _ownerMetadata[account]);\n }\n\n /// @inheritdoc IWeightedMultisigPlugin\n function checkNSignatures(bytes32 actualDigest, bytes32 minimalDigest, address account, bytes memory signatures)\n public\n view\n virtual\n override(BaseMultisigPlugin, IWeightedMultisigPlugin)\n returns (bool success, uint256 firstFailure);\n\n // ┏━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n // ┃ Internal Functions ┃\n // ┗━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n function _addOwnersAndUpdateMultisigMetadata(\n bytes30[] memory ownersToAdd,\n OwnerData[] memory ownersDataToAdd,\n uint256 newThresholdWeight\n ) internal {\n // Add owners and weights\n OwnershipMetadata storage metadata = _ownerMetadata[msg.sender];\n (uint256 _numOwnersAdded, uint256 _totalWeightAdded) =\n _addOwners(ownersToAdd, ownersDataToAdd, metadata.numOwners);\n\n // Update metadata\n // Note: following two additions cannot overflow because we ensure max individual weight is 1,000,000 and max\n // number of owners is 1000.\n // But, we use default checked arithmetic for added safety.\n uint256 _newTotalWeight = metadata.totalWeight + _totalWeightAdded;\n metadata.numOwners = metadata.numOwners + _numOwnersAdded;\n metadata.totalWeight = _newTotalWeight;\n\n _validateAndOptionallySetThresholdWeight(newThresholdWeight, _newTotalWeight, metadata);\n\n // Emit events\n emit OwnersAdded(msg.sender, ownersToAdd, ownersDataToAdd);\n }\n\n function _removeOwners(bytes30[] memory ownersToRemove, uint256 newThresholdWeight) internal {\n uint256 toRemoveLen = ownersToRemove.length;\n\n if (toRemoveLen == 0) {\n revert ZeroOwnersInputNotAllowed();\n }\n\n // Setting number of owners to < 1 is disallowed while plugin installed\n OwnershipMetadata storage metadata = _ownerMetadata[msg.sender];\n uint256 _initialNumOwners = metadata.numOwners;\n if (_initialNumOwners <= toRemoveLen) {\n revert EmptyOwnersNotAllowed();\n }\n\n // Remove owners (and their corresponding weights)\n uint256 _totalWeightRemoved = _removeOwners(ownersToRemove);\n\n // Update metadata\n uint256 _initialTotalWeight = metadata.totalWeight;\n\n // Note: following two deletions cannot underflow because _initialTotalWeight must be >0,\n // as we have nonzero active owners (_initialNumOwners <= toRemoveLen),\n // and active owners have >= 0 weight. But, we use default checked arithmetic for added safety.\n metadata.numOwners = _initialNumOwners - toRemoveLen;\n uint256 _newTotalWeight = _initialTotalWeight - _totalWeightRemoved;\n metadata.totalWeight = _newTotalWeight;\n\n _validateAndOptionallySetThresholdWeight(newThresholdWeight, _newTotalWeight, metadata);\n\n // 4. Emit events\n emit OwnersRemoved(msg.sender, ownersToRemove, _totalWeightRemoved);\n }\n\n function _updateMultisigWeights(\n bytes30[] memory ownersToUpdate,\n OwnerData[] memory newOwnersData,\n uint256 newThresholdWeight\n ) internal {\n uint256 ownersToUpdateLen = ownersToUpdate.length;\n uint256 weightsToUpdateLen = newOwnersData.length;\n\n // If ownersToUpdate and newWeights are differing lengths, revert.\n // (If both are 0, just update threshold)\n if (ownersToUpdateLen != weightsToUpdateLen) {\n revert OwnersWeightsMismatch();\n }\n\n uint256 totalWeightAdditions = 0;\n uint256 totalWeightReductions = 0;\n\n if (ownersToUpdateLen > 0) {\n for (uint256 i = 0; i < ownersToUpdateLen; ++i) {\n // confirm the owner has a nonzero weight, else revert\n uint256 _ownerCurrentWeight = ownerDataPerAccount[ownersToUpdate[i]][msg.sender].weight;\n uint256 _newWeight = newOwnersData[i].weight;\n if (_ownerCurrentWeight == 0) {\n // setting owner weights for uninitialized owners via setMultisigWeights() is not allowed. Owners\n // must be added via addOwners().\n revert InvalidOwner(ownersToUpdate[i]);\n }\n if (_ownerCurrentWeight < _newWeight) {\n _setOwnerWeight(ownersToUpdate[i], newOwnersData[i].weight);\n totalWeightAdditions += (_newWeight - _ownerCurrentWeight);\n } else if (_ownerCurrentWeight > _newWeight) {\n _setOwnerWeight(ownersToUpdate[i], newOwnersData[i].weight);\n totalWeightReductions += (_ownerCurrentWeight - _newWeight);\n }\n }\n }\n\n // 2. Update metadata\n OwnershipMetadata storage metadata = _ownerMetadata[msg.sender];\n uint256 _initialTotalWeight = metadata.totalWeight;\n uint256 _newTotalWeight = _initialTotalWeight + totalWeightAdditions - totalWeightReductions;\n metadata.totalWeight = _newTotalWeight;\n\n _validateAndOptionallySetThresholdWeight(newThresholdWeight, _newTotalWeight, metadata);\n\n // 3. Emit events\n // (updateMultisigWeights permits updating threshold without updating individual owner weights.)\n if (ownersToUpdateLen > 0) {\n emit OwnersUpdated(msg.sender, ownersToUpdate, newOwnersData);\n }\n }\n\n /// @notice Adds owners, or reverts if any owner cannot be added.\n /// @dev constraints:\n /// - ownerToAdd must have nonzero length\n /// - ownersToAdd and ownerWeights length must be the same\n /// - current number of owners + length of ownersToAdd must not exceed max number of owners\n /// - each owner in ownersToAdd must not be address(0) or an existing owner\n /// - each owner in ownersToAdd must have a weight greater than 0 and less than 1,000.\n /// @param ownersToAdd owners to add for msg.sender account\n /// @param ownersData data of each corresponding owner\n /// @param currentNumOwners current number of owners\n function _addOwners(bytes30[] memory ownersToAdd, OwnerData[] memory ownersData, uint256 currentNumOwners)\n internal\n returns (uint256 numOwnersAdded, uint256 totalWeightAdded)\n {\n uint256 _numOwnersToAdd = ownersToAdd.length;\n uint256 _accumulateWeightToAdd = 0;\n\n if (_numOwnersToAdd == 0) {\n revert ZeroOwnersInputNotAllowed();\n }\n\n if (ownersData.length != _numOwnersToAdd) {\n revert OwnersWeightsMismatch();\n }\n\n if (currentNumOwners + _numOwnersToAdd > _MAX_OWNERS) {\n revert TooManyOwners(currentNumOwners, _numOwnersToAdd);\n }\n\n for (uint256 i = 0; i < _numOwnersToAdd; ++i) {\n if (!_owners.tryAdd(msg.sender, SetValue.wrap(ownersToAdd[i]))) {\n revert InvalidOwner(ownersToAdd[i]);\n }\n if (ownersData[i].weight == 0 || ownersData[i].weight > _MAX_WEIGHT) {\n revert InvalidWeight(ownersToAdd[i], msg.sender, ownersData[i].weight);\n }\n // store the ownerData\n ownerDataPerAccount[ownersToAdd[i]][msg.sender] = ownersData[i];\n _accumulateWeightToAdd += ownersData[i].weight;\n }\n\n return (_numOwnersToAdd, _accumulateWeightToAdd);\n }\n\n /// @dev Sets an owner weight, or reverts if the weight is invalid (0, or > 1000000.)\n /// @param owner signer for msg.sender account\n /// @param weight weight to set\n function _setOwnerWeight(bytes30 owner, uint256 weight) internal {\n if (weight == 0 || weight > _MAX_WEIGHT) {\n revert InvalidWeight(owner, msg.sender, weight);\n }\n ownerDataPerAccount[owner][msg.sender].weight = weight;\n }\n\n /// @dev remove owners and their corresponding weights.\n /// @param ownersToRemove owners to remove (must be current owner for account.)\n /// @return totalWeightRemoved total weight removed\n function _removeOwners(bytes30[] memory ownersToRemove) internal returns (uint256 totalWeightRemoved) {\n for (uint256 i = 0; i < ownersToRemove.length; ++i) {\n if (!_owners.tryRemove(msg.sender, SetValue.wrap(ownersToRemove[i]))) {\n revert OwnerDoesNotExist(ownersToRemove[i]);\n }\n totalWeightRemoved += ownerDataPerAccount[ownersToRemove[i]][msg.sender].weight;\n delete ownerDataPerAccount[ownersToRemove[i]][msg.sender];\n }\n }\n\n function _deleteWeights(bytes30[] memory _ownersToRemove) internal returns (uint256 _sumRemoved) {\n for (uint256 i = 0; i < _ownersToRemove.length; i++) {\n _sumRemoved += ownerDataPerAccount[_ownersToRemove[i]][msg.sender].weight;\n delete ownerDataPerAccount[_ownersToRemove[i]][msg.sender];\n }\n return _sumRemoved;\n }\n\n /// @notice Validates new threshold weight against new total weight.\n /// @dev This function assumes new total weight is > 0 as there is no way to set total weight to 0 while plugin is\n /// installed.\n /// @param newThresholdWeight new threshold weight. If zero, will attempt to leave unmodified. The new threshold\n /// weight,\n /// (or old threshold weight if _newThresholdWeight == 0), must be <= _newTotalWeight.\n /// @param newTotalWeight new total weight.\n /// @param metadata metadata to update\n function _validateAndOptionallySetThresholdWeight(\n uint256 newThresholdWeight,\n uint256 newTotalWeight,\n OwnershipMetadata storage metadata\n ) internal {\n uint256 _oldThresholdWeight = metadata.thresholdWeight;\n\n if (newThresholdWeight > 0) {\n if (newTotalWeight < newThresholdWeight) {\n revert ThresholdWeightExceedsTotalWeight(newThresholdWeight, newTotalWeight);\n }\n\n if (newThresholdWeight != _oldThresholdWeight) {\n metadata.thresholdWeight = newThresholdWeight;\n emit ThresholdUpdated(msg.sender, _oldThresholdWeight, newThresholdWeight);\n }\n } else {\n if (newTotalWeight < _oldThresholdWeight) {\n revert ThresholdWeightExceedsTotalWeight(_oldThresholdWeight, newTotalWeight);\n }\n }\n }\n\n function _onInstall(bytes30[] memory initialOwners, OwnerData[] memory ownersData, uint256 thresholdWeight)\n internal\n {\n if (thresholdWeight == 0) {\n revert InvalidThresholdWeight();\n }\n\n uint256 _totalWeight = _sum(ownersData);\n uint256 _oldThresholdWeight = 0;\n\n if (_totalWeight < thresholdWeight) {\n revert ThresholdWeightExceedsTotalWeight(_oldThresholdWeight, thresholdWeight);\n }\n\n uint256 _currentNumOwners = 0;\n _addOwners(initialOwners, ownersData, _currentNumOwners);\n\n _ownerMetadata[msg.sender] = OwnershipMetadata(initialOwners.length, thresholdWeight, _totalWeight);\n\n emit OwnersAdded(msg.sender, initialOwners, ownersData);\n emit ThresholdUpdated(msg.sender, _oldThresholdWeight, thresholdWeight);\n }\n\n function _isOwnerOf(address account, bytes30 ownerHash) internal view returns (bool, OwnerData memory ownerData) {\n if (_owners.contains(account, SetValue.wrap(ownerHash))) {\n return (true, ownerDataPerAccount[ownerHash][account]);\n } else {\n return (false, ownerData);\n }\n }\n\n function _mergeOwners(address[] memory owners, PublicKey[] memory publicKeyOwners)\n internal\n pure\n returns (bytes30[] memory totalOwners)\n {\n uint256 aLen = owners.length;\n uint256 bLen = publicKeyOwners.length;\n totalOwners = new bytes30[](aLen + bLen);\n uint256 index = 0;\n for (uint256 i = 0; i < aLen; ++i) {\n totalOwners[index] = owners[i].toBytes30();\n index++;\n }\n for (uint256 i = 0; i < bLen; ++i) {\n totalOwners[index] = publicKeyOwners[i].toBytes30();\n index++;\n }\n }\n\n function _mergeOwnersData(\n address[] memory owners,\n uint256[] memory weights,\n PublicKey[] memory publicKeyOwners,\n uint256[] memory pubicKeyWeights\n ) internal pure returns (bytes30[] memory totalOwners, OwnerData[] memory ownersData) {\n uint256 aLen = owners.length;\n uint256 bLen = publicKeyOwners.length;\n if (aLen != weights.length || bLen != pubicKeyWeights.length) {\n revert OwnersWeightsMismatch();\n }\n uint256 totalLen = aLen + bLen;\n totalOwners = new bytes30[](totalLen);\n ownersData = new OwnerData[](totalLen);\n uint256 index = 0;\n for (uint256 i = 0; i < aLen; ++i) {\n totalOwners[index] = owners[i].toBytes30();\n ownersData[index].weight = weights[i];\n ownersData[index].credType = CredentialType.ADDRESS;\n ownersData[index].addr = owners[i];\n index++;\n }\n for (uint256 i = 0; i < bLen; ++i) {\n totalOwners[index] = publicKeyOwners[i].toBytes30();\n ownersData[index].weight = pubicKeyWeights[i];\n ownersData[index].credType = CredentialType.PUBLIC_KEY;\n ownersData[index].publicKeyX = publicKeyOwners[i].x;\n ownersData[index].publicKeyY = publicKeyOwners[i].y;\n index++;\n }\n }\n\n /// @dev get owners' data\n /// @param ownerIds owner ids\n /// @param account modular smart contract account\n /// @return _ownersData data of each corresponding owner\n function _getOwnersData(bytes30[] memory ownerIds, address account)\n internal\n view\n returns (OwnerData[] memory _ownersData)\n {\n _ownersData = new OwnerData[](ownerIds.length);\n\n for (uint256 i = 0; i < ownerIds.length; ++i) {\n _ownersData[i] = ownerDataPerAccount[ownerIds[i]][account];\n }\n\n return _ownersData;\n }\n\n /// @dev sums values\n /// @param arr array of uint256 to sum\n /// @return result of summing arr values\n function _sum(OwnerData[] memory arr) internal pure returns (uint256 result) {\n for (uint256 i = 0; i < arr.length; ++i) {\n result += arr[i].weight;\n }\n return result;\n }\n}\n"},"src/msca/6900/v0.7/plugins/v1_0_0/multisig/IWeightedMultisigPlugin.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {OwnerData, OwnershipMetadata, PublicKey} from \"../../../../../../common/CommonStructs.sol\";\n\n/// @title Weighted Multisig Plugin Interface\n/// @author Circle\n/// @notice This plugin adds a weighted threshold ownership scheme to a ERC6900 smart contract account.\n/// @notice The design takes inspiration from Alchemy's [Equally Weighted Multisig\n/// Plugin](https://github.com/alchemyplatform/multisig-plugin).\ninterface IWeightedMultisigPlugin {\n /// @notice This event is emitted when owners of the account are added.\n /// @param account account plugin is installed on\n /// @param owners list of owners added\n /// @param weights list of weights corresponding to added owners\n event OwnersAdded(address account, bytes30[] owners, OwnerData[] weights);\n\n /// @notice This event is emitted when owners of the account are removed.\n /// @param account account plugin is installed on\n /// @param owners list of owners removed\n /// @param totalWeightRemoved total weight removed\n event OwnersRemoved(address account, bytes30[] owners, uint256 totalWeightRemoved);\n\n /// @notice This event is emitted when weights of account owners updated.\n /// @param account account plugin is installed on\n /// @param owners list of owners updated\n /// @param weights list of updated weights corresponding to owners\n event OwnersUpdated(address account, bytes30[] owners, OwnerData[] weights);\n\n /// @notice This event is emitted when the threshold weight is updated\n /// @param account account plugin is installed on\n /// @param oldThresholdWeight the old threshold weight required to perform an action\n /// @param newThresholdWeight the new threshold weight required to perform an action\n event ThresholdUpdated(address account, uint256 oldThresholdWeight, uint256 newThresholdWeight);\n\n error InvalidThresholdWeight();\n error InvalidWeight(bytes30 owner, address account, uint256 weight);\n error OwnersWeightsMismatch();\n error ThresholdWeightExceedsTotalWeight(uint256 thresholdWeight, uint256 totalWeight);\n\n /// @notice Add owners and their associated weights for the account, and optionally update threshold weight required\n /// to perform an action.\n /// @dev Constraints:\n /// - msg.sender must be initialized for this plugin\n /// - ownersToAdd must be non-empty\n /// - total owners after adding ownersToAdd must not exceed 1000.\n /// - length of weightsToAdd must be equal to length of ownersToAdd.\n /// - each weight must be between [1, 1000000], inclusive.\n /// - each owner in ownersToAdd must not be address(0) or an existing owner.\n /// - If newThresholdWeight is not equal to 0 or the current threshold, and owners are added successfully,\n /// the threshold weight will be updated. The threshold weight must be <= the new total weight after adding owners.\n /// This function is installed on the account as part of plugin installation, and should only be called from an\n /// account.\n /// @param ownersToAdd array of addresses for owners to be added, omit for secp256r1 but required for secp256k1\n /// @param weightsToAdd corresponding array of weights for owners to be added (must be same length as owners.), omit\n /// for secp256r1 but required for secp256k1,\n /// @param publicKeyOwnersToAdd owners derived from public keys, omit for secp256k1 but required for secp256r1\n /// @param pubicKeyWeightsToAdd corresponding weights for publicKeyOwnersToAdd, omit for secp256k1 but required for\n /// secp256r1\n /// @param newThresholdWeight new threshold weight to set as required to perform an action, or 0 to leave\n /// unmodified.\n function addOwners(\n address[] calldata ownersToAdd,\n uint256[] calldata weightsToAdd,\n PublicKey[] calldata publicKeyOwnersToAdd,\n uint256[] calldata pubicKeyWeightsToAdd,\n uint256 newThresholdWeight\n ) external;\n\n /// @notice Remove given owners and their set their associated weights to 0 for the account,\n /// and optionally update threshold weight required to perform an action.\n /// @dev Constraints:\n /// - msg.sender must be initialized for this plugin\n /// - ownersToRemove must be non-empty\n /// - Removal of owners must not set total number of owners to 0.\n /// - If newThresholdWeight is not equal to 0 or the current threshold, and owners are removed successfully,\n /// the threshold weight will be updated. The threshold weight must be <= the new total weight after removing\n /// owners.\n /// This function is installed on the account as part of plugin installation, and should\n /// only be called from an account.\n /// @param ownersToRemove array of addresses for owners to be removed, omit for secp256r1 but required for secp256k1\n /// @param publicKeyOwnersToRemove owners derived from public keys, omit for secp256k1 but required for secp256r1\n /// @param newThresholdWeight new threshold weight to set as required to perform an action, or 0 to leave,\n /// unmodified.\n function removeOwners(\n address[] calldata ownersToRemove,\n PublicKey[] calldata publicKeyOwnersToRemove,\n uint256 newThresholdWeight\n ) external;\n\n /// @notice Update owners' weights for the account, and/or update threshold weight required to perform an action.\n /// @dev Constraints:\n /// - all owners updated must currently have non-zero weight\n /// - all new weights must be in range [1, 1000000]\n /// - If a newThresholdWeight is nonzero, the threshold weight will be updated. Updating threshold weight does not\n /// require modifying owners.\n /// The newThresholdWeight must be <= the new total weight.\n /// This function is installed on the account as part of plugin installation, and should\n /// only be called from an account.\n /// @param ownersToUpdate array of addresses for owners to be updated (empty if updating no owners.), omit for\n /// secp256r1 but required for secp256k1\n /// @param newWeightsToUpdate corresponding array of weights for owners to updated (empty if updating no owners.)\n /// @param publicKeyOwnersToUpdate owners derived from public keys, omit for secp256k1 but required for secp256r1\n /// @param pubicKeyNewWeightsToUpdate corresponding weights for publicKeyOwnersToUpdate, omit for secp256k1 but\n /// required for secp256r1\n /// @param newThresholdWeight new threshold weight to set as required to perform an action, or 0 to leave\n /// unmodified.\n function updateMultisigWeights(\n address[] calldata ownersToUpdate,\n uint256[] calldata newWeightsToUpdate,\n PublicKey[] calldata publicKeyOwnersToUpdate,\n uint256[] calldata pubicKeyNewWeightsToUpdate,\n uint256 newThresholdWeight\n ) external;\n\n /// @notice Get the owner id.\n /// @param ownerToCheck The owner to check.\n /// @return (bytes30).\n function getOwnerId(address ownerToCheck) external pure returns (bytes30);\n\n /// @notice Get the owner id.\n /// @param pubKeyOwnerToCheck The owner to check.\n /// @return (bytes30).\n function getOwnerId(PublicKey memory pubKeyOwnerToCheck) external pure returns (bytes30);\n\n /// @notice Check if the signatures are valid for the account.\n /// @param actualDigest Digest of user op with all fields filled in.\n /// At least one signature must cover the actualDigest, with a v value >= 32,\n /// if it differs from the minimal digest.\n /// @param minimalDigest Digest of user op with minimal required fields set:\n /// (address sender, uint256 nonce, bytes initCode, bytes callData), and remaining\n /// fields set to default values.\n /// @param account The account to check the signatures for.\n /// @param signatures The signatures to check.\n /// @return success True if the signatures are valid.\n /// @return firstFailure first failure, if failed is true.\n /// (Note: if all signatures are individually valid but do not satisfy the\n /// multisig, firstFailure will be set to the last signature's index.)\n function checkNSignatures(bytes32 actualDigest, bytes32 minimalDigest, address account, bytes memory signatures)\n external\n view\n returns (bool success, uint256 firstFailure);\n\n /// @notice Check if an address is an owner of `account`.\n /// @param account The account to check.\n /// @param ownerToCheck The owner to check if it is an owner of the provided account.\n /// @return (true, ownerData) if the address is an owner of the account, otherwise return (false, empty ownerData).\n function isOwnerOf(address account, address ownerToCheck) external view returns (bool, OwnerData memory);\n\n /// @notice Check if a public key is an owner of `account`.\n /// @param account The account to check.\n /// @param pubKeyOwnerToCheck The owner to check if it is an owner of the provided account.\n /// @return (true, ownerData) if the public key is an owner of the account, otherwise return (false, empty\n /// ownerData).\n function isOwnerOf(address account, PublicKey memory pubKeyOwnerToCheck)\n external\n view\n returns (bool, OwnerData memory);\n\n /// @notice Get the owners of `account`, their respective weights, and the threshold weight.\n /// @param account The account to get the owners of.\n /// @return ownerAddresses owners of the account\n /// @return ownersData data of each respective owner\n /// @return ownershipMetadata ownership metadata\n function ownershipInfoOf(address account)\n external\n view\n returns (\n bytes30[] calldata ownerAddresses,\n OwnerData[] calldata ownersData,\n OwnershipMetadata memory ownershipMetadata\n );\n}\n"},"node_modules/@modular-account-libs/src/libraries/AssociatedLinkedListSetLib.sol":{"content":"// SPDX-License-Identifier: MIT\n//\n// See LICENSE-MIT file for more information\n\npragma solidity ^0.8.20;\n\nimport {SetValue, SENTINEL_VALUE, HAS_NEXT_FLAG} from \"./Constants.sol\";\n\n/// @dev Type representing the set, which is just a storage slot placeholder like the solidity mapping type.\nstruct AssociatedLinkedListSet {\n bytes32 placeholder;\n}\n\n/// @title Associated Linked List Set Library\n/// @notice Provides a set data structure that is enumerable and held in address-associated storage (per the\n/// ERC-4337 spec)\nlibrary AssociatedLinkedListSetLib {\n // Mapping Entry Byte Layout\n // | value | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA____ |\n // | meta | 0x____________________________________________________________BBBB |\n\n // Bit-layout of the meta bytes (2 bytes)\n // | user flags | 11111111 11111100 |\n // | has next | 00000000 00000010 |\n // | sentinel | 00000000 00000001 |\n\n // Mapping keys exclude the upper 15 bits of the meta bytes, which allows keys to be either a value or the\n // sentinel.\n\n // This cannot be evaluated at compile time because of its use in inline assembly.\n bytes4 internal constant ASSOCIATED_STORAGE_PREFIX = 0xf938c976; // bytes4(keccak256(\"AssociatedLinkedListSet\"))\n\n // A custom type representing the index of a storage slot\n type StoragePointer is bytes32;\n\n // A custom type representing a pointer to a location in memory beyond the current free memory pointer.\n // Holds a fixed-size buffer similar to \"bytes memory\", but without a length field.\n // Care must be taken when using these, as they may be overwritten if ANY memory is allocated after allocating\n // a TempBytesMemory.\n type TempBytesMemory is bytes32;\n\n // INTERNAL METHODS\n\n /// @notice Adds a value to a set.\n /// @param set The set to add the value to.\n /// @param associated The address the set is associated with.\n /// @param value The value to add.\n /// @return True if the value was added, false if the value cannot be added (already exists or is zero).\n function tryAdd(AssociatedLinkedListSet storage set, address associated, SetValue value) internal returns (bool) {\n bytes32 unwrappedKey = bytes32(SetValue.unwrap(value));\n if (unwrappedKey == bytes32(0)) {\n // Cannot add the zero value\n return false;\n }\n\n TempBytesMemory keyBuffer = _allocateTempKeyBuffer(set, associated);\n\n StoragePointer valueSlot = _mapLookup(keyBuffer, unwrappedKey);\n if (_load(valueSlot) != bytes32(0)) {\n // Entry already exists\n return false;\n }\n\n // Load the head of the set\n StoragePointer sentinelSlot = _mapLookup(keyBuffer, SENTINEL_VALUE);\n bytes32 prev = _load(sentinelSlot);\n if (prev == bytes32(0) || isSentinel(prev)) {\n // set is empty, need to do:\n // map[SENTINEL_VALUE] = unwrappedKey;\n // map[unwrappedKey] = SENTINEL_VALUE;\n _store(sentinelSlot, unwrappedKey);\n _store(valueSlot, SENTINEL_VALUE);\n } else {\n // set is not empty, need to do:\n // map[SENTINEL_VALUE] = unwrappedKey | HAS_NEXT_FLAG;\n // map[unwrappedKey] = prev;\n _store(sentinelSlot, unwrappedKey | HAS_NEXT_FLAG);\n _store(valueSlot, prev);\n }\n\n return true;\n }\n\n /// @notice Removes a value from a set.\n /// @dev This is an O(n) operation, where n is the number of elements in the set.\n /// @param set The set to remove the value from\n /// @param associated The address the set is associated with\n /// @param value The value to remove\n /// @return True if the value was removed, false if the value does not exist\n function tryRemove(AssociatedLinkedListSet storage set, address associated, SetValue value)\n internal\n returns (bool)\n {\n bytes32 unwrappedKey = bytes32(SetValue.unwrap(value));\n TempBytesMemory keyBuffer = _allocateTempKeyBuffer(set, associated);\n\n StoragePointer valueSlot = _mapLookup(keyBuffer, unwrappedKey);\n bytes32 nextValue = _load(valueSlot);\n if (unwrappedKey == bytes32(0) || nextValue == bytes32(0)) {\n // Entry does not exist\n return false;\n }\n\n bytes32 prevKey = SENTINEL_VALUE;\n bytes32 currentVal;\n do {\n // Load the current entry\n StoragePointer prevSlot = _mapLookup(keyBuffer, prevKey);\n currentVal = _load(prevSlot);\n bytes32 currentKey = clearFlags(currentVal);\n if (currentKey == unwrappedKey) {\n // Found the entry\n // Set the previous value's next value to the next value,\n // and the flags to the current value's flags.\n // and the next value's `hasNext` flag to determine whether or not the next value is (or points to)\n // the sentinel value.\n\n // Need to do:\n // map[prevKey] = clearFlags(nextValue) | getUserFlags(currentVal) | (nextValue & HAS_NEXT_FLAG);\n // map[currentKey] = bytes32(0);\n\n _store(prevSlot, clearFlags(nextValue) | getUserFlags(currentVal) | (nextValue & HAS_NEXT_FLAG));\n _store(valueSlot, bytes32(0));\n\n return true;\n }\n prevKey = currentKey;\n } while (!isSentinel(currentVal) && currentVal != bytes32(0));\n return false;\n }\n\n /// @notice Removes a value from a set, given the previous value in the set.\n /// @dev This is an O(1) operation but requires additional knowledge.\n /// @param set The set to remove the value from\n /// @param associated The address the set is associated with\n /// @param value The value to remove\n /// @param prev The previous value in the set\n /// @return True if the value was removed, false if the value does not exist\n function tryRemoveKnown(AssociatedLinkedListSet storage set, address associated, SetValue value, bytes32 prev)\n internal\n returns (bool)\n {\n bytes32 unwrappedKey = bytes32(SetValue.unwrap(value));\n TempBytesMemory keyBuffer = _allocateTempKeyBuffer(set, associated);\n\n prev = clearFlags(prev);\n\n if (prev == bytes32(0) || unwrappedKey == bytes32(0)) {\n return false;\n }\n\n // assert that the previous key's next value is the value to be removed\n StoragePointer prevSlot = _mapLookup(keyBuffer, prev);\n bytes32 currentValue = _load(prevSlot);\n if (clearFlags(currentValue) != unwrappedKey) {\n return false;\n }\n\n StoragePointer valueSlot = _mapLookup(keyBuffer, unwrappedKey);\n bytes32 next = _load(valueSlot);\n if (next == bytes32(0)) {\n // The set didn't actually contain the value\n return false;\n }\n\n // Need to do:\n // map[prev] = clearUserFlags(next) | getUserFlags(currentValue);\n // map[unwrappedKey] = bytes32(0);\n _store(prevSlot, clearUserFlags(next) | getUserFlags(currentValue));\n _store(valueSlot, bytes32(0));\n\n return true;\n }\n\n /// @notice Removes all values from a set.\n /// @dev This is an O(n) operation, where n is the number of elements in the set.\n /// @param set The set to remove the values from\n /// @param associated The address the set is associated with\n function clear(AssociatedLinkedListSet storage set, address associated) internal {\n TempBytesMemory keyBuffer = _allocateTempKeyBuffer(set, associated);\n\n bytes32 cursor = SENTINEL_VALUE;\n\n do {\n StoragePointer cursorSlot = _mapLookup(keyBuffer, cursor);\n bytes32 next = clearFlags(_load(cursorSlot));\n _store(cursorSlot, bytes32(0));\n cursor = next;\n } while (!isSentinel(cursor) && cursor != bytes32(0));\n }\n\n /// @notice Set the flags on a value in the set.\n /// @dev The user flags can only be set on the upper 14 bits, because the lower two are reserved for the\n /// sentinel and has next bit.\n /// @param set The set containing the value.\n /// @param associated The address the set is associated with.\n /// @param value The value to set the flags on.\n /// @param flags The flags to set.\n /// @return True if the set contains the value and the operation succeeds, false otherwise.\n function trySetFlags(AssociatedLinkedListSet storage set, address associated, SetValue value, uint16 flags)\n internal\n returns (bool)\n {\n bytes32 unwrappedKey = SetValue.unwrap(value);\n TempBytesMemory keyBuffer = _allocateTempKeyBuffer(set, associated);\n\n // Ignore the lower 2 bits.\n flags &= 0xFFFC;\n\n // If the set doesn't actually contain the value, return false;\n StoragePointer valueSlot = _mapLookup(keyBuffer, unwrappedKey);\n bytes32 next = _load(valueSlot);\n if (next == bytes32(0)) {\n return false;\n }\n\n // Set the flags\n _store(valueSlot, clearUserFlags(next) | bytes32(uint256(flags)));\n\n return true;\n }\n\n /// @notice Set the given flags on a value in the set, preserving the values of other flags.\n /// @dev The user flags can only be set on the upper 14 bits, because the lower two are reserved for the\n /// sentinel and has next bit.\n /// Short-circuits if the flags are already enabled, returning true.\n /// @param set The set containing the value.\n /// @param associated The address the set is associated with.\n /// @param value The value to enable the flags on.\n /// @param flags The flags to enable.\n /// @return True if the operation succeeds or short-circuits due to the flags already being enabled. False\n /// otherwise.\n function tryEnableFlags(AssociatedLinkedListSet storage set, address associated, SetValue value, uint16 flags)\n internal\n returns (bool)\n {\n flags &= 0xFFFC; // Allow short-circuit if lower bits are accidentally set\n uint16 currFlags = getFlags(set, associated, value);\n if (currFlags & flags == flags) return true; // flags are already enabled\n return trySetFlags(set, associated, value, currFlags | flags);\n }\n\n /// @notice Clear the given flags on a value in the set, preserving the values of other flags.\n /// @notice If the value is not in the set, this function will still return true.\n /// @dev The user flags can only be set on the upper 14 bits, because the lower two are reserved for the\n /// sentinel and has next bit.\n /// Short-circuits if the flags are already disabled, or if set does not contain the value. Short-circuits\n /// return true.\n /// @param set The set containing the value.\n /// @param associated The address the set is associated with.\n /// @param value The value to disable the flags on.\n /// @param flags The flags to disable.\n /// @return True if the operation succeeds, or short-circuits due to the flags already being disabled or if the\n /// set does not contain the value. False otherwise.\n function tryDisableFlags(AssociatedLinkedListSet storage set, address associated, SetValue value, uint16 flags)\n internal\n returns (bool)\n {\n flags &= 0xFFFC; // Allow short-circuit if lower bits are accidentally set\n uint16 currFlags = getFlags(set, associated, value);\n if (currFlags & flags == 0) return true; // flags are already disabled\n return trySetFlags(set, associated, value, currFlags & ~flags);\n }\n\n /// @notice Checks if a set contains a value\n /// @dev This method does not clear the upper bits of `value`, that is expected to be done as part of casting\n /// to the correct type. If this function is provided the sentinel value by using the upper bits, this function\n /// may returns `true`.\n /// @param set The set to check\n /// @param associated The address the set is associated with\n /// @param value The value to check for\n /// @return True if the set contains the value, false otherwise\n function contains(AssociatedLinkedListSet storage set, address associated, SetValue value)\n internal\n view\n returns (bool)\n {\n bytes32 unwrappedKey = bytes32(SetValue.unwrap(value));\n TempBytesMemory keyBuffer = _allocateTempKeyBuffer(set, associated);\n\n StoragePointer slot = _mapLookup(keyBuffer, unwrappedKey);\n return _load(slot) != bytes32(0);\n }\n\n /// @notice Checks if a set is empty\n /// @param set The set to check\n /// @param associated The address the set is associated with\n /// @return True if the set is empty, false otherwise\n function isEmpty(AssociatedLinkedListSet storage set, address associated) internal view returns (bool) {\n TempBytesMemory keyBuffer = _allocateTempKeyBuffer(set, associated);\n\n StoragePointer sentinelSlot = _mapLookup(keyBuffer, SENTINEL_VALUE);\n bytes32 val = _load(sentinelSlot);\n return val == bytes32(0) || isSentinel(val); // either the sentinel is unset, or points to itself\n }\n\n /// @notice Get the flags on a value in the set.\n /// @dev The reserved lower 2 bits will not be returned, as those are reserved for the sentinel and has next\n /// bit.\n /// @param set The set containing the value.\n /// @param associated The address the set is associated with.\n /// @param value The value to get the flags from.\n /// @return The flags set on the value.\n function getFlags(AssociatedLinkedListSet storage set, address associated, SetValue value)\n internal\n view\n returns (uint16)\n {\n bytes32 unwrappedKey = SetValue.unwrap(value);\n TempBytesMemory keyBuffer = _allocateTempKeyBuffer(set, associated);\n return uint16(uint256(_load(_mapLookup(keyBuffer, unwrappedKey))) & 0xFFFC);\n }\n\n /// @notice Check if the flags on a value are enabled.\n /// @dev The reserved lower 2 bits will be ignored, as those are reserved for the sentinel and has next bit.\n /// @param set The set containing the value.\n /// @param associated The address the set is associated with.\n /// @param value The value to check the flags on.\n /// @param flags The flags to check.\n /// @return True if all of the flags are enabled, false otherwise.\n function flagsEnabled(AssociatedLinkedListSet storage set, address associated, SetValue value, uint16 flags)\n internal\n view\n returns (bool)\n {\n flags &= 0xFFFC;\n return getFlags(set, associated, value) & flags == flags;\n }\n\n /// @notice Check if the flags on a value are disabled.\n /// @dev The reserved lower 2 bits will be ignored, as those are reserved for the sentinel and has next bit.\n /// @param set The set containing the value.\n /// @param associated The address the set is associated with.\n /// @param value The value to check the flags on.\n /// @param flags The flags to check.\n /// @return True if all of the flags are disabled, false otherwise.\n function flagsDisabled(AssociatedLinkedListSet storage set, address associated, SetValue value, uint16 flags)\n internal\n view\n returns (bool)\n {\n flags &= 0xFFFC;\n return ~(getFlags(set, associated, value)) & flags == flags;\n }\n\n /// @notice Gets all elements in a set.\n /// @dev This is an O(n) operation, where n is the number of elements in the set.\n /// @param set The set to get the elements of.\n /// @return ret An array of all elements in the set.\n function getAll(AssociatedLinkedListSet storage set, address associated)\n internal\n view\n returns (SetValue[] memory ret)\n {\n TempBytesMemory keyBuffer = _allocateTempKeyBuffer(set, associated);\n uint256 size;\n bytes32 cursor = _load(_mapLookup(keyBuffer, SENTINEL_VALUE));\n\n // Dynamically allocate the returned array as we iterate through the set, since we don't know the size\n // beforehand.\n // This is accomplished by first writing to memory after the free memory pointer,\n // then updating the free memory pointer to cover the newly-allocated data.\n // To the compiler, writes to memory after the free memory pointer are considered \"memory safe\".\n // See https://docs.soliditylang.org/en/v0.8.22/assembly.html#memory-safety\n // Stack variable lifting done when compiling with via-ir will only ever place variables into memory\n // locations below the current free memory pointer, so it is safe to compile this library with via-ir.\n // See https://docs.soliditylang.org/en/v0.8.22/yul.html#memoryguard\n /// @solidity memory-safe-assembly\n assembly {\n // It is critical that no other memory allocations occur between:\n // - loading the value of the free memory pointer into `ret`\n // - updating the free memory pointer to point to the newly-allocated data, which is done after all\n // the values have been written.\n ret := mload(0x40)\n // Add an extra offset of 4 words to account for the length of the keyBuffer, since it will be used\n // for each lookup. If this value were written back to the free memory pointer, it would effectively\n // convert the keyBuffer into a \"bytes memory\" type. However, we don't actually write to the free\n // memory pointer until after all we've also allocated the entire return array.\n ret := add(ret, 0x80)\n }\n\n while (!isSentinel(cursor) && cursor != bytes32(0)) {\n unchecked {\n ++size;\n }\n bytes32 cleared = clearFlags(cursor);\n // Place the item into the return array manually. Since the size was just incremented, it will point to\n // the next location to write to.\n /// @solidity memory-safe-assembly\n assembly {\n mstore(add(ret, mul(size, 0x20)), cleared)\n }\n if (hasNext(cursor)) {\n cursor = _load(_mapLookup(keyBuffer, cleared));\n } else {\n cursor = bytes32(0);\n }\n }\n\n /// @solidity memory-safe-assembly\n assembly {\n // Update the free memory pointer with the now-known length of the array.\n mstore(0x40, add(ret, mul(add(size, 1), 0x20)))\n // Set the length of the array.\n mstore(ret, size)\n }\n }\n\n function isSentinel(bytes32 value) internal pure returns (bool ret) {\n /// @solidity memory-safe-assembly\n assembly {\n ret := and(value, 1)\n }\n }\n\n function hasNext(bytes32 value) internal pure returns (bool) {\n return value & HAS_NEXT_FLAG != 0;\n }\n\n function clearFlags(bytes32 val) internal pure returns (bytes32) {\n return val & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0001;\n }\n\n /// @dev Preserves the lower two bits\n function clearUserFlags(bytes32 val) internal pure returns (bytes32) {\n return val & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0003;\n }\n\n function getUserFlags(bytes32 val) internal pure returns (bytes32) {\n return val & bytes32(uint256(0xFFFC));\n }\n\n // PRIVATE METHODS\n\n /// @notice Given an allocated key buffer, returns the storage slot for a given key\n function _mapLookup(TempBytesMemory keyBuffer, bytes32 value) private pure returns (StoragePointer slot) {\n /// @solidity memory-safe-assembly\n assembly {\n // Store the value in the last word.\n mstore(add(keyBuffer, 0x60), value)\n slot := keccak256(keyBuffer, 0x80)\n }\n }\n\n /// @notice Allocates a key buffer for a given ID and associated address into scratch space memory.\n /// @dev The returned buffer must not be used if any additional memory is allocated after calling this\n /// function.\n /// @param set The set to allocate the key buffer for.\n /// @param associated The address the set is associated with.\n /// @return key A key buffer that can be used to lookup values in the set\n function _allocateTempKeyBuffer(AssociatedLinkedListSet storage set, address associated)\n private\n pure\n returns (TempBytesMemory key)\n {\n // Key derivation for an entry\n // Note: `||` refers to the concat operator\n // associated addr (left-padded) || prefix || uint224(0) batchIndex || set storage slot || entry\n // Word 1:\n // | zeros | 0x000000000000000000000000________________________________________ |\n // | address | 0x________________________AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |\n // Word 2:\n // | prefix | 0xPPPPPPPP________________________________________________________ |\n // | batch index (zero) | 0x________00000000000000000000000000000000000000000000000000000000 |\n // Word 3:\n // | set storage slot | 0xSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS |\n // Word 4:\n // | entry value | 0xVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV____ |\n // | entry meta | 0x____________________________________________________________MMMM |\n\n // The batch index is for consistency with ModuleStorageLib, and the prefix in front of it is\n // to prevent any potential crafted collisions where the batch index may be equal to storage slot\n // of the ALLS. The prefix is set to the upper bits of the batch index to make it infeasible to\n // reach from just incrementing the value.\n\n // This segment is memory-safe because it only uses the scratch space memory after the value of the free\n // memory pointer.\n // See https://docs.soliditylang.org/en/v0.8.22/assembly.html#memory-safety\n /// @solidity memory-safe-assembly\n assembly {\n // Clean upper bits of arguments\n associated := and(associated, 0xffffffffffffffffffffffffffffffffffffffff)\n\n // Use memory past-the-free-memory-pointer without updating it, as this is just scratch space\n key := mload(0x40)\n // Store the associated address in the first word, left-padded with zeroes\n mstore(key, associated)\n // Store the prefix and a batch index of 0\n mstore(add(key, 0x20), ASSOCIATED_STORAGE_PREFIX)\n // Store the list's storage slot in the third word\n mstore(add(key, 0x40), set.slot)\n // Leaves the last word open for the value entry\n }\n\n return key;\n }\n\n /// @dev Loads a value from storage\n function _load(StoragePointer ptr) private view returns (bytes32 val) {\n /// @solidity memory-safe-assembly\n assembly {\n val := sload(ptr)\n }\n }\n\n /// @dev Writes a value into storage\n function _store(StoragePointer ptr, bytes32 val) private {\n /// @solidity memory-safe-assembly\n assembly {\n sstore(ptr, val)\n }\n }\n}\n"},"node_modules/@modular-account-libs/src/libraries/Constants.sol":{"content":"// SPDX-License-Identifier: MIT\n//\n// See LICENSE-MIT file for more information\n\npragma solidity ^0.8.20;\n\ntype SetValue is bytes30;\n\n/// @dev The sentinel value is used to indicate the head and tail of the list.\nbytes32 constant SENTINEL_VALUE = bytes32(uint256(1));\n\n/// @dev Removing the last element will result in this flag not being set correctly, but all operations will\n/// function normally, albeit with one extra sload for getAll.\nbytes32 constant HAS_NEXT_FLAG = bytes32(uint256(2));\n\n/// @dev As defined by ERC-4337.\nuint256 constant SIG_VALIDATION_PASSED = 0;\nuint256 constant SIG_VALIDATION_FAILED = 1;\n"},"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC1822Proxiable} from \"@openzeppelin/contracts/interfaces/draft-IERC1822.sol\";\nimport {ERC1967Utils} from \"@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol\";\nimport {Initializable} from \"./Initializable.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n */\nabstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable {\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address private immutable __self = address(this);\n\n /**\n * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)`\n * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called,\n * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string.\n * If the getter returns `\"5.0.0\"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must\n * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function\n * during an upgrade.\n */\n string public constant UPGRADE_INTERFACE_VERSION = \"5.0.0\";\n\n /**\n * @dev The call is from an unauthorized context.\n */\n error UUPSUnauthorizedCallContext();\n\n /**\n * @dev The storage `slot` is unsupported as a UUID.\n */\n error UUPSUnsupportedProxiableUUID(bytes32 slot);\n\n /**\n * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\n * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n * fail.\n */\n modifier onlyProxy() {\n _checkProxy();\n _;\n }\n\n /**\n * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n * callable on the implementing contract but not through proxies.\n */\n modifier notDelegated() {\n _checkNotDelegated();\n _;\n }\n\n function __UUPSUpgradeable_init() internal onlyInitializing {\n }\n\n function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\n }\n /**\n * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\n * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n */\n function proxiableUUID() external view virtual notDelegated returns (bytes32) {\n return ERC1967Utils.IMPLEMENTATION_SLOT;\n }\n\n /**\n * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n * encoded in `data`.\n *\n * Calls {_authorizeUpgrade}.\n *\n * Emits an {Upgraded} event.\n *\n * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\n _authorizeUpgrade(newImplementation);\n _upgradeToAndCallUUPS(newImplementation, data);\n }\n\n /**\n * @dev Reverts if the execution is not performed via delegatecall or the execution\n * context is not of a proxy with an ERC1967-compliant implementation pointing to self.\n * See {_onlyProxy}.\n */\n function _checkProxy() internal view virtual {\n if (\n address(this) == __self || // Must be called through delegatecall\n ERC1967Utils.getImplementation() != __self // Must be called through an active proxy\n ) {\n revert UUPSUnauthorizedCallContext();\n }\n }\n\n /**\n * @dev Reverts if the execution is performed via delegatecall.\n * See {notDelegated}.\n */\n function _checkNotDelegated() internal view virtual {\n if (address(this) != __self) {\n // Must not be called through delegatecall\n revert UUPSUnauthorizedCallContext();\n }\n }\n\n /**\n * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n * {upgradeToAndCall}.\n *\n * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n *\n * ```solidity\n * function _authorizeUpgrade(address) internal onlyOwner {}\n * ```\n */\n function _authorizeUpgrade(address newImplementation) internal virtual;\n\n /**\n * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call.\n *\n * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value\n * is expected to be the implementation slot in ERC1967.\n *\n * Emits an {IERC1967-Upgraded} event.\n */\n function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private {\n try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) {\n revert UUPSUnsupportedProxiableUUID(slot);\n }\n ERC1967Utils.upgradeToAndCall(newImplementation, data);\n } catch {\n // The implementation is not UUPS\n revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation);\n }\n }\n}\n"},"node_modules/@openzeppelin/contracts/interfaces/IERC1271.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1271.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC1271 standard signature validation method for\n * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].\n */\ninterface IERC1271 {\n /**\n * @dev Should return whether the signature provided is valid for the provided data\n * @param hash Hash of the data to be signed\n * @param signature Signature byte array associated with _data\n */\n function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);\n}\n"},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS\n }\n\n /**\n * @dev The signature derives the `address(0)`.\n */\n error ECDSAInvalidSignature();\n\n /**\n * @dev The signature has an invalid length.\n */\n error ECDSAInvalidSignatureLength(uint256 length);\n\n /**\n * @dev The signature has an S value that is in the upper half order.\n */\n error ECDSAInvalidSignatureS(bytes32 s);\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not\n * return address(0) without also returning an error description. Errors are documented using an enum (error type)\n * and a bytes32 providing additional information about the error.\n *\n * If no error is returned, then the address can be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM precompile allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {MessageHashUtils-toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n */\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) {\n unchecked {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n // We do not check for an overflow here since the shift operation results in 0 or 1.\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function tryRecover(\n bytes32 hash,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) internal pure returns (address, RecoverError, bytes32) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS, s);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature, bytes32(0));\n }\n\n return (signer, RecoverError.NoError, bytes32(0));\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);\n _throwError(error, errorArg);\n return recovered;\n }\n\n /**\n * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.\n */\n function _throwError(RecoverError error, bytes32 errorArg) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert ECDSAInvalidSignature();\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert ECDSAInvalidSignatureLength(uint256(errorArg));\n } else if (error == RecoverError.InvalidSignatureS) {\n revert ECDSAInvalidSignatureS(errorArg);\n }\n }\n}\n"},"src/common/CommonStructs.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nstruct PublicKey {\n uint256 x;\n uint256 y;\n}\n\n/// @dev WebAuthn related data.\nstruct WebAuthnData {\n /// @dev The WebAuthn authenticator data.\n /// See https://www.w3.org/TR/webauthn-2/#dom-authenticatorassertionresponse-authenticatordata.\n bytes authenticatorData;\n /// @dev The WebAuthn client data JSON.\n /// See https://www.w3.org/TR/webauthn-2/#dom-authenticatorresponse-clientdatajson.\n string clientDataJSON;\n /// @dev The index at which \"challenge\":\"...\" occurs in `clientDataJSON`.\n uint256 challengeIndex;\n /// @dev The index at which \"type\":\"...\" occurs in `clientDataJSON`.\n uint256 typeIndex;\n /// @dev Checks that the authenticator enforced user verification. User verification should be required if, and only\n /// if, options.userVerification is set to required in the request.\n bool requireUserVerification;\n}\n\n/// @dev Follow \"Smart Contract Signatures Encoding\".\nstruct WebAuthnSigDynamicPart {\n /// @dev Webauthn related data\n WebAuthnData webAuthnData;\n /// @dev The r value of secp256r1 signature\n uint256 r;\n /// @dev The s value of secp256r1 signature\n uint256 s;\n}\n\nenum CredentialType {\n PUBLIC_KEY,\n ADDRESS\n}\n\n/// @notice For public credential, we either store public key or address but not both.\n/// @param weight required, weightage on each owner\n/// @param credType required, public credential type\n/// @param publicKeyX optional, x coordinate of public key\n/// @param publicKeyY optional, y coordinate of public key\n/// @param addr optional, owner address\nstruct OwnerData {\n uint256 weight;\n CredentialType credType; // 1 byte, fit in the same slot as addr (if used) or its own slot\n address addr; // 20 bytes if used, fit in the same slot as credType\n uint256 publicKeyX; // 32 bytes if used\n uint256 publicKeyY; // 32 bytes if used\n}\n\n/// @notice Metadata of the ownership of an account.\n/// @param numOwners number of owners on the account\n/// @param thresholdWeight weight of signatures required to perform an action\n/// @param totalWeight total weight of signatures required to perform an action\nstruct OwnershipMetadata {\n uint256 numOwners;\n uint256 thresholdWeight;\n uint256 totalWeight;\n}\n"},"src/libs/AddressBytesLib.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\n/**\n * @dev Util functions for address stored in fixed bytes.\n */\nlibrary AddressBytesLib {\n /// @dev Helper function to convert address to bytes30 with leading zeros.\n function toBytes30(address addr) internal pure returns (bytes30) {\n return bytes30(uint240(uint160(addr)));\n }\n}\n"},"src/libs/PublicKeyLib.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {PublicKey} from \"../common/CommonStructs.sol\";\n\n/**\n * @dev Util functions for public key.\n */\nlibrary PublicKeyLib {\n error InvalidPublicKey(uint256 x, uint256 y);\n\n function toBytes30(uint256 x, uint256 y) internal pure returns (bytes30) {\n // (0, 0) is point at infinity and not on the curve and should therefore be rejected\n if (x == 0 && y == 0) {\n revert InvalidPublicKey(x, y);\n }\n return bytes30(uint240(uint256(keccak256(abi.encode(x, y)))));\n }\n\n function toBytes30(PublicKey memory publicKey) internal pure returns (bytes30) {\n // (0, 0) is point at infinity and not on the curve and should therefore be rejected\n uint256 x = publicKey.x;\n uint256 y = publicKey.y;\n return toBytes30(x, y);\n }\n}\n"},"src/libs/WebAuthnLib.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {WebAuthnData} from \"../common/CommonStructs.sol\";\nimport {FCL_ecdsa} from \"@fcl/FCL_ecdsa.sol\";\nimport {FCL_Elliptic_ZZ} from \"@fcl/FCL_elliptic.sol\";\n\n/// @title WebAuthn\n///\n/// @notice A library for verifying WebAuthn Authentication Assertions, built off the work\n/// of Coinbase and Daimo.\n///\n/// @dev Attempts to use the RIP-7212 precompile for signature verification.\n/// If precompile verification fails, it falls back to FreshCryptoLib.\n/// @dev We use SigType (one byte) to differentiate between signature types.\n/// If SigType == 0, then it's a contract signature (EIP-1271).\n/// If SigType == 1, then it's pre-validated signature that we don't support.\n/// If SigType == 2, then it's a secp256r1 signature.\n/// If SigType > 26 && SigType < 31, then it's secp256k1 signature.\n/// If SigType > 30, then it's eth_sign signature that we don't support.\n/// If SigType >= 32, then it's a multisig signature authenticating an actual digest.\n/// For more details, please refer to \"Smart Contract Signatures Encoding\" doc.\n/// @dev “secp256r1” ECDSA signatures consist of v, r, and s components. While the v value makes it possible to\n/// recover the public key of the signer,\n/// most signers do not generate the v component of the signature since r and s are sufficient for\n/// verification. In order to provide an exact and more compatible implementation, verification is preferred over\n/// recovery for the precompile.\n/// Existing P256 implementations verify (x, y, r, s) directly. Note that many implementations use (0, 0) as the\n/// reference point at infinity, which is not on the curve and should therefore be rejected.\n///\n/// @author Circle\n/// @author Coinbase (https://github.com/base-org/webauthn-sol)\n/// @author Daimo (https://github.com/daimo-eth/p256-verifier/blob/master/src/WebAuthn.sol)\nlibrary WebAuthnLib {\n /// @dev Bit 0 of the authenticator data struct, corresponding to the \"User Present\" bit.\n /// See https://www.w3.org/TR/webauthn-2/#flags.\n bytes1 private constant _AUTH_DATA_FLAGS_UP = 0x01;\n\n /// @dev Bit 2 of the authenticator data struct, corresponding to the \"User Verified\" bit.\n /// See https://www.w3.org/TR/webauthn-2/#flags.\n bytes1 private constant _AUTH_DATA_FLAGS_UV = 0x04;\n\n /// @dev Secp256r1 curve order / 2 used as guard to prevent signature malleability issue.\n uint256 private constant _P256_N_DIV_2 = FCL_Elliptic_ZZ.n / 2;\n\n /// @dev The precompiled contract address to use for signature verification in the “secp256r1” elliptic curve.\n /// See https://github.com/ethereum/RIPs/blob/master/RIPS/rip-7212.md.\n address private constant _VERIFIER = address(0x100);\n\n /// @dev The expected type (hash) in the client data JSON when verifying assertion signatures.\n /// See https://www.w3.org/TR/webauthn-2/#dom-collectedclientdata-type\n // solhint-disable-next-line quotes\n bytes32 private constant _EXPECTED_TYPE_HASH = keccak256('\"type\":\"webauthn.get\"');\n\n string internal constant _TABLE_URL = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\n ///\n /// @notice Verifies a Webauthn Authentication Assertion as described\n /// in https://www.w3.org/TR/webauthn-2/#sctn-verifying-assertion.\n ///\n /// @dev We do not verify all the steps as described in the specification, only ones relevant to our context.\n /// Please carefully read through this list before usage.\n ///\n /// Specifically, we do verify the following:\n /// - Verify that authenticatorData (which comes from the authenticator, such as iCloud Keychain) indicates\n /// a well-formed assertion with the user present bit set. If `requireUserVerification` is set, checks\n /// that the\n /// authenticator\n /// enforced user verification. User verification should be required if, and only if,\n /// options.userVerification\n /// is set to required in the request.\n /// - Verifies that the client JSON is of type \"webauthn.get\", i.e. the client was responding to a request\n /// to\n /// assert authentication.\n /// - Verifies that the client JSON contains the requested challenge.\n /// - Verifies that (r, s) constitute a valid signature over both the authenticatorData and client JSON, for\n /// public\n /// key (x, y).\n ///\n /// We make some assumptions about the particular use case of this verifier, so we do NOT verify the following:\n /// - Does NOT verify that the origin in the `clientDataJSON` matches the Relying Party's origin: tt is\n /// considered\n /// the authenticator's responsibility to ensure that the user is interacting with the correct RP. This is\n /// enforced by most high quality authenticators properly, particularly the iCloud Keychain and Google\n /// Password\n /// Manager were tested.\n /// - Does NOT verify That `topOrigin` in `clientDataJSON` is well-formed: We assume it would never be\n /// present, i.e.\n /// the credentials are never used in a cross-origin/iframe context. The website/app set up should\n /// disallow\n /// cross-origin usage of the credentials. This is the default behaviour for created credentials in common\n /// settings.\n /// - Does NOT verify that the `rpIdHash` in `authenticatorData` is the SHA-256 hash of the RP ID expected\n /// by the Relying\n /// Party: this means that we rely on the authenticator to properly enforce credentials to be used only by\n /// the correct RP.\n /// This is generally enforced with features like Apple App Site Association and Google Asset Links. To\n /// protect from\n /// edge cases in which a previously-linked RP ID is removed from the authorised RP IDs, we recommend that\n /// messages\n /// signed by the authenticator include some expiry mechanism.\n /// - Does NOT verify the credential backup state: this assumes the credential backup state is NOT used as\n /// part of Relying\n /// Party business logic or policy.\n /// - Does NOT verify the values of the client extension outputs: this assumes that the Relying Party does\n /// not use client\n /// extension outputs.\n /// - Does NOT verify the signature counter: signature counters are intended to enable risk scoring for the\n /// Relying Party.\n /// This assumes risk scoring is not used as part of Relying Party business logic or policy.\n /// - Does NOT verify the attestation object: this assumes that response.attestationObject is NOT present in\n /// the response,\n /// i.e. the RP does not intend to verify an attestation.\n ///\n /// @param challenge The challenge that was provided by the relying party.\n /// @param webAuthnData The `WebAuthnData` struct.\n /// @param r The r value of secp256r1 signature.\n /// @param s The s value of secp256r1 signature\n /// @param x The x coordinate of the public key.\n /// @param y The y coordinate of the public key.\n ///\n /// @return `true` if the authentication assertion passed validation, else `false`.\n function verify(\n bytes memory challenge,\n WebAuthnData memory webAuthnData,\n uint256 r,\n uint256 s,\n uint256 x,\n uint256 y\n ) internal view returns (bool) {\n if (s > _P256_N_DIV_2) {\n // guard against signature malleability\n return false;\n }\n\n // 11. Verify that the value of C.type is the string webauthn.get.\n // bytes(\"type\":\"webauthn.get\").length = 21\n string memory _type = _slice(webAuthnData.clientDataJSON, webAuthnData.typeIndex, webAuthnData.typeIndex + 21);\n if (keccak256(bytes(_type)) != _EXPECTED_TYPE_HASH) {\n return false;\n }\n\n // 12. Verify that the value of C.challenge equals the base64url encoding of options.challenge.\n // solhint-disable-next-line quotes\n bytes memory expectedChallenge = bytes(string.concat('\"challenge\":\"', encodeURL(challenge), '\"'));\n string memory actualChallenge = _slice(\n webAuthnData.clientDataJSON,\n webAuthnData.challengeIndex,\n webAuthnData.challengeIndex + expectedChallenge.length\n );\n if (keccak256(bytes(actualChallenge)) != keccak256(expectedChallenge)) {\n return false;\n }\n\n // Skip 13., 14., 15.\n\n // 16. Verify that the UP bit of the flags in authData is set.\n if (webAuthnData.authenticatorData[32] & _AUTH_DATA_FLAGS_UP != _AUTH_DATA_FLAGS_UP) {\n return false;\n }\n\n // 17. If user verification is required for this assertion, verify that the User Verified bit of the flags in\n // authData is set.\n if (\n webAuthnData.requireUserVerification\n && (webAuthnData.authenticatorData[32] & _AUTH_DATA_FLAGS_UV) != _AUTH_DATA_FLAGS_UV\n ) {\n return false;\n }\n\n // skip 18.\n\n // 19. Let hash be the result of computing a hash over the cData using SHA-256.\n bytes32 clientDataJSONHash = sha256(bytes(webAuthnData.clientDataJSON));\n\n // 20. Using credentialPublicKey, verify that sig is a valid signature over the binary concatenation of authData\n // and hash.\n bytes32 messageHash = sha256(abi.encodePacked(webAuthnData.authenticatorData, clientDataJSONHash));\n bytes memory args = abi.encode(messageHash, r, s, x, y);\n // try the RIP-7212 precompile address\n (bool success, bytes memory ret) = _VERIFIER.staticcall(args);\n // staticcall will not revert if address has no code\n // check return length\n // note that even if precompile exists, ret.length is 0 when verification returns false\n // so an invalid signature will be checked twice: once by the precompile and once by FCL.\n // Ideally this signature failure is simulated offchain and no one actually pay this gas.\n bool valid = ret.length > 0;\n if (success && valid) return abi.decode(ret, (uint256)) == 1;\n\n return FCL_ecdsa.ecdsa_verify(messageHash, r, s, x, y);\n }\n\n /// @dev Fork from Solady without introducing the dependency with whole LibString\n /// as other functions are failing the security scans.\n function _slice(string memory subject, uint256 start, uint256 end) internal pure returns (string memory result) {\n // solhint-disable-next-line no-inline-assembly\n assembly (\"memory-safe\") {\n let subjectLength := mload(subject)\n if iszero(gt(subjectLength, end)) { end := subjectLength }\n if iszero(gt(subjectLength, start)) { start := subjectLength }\n if lt(start, end) {\n result := mload(0x40)\n let resultLength := sub(end, start)\n mstore(result, resultLength)\n subject := add(subject, start)\n let w := not(0x1f)\n // Copy the `subject` one word at a time, backwards.\n for { let o := and(add(resultLength, 0x1f), w) } 1 {} {\n mstore(add(result, o), mload(add(subject, o)))\n o := add(o, w) // `sub(o, 0x20)`.\n if iszero(o) { break }\n }\n // Zeroize the slot after the string.\n mstore(add(add(result, 0x20), resultLength), 0)\n // Allocate memory for the length and the bytes,\n // rounded up to a multiple of 32.\n mstore(0x40, add(result, and(add(resultLength, 0x3f), w)))\n }\n }\n }\n\n /**\n * @notice Forked from OZ 5. Please remove this function after library upgrade.\n * @dev Converts a `bytes` to its Bytes64Url `string` representation.\n */\n function encodeURL(bytes memory data) internal pure returns (string memory) {\n return _encode(data, _TABLE_URL, false);\n }\n\n /**\n * @dev Internal table-agnostic conversion\n */\n function _encode(bytes memory data, string memory table, bool withPadding) private pure returns (string memory) {\n /**\n * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence\n * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol\n */\n if (data.length == 0) return \"\";\n\n // If padding is enabled, the final length should be `bytes` data length divided by 3 rounded up and then\n // multiplied by 4 so that it leaves room for padding the last chunk\n // - `data.length + 2` -> Round up\n // - `/ 3` -> Number of 3-bytes chunks\n // - `4 *` -> 4 characters for each chunk\n // If padding is disabled, the final length should be `bytes` data length multiplied by 4/3 rounded up as\n // opposed to when padding is required to fill the last chunk.\n // - `4 *` -> 4 characters for each chunk\n // - `data.length + 2` -> Round up\n // - `/ 3` -> Number of 3-bytes chunks\n uint256 resultLength = withPadding ? 4 * ((data.length + 2) / 3) : (4 * data.length + 2) / 3;\n\n string memory result = new string(resultLength);\n\n /// @solidity memory-safe-assembly\n // solhint-disable-next-line no-inline-assembly\n assembly {\n // Prepare the lookup table (skip the first \"length\" byte)\n let tablePtr := add(table, 1)\n\n // Prepare result pointer, jump over length\n let resultPtr := add(result, 0x20)\n let dataPtr := data\n let endPtr := add(data, mload(data))\n\n // In some cases, the last iteration will read bytes after the end of the data. We cache the value, and\n // set it to zero to make sure no dirty bytes are read in that section.\n let afterPtr := add(endPtr, 0x20)\n let afterCache := mload(afterPtr)\n mstore(afterPtr, 0x00)\n\n // Run over the input, 3 bytes at a time\n for {} lt(dataPtr, endPtr) {} {\n // Advance 3 bytes\n dataPtr := add(dataPtr, 3)\n let input := mload(dataPtr)\n\n // To write each character, shift the 3 byte (24 bits) chunk\n // 4 times in blocks of 6 bits for each character (18, 12, 6, 0)\n // and apply logical AND with 0x3F to bitmask the least significant 6 bits.\n // Use this as an index into the lookup table, mload an entire word\n // so the desired character is in the least significant byte, and\n // mstore8 this least significant byte into the result and continue.\n\n mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F))))\n resultPtr := add(resultPtr, 1) // Advance\n\n mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F))))\n resultPtr := add(resultPtr, 1) // Advance\n\n mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F))))\n resultPtr := add(resultPtr, 1) // Advance\n\n mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F))))\n resultPtr := add(resultPtr, 1) // Advance\n }\n\n // Reset the value that was cached\n mstore(afterPtr, afterCache)\n\n if withPadding {\n // When data `bytes` is not exactly 3 bytes long\n // it is padded with `=` characters at the end\n switch mod(mload(data), 3)\n case 1 {\n mstore8(sub(resultPtr, 1), 0x3d)\n mstore8(sub(resultPtr, 2), 0x3d)\n }\n case 2 { mstore8(sub(resultPtr, 1), 0x3d) }\n }\n }\n\n return result;\n }\n}\n"},"src/msca/6900/shared/erc712/BaseERC712CompliantModule.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\n\n// @notice Inspired by 6900 reference implementation with some modifications.\n// A base contract for modules that use EIP-712 structured data signing.\n// Unlike other EIP712 libraries, this base contract uses the salt field (bytes32(bytes20(account)) to hold the\n// account address\n// and uses the verifyingContract field to hold module address.\n// This abstract contract does not implement EIP-5267, as the domain retrieval function eip712Domain() does not provide\n// a parameter to hold the account address.\n// If we use verifyingContract to hold account address, then `msg.sender` would be address(0) for an `eth_call` without\n// an override.\nabstract contract BaseERC712CompliantModule {\n // keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)\")\n bytes32 private constant _DOMAIN_SEPARATOR_TYPEHASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)\");\n\n /// @notice Wraps a replay safe hash in an EIP-712 envelope to prevent cross-account replay attacks.\n /// domainSeparator = hashStruct(eip712Domain).\n /// eip712Domain = (string name,string version,uint256 chainId,address verifyingContract,bytes32 salt)\n /// The domain separator includes the chainId, module address and account address.\n /// hashStruct(s) = keccak256(typeHash ‖ encodeData(s)) where typeHash = keccak256(encodeType(typeOf(s)))\n /// @param account SCA to build the message hash for.\n /// @param hash Message that should be hashed.\n /// @return Replay safe message hash.\n function getReplaySafeMessageHash(address account, bytes32 hash) public view returns (bytes32) {\n return MessageHashUtils.toTypedDataHash({\n domainSeparator: keccak256(\n abi.encode(\n _DOMAIN_SEPARATOR_TYPEHASH, _getModuleIdHash(), block.chainid, address(this), bytes32(bytes20(account))\n )\n ),\n structHash: keccak256(abi.encode(_getModuleTypeHash(), hash))\n });\n }\n\n /// @dev Returns the module typehash.\n function _getModuleTypeHash() internal pure virtual returns (bytes32);\n\n /// @dev Returns the module id.\n function _getModuleIdHash() internal pure virtual returns (bytes32);\n}\n"},"src/msca/6900/v0.7/interfaces/IStandardExecutor.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport \"../common/Structs.sol\";\n\n/**\n * @dev Implements https://eips.ethereum.org/EIPS/eip-6900. MSCAs must implement this interface to support open-ended\n * execution.\n */\ninterface IStandardExecutor {\n /// @notice Standard execute method.\n /// @dev If the target is a plugin, the call SHOULD revert.\n /// @param target The target address for the account to call.\n /// @param value The value to send with the call.\n /// @param data The calldata for the call.\n /// @return The return data from the call.\n function execute(address target, uint256 value, bytes calldata data) external payable returns (bytes memory);\n\n /// @notice Standard executeBatch method.\n /// @dev If the target is a plugin, the call SHOULD revert. If any of the calls revert, the entire batch MUST\n /// revert.\n /// @param calls The array of calls.\n /// @return An array containing the return data from the calls.\n function executeBatch(Call[] calldata calls) external payable returns (bytes[] memory);\n}\n"},"node_modules/@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/SignatureChecker.sol)\n\npragma solidity ^0.8.20;\n\nimport {ECDSA} from \"./ECDSA.sol\";\nimport {IERC1271} from \"../../interfaces/IERC1271.sol\";\n\n/**\n * @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA\n * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like\n * Argent and Safe Wallet (previously Gnosis Safe).\n */\nlibrary SignatureChecker {\n /**\n * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the\n * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`.\n *\n * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus\n * change through time. It could return true at block N and false at block N+1 (or the opposite).\n */\n function isValidSignatureNow(address signer, bytes32 hash, bytes memory signature) internal view returns (bool) {\n (address recovered, ECDSA.RecoverError error, ) = ECDSA.tryRecover(hash, signature);\n return\n (error == ECDSA.RecoverError.NoError && recovered == signer) ||\n isValidERC1271SignatureNow(signer, hash, signature);\n }\n\n /**\n * @dev Checks if a signature is valid for a given signer and data hash. The signature is validated\n * against the signer smart contract using ERC1271.\n *\n * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus\n * change through time. It could return true at block N and false at block N+1 (or the opposite).\n */\n function isValidERC1271SignatureNow(\n address signer,\n bytes32 hash,\n bytes memory signature\n ) internal view returns (bool) {\n (bool success, bytes memory result) = signer.staticcall(\n abi.encodeCall(IERC1271.isValidSignature, (hash, signature))\n );\n return (success &&\n result.length >= 32 &&\n abi.decode(result, (bytes32)) == bytes32(IERC1271.isValidSignature.selector));\n }\n}\n"},"src/utils/ExecutionUtils.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\n// solhint-disable no-inline-assembly\n\n/**\n * Utility functions helpful when making different kinds of contract calls in Solidity.\n * For inline assembly, please refer to https://docs.soliditylang.org/en/latest/assembly.html\n * For opcodes, please refer to https://ethereum.org/en/developers/docs/evm/opcodes/ and https://www.evm.codes/\n */\nlibrary ExecutionUtils {\n function call(address to, uint256 value, bytes memory data)\n internal\n returns (bool success, bytes memory returnData)\n {\n assembly {\n success := call(gas(), to, value, add(data, 0x20), mload(data), 0, 0)\n let len := returndatasize()\n let ptr := mload(0x40)\n mstore(0x40, add(ptr, add(len, 0x20)))\n mstore(ptr, len)\n returndatacopy(add(ptr, 0x20), 0, len)\n returnData := ptr\n }\n }\n\n function revertWithData(bytes memory returnData) internal pure {\n assembly {\n revert(add(returnData, 32), mload(returnData))\n }\n }\n\n function callAndRevert(address to, uint256 value, bytes memory data) internal {\n (bool success, bytes memory returnData) = call(to, value, data);\n if (!success) {\n revertWithData(returnData);\n }\n }\n\n function callWithReturnDataOrRevert(address to, uint256 value, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returnData) = call(to, value, data);\n if (!success) {\n // bubble up revert reason\n revertWithData(returnData);\n }\n return returnData;\n }\n\n /// @dev Return data or revert.\n function delegateCall(address to, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returnData) = to.delegatecall(data);\n if (!success) {\n // bubble up revert reason\n revertWithData(returnData);\n }\n return returnData;\n }\n\n /// @dev Allocates memory for and retrieves return data from the previous external function call. The end of the\n /// allocated data may not be aligned to 32 bytes, which means the next free memory slot might fall somewhere\n /// between two 32-byte words. Therefore the memory address is aligned to the next 32-byte boundary to ensure\n /// efficient memory usage. The function also stores the size of the return data and copies the return data\n /// itself into the allocated memory.\n /// @return returnData the data returned by the last external function call.\n /// @notice The function ensures memory alignment by adding 63 (0x3f = 0x1f + 0x20) and clearing the last 5 bits,\n /// ensuring the memory is pushed to the nearest multiple of 32 bytes. This avoids unaligned memory access,\n /// which can lead to inefficiencies.\n function fetchReturnData() internal pure returns (bytes memory returnData) {\n assembly (\"memory-safe\") {\n // allocate memory for the return data starting at the free memory pointer\n returnData := mload(0x40)\n // update the free memory pointer after adding the size of the return data and ensuring it is aligned to the\n // next 32-byte boundary\n mstore(0x40, add(returnData, and(add(returndatasize(), 0x3f), not(0x1f))))\n // store the size of the return data at the start of the allocated memory\n mstore(returnData, returndatasize())\n // copy the return data to the allocated memory space\n returndatacopy(add(returnData, 0x20), 0, returndatasize())\n }\n }\n}\n"},"src/msca/6900/shared/common/Errors.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\n/**\n * @notice Throws when the caller is unexpected.\n */\nerror UnauthorizedCaller();\n\n/**\n * @notice Throws when the selector is not found.\n */\nerror NotFoundSelector();\n\n/**\n * @notice Throws when authorizer is invalid.\n */\nerror InvalidAuthorizer();\n\nerror InvalidValidationFunctionId(uint8 functionId);\n\nerror InvalidFunctionReference();\n\nerror ItemAlreadyExists();\n\nerror ItemDoesNotExist();\n\nerror InvalidLimit();\n\nerror InvalidExecutionFunction(bytes4 selector);\n\nerror InvalidInitializationInput();\n\nerror Create2FailedDeployment();\n\nerror InvalidLength();\n\nerror Unsupported();\n\nerror NotImplemented(bytes4 selector, uint8 functionId);\n\nerror InvalidItem();\n\n// v2 NotImplemented\nerror NotImplementedFunction(bytes4 selector, uint32 entityId);\n"},"src/msca/6900/shared/common/Structs.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\n/**\n * @dev Returned data from validateUserOp.\n * validateUserOp returns a uint256, with is created by `_packedValidationData` and parsed by `_parseValidationData`\n * @param validAfter - this UserOp is valid only after this timestamp.\n * @param validaUntil - this UserOp is valid only up to this timestamp.\n * @param authorizer - address(0) - the account validated the signature by itself.\n * address(1) - the account failed to validate the signature.\n * otherwise - this is an address of a signature aggregator that must be used to validate the\n * signature.\n */\nstruct ValidationData {\n uint48 validAfter;\n uint48 validUntil;\n address authorizer;\n}\n\nstruct AddressDLL {\n mapping(address => address) next;\n mapping(address => address) prev;\n uint256 count;\n}\n\nstruct Bytes4DLL {\n mapping(bytes4 => bytes4) next;\n mapping(bytes4 => bytes4) prev;\n uint256 count;\n}\n\nstruct Bytes32DLL {\n mapping(bytes32 => bytes32) next;\n mapping(bytes32 => bytes32) prev;\n uint256 count;\n}\n"},"src/msca/6900/shared/libs/AddressDLLLib.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {InvalidLimit, ItemAlreadyExists, ItemDoesNotExist} from \"../common/Errors.sol\";\nimport {AddressDLL} from \"../common/Structs.sol\";\n\n/**\n * @dev Enumerable & ordered doubly linked list built using mapping(address => address).\n * Item is expected to be unique.\n */\nlibrary AddressDLLLib {\n address constant SENTINEL_ADDRESS = address(0x0);\n uint160 constant SENTINEL_ADDRESS_UINT = 0;\n\n event AddressAdded(address indexed addr);\n event AddressRemoved(address indexed addr);\n\n error InvalidAddress();\n\n modifier validAddress(address addr) {\n if (uint160(addr) <= SENTINEL_ADDRESS_UINT) {\n revert InvalidAddress();\n }\n _;\n }\n\n /**\n * @dev Check if an item exists or not. O(1).\n */\n function contains(AddressDLL storage dll, address item) internal view returns (bool) {\n return getHead(dll) == item || dll.next[item] != address(0) || dll.prev[item] != address(0);\n }\n\n /**\n * @dev Get the count of dll. O(1).\n */\n function size(AddressDLL storage dll) internal view returns (uint256) {\n return dll.count;\n }\n\n /**\n * @dev Add an new item which did not exist before. Otherwise the function reverts. O(1).\n */\n function append(AddressDLL storage dll, address item) internal validAddress(item) returns (bool) {\n if (contains(dll, item)) {\n revert ItemAlreadyExists();\n }\n address prev = getTail(dll);\n address next = SENTINEL_ADDRESS;\n // prev.next = item\n dll.next[prev] = item;\n // item.next = next\n dll.next[item] = next;\n // next.prev = item\n dll.prev[next] = item;\n // item.prev = prev\n dll.prev[item] = prev;\n dll.count++;\n emit AddressAdded(item);\n return true;\n }\n\n /**\n * @dev Remove an already existing item. Otherwise the function reverts. O(1).\n */\n function remove(AddressDLL storage dll, address item) internal validAddress(item) returns (bool) {\n if (!contains(dll, item)) {\n revert ItemDoesNotExist();\n }\n // item.prev.next = item.next\n dll.next[dll.prev[item]] = dll.next[item];\n // item.next.prev = item.prev\n dll.prev[dll.next[item]] = dll.prev[item];\n delete dll.next[item];\n delete dll.prev[item];\n dll.count--;\n emit AddressRemoved(item);\n return true;\n }\n\n /**\n * @dev Return paginated addresses and next pointer address. O(n).\n * @param start Starting address, inclusive, if start == address(0x0), this method searches from the head.\n */\n function getPaginated(AddressDLL storage dll, address start, uint256 limit)\n internal\n view\n returns (address[] memory, address)\n {\n if (limit == 0) {\n revert InvalidLimit();\n }\n address[] memory results = new address[](limit);\n address current = start;\n if (start == address(0)) {\n current = getHead(dll);\n }\n uint256 count = 0;\n for (; count < limit && uint160(current) > SENTINEL_ADDRESS_UINT; ++count) {\n results[count] = current;\n current = dll.next[current];\n }\n assembly (\"memory-safe\") {\n mstore(results, count)\n }\n return (results, current);\n }\n\n /**\n * @dev Return all the data. O(n).\n */\n function getAll(AddressDLL storage dll) internal view returns (address[] memory results) {\n uint256 totalCount = size(dll);\n results = new address[](totalCount);\n uint256 accumulatedCount = 0;\n address startAddr = address(0x0);\n for (uint256 i = 0; i < totalCount; ++i) {\n (address[] memory currentResults, address nextAddr) = getPaginated(dll, startAddr, 10);\n for (uint256 j = 0; j < currentResults.length; ++j) {\n results[accumulatedCount++] = currentResults[j];\n }\n if (nextAddr == SENTINEL_ADDRESS) {\n break;\n }\n startAddr = nextAddr;\n }\n return results;\n }\n\n function getHead(AddressDLL storage dll) internal view returns (address) {\n return dll.next[SENTINEL_ADDRESS];\n }\n\n function getTail(AddressDLL storage dll) internal view returns (address) {\n return dll.prev[SENTINEL_ADDRESS];\n }\n}\n"},"src/msca/6900/shared/libs/ValidationDataLib.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {ValidationData} from \"../common/Structs.sol\";\n\nlibrary ValidationDataLib {\n error WrongTimeBounds();\n\n /**\n * @dev Intercept the time bounds [validAfter, validUntil], as well as signature validation result (favoring the\n * failure).\n */\n function _intersectValidationData(ValidationData memory a, uint256 uintb)\n internal\n pure\n returns (ValidationData memory validationData)\n {\n ValidationData memory b = _unpackValidationData(uintb);\n if (a.validAfter > a.validUntil) {\n revert WrongTimeBounds();\n }\n if (b.validAfter > b.validUntil) {\n revert WrongTimeBounds();\n }\n // 0 is successful validation\n if (a.authorizer == address(0)) {\n validationData.authorizer = b.authorizer;\n } else {\n validationData.authorizer = a.authorizer;\n }\n if (a.validAfter > b.validAfter) {\n validationData.validAfter = a.validAfter;\n } else {\n validationData.validAfter = b.validAfter;\n }\n if (a.validUntil < b.validUntil) {\n validationData.validUntil = a.validUntil;\n } else {\n validationData.validUntil = b.validUntil;\n }\n // make sure the caller (e.g. entryPoint) reverts\n if (validationData.validAfter >= validationData.validUntil) {\n validationData.authorizer = address(1);\n }\n return validationData;\n }\n\n /**\n * @dev Unpack into the deserialized packed format from validAfter | validUntil | authorizer.\n */\n function _unpackValidationData(uint256 validationDataInt)\n internal\n pure\n returns (ValidationData memory validationData)\n {\n address authorizer = address(uint160(validationDataInt));\n uint48 validUntil = uint48(validationDataInt >> 160);\n if (validUntil == 0) {\n validUntil = type(uint48).max;\n }\n uint48 validAfter = uint48(validationDataInt >> (48 + 160));\n return ValidationData(validAfter, validUntil, authorizer);\n }\n\n function _packValidationData(ValidationData memory data) internal pure returns (uint256) {\n return uint160(data.authorizer) | (uint256(data.validUntil) << 160) | (uint256(data.validAfter) << (160 + 48));\n }\n}\n"},"src/msca/6900/v0.7/common/Constants.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\n// magic value for runtime validation functions that always allow access\nbytes21 constant RUNTIME_VALIDATION_ALWAYS_ALLOW_FUNCTION_REFERENCE = bytes21(uint168(1));\n\n// magic value for hooks that should always revert\nbytes21 constant PRE_HOOK_ALWAYS_DENY_FUNCTION_REFERENCE = bytes21(uint168(2));\n"},"src/msca/6900/v0.7/common/Structs.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\n// Standard executor\nstruct Call {\n // The target address for the account to call.\n address target;\n // The value to send with the call.\n uint256 value;\n // The calldata for the call.\n bytes data;\n}\n\nstruct FunctionReference {\n address plugin;\n uint8 functionId;\n}\n\n// Account loupe\n// @notice Config for an execution function, given a selector\nstruct ExecutionFunctionConfig {\n address plugin;\n FunctionReference userOpValidationFunction;\n FunctionReference runtimeValidationFunction;\n}\n\n/// @notice Pre and post hooks for a given selector\n/// @dev It's possible for one of either `preExecHook` or `postExecHook` to be empty\nstruct ExecutionHooks {\n FunctionReference preExecHook;\n FunctionReference postExecHook;\n}\n\n// internal data structure\nstruct Bytes21DLL {\n mapping(bytes21 => bytes21) next;\n mapping(bytes21 => bytes21) prev;\n uint256 count;\n}\n\nstruct RepeatableBytes21DLL {\n mapping(bytes21 => bytes21) next;\n mapping(bytes21 => bytes21) prev;\n mapping(bytes21 => uint256) counter;\n // unique items\n uint256 uniqueItems;\n // total items with repeatable ones\n uint256 totalItems;\n}\n\n// Represents a set of pre and post hooks. Used to store execution hooks.\nstruct HookGroup {\n RepeatableBytes21DLL preHooks;\n // key = preExecHook.pack()\n mapping(bytes21 => RepeatableBytes21DLL) preToPostHooks;\n RepeatableBytes21DLL postOnlyHooks;\n}\n\n// plugin's permission to call external (to the account and its plugins) contracts and addresses\n// through `executeFromPluginExternal`\nstruct PermittedExternalCall {\n bool addressPermitted;\n // either anySelector or selectors permitted\n bool anySelector;\n mapping(bytes4 => bool) selectors;\n}\n\nstruct PostExecHookToRun {\n bytes preExecHookReturnData;\n FunctionReference postExecHook;\n}\n\n// plugin detail stored in wallet storage\nstruct PluginDetail {\n // permitted to call any external contracts and selectors\n bool anyExternalAddressPermitted;\n // boolean to indicate if the plugin can spend native tokens, if any of the execution function can spend\n // native tokens, a plugin is considered to be able to spend native tokens of the accounts\n bool canSpendNativeToken;\n // tracks the count this plugin has been used as a dependency function\n uint256 dependentCounter;\n bytes32 manifestHash;\n Bytes21DLL dependencies;\n}\n\n// execution detail associated with selector\nstruct ExecutionDetail {\n address plugin; // plugin address that implements the execution function, for native functions, the value should be\n // address(0)\n FunctionReference userOpValidationFunction;\n RepeatableBytes21DLL preUserOpValidationHooks;\n FunctionReference runtimeValidationFunction;\n RepeatableBytes21DLL preRuntimeValidationHooks;\n HookGroup executionHooks;\n}\n"},"src/msca/6900/v0.7/interfaces/IAccountLoupe.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport \"../common/Structs.sol\";\n\n/**\n * @dev Implements https://eips.ethereum.org/EIPS/eip-6900. MSCAs may implement this interface to support visibility in\n * plugin configurations on-chain.\n */\ninterface IAccountLoupe {\n /// @notice Get the validation functions and plugin address for a selector.\n /// @dev If the selector is a native function, the plugin address will be the address of the account.\n /// @param selector The selector to get the configuration for.\n /// @return The configuration for this selector.\n function getExecutionFunctionConfig(bytes4 selector) external view returns (ExecutionFunctionConfig memory);\n\n /// @notice Get the pre and post execution hooks for a selector.\n /// @param selector The selector to get the hooks for.\n /// @return The pre and post execution hooks for this selector.\n function getExecutionHooks(bytes4 selector) external view returns (ExecutionHooks[] memory);\n\n /// @notice Get the pre user op and runtime validation hooks associated with a selector.\n /// @param selector The selector to get the hooks for.\n /// @return preUserOpValidationHooks The pre user op validation hooks for this selector.\n /// @return preRuntimeValidationHooks The pre runtime validation hooks for this selector.\n function getPreValidationHooks(bytes4 selector)\n external\n view\n returns (FunctionReference[] memory, FunctionReference[] memory);\n\n /// @notice Get an array of all installed plugins.\n /// @return pluginAddresses The addresses of all installed plugins.\n function getInstalledPlugins() external view returns (address[] memory);\n}\n"},"src/msca/6900/v0.7/interfaces/IPlugin.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport \"../common/PluginManifest.sol\";\nimport \"../common/Structs.sol\";\nimport {PackedUserOperation} from \"@account-abstraction/contracts/interfaces/PackedUserOperation.sol\";\n\n/**\n * @dev Implements https://eips.ethereum.org/EIPS/eip-6900. Plugins must implement this interface to support plugin\n * management and interactions with MSCAs.\n */\ninterface IPlugin {\n /// @notice Initialize plugin data for the modular account.\n /// @dev Called by the modular account during `installPlugin`.\n /// @param data Optional bytes array to be decoded and used by the plugin to setup initial plugin data for the\n /// modular account.\n function onInstall(bytes calldata data) external;\n\n /// @notice Clear plugin data for the modular account.\n /// @dev Called by the modular account during `uninstallPlugin`.\n /// @param data Optional bytes array to be decoded and used by the plugin to clear plugin data for the modular\n /// account.\n function onUninstall(bytes calldata data) external;\n\n /// @notice Run the pre user operation validation hook specified by the `functionId`.\n /// @dev Pre user operation validation hooks MUST NOT return an authorizer value other than 0 or 1.\n /// @param functionId An identifier that routes the call to different internal implementations, should there be more\n /// than one.\n /// @param userOp The user operation.\n /// @param userOpHash The user operation hash.\n /// @return Packed validation data for validAfter (6 bytes), validUntil (6 bytes), and authorizer (20 bytes).\n function preUserOpValidationHook(uint8 functionId, PackedUserOperation calldata userOp, bytes32 userOpHash)\n external\n returns (uint256);\n\n /// @notice Run the user operation validationFunction specified by the `functionId`.\n /// @param functionId An identifier that routes the call to different internal implementations, should there be\n /// more than one.\n /// @param userOp The user operation.\n /// @param userOpHash The user operation hash.\n /// @return Packed validation data for validAfter (6 bytes), validUntil (6 bytes), and authorizer (20 bytes).\n function userOpValidationFunction(uint8 functionId, PackedUserOperation calldata userOp, bytes32 userOpHash)\n external\n returns (uint256);\n\n /// @notice Run the pre runtime validation hook specified by the `functionId`.\n /// @dev To indicate the entire call should revert, the function MUST revert.\n /// @param functionId An identifier that routes the call to different internal implementations, should there be more\n /// than one.\n /// @param sender The caller address.\n /// @param value The call value.\n /// @param data The calldata sent.\n function preRuntimeValidationHook(uint8 functionId, address sender, uint256 value, bytes calldata data) external;\n\n /// @notice Run the runtime validationFunction specified by the `functionId`.\n /// @dev To indicate the entire call should revert, the function MUST revert.\n /// @param functionId An identifier that routes the call to different internal implementations, should there be\n /// more than one.\n /// @param sender The caller address.\n /// @param value The call value.\n /// @param data The calldata sent.\n function runtimeValidationFunction(uint8 functionId, address sender, uint256 value, bytes calldata data) external;\n\n /// @notice Run the pre execution hook specified by the `functionId`.\n /// @dev To indicate the entire call should revert, the function MUST revert.\n /// @param functionId An identifier that routes the call to different internal implementations, should there be more\n /// than one.\n /// @param sender The caller address.\n /// @param value The call value.\n /// @param data The calldata sent.\n /// @return context Context to pass to a post execution hook, if present. An empty bytes array MAY be returned.\n function preExecutionHook(uint8 functionId, address sender, uint256 value, bytes calldata data)\n external\n returns (bytes memory context);\n\n /// @notice Run the post execution hook specified by the `functionId`.\n /// @dev To indicate the entire call should revert, the function MUST revert.\n /// @param functionId An identifier that routes the call to different internal implementations, should there be more\n /// than one.\n /// @param preExecHookData The context returned by its associated pre execution hook.\n function postExecutionHook(uint8 functionId, bytes calldata preExecHookData) external;\n\n /// @notice Describe the contents and intended configuration of the plugin.\n /// @dev This manifest MUST stay constant over time.\n /// @return A manifest describing the contents and intended configuration of the plugin.\n function pluginManifest() external pure returns (PluginManifest memory);\n\n /// @notice Describe the metadata of the plugin.\n /// @dev This metadata MUST stay constant over time.\n /// @return A metadata struct describing the plugin.\n function pluginMetadata() external pure returns (PluginMetadata memory);\n}\n"},"src/msca/6900/v0.7/interfaces/IPluginExecutor.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\n/**\n * @dev Implements https://eips.ethereum.org/EIPS/eip-6900. MSCAs must implement this interface to support execution\n * from plugins.\n */\ninterface IPluginExecutor {\n /// @notice Execute a call from a plugin through the account.\n /// @dev Permissions must be granted to the calling plugin for the call to go through.\n /// @param data The calldata to send to the account.\n function executeFromPlugin(bytes calldata data) external payable returns (bytes memory);\n\n /// @notice Execute a call from a plugin to a non-plugin address.\n /// @dev If the target is a plugin, the call SHOULD revert. Permissions must be granted to the calling plugin\n /// for the call to go through.\n /// @param target The address to be called.\n /// @param value The value to send with the call.\n /// @param data The calldata to send to the target.\n /// @return The return data from the call.\n function executeFromPluginExternal(address target, uint256 value, bytes calldata data)\n external\n payable\n returns (bytes memory);\n}\n"},"src/msca/6900/v0.7/interfaces/IPluginManager.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport \"../common/Structs.sol\";\n\n/**\n * @dev Implements https://eips.ethereum.org/EIPS/eip-6900. MSCAs must implement this interface to support installing\n * and uninstalling plugins.\n */\ninterface IPluginManager {\n event PluginInstalled(address indexed plugin, bytes32 manifestHash, FunctionReference[] dependencies);\n event PluginUninstalled(address indexed plugin, bool indexed onUninstallSucceeded);\n\n /// @notice Install a plugin to the modular account.\n /// @param plugin The plugin to install.\n /// @param manifestHash The hash of the plugin manifest.\n /// @param pluginInstallData Optional data to be decoded and used by the plugin to setup initial plugin data\n /// for the modular account.\n /// @param dependencies The dependencies of the plugin, as described in the manifest. Each FunctionReference\n /// MUST be composed of an installed plugin's address and a function ID of its validation function.\n function installPlugin(\n address plugin,\n bytes32 manifestHash,\n bytes calldata pluginInstallData,\n FunctionReference[] calldata dependencies\n ) external;\n\n /// @notice Uninstall a plugin from the modular account.\n /// @param plugin The plugin to uninstall.\n /// @param config An optional, implementation-specific field that accounts may use to ensure consistency\n /// guarantees.\n /// @param pluginUninstallData Optional data to be decoded and used by the plugin to clear plugin data for the\n /// modular account.\n function uninstallPlugin(address plugin, bytes calldata config, bytes calldata pluginUninstallData) external;\n}\n"},"src/msca/6900/v0.7/libs/ExecutionHookLib.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {EMPTY_FUNCTION_REFERENCE, SENTINEL_BYTES21} from \"../../../../common/Constants.sol\";\nimport {InvalidValidationFunctionId} from \"../../shared/common/Errors.sol\";\nimport {\n PRE_HOOK_ALWAYS_DENY_FUNCTION_REFERENCE,\n RUNTIME_VALIDATION_ALWAYS_ALLOW_FUNCTION_REFERENCE\n} from \"../common/Constants.sol\";\nimport \"../common/Structs.sol\";\nimport {IPlugin} from \"../interfaces/IPlugin.sol\";\nimport {FunctionReferenceLib} from \"./FunctionReferenceLib.sol\";\nimport {RepeatableFunctionReferenceDLLLib} from \"./RepeatableFunctionReferenceDLLLib.sol\";\n\n/**\n * @dev Process pre or post execution hooks.\n */\nlibrary ExecutionHookLib {\n using RepeatableFunctionReferenceDLLLib for RepeatableBytes21DLL;\n using FunctionReferenceLib for FunctionReference;\n using FunctionReferenceLib for bytes21;\n\n error PreExecHookFailed(address plugin, uint8 functionId, bytes revertReason);\n error PostExecHookFailed(address plugin, uint8 functionId, bytes revertReason);\n\n // avoid stack too deep\n struct SetPostExecHooksFromPreHooksParam {\n uint256 totalPostExecHooksToRunCount;\n PostExecHookToRun[] postExecHooksToRun;\n }\n\n function _processPreExecHooks(HookGroup storage hookGroup, bytes calldata data)\n internal\n returns (PostExecHookToRun[] memory postExecHooksToRun)\n {\n uint256 postOnlyHooksCount = hookGroup.postOnlyHooks.getUniqueItems();\n // hooks have three categories a. preOnlyHook b. preToPostHook c. postOnlyHook\n // 1. add repeated preHook into postHook 2. add postOnlyHooks\n uint256 maxPostHooksCount = postOnlyHooksCount + hookGroup.preHooks.getTotalItems();\n uint256 totalPostExecHooksToRunCount = 0;\n postExecHooksToRun = new PostExecHookToRun[](maxPostHooksCount);\n // copy postOnlyHooks into result first\n FunctionReference memory startHook = EMPTY_FUNCTION_REFERENCE.unpack();\n for (uint256 i = 0; i < postOnlyHooksCount; ++i) {\n (FunctionReference[] memory resultPostOnlyHooks, FunctionReference memory nextHook) =\n hookGroup.postOnlyHooks.getPaginated(startHook, 10);\n for (uint256 j = 0; j < resultPostOnlyHooks.length; ++j) {\n postExecHooksToRun[totalPostExecHooksToRunCount++].postExecHook = resultPostOnlyHooks[j];\n }\n if (nextHook.pack() == SENTINEL_BYTES21) {\n break;\n }\n startHook = nextHook;\n }\n // then run the preHooks and copy associated postHooks\n SetPostExecHooksFromPreHooksParam memory input;\n input.totalPostExecHooksToRunCount = totalPostExecHooksToRunCount;\n input.postExecHooksToRun = postExecHooksToRun;\n (totalPostExecHooksToRunCount, postExecHooksToRun) = _setPostExecHooksFromPreHooks(hookGroup, data, input);\n assembly (\"memory-safe\") {\n mstore(postExecHooksToRun, totalPostExecHooksToRunCount)\n }\n }\n\n function _processPreExecHook(FunctionReference memory preExecHook, bytes calldata data)\n internal\n returns (bytes memory preExecHookReturnData)\n {\n try IPlugin(preExecHook.plugin).preExecutionHook(preExecHook.functionId, msg.sender, msg.value, data) returns (\n bytes memory returnData\n ) {\n preExecHookReturnData = returnData;\n } catch (bytes memory revertReason) {\n revert PreExecHookFailed(preExecHook.plugin, preExecHook.functionId, revertReason);\n }\n return preExecHookReturnData;\n }\n\n function _processPostExecHooks(PostExecHookToRun[] memory postExecHooksToRun) internal {\n uint256 length = postExecHooksToRun.length;\n for (uint256 i = 0; i < length; ++i) {\n FunctionReference memory postExecHook = postExecHooksToRun[i].postExecHook;\n try IPlugin(postExecHook.plugin).postExecutionHook(\n postExecHook.functionId, postExecHooksToRun[i].preExecHookReturnData\n ) {} catch (bytes memory revertReason) {\n revert PostExecHookFailed(postExecHook.plugin, postExecHook.functionId, revertReason);\n }\n }\n }\n\n function _getExecutionHooks(HookGroup storage hookGroup) internal view returns (ExecutionHooks[] memory hooks) {\n uint256 preHooksCount = hookGroup.preHooks.getUniqueItems();\n uint256 postOnlyHooksCount = hookGroup.postOnlyHooks.getUniqueItems();\n // hooks have three categories a. preOnlyHook b. preToPostHook c. postOnlyHook\n // 1. add repeated preHook into postHook 2. add postOnlyHooks\n uint256 maxExecHooksCount = postOnlyHooksCount + hookGroup.preHooks.getTotalItems();\n uint256 totalExecHooksCount = 0;\n hooks = new ExecutionHooks[](maxExecHooksCount);\n // copy postOnlyHooks into result first\n FunctionReference memory startHook = EMPTY_FUNCTION_REFERENCE.unpack();\n for (uint256 i = 0; i < postOnlyHooksCount; ++i) {\n (FunctionReference[] memory resultPostOnlyHooks, FunctionReference memory nextHook) =\n hookGroup.postOnlyHooks.getPaginated(startHook, 10);\n for (uint256 j = 0; j < resultPostOnlyHooks.length; ++j) {\n hooks[totalExecHooksCount++].postExecHook = resultPostOnlyHooks[j];\n }\n if (nextHook.pack() == SENTINEL_BYTES21) {\n break;\n }\n startHook = nextHook;\n }\n // then copy preOnlyHooks or preToPostHooks\n startHook = EMPTY_FUNCTION_REFERENCE.unpack();\n for (uint256 i = 0; i < preHooksCount; ++i) {\n (FunctionReference[] memory resultPreExecHooks, FunctionReference memory nextHook) =\n hookGroup.preHooks.getPaginated(startHook, 10);\n for (uint256 j = 0; j < resultPreExecHooks.length; ++j) {\n // if any revert, the outer call MUST revert\n bytes21 packedPreExecHook = resultPreExecHooks[j].pack();\n // getAll can handle 1000+ hooks\n FunctionReference[] memory preToPostHooks = hookGroup.preToPostHooks[packedPreExecHook].getAll();\n if (preToPostHooks.length > 0) {\n for (uint256 k = 0; k < preToPostHooks.length; ++k) {\n hooks[totalExecHooksCount].preExecHook = resultPreExecHooks[j];\n hooks[totalExecHooksCount].postExecHook = preToPostHooks[k];\n totalExecHooksCount++;\n }\n } else {\n // no associated postHook\n hooks[totalExecHooksCount++].preExecHook = resultPreExecHooks[j];\n }\n }\n if (nextHook.pack() == SENTINEL_BYTES21) {\n break;\n }\n startHook = nextHook;\n }\n assembly (\"memory-safe\") {\n mstore(hooks, totalExecHooksCount)\n }\n return hooks;\n }\n\n /// @dev The caller would expect both input.totalPostExecHooksToRunCount and input.postExecHooksToRun to be assigned\n /// back to original values.\n function _setPostExecHooksFromPreHooks(\n HookGroup storage hookGroup,\n bytes calldata data,\n SetPostExecHooksFromPreHooksParam memory input\n ) internal returns (uint256, PostExecHookToRun[] memory) {\n FunctionReference memory startHook = EMPTY_FUNCTION_REFERENCE.unpack();\n uint256 preHooksCount = hookGroup.preHooks.getUniqueItems();\n for (uint256 i = 0; i < preHooksCount; ++i) {\n (FunctionReference[] memory resultPreExecHooks, FunctionReference memory nextHook) =\n hookGroup.preHooks.getPaginated(startHook, 10);\n for (uint256 j = 0; j < resultPreExecHooks.length; ++j) {\n // if any revert, the outer call MUST revert\n bytes21 packedPreExecHook = resultPreExecHooks[j].pack();\n if (\n packedPreExecHook == EMPTY_FUNCTION_REFERENCE\n || packedPreExecHook == RUNTIME_VALIDATION_ALWAYS_ALLOW_FUNCTION_REFERENCE\n || packedPreExecHook == PRE_HOOK_ALWAYS_DENY_FUNCTION_REFERENCE\n ) {\n revert InvalidValidationFunctionId(resultPreExecHooks[j].functionId);\n }\n // getAll can handle 1000+ hooks\n // run duplicated (if any) preHooks only once\n bytes memory preExecHookReturnData = _processPreExecHook(resultPreExecHooks[j], data);\n FunctionReference[] memory preToPostHooks = hookGroup.preToPostHooks[packedPreExecHook].getAll();\n if (preToPostHooks.length > 0) {\n for (uint256 k = 0; k < preToPostHooks.length; ++k) {\n input.postExecHooksToRun[input.totalPostExecHooksToRunCount].postExecHook = preToPostHooks[k];\n input.postExecHooksToRun[input.totalPostExecHooksToRunCount].preExecHookReturnData =\n preExecHookReturnData;\n input.totalPostExecHooksToRunCount++;\n }\n }\n }\n if (nextHook.pack() == SENTINEL_BYTES21) {\n break;\n }\n startHook = nextHook;\n }\n return (input.totalPostExecHooksToRunCount, input.postExecHooksToRun);\n }\n}\n"},"src/msca/6900/v0.7/libs/FunctionReferenceLib.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport \"../common/Structs.sol\";\n\nlibrary FunctionReferenceLib {\n function unpack(bytes21 frBytes) internal pure returns (FunctionReference memory) {\n return FunctionReference(address(bytes20(frBytes)), uint8(bytes1(frBytes << 160)));\n }\n\n function pack(FunctionReference memory functionReference) internal pure returns (bytes21) {\n return (bytes21(bytes20(functionReference.plugin)) | bytes21(uint168(functionReference.functionId)));\n }\n}\n"},"src/msca/6900/v0.7/libs/RepeatableFunctionReferenceDLLLib.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {EMPTY_FUNCTION_REFERENCE, SENTINEL_BYTES21} from \"../../../../common/Constants.sol\";\nimport {InvalidFunctionReference, InvalidLimit, ItemDoesNotExist} from \"../../shared/common/Errors.sol\";\nimport \"../common/Structs.sol\";\nimport {FunctionReferenceLib} from \"./FunctionReferenceLib.sol\";\n\n/**\n * @dev Enumerable & ordered doubly linked list built using RepeatableBytes21DLL.\n * Item is expected to be have a counter that tracks repeated number.\n */\nlibrary RepeatableFunctionReferenceDLLLib {\n using FunctionReferenceLib for FunctionReference;\n using FunctionReferenceLib for bytes21;\n\n modifier validFunctionReference(FunctionReference memory fr) {\n if (fr.pack() <= SENTINEL_BYTES21) {\n revert InvalidFunctionReference();\n }\n _;\n }\n\n /**\n * @dev Check the counter of an item. O(1).\n * @return the counter\n */\n function getRepeatedCount(RepeatableBytes21DLL storage dll, FunctionReference memory fr)\n internal\n view\n returns (uint256)\n {\n bytes21 item = fr.pack();\n if (item == SENTINEL_BYTES21) {\n return 1;\n }\n return dll.counter[item];\n }\n\n /**\n * @dev Get the total items of dll. O(1).\n */\n function getTotalItems(RepeatableBytes21DLL storage dll) internal view returns (uint256) {\n return dll.totalItems;\n }\n\n /**\n * @dev Get the unique items of dll. O(1).\n */\n function getUniqueItems(RepeatableBytes21DLL storage dll) internal view returns (uint256) {\n return dll.uniqueItems;\n }\n\n /**\n * @dev Add an new item. O(1).\n */\n function append(RepeatableBytes21DLL storage dll, FunctionReference memory fr)\n internal\n validFunctionReference(fr)\n returns (uint256)\n {\n bytes21 item = fr.pack();\n uint256 currentCount = getRepeatedCount(dll, fr);\n if (currentCount == 0) {\n bytes21 prev = getTailWithoutUnpack(dll);\n bytes21 next = SENTINEL_BYTES21;\n // prev.next = item\n dll.next[prev] = item;\n // item.next = next\n dll.next[item] = next;\n // next.prev = item\n dll.prev[next] = item;\n // item.prev = prev\n dll.prev[item] = prev;\n dll.uniqueItems++;\n }\n dll.counter[item]++;\n dll.totalItems++;\n return dll.counter[item];\n }\n\n /**\n * @dev Remove or decrease the counter of already existing item. Otherwise the function reverts. O(1).\n */\n function remove(RepeatableBytes21DLL storage dll, FunctionReference memory fr)\n internal\n validFunctionReference(fr)\n returns (uint256)\n {\n uint256 currentCount = getRepeatedCount(dll, fr);\n if (currentCount == 0) {\n revert ItemDoesNotExist();\n }\n bytes21 item = fr.pack();\n if (currentCount == 1) {\n // delete the item\n // item.prev.next = item.next\n dll.next[dll.prev[item]] = dll.next[item];\n // item.next.prev = item.prev\n dll.prev[dll.next[item]] = dll.prev[item];\n delete dll.next[item];\n delete dll.prev[item];\n delete dll.counter[item];\n dll.uniqueItems--;\n } else {\n dll.counter[item]--;\n }\n dll.totalItems--;\n return dll.counter[item];\n }\n\n /**\n * @dev Remove all copies of already existing items. O(1).\n */\n function removeAllRepeated(RepeatableBytes21DLL storage dll, FunctionReference memory fr)\n internal\n validFunctionReference(fr)\n returns (bool)\n {\n uint256 currentCount = getRepeatedCount(dll, fr);\n if (currentCount == 0) {\n revert ItemDoesNotExist();\n }\n bytes21 item = fr.pack();\n // item.prev.next = item.next\n dll.next[dll.prev[item]] = dll.next[item];\n // item.next.prev = item.prev\n dll.prev[dll.next[item]] = dll.prev[item];\n delete dll.next[item];\n delete dll.prev[item];\n delete dll.counter[item];\n dll.uniqueItems--;\n dll.totalItems -= currentCount;\n return true;\n }\n\n /**\n * @dev Return paginated results and next pointer without counter information. O(n).\n * In order to get counter information (which our current use case does not need), please call\n * getRepeatedCount.\n * @param startFR Starting item, inclusive, if start == bytes21(0), this method searches from the head.\n */\n function getPaginated(RepeatableBytes21DLL storage dll, FunctionReference memory startFR, uint256 limit)\n internal\n view\n returns (FunctionReference[] memory, FunctionReference memory)\n {\n if (limit == 0) {\n revert InvalidLimit();\n }\n bytes21 start = startFR.pack();\n FunctionReference[] memory results = new FunctionReference[](limit);\n bytes21 current = start;\n if (start == SENTINEL_BYTES21) {\n current = getHeadWithoutUnpack(dll);\n }\n uint256 count = 0;\n for (; count < limit && current > SENTINEL_BYTES21; ++count) {\n results[count] = current.unpack();\n current = dll.next[current];\n }\n assembly (\"memory-safe\") {\n mstore(results, count)\n }\n return (results, current.unpack());\n }\n\n /**\n * @dev Return all the unique items without counter information. O(n).\n * In order to get counter information (which our current use case does not need), please call\n * getRepeatedCount.\n */\n function getAll(RepeatableBytes21DLL storage dll) internal view returns (FunctionReference[] memory results) {\n uint256 totalUniqueCount = getUniqueItems(dll);\n results = new FunctionReference[](totalUniqueCount);\n uint256 accumulatedCount = 0;\n FunctionReference memory startFR = EMPTY_FUNCTION_REFERENCE.unpack();\n for (uint256 i = 0; i < totalUniqueCount; ++i) {\n (FunctionReference[] memory currentResults, FunctionReference memory nextFR) =\n getPaginated(dll, startFR, 10);\n for (uint256 j = 0; j < currentResults.length; ++j) {\n results[accumulatedCount++] = currentResults[j];\n }\n if (nextFR.pack() == SENTINEL_BYTES21) {\n break;\n }\n startFR = nextFR;\n }\n return results;\n }\n\n function getHead(RepeatableBytes21DLL storage dll) internal view returns (FunctionReference memory) {\n return dll.next[SENTINEL_BYTES21].unpack();\n }\n\n function getTail(RepeatableBytes21DLL storage dll) internal view returns (FunctionReference memory) {\n return dll.prev[SENTINEL_BYTES21].unpack();\n }\n\n function getHeadWithoutUnpack(RepeatableBytes21DLL storage dll) private view returns (bytes21) {\n return dll.next[SENTINEL_BYTES21];\n }\n\n function getTailWithoutUnpack(RepeatableBytes21DLL storage dll) private view returns (bytes21) {\n return dll.prev[SENTINEL_BYTES21];\n }\n}\n"},"src/msca/6900/v0.7/libs/SelectorRegistryLib.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {IAccountLoupe} from \"../interfaces/IAccountLoupe.sol\";\n\nimport {IPlugin} from \"../interfaces/IPlugin.sol\";\nimport {IPluginExecutor} from \"../interfaces/IPluginExecutor.sol\";\nimport {IPluginManager} from \"../interfaces/IPluginManager.sol\";\nimport {IStandardExecutor} from \"../interfaces/IStandardExecutor.sol\";\nimport {IAggregator} from \"@account-abstraction/contracts/interfaces/IAggregator.sol\";\nimport {IPaymaster} from \"@account-abstraction/contracts/interfaces/IPaymaster.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\n\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nlibrary SelectorRegistryLib {\n bytes4 internal constant INITIALIZE_UPGRADABLE_MSCA =\n bytes4(keccak256(\"initializeUpgradableMSCA(address[],bytes32[],bytes[])\"));\n bytes4 internal constant INITIALIZE_SINGLE_OWNER_MSCA = bytes4(keccak256(\"initializeSingleOwnerMSCA(address)\"));\n bytes4 internal constant TRANSFER_NATIVE_OWNERSHIP = bytes4(keccak256(\"transferNativeOwnership(address)\"));\n bytes4 internal constant RENOUNCE_NATIVE_OWNERSHIP = bytes4(keccak256(\"renounceNativeOwnership()\"));\n bytes4 internal constant GET_NATIVE_OWNER = bytes4(keccak256(\"getNativeOwner()\"));\n bytes4 internal constant VALIDATE_USER_OP = bytes4(keccak256(\"validateUserOp(UserOperation,bytes32,uint256)\"));\n bytes4 internal constant GET_ENTRYPOINT = bytes4(keccak256(\"getEntryPoint()\"));\n bytes4 internal constant GET_NONCE = bytes4(keccak256(\"getNonce()\"));\n\n /**\n * @dev Check if the selector is for native function.\n * @param selector the function selector.\n */\n function _isNativeFunctionSelector(bytes4 selector) internal pure returns (bool) {\n return selector == IStandardExecutor.execute.selector || selector == IStandardExecutor.executeBatch.selector\n || selector == IPluginManager.installPlugin.selector || selector == IPluginManager.uninstallPlugin.selector\n || selector == UUPSUpgradeable.upgradeToAndCall.selector || selector == UUPSUpgradeable.proxiableUUID.selector\n // check against IERC165 methods\n || selector == IERC165.supportsInterface.selector\n // check against IPluginExecutor methods\n || selector == IPluginExecutor.executeFromPlugin.selector\n || selector == IPluginExecutor.executeFromPluginExternal.selector\n // check against IAccountLoupe methods\n || selector == IAccountLoupe.getExecutionFunctionConfig.selector\n || selector == IAccountLoupe.getExecutionHooks.selector\n || selector == IAccountLoupe.getPreValidationHooks.selector\n || selector == IAccountLoupe.getInstalledPlugins.selector || selector == VALIDATE_USER_OP\n || selector == GET_ENTRYPOINT || selector == GET_NONCE || selector == INITIALIZE_UPGRADABLE_MSCA\n || selector == INITIALIZE_SINGLE_OWNER_MSCA || selector == TRANSFER_NATIVE_OWNERSHIP\n || selector == RENOUNCE_NATIVE_OWNERSHIP || selector == GET_NATIVE_OWNER;\n }\n\n function _isErc4337FunctionSelector(bytes4 selector) internal pure returns (bool) {\n return selector == IAggregator.validateSignatures.selector\n || selector == IAggregator.validateUserOpSignature.selector\n || selector == IAggregator.aggregateSignatures.selector\n || selector == IPaymaster.validatePaymasterUserOp.selector || selector == IPaymaster.postOp.selector;\n }\n\n function _isIPluginFunctionSelector(bytes4 selector) internal pure returns (bool) {\n return selector == IPlugin.onInstall.selector || selector == IPlugin.onUninstall.selector\n || selector == IPlugin.preUserOpValidationHook.selector || selector == IPlugin.userOpValidationFunction.selector\n || selector == IPlugin.preRuntimeValidationHook.selector\n || selector == IPlugin.runtimeValidationFunction.selector || selector == IPlugin.preExecutionHook.selector\n || selector == IPlugin.postExecutionHook.selector || selector == IPlugin.pluginManifest.selector\n || selector == IPlugin.pluginMetadata.selector;\n }\n}\n"},"src/msca/6900/v0.7/libs/WalletStorageV1Lib.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {AddressDLL} from \"../../shared/common/Structs.sol\";\nimport \"../common/Structs.sol\";\n\n/// @dev The same storage will be used for v1.x.y of MSCAs.\nlibrary WalletStorageV1Lib {\n // keccak256 hash of \"circle.msca.v1.storage\" subtracted by 1\n bytes32 constant WALLET_STORAGE_SLOT = 0xc6a0cc20c824c4eecc4b0fbb7fb297d07492a7bd12c83d4fa4d27b4249f9bfc8;\n\n struct Layout {\n // installed plugin addresses for quick query\n AddressDLL installedPlugins;\n // installed plugin details such as manifest, dependencies\n mapping(address => PluginDetail) pluginDetails;\n // permissions for executeFromPlugin into another plugin\n // callingPluginAddress => callingExecutionSelector => permittedOrNot\n mapping(address => mapping(bytes4 => bool)) permittedPluginCalls;\n // permissions for executeFromPluginExternal into external contract\n // callingPluginAddress => targetContractAddress => permission\n mapping(address => mapping(address => PermittedExternalCall)) permittedExternalCalls;\n // list of ERC-165 interfaceIds to add to account to support introspection checks\n // interfaceId => counter\n mapping(bytes4 => uint256) supportedInterfaces;\n // find plugin or native function execution detail by selector\n mapping(bytes4 => ExecutionDetail) executionDetails;\n /// indicates that the contract has been initialized\n uint8 initialized;\n /// indicates that the contract is in the process of being initialized\n bool initializing;\n // optional fields\n address owner;\n }\n\n /**\n * @dev Function to read structured wallet storage.\n */\n function getLayout() internal pure returns (Layout storage walletStorage) {\n assembly (\"memory-safe\") {\n walletStorage.slot := WALLET_STORAGE_SLOT\n }\n }\n}\n"},"src/msca/6900/v0.7/managers/PluginExecutor.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {ExecutionUtils} from \"../../../../utils/ExecutionUtils.sol\";\nimport {InvalidExecutionFunction, NotFoundSelector} from \"../../shared/common/Errors.sol\";\nimport \"../common/Structs.sol\";\nimport {IPlugin} from \"../interfaces/IPlugin.sol\";\nimport {IPluginExecutor} from \"../interfaces/IPluginExecutor.sol\";\nimport {ExecutionHookLib} from \"../libs/ExecutionHookLib.sol\";\nimport {WalletStorageV1Lib} from \"../libs/WalletStorageV1Lib.sol\";\nimport {ERC165Checker} from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\n/**\n * @dev Default implementation of https://eips.ethereum.org/EIPS/eip-6900. MSCAs must implement this interface to\n * support execution from plugins.\n * https://eips.ethereum.org/assets/eip-6900/Plugin_Execution_Flow.svg\n */\nlibrary PluginExecutor {\n using ExecutionHookLib for HookGroup;\n using ExecutionHookLib for PostExecHookToRun[];\n using ExecutionUtils for address;\n\n error ExecuteFromPluginToExternalNotPermitted();\n error ExecFromPluginToSelectorNotPermitted(address plugin, bytes4 selector);\n error NativeTokenSpendingNotPermitted(address plugin);\n\n /// @dev Refer to IPluginExecutor\n function executeFromPlugin(bytes calldata data) internal returns (bytes memory) {\n if (data.length < 4) {\n revert NotFoundSelector();\n }\n bytes4 selector = bytes4(data[0:4]);\n if (selector == bytes4(0)) {\n revert NotFoundSelector();\n }\n address callingPlugin = msg.sender;\n WalletStorageV1Lib.Layout storage walletStorage = WalletStorageV1Lib.getLayout();\n // permission check\n if (!walletStorage.permittedPluginCalls[callingPlugin][selector]) {\n revert ExecFromPluginToSelectorNotPermitted(callingPlugin, selector);\n }\n // this function call emulates a call to the fallback that routes calls into another plugin;\n // we use inner data here instead of the entire msg.data that includes the complete calldata of\n // executeFromPlugin\n ExecutionDetail storage executionDetail = walletStorage.executionDetails[selector];\n if (executionDetail.plugin == address(0)) {\n revert InvalidExecutionFunction(selector);\n }\n // pre execution hooks\n PostExecHookToRun[] memory postExecHooks = executionDetail.executionHooks._processPreExecHooks(data);\n // permitted to call the other plugin\n bytes memory returnData = executionDetail.plugin.callWithReturnDataOrRevert(0, data);\n // post execution hooks\n postExecHooks._processPostExecHooks();\n return returnData;\n }\n\n /// @dev Refer to IPluginExecutor\n function executeFromPluginToExternal(bytes calldata data, address target, uint256 value)\n internal\n returns (bytes memory)\n {\n if (target == address(this) || ERC165Checker.supportsInterface(target, type(IPlugin).interfaceId)) {\n revert ExecuteFromPluginToExternalNotPermitted();\n }\n WalletStorageV1Lib.Layout storage walletStorage = WalletStorageV1Lib.getLayout();\n address callingPlugin = msg.sender;\n // revert if the plugin can't cover the value and is not permitted to spend MSCA's native token\n if (value > 0 && value > msg.value && !walletStorage.pluginDetails[callingPlugin].canSpendNativeToken) {\n revert NativeTokenSpendingNotPermitted(callingPlugin);\n }\n PermittedExternalCall storage permittedExternalCall =\n walletStorage.permittedExternalCalls[callingPlugin][target];\n // permission check\n // addressPermitted can only be true if anyExternalAddressPermitted is false\n bool targetContractCallPermitted;\n // external call might not have function selector\n bytes4 selector = bytes4(data);\n if (permittedExternalCall.addressPermitted) {\n targetContractCallPermitted =\n permittedExternalCall.anySelector || permittedExternalCall.selectors[selector] || data.length == 0;\n } else {\n // also need to check the default permission in plugin detail\n targetContractCallPermitted = walletStorage.pluginDetails[callingPlugin].anyExternalAddressPermitted;\n }\n if (!targetContractCallPermitted) {\n revert ExecFromPluginToSelectorNotPermitted(callingPlugin, selector);\n }\n // we use msg.data here so the complete calldata of current function call executeFromPluginToExternalContract\n // can be passed\n // pre executeFromPluginToExternalContract hooks\n // process any pre exec hooks for IPluginExecutor.executeFromPluginExternal.selector during runtime\n PostExecHookToRun[] memory postExecHooks = walletStorage.executionDetails[IPluginExecutor\n .executeFromPluginExternal\n .selector].executionHooks._processPreExecHooks(msg.data);\n // call externally\n bytes memory returnData = target.callWithReturnDataOrRevert(value, data);\n // post executeFromPluginToExternalContract hooks\n postExecHooks._processPostExecHooks();\n return returnData;\n }\n}\n"},"src/msca/6900/v0.7/managers/PluginManager.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {EMPTY_FUNCTION_REFERENCE} from \"../../../../common/Constants.sol\";\nimport {InvalidFunctionReference} from \"../../shared/common/Errors.sol\";\nimport {AddressDLL} from \"../../shared/common/Structs.sol\";\nimport {AddressDLLLib} from \"../../shared/libs/AddressDLLLib.sol\";\nimport {\n PRE_HOOK_ALWAYS_DENY_FUNCTION_REFERENCE,\n RUNTIME_VALIDATION_ALWAYS_ALLOW_FUNCTION_REFERENCE\n} from \"../common/Constants.sol\";\nimport \"../common/PluginManifest.sol\";\nimport \"../common/Structs.sol\";\nimport {IPlugin} from \"../interfaces/IPlugin.sol\";\nimport {FunctionReferenceDLLLib} from \"../libs/FunctionReferenceDLLLib.sol\";\nimport {FunctionReferenceLib} from \"../libs/FunctionReferenceLib.sol\";\nimport {RepeatableFunctionReferenceDLLLib} from \"../libs/RepeatableFunctionReferenceDLLLib.sol\";\nimport {SelectorRegistryLib} from \"../libs/SelectorRegistryLib.sol\";\nimport {WalletStorageV1Lib} from \"../libs/WalletStorageV1Lib.sol\";\nimport {ERC165Checker} from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\n/**\n * @dev Default implementation of https://eips.ethereum.org/EIPS/eip-6900. MSCAs must implement this interface to\n * support installing and uninstalling plugins.\n */\ncontract PluginManager {\n using AddressDLLLib for AddressDLL;\n using FunctionReferenceDLLLib for Bytes21DLL;\n using RepeatableFunctionReferenceDLLLib for RepeatableBytes21DLL;\n using FunctionReferenceLib for FunctionReference;\n using FunctionReferenceLib for bytes21;\n using SelectorRegistryLib for bytes4;\n\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n address private immutable __self = address(this);\n\n enum AssociatedFunctionType {\n HOOK,\n VALIDATION_FUNCTION\n }\n\n error PluginNotImplementInterface();\n error InvalidPluginManifest();\n error InvalidPluginManifestHash();\n error InvalidPluginDependency(address plugin);\n error PluginUsedByOthers(address plugin);\n error ExecutionDetailAlreadySet(address plugin, bytes4 selector);\n error ExecuteFromPluginExternalAlreadySet(address plugin, address externalAddress);\n error ExecuteFromPluginExternalAlreadyUnset(address plugin, address externalAddress);\n error ValidationFunctionAlreadySet(bytes4 selector);\n error FailToCallOnInstall(address plugin, bytes revertReason);\n error OnlyDelegated();\n error HookDependencyNotPermitted();\n error InvalidExecutionSelector(address plugin, bytes4 selector);\n\n modifier onlyDelegated() {\n if (address(this) == __self) {\n revert OnlyDelegated();\n }\n _;\n }\n\n /// @dev Refer to IPluginManager\n function install(\n address plugin,\n bytes32 manifestHash,\n bytes memory pluginInstallData,\n FunctionReference[] memory dependencies,\n address msca\n ) external onlyDelegated {\n // revert if the plugin does not implement ERC-165 or does not support the IPlugin interface\n if (!ERC165Checker.supportsInterface(plugin, type(IPlugin).interfaceId)) {\n revert PluginNotImplementInterface();\n }\n WalletStorageV1Lib.Layout storage storageLayout = WalletStorageV1Lib.getLayout();\n // revert internally if the plugin has already been installed on the modular account\n storageLayout.installedPlugins.append(plugin);\n IPlugin pluginToInstall = IPlugin(plugin);\n // revert if manifestHash does not match the computed Keccak-256 hash of the plugin’s returned manifest\n PluginManifest memory pluginManifest = pluginToInstall.pluginManifest();\n if (manifestHash != keccak256(abi.encode(pluginManifest))) {\n revert InvalidPluginManifestHash();\n }\n // store the plugin manifest hash\n storageLayout.pluginDetails[plugin].manifestHash = manifestHash;\n uint256 length = pluginManifest.interfaceIds.length;\n for (uint256 i = 0; i < length; ++i) {\n storageLayout.supportedInterfaces[pluginManifest.interfaceIds[i]] += 1;\n }\n // revert if any address in dependencies does not support the interface at its matching index in the manifest’s\n // dependencyInterfaceIds,\n // or if the two array lengths do not match,\n // or if any of the dependencies are not already installed on the modular account\n length = dependencies.length;\n if (length != pluginManifest.dependencyInterfaceIds.length) {\n revert InvalidPluginDependency(plugin);\n }\n for (uint256 i = 0; i < length; ++i) {\n address dependencyPluginAddr = dependencies[i].plugin;\n // if dependencyPluginAddr is msca address, then we don't actually introduce any new plugin dependency\n // other than native dependency, so we do not need to perform any plugin dependency related logic\n if (dependencyPluginAddr == msca) {\n continue;\n }\n if (!ERC165Checker.supportsInterface(dependencyPluginAddr, pluginManifest.dependencyInterfaceIds[i])) {\n revert InvalidPluginDependency(dependencyPluginAddr);\n }\n // the dependency plugin needs to be installed first\n if (!storageLayout.installedPlugins.contains(dependencyPluginAddr)) {\n revert InvalidPluginDependency(dependencyPluginAddr);\n }\n // each dependency’s record MUST also be updated to reflect that it has a new dependent\n // record the plugin dependency, will revert if it's already installed\n storageLayout.pluginDetails[plugin].dependencies.append(dependencies[i]);\n // increment the dependency's dependentCounter since the current plugin is dependent on dependencyPlugin\n storageLayout.pluginDetails[dependencyPluginAddr].dependentCounter += 1;\n }\n\n // record if this plugin is allowed to spend native token\n if (pluginManifest.canSpendNativeToken) {\n storageLayout.pluginDetails[plugin].canSpendNativeToken = true;\n }\n\n // record execution details\n //////////////////////////////////////////////\n // install execution functions and hooks\n //////////////////////////////////////////////\n length = pluginManifest.executionFunctions.length;\n for (uint256 i = 0; i < length; ++i) {\n bytes4 selector = pluginManifest.executionFunctions[i];\n if (storageLayout.executionDetails[selector].plugin != address(0)) {\n revert ExecutionDetailAlreadySet(plugin, selector);\n }\n if (\n selector._isNativeFunctionSelector() || selector._isErc4337FunctionSelector()\n || selector._isIPluginFunctionSelector()\n ) {\n revert InvalidExecutionSelector(plugin, selector);\n }\n storageLayout.executionDetails[selector].plugin = plugin;\n }\n\n // install pre and post execution hooks\n length = pluginManifest.executionHooks.length;\n for (uint256 i = 0; i < length; ++i) {\n bytes4 selector = pluginManifest.executionHooks[i].selector;\n FunctionReference memory preExecHook = _resolveManifestFunction(\n pluginManifest.executionHooks[i].preExecHook,\n plugin,\n dependencies,\n ManifestAssociatedFunctionType.PRE_HOOK_ALWAYS_DENY,\n AssociatedFunctionType.HOOK\n );\n FunctionReference memory postExecHook = _resolveManifestFunction(\n pluginManifest.executionHooks[i].postExecHook,\n plugin,\n dependencies,\n ManifestAssociatedFunctionType.NONE,\n AssociatedFunctionType.HOOK\n );\n _addHookGroup(storageLayout.executionDetails[selector].executionHooks, preExecHook, postExecHook);\n }\n\n //////////////////////////////////////////////\n // install validation functions and hooks\n //////////////////////////////////////////////\n // install userOpValidationFunctions\n length = pluginManifest.userOpValidationFunctions.length;\n for (uint256 i = 0; i < length; ++i) {\n bytes4 selector = pluginManifest.userOpValidationFunctions[i].executionSelector;\n if (storageLayout.executionDetails[selector].userOpValidationFunction.pack() != EMPTY_FUNCTION_REFERENCE) {\n revert ValidationFunctionAlreadySet(selector);\n }\n storageLayout.executionDetails[selector].userOpValidationFunction = _resolveManifestFunction(\n pluginManifest.userOpValidationFunctions[i].associatedFunction,\n plugin,\n dependencies,\n ManifestAssociatedFunctionType.NONE,\n AssociatedFunctionType.VALIDATION_FUNCTION\n );\n }\n // install runtimeValidationFunctions\n length = pluginManifest.runtimeValidationFunctions.length;\n for (uint256 i = 0; i < length; ++i) {\n bytes4 selector = pluginManifest.runtimeValidationFunctions[i].executionSelector;\n if (storageLayout.executionDetails[selector].runtimeValidationFunction.pack() != EMPTY_FUNCTION_REFERENCE) {\n revert ValidationFunctionAlreadySet(selector);\n }\n storageLayout.executionDetails[selector].runtimeValidationFunction = _resolveManifestFunction(\n pluginManifest.runtimeValidationFunctions[i].associatedFunction,\n plugin,\n dependencies,\n ManifestAssociatedFunctionType.RUNTIME_VALIDATION_ALWAYS_ALLOW, // risk burning gas from the account\n AssociatedFunctionType.VALIDATION_FUNCTION\n );\n }\n // install preUserOpValidationHooks\n length = pluginManifest.preUserOpValidationHooks.length;\n // force override to be safe\n FunctionReference[] memory emptyDependencies = new FunctionReference[](0);\n for (uint256 i = 0; i < length; ++i) {\n bytes4 selector = pluginManifest.preUserOpValidationHooks[i].executionSelector;\n // revert internally\n storageLayout.executionDetails[selector].preUserOpValidationHooks.append(\n _resolveManifestFunction(\n pluginManifest.preUserOpValidationHooks[i].associatedFunction,\n plugin,\n emptyDependencies,\n ManifestAssociatedFunctionType.PRE_HOOK_ALWAYS_DENY,\n AssociatedFunctionType.HOOK\n )\n );\n }\n // install preRuntimeValidationHooks\n length = pluginManifest.preRuntimeValidationHooks.length;\n for (uint256 i = 0; i < length; ++i) {\n // revert internally\n storageLayout.executionDetails[pluginManifest.preRuntimeValidationHooks[i].executionSelector]\n .preRuntimeValidationHooks\n .append(\n _resolveManifestFunction(\n pluginManifest.preRuntimeValidationHooks[i].associatedFunction,\n plugin,\n emptyDependencies,\n ManifestAssociatedFunctionType.PRE_HOOK_ALWAYS_DENY,\n AssociatedFunctionType.HOOK\n )\n );\n }\n\n // store the plugin’s permitted function selectors and external contract calls to be able to validate calls\n // to executeFromPlugin and executeFromPluginExternal\n //////////////////////////////////////////////\n // permissions for executeFromPlugin\n //////////////////////////////////////////////\n // native functions or execution functions already installed on the MSCA that this plugin will be able to call\n length = pluginManifest.permittedExecutionSelectors.length;\n for (uint256 i = 0; i < length; ++i) {\n // enable PermittedPluginCall\n storageLayout.permittedPluginCalls[plugin][pluginManifest.permittedExecutionSelectors[i]] = true;\n }\n\n //////////////////////////////////////////////\n // permissions for executeFromPluginExternal\n //////////////////////////////////////////////\n // is the plugin permitted to call any external contracts and selectors\n if (pluginManifest.permitAnyExternalAddress) {\n storageLayout.pluginDetails[plugin].anyExternalAddressPermitted = true;\n } else {\n // more limited access - record external contract calls that this plugin will be able to make\n length = pluginManifest.permittedExternalCalls.length;\n for (uint256 i = 0; i < length; ++i) {\n ManifestExternalCallPermission memory externalCallPermission = pluginManifest.permittedExternalCalls[i];\n PermittedExternalCall storage permittedExternalCall =\n storageLayout.permittedExternalCalls[plugin][externalCallPermission.externalAddress];\n if (permittedExternalCall.addressPermitted) {\n revert ExecuteFromPluginExternalAlreadySet(plugin, externalCallPermission.externalAddress);\n }\n permittedExternalCall.addressPermitted = true;\n if (externalCallPermission.permitAnySelector) {\n permittedExternalCall.anySelector = true;\n } else {\n uint256 permittedExternalCallSelectorsLength = externalCallPermission.selectors.length;\n for (uint256 j = 0; j < permittedExternalCallSelectorsLength; ++j) {\n permittedExternalCall.selectors[externalCallPermission.selectors[j]] = true;\n }\n }\n }\n }\n\n // call onInstall to initialize plugin data for the modular account\n // solhint-disable-next-line no-empty-blocks\n try IPlugin(plugin).onInstall(pluginInstallData) {}\n catch (bytes memory revertReason) {\n revert FailToCallOnInstall(plugin, revertReason);\n }\n }\n\n /// @dev Refer to IPluginManager\n function uninstall(address plugin, bytes memory config, bytes memory pluginUninstallData)\n external\n onlyDelegated\n returns (bool)\n {\n WalletStorageV1Lib.Layout storage storageLayout = WalletStorageV1Lib.getLayout();\n // revert internally if plugin was not installed before\n storageLayout.installedPlugins.remove(plugin);\n PluginManifest memory pluginManifest;\n if (config.length > 0) {\n // the modular account MAY implement the capability for the manifest to be encoded in the config field as a\n // parameter\n pluginManifest = abi.decode(config, (PluginManifest));\n } else {\n pluginManifest = IPlugin(plugin).pluginManifest();\n }\n // revert if the hash of the manifest used at install time does not match the computed Keccak-256 hash of the\n // plugin’s current manifest\n if (storageLayout.pluginDetails[plugin].manifestHash != keccak256(abi.encode(pluginManifest))) {\n revert InvalidPluginManifestHash();\n }\n // revert if there is at least 1 other installed plugin that depends on validation functions or hooks added by\n // this plugin;\n // plugins used as dependencies must not be uninstalled while dependent plugins exist\n if (storageLayout.pluginDetails[plugin].dependentCounter != 0) {\n revert PluginUsedByOthers(plugin);\n }\n // each dependency’s record SHOULD be updated to reflect that it has no longer has this plugin as a dependent\n _removeDependencies(plugin, storageLayout);\n // remove records for the plugin’s dependencies, injected permitted call hooks, permitted function selectors,\n // and permitted external contract calls\n // uninstall the components in reverse order (by component type) of their installation\n //////////////////////////////////////////////\n // permissions for executeFromPluginExternal\n //////////////////////////////////////////////\n if (pluginManifest.permitAnyExternalAddress) {\n storageLayout.pluginDetails[plugin].anyExternalAddressPermitted = false;\n }\n uint256 length;\n if (!pluginManifest.permitAnyExternalAddress) {\n length = pluginManifest.permittedExternalCalls.length;\n for (uint256 i = 0; i < length; ++i) {\n ManifestExternalCallPermission memory externalCallPermission = pluginManifest.permittedExternalCalls[i];\n PermittedExternalCall storage permittedExternalCall =\n storageLayout.permittedExternalCalls[plugin][externalCallPermission.externalAddress];\n if (!permittedExternalCall.addressPermitted) {\n revert ExecuteFromPluginExternalAlreadyUnset(plugin, externalCallPermission.externalAddress);\n }\n permittedExternalCall.addressPermitted = false;\n if (externalCallPermission.permitAnySelector) {\n permittedExternalCall.anySelector = false;\n } else {\n uint256 permittedExternalCallSelectorsLength = externalCallPermission.selectors.length;\n for (uint256 j = 0; j < permittedExternalCallSelectorsLength; ++j) {\n permittedExternalCall.selectors[externalCallPermission.selectors[j]] = false;\n }\n }\n }\n }\n\n length = pluginManifest.permittedExecutionSelectors.length;\n for (uint256 i = 0; i < length; ++i) {\n // disable PermittedPluginCall\n storageLayout.permittedPluginCalls[plugin][pluginManifest.permittedExecutionSelectors[i]] = false;\n }\n\n //////////////////////////////////////////////\n // uninstall validation functions and hooks\n //////////////////////////////////////////////\n // uninstall preRuntimeValidationHooks\n FunctionReference[] memory emptyDependencies = new FunctionReference[](0);\n length = pluginManifest.preRuntimeValidationHooks.length;\n for (uint256 i = 0; i < length; ++i) {\n // revert internally\n storageLayout.executionDetails[pluginManifest.preRuntimeValidationHooks[i].executionSelector]\n .preRuntimeValidationHooks\n .remove(\n _resolveManifestFunction(\n pluginManifest.preRuntimeValidationHooks[i].associatedFunction,\n plugin,\n emptyDependencies,\n ManifestAssociatedFunctionType.PRE_HOOK_ALWAYS_DENY,\n AssociatedFunctionType.HOOK\n )\n );\n }\n // uninstall preUserOpValidationHooks\n length = pluginManifest.preUserOpValidationHooks.length;\n for (uint256 i = 0; i < length; ++i) {\n // revert internally\n storageLayout.executionDetails[pluginManifest.preUserOpValidationHooks[i].executionSelector]\n .preUserOpValidationHooks\n .remove(\n _resolveManifestFunction(\n pluginManifest.preUserOpValidationHooks[i].associatedFunction,\n plugin,\n emptyDependencies,\n ManifestAssociatedFunctionType.PRE_HOOK_ALWAYS_DENY,\n AssociatedFunctionType.HOOK\n )\n );\n }\n // uninstall runtimeValidationFunctions\n FunctionReference memory emptyFunctionReference = EMPTY_FUNCTION_REFERENCE.unpack();\n length = pluginManifest.runtimeValidationFunctions.length;\n for (uint256 i = 0; i < length; ++i) {\n storageLayout.executionDetails[pluginManifest.runtimeValidationFunctions[i].executionSelector]\n .runtimeValidationFunction = emptyFunctionReference;\n }\n // uninstall userOpValidationFunctions\n length = pluginManifest.userOpValidationFunctions.length;\n for (uint256 i = 0; i < length; ++i) {\n storageLayout.executionDetails[pluginManifest.userOpValidationFunctions[i].executionSelector]\n .userOpValidationFunction = emptyFunctionReference;\n }\n\n //////////////////////////////////////////////\n // uninstall execution functions and hooks\n //////////////////////////////////////////////\n _removeExecutionHooks(plugin, pluginManifest.executionHooks, storageLayout);\n length = pluginManifest.executionFunctions.length;\n for (uint256 i = 0; i < length; ++i) {\n storageLayout.executionDetails[pluginManifest.executionFunctions[i]].plugin = address(0);\n }\n\n length = pluginManifest.interfaceIds.length;\n for (uint256 i = 0; i < length; ++i) {\n storageLayout.supportedInterfaces[pluginManifest.interfaceIds[i]] -= 1;\n }\n // reset all members that are not mappings and also recurse into the members unless they're mappings\n delete storageLayout.pluginDetails[plugin];\n // call the plugin’s onUninstall callback with the data provided in the uninstallData parameter;\n // This serves to clear the plugin state for the modular account;\n // If onUninstall reverts, execution SHOULD continue to allow the uninstall to complete\n bool onUninstallSucceeded = true;\n // solhint-disable-next-line no-empty-blocks\n try IPlugin(plugin).onUninstall(pluginUninstallData) {}\n catch {\n // leave it up to the caller if we want to revert if the plugin storage isn't cleaned up\n onUninstallSucceeded = false;\n }\n return onUninstallSucceeded;\n }\n\n /**\n * @dev Resolve manifest function.\n * For functions of type `ManifestAssociatedFunctionType.DEPENDENCY`, the MSCA MUST find the plugin address\n * of the function at `dependencies[dependencyIndex]` during the call to `installPlugin(config)`.\n * A plugin can no longer use hooks from other plugins to be added on Execution and/or Validation function\n * selectors\n * in its own manifest. We'll revert if hook is provided as dependency from an external plugin.\n * @param allowedMagicValue which magic value (if any) is permissible for the function type to resolve.\n * @param associatedFunctionType the type of associated function, either a validation function or a hook, as opposed\n * to execution functions\n */\n function _resolveManifestFunction(\n ManifestFunction memory manifestFunction,\n address plugin,\n FunctionReference[] memory dependencies,\n ManifestAssociatedFunctionType allowedMagicValue,\n AssociatedFunctionType associatedFunctionType\n ) internal pure returns (FunctionReference memory) {\n // revert if it's hook and provided as dependency\n if (\n associatedFunctionType == AssociatedFunctionType.HOOK\n && manifestFunction.functionType == ManifestAssociatedFunctionType.DEPENDENCY\n ) {\n revert HookDependencyNotPermitted();\n }\n if (manifestFunction.functionType == ManifestAssociatedFunctionType.SELF) {\n return FunctionReference(plugin, manifestFunction.functionId);\n } else if (manifestFunction.functionType == ManifestAssociatedFunctionType.DEPENDENCY) {\n // out of boundary\n if (manifestFunction.dependencyIndex >= dependencies.length) {\n revert InvalidPluginManifest();\n }\n return dependencies[manifestFunction.dependencyIndex];\n } else if (manifestFunction.functionType == ManifestAssociatedFunctionType.RUNTIME_VALIDATION_ALWAYS_ALLOW) {\n if (allowedMagicValue == ManifestAssociatedFunctionType.RUNTIME_VALIDATION_ALWAYS_ALLOW) {\n return RUNTIME_VALIDATION_ALWAYS_ALLOW_FUNCTION_REFERENCE.unpack();\n } else {\n revert InvalidPluginManifest();\n }\n } else if (manifestFunction.functionType == ManifestAssociatedFunctionType.PRE_HOOK_ALWAYS_DENY) {\n if (allowedMagicValue == ManifestAssociatedFunctionType.PRE_HOOK_ALWAYS_DENY) {\n return PRE_HOOK_ALWAYS_DENY_FUNCTION_REFERENCE.unpack();\n } else {\n revert InvalidPluginManifest();\n }\n } else {\n return EMPTY_FUNCTION_REFERENCE.unpack();\n }\n }\n\n function _addHookGroup(\n HookGroup storage hookGroup,\n FunctionReference memory preExecHook,\n FunctionReference memory postExecHook\n ) internal {\n bytes21 packedPreExecHook = preExecHook.pack();\n if (packedPreExecHook == EMPTY_FUNCTION_REFERENCE) {\n if (postExecHook.pack() == EMPTY_FUNCTION_REFERENCE) {\n // pre and post hooks cannot be null at the same time\n revert InvalidFunctionReference();\n }\n hookGroup.postOnlyHooks.append(postExecHook);\n } else {\n hookGroup.preHooks.append(preExecHook);\n if (postExecHook.pack() != EMPTY_FUNCTION_REFERENCE) {\n hookGroup.preToPostHooks[packedPreExecHook].append(postExecHook);\n }\n }\n }\n\n function _removeHookGroup(\n HookGroup storage hookGroup,\n FunctionReference memory preExecHook,\n FunctionReference memory postExecHook\n ) internal {\n bytes21 packedPreExecHook = preExecHook.pack();\n if (packedPreExecHook == EMPTY_FUNCTION_REFERENCE) {\n // pre and post hooks cannot be null at the same time\n hookGroup.postOnlyHooks.remove(postExecHook);\n } else {\n hookGroup.preHooks.remove(preExecHook);\n // remove postExecHook if any\n if (postExecHook.pack() != EMPTY_FUNCTION_REFERENCE) {\n hookGroup.preToPostHooks[packedPreExecHook].remove(postExecHook);\n }\n }\n }\n\n function _removeDependencies(address plugin, WalletStorageV1Lib.Layout storage storageLayout) internal {\n Bytes21DLL storage pluginDependencies = storageLayout.pluginDetails[plugin].dependencies;\n uint256 length = pluginDependencies.size();\n FunctionReference memory startFR = EMPTY_FUNCTION_REFERENCE.unpack();\n FunctionReference[] memory dependencies;\n for (uint256 i = 0; i < length; ++i) {\n (dependencies, startFR) = pluginDependencies.getPaginated(startFR, 100);\n for (uint256 j = 0; j < dependencies.length; ++j) {\n storageLayout.pluginDetails[dependencies[j].plugin].dependentCounter -= 1;\n storageLayout.pluginDetails[plugin].dependencies.remove(dependencies[j]);\n }\n if (startFR.pack() == EMPTY_FUNCTION_REFERENCE) {\n break;\n }\n }\n }\n\n function _removeExecutionHooks(\n address plugin,\n ManifestExecutionHook[] memory executionHooks,\n WalletStorageV1Lib.Layout storage storageLayout\n ) internal {\n uint256 length = executionHooks.length;\n FunctionReference[] memory dependencies = new FunctionReference[](0);\n for (uint256 i = 0; i < length; ++i) {\n bytes4 selector = executionHooks[i].selector;\n FunctionReference memory preExecHook = _resolveManifestFunction(\n executionHooks[i].preExecHook,\n plugin,\n dependencies,\n ManifestAssociatedFunctionType.PRE_HOOK_ALWAYS_DENY,\n AssociatedFunctionType.HOOK\n );\n FunctionReference memory postExecHookToRemove = _resolveManifestFunction(\n executionHooks[i].postExecHook,\n plugin,\n dependencies,\n ManifestAssociatedFunctionType.NONE,\n AssociatedFunctionType.HOOK\n );\n _removeHookGroup(storageLayout.executionDetails[selector].executionHooks, preExecHook, postExecHookToRemove);\n }\n }\n}\n"},"src/msca/6900/v0.7/managers/StandardExecutor.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {ExecutionUtils} from \"../../../../utils/ExecutionUtils.sol\";\nimport \"../common/Structs.sol\";\nimport {IPlugin} from \"../interfaces/IPlugin.sol\";\nimport {ERC165Checker} from \"@openzeppelin/contracts/utils/introspection/ERC165Checker.sol\";\n\n/**\n * @dev Default implementation of https://eips.ethereum.org/EIPS/eip-6900. MSCAs must implement this interface to\n * support open-ended execution.\n */\nlibrary StandardExecutor {\n using ExecutionUtils for address;\n\n error TargetIsPlugin(address plugin);\n\n /// @dev Refer to IStandardExecutor\n function execute(address target, uint256 value, bytes calldata data) internal returns (bytes memory returnData) {\n // reverts if the target is a plugin because modular account should be calling plugin via execution functions\n // defined in IPluginExecutor\n if (ERC165Checker.supportsInterface(target, type(IPlugin).interfaceId)) {\n revert TargetIsPlugin(target);\n }\n return target.callWithReturnDataOrRevert(value, data);\n }\n\n /// @dev Refer to IStandardExecutor\n function executeBatch(Call[] calldata calls) internal returns (bytes[] memory returnData) {\n returnData = new bytes[](calls.length);\n for (uint256 i = 0; i < calls.length; ++i) {\n if (ERC165Checker.supportsInterface(calls[i].target, type(IPlugin).interfaceId)) {\n revert TargetIsPlugin(calls[i].target);\n }\n returnData[i] = calls[i].target.callWithReturnDataOrRevert(calls[i].value, calls[i].data);\n }\n return returnData;\n }\n}\n"},"src/msca/6900/v0.7/account/WalletStorageInitializable.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {WalletStorageV1Lib} from \"../libs/WalletStorageV1Lib.sol\";\n\n/// @notice Forked from OpenZeppelin (proxy/utils/Initializable.sol) with wallet storage access.\n/// Reinitialization is removed.\n/// For V1 MSCA.\nabstract contract WalletStorageInitializable {\n /**\n * @dev Triggered when the contract has been initialized.\n */\n event WalletStorageInitialized();\n\n error WalletStorageIsInitializing();\n error WalletStorageIsNotInitializing();\n error WalletStorageIsInitialized();\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyWalletStorageInitializing` functions can be used to initialize parent contracts.\n *\n * Functions marked with `walletStorageInitializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {WalletStorageInitialized} event.\n */\n modifier walletStorageInitializer() {\n bool isTopLevelCall = _setWalletStorageInitializing();\n _;\n if (isTopLevelCall) {\n WalletStorageV1Lib.getLayout().initializing = false;\n emit WalletStorageInitialized();\n }\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {walletStorageInitializer} modifier, directly or indirectly.\n */\n modifier onlyWalletStorageInitializing() {\n if (!WalletStorageV1Lib.getLayout().initializing) {\n revert WalletStorageIsNotInitializing();\n }\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {WalletStorageInitialized} event the first time it is successfully executed.\n */\n function _disableWalletStorageInitializers() internal virtual {\n if (WalletStorageV1Lib.getLayout().initializing) {\n revert WalletStorageIsInitializing();\n }\n if (WalletStorageV1Lib.getLayout().initialized != type(uint8).max) {\n WalletStorageV1Lib.getLayout().initialized = type(uint8).max;\n emit WalletStorageInitialized();\n }\n }\n\n function _setWalletStorageInitializing() internal returns (bool) {\n bool isTopLevelCall = !WalletStorageV1Lib.getLayout().initializing;\n uint8 initialized = WalletStorageV1Lib.getLayout().initialized;\n if (!(isTopLevelCall && initialized < 1) || (address(this).code.length <= 0 && initialized == 1)) {\n revert WalletStorageIsInitialized();\n }\n WalletStorageV1Lib.getLayout().initialized = 1;\n if (isTopLevelCall) {\n WalletStorageV1Lib.getLayout().initializing = true;\n }\n return isTopLevelCall;\n }\n}\n"},"lib/account-abstraction/contracts/interfaces/IEntryPoint.sol":{"content":"/**\n ** Account-Abstraction (EIP-4337) singleton EntryPoint implementation.\n ** Only one instance required on each chain.\n **/\n// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\n/* solhint-disable avoid-low-level-calls */\n/* solhint-disable no-inline-assembly */\n/* solhint-disable reason-string */\n\nimport \"./PackedUserOperation.sol\";\nimport \"./IStakeManager.sol\";\nimport \"./IAggregator.sol\";\nimport \"./INonceManager.sol\";\n\ninterface IEntryPoint is IStakeManager, INonceManager {\n /***\n * An event emitted after each successful request.\n * @param userOpHash - Unique identifier for the request (hash its entire content, except signature).\n * @param sender - The account that generates this request.\n * @param paymaster - If non-null, the paymaster that pays for this request.\n * @param nonce - The nonce value from the request.\n * @param success - True if the sender transaction succeeded, false if reverted.\n * @param actualGasCost - Actual amount paid (by account or paymaster) for this UserOperation.\n * @param actualGasUsed - Total gas used by this UserOperation (including preVerification, creation,\n * validation and execution).\n */\n event UserOperationEvent(\n bytes32 indexed userOpHash,\n address indexed sender,\n address indexed paymaster,\n uint256 nonce,\n bool success,\n uint256 actualGasCost,\n uint256 actualGasUsed\n );\n\n /**\n * Account \"sender\" was deployed.\n * @param userOpHash - The userOp that deployed this account. UserOperationEvent will follow.\n * @param sender - The account that is deployed\n * @param factory - The factory used to deploy this account (in the initCode)\n * @param paymaster - The paymaster used by this UserOp\n */\n event AccountDeployed(\n bytes32 indexed userOpHash,\n address indexed sender,\n address factory,\n address paymaster\n );\n\n /**\n * An event emitted if the UserOperation \"callData\" reverted with non-zero length.\n * @param userOpHash - The request unique identifier.\n * @param sender - The sender of this request.\n * @param nonce - The nonce used in the request.\n * @param revertReason - The return bytes from the (reverted) call to \"callData\".\n */\n event UserOperationRevertReason(\n bytes32 indexed userOpHash,\n address indexed sender,\n uint256 nonce,\n bytes revertReason\n );\n\n /**\n * An event emitted if the UserOperation Paymaster's \"postOp\" call reverted with non-zero length.\n * @param userOpHash - The request unique identifier.\n * @param sender - The sender of this request.\n * @param nonce - The nonce used in the request.\n * @param revertReason - The return bytes from the (reverted) call to \"callData\".\n */\n event PostOpRevertReason(\n bytes32 indexed userOpHash,\n address indexed sender,\n uint256 nonce,\n bytes revertReason\n );\n\n /**\n * UserOp consumed more than prefund. The UserOperation is reverted, and no refund is made.\n * @param userOpHash - The request unique identifier.\n * @param sender - The sender of this request.\n * @param nonce - The nonce used in the request.\n */\n event UserOperationPrefundTooLow(\n bytes32 indexed userOpHash,\n address indexed sender,\n uint256 nonce\n );\n\n /**\n * An event emitted by handleOps(), before starting the execution loop.\n * Any event emitted before this event, is part of the validation.\n */\n event BeforeExecution();\n\n /**\n * Signature aggregator used by the following UserOperationEvents within this bundle.\n * @param aggregator - The aggregator used for the following UserOperationEvents.\n */\n event SignatureAggregatorChanged(address indexed aggregator);\n\n /**\n * A custom revert error of handleOps, to identify the offending op.\n * Should be caught in off-chain handleOps simulation and not happen on-chain.\n * Useful for mitigating DoS attempts against batchers or for troubleshooting of factory/account/paymaster reverts.\n * NOTE: If simulateValidation passes successfully, there should be no reason for handleOps to fail on it.\n * @param opIndex - Index into the array of ops to the failed one (in simulateValidation, this is always zero).\n * @param reason - Revert reason. The string starts with a unique code \"AAmn\",\n * where \"m\" is \"1\" for factory, \"2\" for account and \"3\" for paymaster issues,\n * so a failure can be attributed to the correct entity.\n */\n error FailedOp(uint256 opIndex, string reason);\n\n /**\n * A custom revert error of handleOps, to report a revert by account or paymaster.\n * @param opIndex - Index into the array of ops to the failed one (in simulateValidation, this is always zero).\n * @param reason - Revert reason. see FailedOp(uint256,string), above\n * @param inner - data from inner cought revert reason\n * @dev note that inner is truncated to 2048 bytes\n */\n error FailedOpWithRevert(uint256 opIndex, string reason, bytes inner);\n\n error PostOpReverted(bytes returnData);\n\n /**\n * Error case when a signature aggregator fails to verify the aggregated signature it had created.\n * @param aggregator The aggregator that failed to verify the signature\n */\n error SignatureValidationFailed(address aggregator);\n\n // Return value of getSenderAddress.\n error SenderAddressResult(address sender);\n\n // UserOps handled, per aggregator.\n struct UserOpsPerAggregator {\n PackedUserOperation[] userOps;\n // Aggregator address\n IAggregator aggregator;\n // Aggregated signature\n bytes signature;\n }\n\n /**\n * Execute a batch of UserOperations.\n * No signature aggregator is used.\n * If any account requires an aggregator (that is, it returned an aggregator when\n * performing simulateValidation), then handleAggregatedOps() must be used instead.\n * @param ops - The operations to execute.\n * @param beneficiary - The address to receive the fees.\n */\n function handleOps(\n PackedUserOperation[] calldata ops,\n address payable beneficiary\n ) external;\n\n /**\n * Execute a batch of UserOperation with Aggregators\n * @param opsPerAggregator - The operations to execute, grouped by aggregator (or address(0) for no-aggregator accounts).\n * @param beneficiary - The address to receive the fees.\n */\n function handleAggregatedOps(\n UserOpsPerAggregator[] calldata opsPerAggregator,\n address payable beneficiary\n ) external;\n\n /**\n * Generate a request Id - unique identifier for this request.\n * The request ID is a hash over the content of the userOp (except the signature), the entrypoint and the chainid.\n * @param userOp - The user operation to generate the request ID for.\n * @return hash the hash of this UserOperation\n */\n function getUserOpHash(\n PackedUserOperation calldata userOp\n ) external view returns (bytes32);\n\n /**\n * Gas and return values during simulation.\n * @param preOpGas - The gas used for validation (including preValidationGas)\n * @param prefund - The required prefund for this operation\n * @param accountValidationData - returned validationData from account.\n * @param paymasterValidationData - return validationData from paymaster.\n * @param paymasterContext - Returned by validatePaymasterUserOp (to be passed into postOp)\n */\n struct ReturnInfo {\n uint256 preOpGas;\n uint256 prefund;\n uint256 accountValidationData;\n uint256 paymasterValidationData;\n bytes paymasterContext;\n }\n\n /**\n * Returned aggregated signature info:\n * The aggregator returned by the account, and its current stake.\n */\n struct AggregatorStakeInfo {\n address aggregator;\n StakeInfo stakeInfo;\n }\n\n /**\n * Get counterfactual sender address.\n * Calculate the sender contract address that will be generated by the initCode and salt in the UserOperation.\n * This method always revert, and returns the address in SenderAddressResult error\n * @param initCode - The constructor code to be passed into the UserOperation.\n */\n function getSenderAddress(bytes memory initCode) external;\n\n error DelegateAndRevert(bool success, bytes ret);\n\n /**\n * Helper method for dry-run testing.\n * @dev calling this method, the EntryPoint will make a delegatecall to the given data, and report (via revert) the result.\n * The method always revert, so is only useful off-chain for dry run calls, in cases where state-override to replace\n * actual EntryPoint code is less convenient.\n * @param target a target contract to make a delegatecall from entrypoint\n * @param data data to pass to target in a delegatecall\n */\n function delegateAndRevert(address target, bytes calldata data) external;\n}\n"},"lib/account-abstraction/contracts/interfaces/PackedUserOperation.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\n/**\n * User Operation struct\n * @param sender - The sender account of this request.\n * @param nonce - Unique value the sender uses to verify it is not a replay.\n * @param initCode - If set, the account contract will be created by this constructor/\n * @param callData - The method call to execute on this account.\n * @param accountGasLimits - Packed gas limits for validateUserOp and gas limit passed to the callData method call.\n * @param preVerificationGas - Gas not calculated by the handleOps method, but added to the gas paid.\n * Covers batch overhead.\n * @param gasFees - packed gas fields maxPriorityFeePerGas and maxFeePerGas - Same as EIP-1559 gas parameters.\n * @param paymasterAndData - If set, this field holds the paymaster address, verification gas limit, postOp gas limit and paymaster-specific extra data\n * The paymaster will pay for the transaction instead of the sender.\n * @param signature - Sender-verified signature over the entire request, the EntryPoint address and the chain ID.\n */\nstruct PackedUserOperation {\n address sender;\n uint256 nonce;\n bytes initCode;\n bytes callData;\n bytes32 accountGasLimits;\n uint256 preVerificationGas;\n bytes32 gasFees;\n bytes paymasterAndData;\n bytes signature;\n}\n"},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},"src/libs/SetValueLib.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {SetValue} from \"@modular-account-libs/libraries/Constants.sol\";\n\n/**\n * @dev Handles SetValue from Alchemy's library.\n */\nlibrary SetValueLib {\n /// @dev Helper function to convert set values to bytes30 with leading zeros.\n function toBytes30Array(SetValue[] memory values) internal pure returns (bytes30[] memory res) {\n uint256 len = values.length;\n res = new bytes30[](len);\n for (uint256 i = 0; i < len; ++i) {\n res[i] = SetValue.unwrap(values[i]);\n }\n return res;\n }\n}\n"},"src/msca/6900/v0.7/plugins/BasePlugin.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {NotImplemented} from \"../../shared/common/Errors.sol\";\nimport \"../common/PluginManifest.sol\";\nimport \"../common/Structs.sol\";\nimport {IPlugin} from \"../interfaces/IPlugin.sol\";\nimport {PackedUserOperation} from \"@account-abstraction/contracts/interfaces/PackedUserOperation.sol\";\nimport {ERC165} from \"@openzeppelin/contracts/utils/introspection/ERC165.sol\";\n\n/**\n * @dev Default implementation of https://eips.ethereum.org/EIPS/eip-6900. MSCAs must implement this interface to\n * support open-ended execution.\n */\nabstract contract BasePlugin is IPlugin, ERC165 {\n error AlreadyInitialized();\n error NotInitialized();\n\n /// @dev Ensure the account has initialized this plugin\n /// @param account the account to check\n modifier isNotInitialized(address account) {\n if (_isInitialized(account)) {\n revert AlreadyInitialized();\n }\n _;\n }\n\n /// @dev Ensure the account has not initialized this plugin\n /// @param account the account to check\n modifier isInitialized(address account) {\n if (!_isInitialized(account)) {\n revert NotInitialized();\n }\n _;\n }\n\n /// @notice Initialize plugin data for the modular account.\n /// @dev Called by the modular account during `installPlugin`.\n /// @param data Optional bytes array to be decoded and used by the plugin to setup initial plugin data for the\n /// modular account.\n function onInstall(bytes calldata data) external virtual {\n (data);\n revert NotImplemented(msg.sig, 0);\n }\n\n /// @notice Clear plugin data for the modular account.\n /// @dev Called by the modular account during `uninstallPlugin`.\n /// @param data Optional bytes array to be decoded and used by the plugin to clear plugin data for the modular\n /// account.\n function onUninstall(bytes calldata data) external virtual {\n (data);\n revert NotImplemented(msg.sig, 0);\n }\n\n /// @notice Run the pre user operation validation hook specified by the `functionId`.\n /// @dev Pre user operation validation hooks MUST NOT return an authorizer value other than 0 or 1.\n /// @param functionId An identifier that routes the call to different internal implementations, should there be more\n /// than one.\n /// @param userOp The user operation.\n /// @param userOpHash The user operation hash.\n /// @return validationData Packed validation data for validAfter (6 bytes), validUntil (6 bytes), and authorizer (20\n /// bytes).\n function preUserOpValidationHook(uint8 functionId, PackedUserOperation calldata userOp, bytes32 userOpHash)\n external\n virtual\n returns (uint256 validationData)\n {\n (functionId, userOp, userOpHash);\n revert NotImplemented(msg.sig, functionId);\n }\n\n /// @notice Run the user operation validationFunction specified by the `functionId`.\n /// @param functionId An identifier that routes the call to different internal implementations, should there be\n /// more than one.\n /// @param userOp The user operation.\n /// @param userOpHash The user operation hash.\n /// @return validationData Packed validation data for validAfter (6 bytes), validUntil (6 bytes), and authorizer (20\n /// bytes).\n function userOpValidationFunction(uint8 functionId, PackedUserOperation calldata userOp, bytes32 userOpHash)\n external\n virtual\n returns (uint256 validationData)\n {\n (functionId, userOp, userOpHash);\n revert NotImplemented(msg.sig, functionId);\n }\n\n /// @notice Run the pre runtime validation hook specified by the `functionId`.\n /// @dev To indicate the entire call should revert, the function MUST revert.\n /// @param functionId An identifier that routes the call to different internal implementations, should there be more\n /// than one.\n /// @param sender The caller address.\n /// @param value The call value.\n /// @param data The calldata sent.\n function preRuntimeValidationHook(uint8 functionId, address sender, uint256 value, bytes calldata data)\n external\n virtual\n {\n (functionId, sender, value, data);\n revert NotImplemented(msg.sig, functionId);\n }\n\n /// @notice Run the runtime validationFunction specified by the `functionId`.\n /// @dev To indicate the entire call should revert, the function MUST revert.\n /// @param functionId An identifier that routes the call to different internal implementations, should there be\n /// more than one.\n /// @param sender The caller address.\n /// @param value The call value.\n /// @param data The calldata sent.\n function runtimeValidationFunction(uint8 functionId, address sender, uint256 value, bytes calldata data)\n external\n virtual\n {\n (functionId, sender, value, data);\n revert NotImplemented(msg.sig, functionId);\n }\n\n /// @notice Run the pre execution hook specified by the `functionId`.\n /// @dev To indicate the entire call should revert, the function MUST revert.\n /// @param functionId An identifier that routes the call to different internal implementations, should there be more\n /// than one.\n /// @param sender The caller address.\n /// @param value The call value.\n /// @param data The calldata sent.\n /// @return context Context to pass to a post execution hook, if present. An empty bytes array MAY be returned.\n function preExecutionHook(uint8 functionId, address sender, uint256 value, bytes calldata data)\n external\n virtual\n returns (bytes memory context)\n {\n (functionId, sender, value, data);\n revert NotImplemented(msg.sig, functionId);\n }\n\n /// @notice Run the post execution hook specified by the `functionId`.\n /// @dev To indicate the entire call should revert, the function MUST revert.\n /// @param functionId An identifier that routes the call to different internal implementations, should there be more\n /// than one.\n /// @param preExecHookData The context returned by its associated pre execution hook.\n function postExecutionHook(uint8 functionId, bytes calldata preExecHookData) external virtual {\n (functionId, preExecHookData);\n revert NotImplemented(msg.sig, functionId);\n }\n\n /// @notice Describe the contents and intended configuration of the plugin.\n /// @dev The manifest MUST stay constant over time.\n /// @return A manifest describing the contents and intended configuration of the plugin.\n function pluginManifest() external pure virtual returns (PluginManifest memory) {\n revert NotImplemented(msg.sig, 0);\n }\n\n /// @notice Describe the metadata of the plugin.\n /// @dev This metadata MUST stay constant over time.\n /// @return A metadata struct describing the plugin.\n function pluginMetadata() external pure virtual returns (PluginMetadata memory) {\n revert NotImplemented(msg.sig, 0);\n }\n\n /// @dev Returns true if this contract implements the interface defined by\n /// `interfaceId`. See the corresponding\n /// https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n /// to learn more about how these ids are created.\n ///\n /// This function call must use less than 30,000 gas.\n ///\n /// Supporting the IPlugin interface is a requirement for plugin installation (PluginManager). This is also used\n /// by the modular account to prevent StandardExecutor functions from making calls to plugins.\n /// @param interfaceId The interface ID to check for support.\n /// @return True if the contract supports `interfaceId`.\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IPlugin).interfaceId || super.supportsInterface(interfaceId);\n }\n\n /// @notice Check if the account has initialized this plugin yet\n /// @dev This function should be overwritten for plugins that have state-changing onInstall's\n /// @param account The account to check\n /// @return True if the account has initialized this plugin\n // solhint-disable-next-line no-empty-blocks\n function _isInitialized(address account) internal view virtual returns (bool) {\n (account);\n revert NotImplemented(msg.sig, 0);\n }\n}\n"},"src/msca/6900/v0.7/plugins/v1_0_0/multisig/BaseMultisigPlugin.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\n\npragma solidity 0.8.24;\n\nimport {\n EMPTY_HASH,\n SIG_VALIDATION_FAILED,\n SIG_VALIDATION_SUCCEEDED,\n ZERO,\n ZERO_BYTES32\n} from \"../../../../../../common/Constants.sol\";\n\nimport {NotImplemented} from \"../../../../shared/common/Errors.sol\";\nimport {BasePlugin} from \"../../BasePlugin.sol\";\nimport {PackedUserOperation} from \"@account-abstraction/contracts/interfaces/PackedUserOperation.sol\";\nimport {\n AssociatedLinkedListSet,\n AssociatedLinkedListSetLib\n} from \"@modular-account-libs/libraries/AssociatedLinkedListSetLib.sol\";\nimport {ECDSA} from \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport {MessageHashUtils} from \"@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol\";\n\n/// @title Base Multisig Plugin\n/// @author Circle\n/// @notice Base contract for multisig plugins.\n/// Functions implemented in this contract are forked with modifications from\n/// https://github.com/alchemyplatform/multisig-plugin/blob/170ec0df78aa20248ab6f792540b4d4d4e0f752c/src/MultisigPlugin.sol\nabstract contract BaseMultisigPlugin is BasePlugin {\n using ECDSA for bytes32;\n using MessageHashUtils for bytes32;\n using AssociatedLinkedListSetLib for AssociatedLinkedListSet;\n\n error EmptyOwnersNotAllowed();\n error InvalidAddress();\n error InvalidNumSigsOnActualDigest(uint256 invalidNum);\n error InvalidMaxFeePerGas();\n error InvalidMaxPriorityFeePerGas();\n error InvalidOwner(bytes30 owner);\n error InvalidPreVerificationGas();\n error InvalidSigLength();\n error InvalidSigOffset();\n error InvalidContractSigLength();\n error OwnerDoesNotExist(bytes30 owner);\n error TooManyOwners(uint256 currentNumOwners, uint256 numOwnersToAdd);\n error ZeroOwnersInputNotAllowed();\n error InvalidUserOpDigest();\n\n enum FunctionId {\n USER_OP_VALIDATION_OWNER // require owner access\n\n }\n\n // Linked list of account owners, in account address-associated storage\n AssociatedLinkedListSet internal _owners;\n\n address public immutable ENTRYPOINT;\n string constant ADD_OWNERS_PERMISSION = \"Add Owners\";\n string constant UPDATE_MULTISIG_WEIGHTS_PERMISSION = \"Update Multisig Weights\";\n string constant REMOVE_OWNERS_PERMISSION = \"Remove Owners\";\n\n constructor(address entryPoint) {\n ENTRYPOINT = entryPoint;\n }\n\n /// @notice Check if the signatures are valid for the account.\n /// @param actualDigest The actual gas digest.\n /// @param minimalDigest Digest of user op with minimal required fields set:\n /// (address sender, uint256 nonce, bytes initCode, bytes callData), and remaining\n /// fields set to default values.\n /// @param account The account to check the signatures for.\n /// @param signatures The signatures to check.\n /// @return success True if the signatures are valid.\n /// @return firstFailure first failure, if failed is true.\n /// (Note: if all signatures are individually valid but do not satisfy the\n /// multisig, firstFailure will be set to the last signature's index.)\n function checkNSignatures(bytes32 actualDigest, bytes32 minimalDigest, address account, bytes memory signatures)\n public\n view\n virtual\n returns (bool success, uint256 firstFailure);\n\n /// @inheritdoc BasePlugin\n function userOpValidationFunction(uint8 functionId, PackedUserOperation calldata userOp, bytes32 userOpHash)\n external\n view\n override\n returns (uint256)\n {\n if (functionId == uint8(FunctionId.USER_OP_VALIDATION_OWNER)) {\n // UserOp.sig format:\n // 0-n: k signatures, each sig is 65 bytes each (so n = 65 * k)\n // n-: contract signatures if any\n bytes32 actualUserOpDigest = userOpHash.toEthSignedMessageHash();\n bytes32 minimalUserOpDigest = _getMinimalUserOpDigest(userOp).toEthSignedMessageHash();\n // actualUserOpDigest must differ from minimalUserOpDigest in userOp\n // when actualUserOpDigest != minimalUserOpDigest, numSigsOnActualDigest is set to one\n if (actualUserOpDigest == minimalUserOpDigest) {\n revert InvalidUserOpDigest();\n }\n (bool success,) = checkNSignatures(actualUserOpDigest, minimalUserOpDigest, msg.sender, userOp.signature);\n\n return success ? SIG_VALIDATION_SUCCEEDED : SIG_VALIDATION_FAILED;\n }\n\n revert NotImplemented(msg.sig, functionId);\n }\n\n /// @dev get the minimal user op digest\n /// (user op hash with gas fields or paymasterAndData set to default values.)\n /// @param userOp The user operation\n /// @return minimal user op hash\n function _getMinimalUserOpDigest(PackedUserOperation calldata userOp) internal view returns (bytes32) {\n address sender;\n assembly (\"memory-safe\") {\n sender := calldataload(userOp)\n }\n uint256 nonce = userOp.nonce;\n bytes32 hashInitCode = _calldataKeccak(userOp.initCode);\n bytes32 hashCallData = _calldataKeccak(userOp.callData);\n\n bytes32 userOpHash = keccak256(\n abi.encode(\n sender,\n nonce,\n hashInitCode,\n hashCallData,\n ZERO_BYTES32, // accountGasLimits\n ZERO, // preVerificationGas = 0\n ZERO_BYTES32, // gasFees\n EMPTY_HASH // paymasterAndData = keccak256('')\n )\n );\n\n return keccak256(abi.encode(userOpHash, ENTRYPOINT, block.chainid));\n }\n\n /// @param data calldata to hash\n function _calldataKeccak(bytes calldata data) internal pure returns (bytes32 ret) {\n assembly (\"memory-safe\") {\n let mem := mload(0x40)\n let len := data.length\n calldatacopy(mem, data.offset, len)\n ret := keccak256(mem, len)\n }\n }\n\n /// @notice Check if the account has initialized this plugin yet\n /// @param account The account to check\n /// @return True if the account has initialized this plugin\n function _isInitialized(address account) internal view virtual override returns (bool) {\n return !_owners.isEmpty(account);\n }\n\n /// @dev Helper function to get a 65 byte signature from a multi-signature\n /// @dev Functions using this must make sure signatures is long enough to contain\n /// the signature (65 * pos + 65 bytes.)\n /// @param signatures signatures to split\n /// @param pos position in signatures\n function _signatureSplit(bytes memory signatures, uint256 pos)\n internal\n pure\n returns (uint8 v, bytes32 r, bytes32 s)\n {\n assembly (\"memory-safe\") {\n let signaturePos := mul(0x41, pos)\n r := mload(add(signatures, add(signaturePos, 0x20)))\n s := mload(add(signatures, add(signaturePos, 0x40)))\n v := byte(0, mload(add(signatures, add(signaturePos, 0x60))))\n }\n }\n}\n"},"node_modules/@openzeppelin/contracts/interfaces/draft-IERC1822.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822Proxiable {\n /**\n * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n * address.\n *\n * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n * function revert if invoked through a proxy.\n */\n function proxiableUUID() external view returns (bytes32);\n}\n"},"node_modules/@openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol)\n\npragma solidity ^0.8.20;\n\nimport {IBeacon} from \"../beacon/IBeacon.sol\";\nimport {Address} from \"../../utils/Address.sol\";\nimport {StorageSlot} from \"../../utils/StorageSlot.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n */\nlibrary ERC1967Utils {\n // We re-declare ERC-1967 events here because they can't be used directly from IERC1967.\n // This will be fixed in Solidity 0.8.21. At that point we should remove these events.\n /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Emitted when the beacon is changed.\n */\n event BeaconUpgraded(address indexed beacon);\n\n /**\n * @dev Storage slot with the address of the current implementation.\n * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n /**\n * @dev The `implementation` of the proxy is invalid.\n */\n error ERC1967InvalidImplementation(address implementation);\n\n /**\n * @dev The `admin` of the proxy is invalid.\n */\n error ERC1967InvalidAdmin(address admin);\n\n /**\n * @dev The `beacon` of the proxy is invalid.\n */\n error ERC1967InvalidBeacon(address beacon);\n\n /**\n * @dev An upgrade function sees `msg.value > 0` that may be lost.\n */\n error ERC1967NonPayable();\n\n /**\n * @dev Returns the current implementation address.\n */\n function getImplementation() internal view returns (address) {\n return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 implementation slot.\n */\n function _setImplementation(address newImplementation) private {\n if (newImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(newImplementation);\n }\n StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation;\n }\n\n /**\n * @dev Performs implementation upgrade with additional setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-Upgraded} event.\n */\n function upgradeToAndCall(address newImplementation, bytes memory data) internal {\n _setImplementation(newImplementation);\n emit Upgraded(newImplementation);\n\n if (data.length > 0) {\n Address.functionDelegateCall(newImplementation, data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Storage slot with the admin of the contract.\n * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n /**\n * @dev Returns the current admin.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using\n * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function getAdmin() internal view returns (address) {\n return StorageSlot.getAddressSlot(ADMIN_SLOT).value;\n }\n\n /**\n * @dev Stores a new address in the EIP1967 admin slot.\n */\n function _setAdmin(address newAdmin) private {\n if (newAdmin == address(0)) {\n revert ERC1967InvalidAdmin(address(0));\n }\n StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin;\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {IERC1967-AdminChanged} event.\n */\n function changeAdmin(address newAdmin) internal {\n emit AdminChanged(getAdmin(), newAdmin);\n _setAdmin(newAdmin);\n }\n\n /**\n * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n * This is the keccak-256 hash of \"eip1967.proxy.beacon\" subtracted by 1.\n */\n // solhint-disable-next-line private-vars-leading-underscore\n bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n /**\n * @dev Returns the current beacon.\n */\n function getBeacon() internal view returns (address) {\n return StorageSlot.getAddressSlot(BEACON_SLOT).value;\n }\n\n /**\n * @dev Stores a new beacon in the EIP1967 beacon slot.\n */\n function _setBeacon(address newBeacon) private {\n if (newBeacon.code.length == 0) {\n revert ERC1967InvalidBeacon(newBeacon);\n }\n\n StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon;\n\n address beaconImplementation = IBeacon(newBeacon).implementation();\n if (beaconImplementation.code.length == 0) {\n revert ERC1967InvalidImplementation(beaconImplementation);\n }\n }\n\n /**\n * @dev Change the beacon and trigger a setup call if data is nonempty.\n * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected\n * to avoid stuck value in the contract.\n *\n * Emits an {IERC1967-BeaconUpgraded} event.\n *\n * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since\n * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for\n * efficiency.\n */\n function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n\n if (data.length > 0) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n } else {\n _checkNonPayable();\n }\n }\n\n /**\n * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract\n * if an upgrade doesn't perform an initialization call.\n */\n function _checkNonPayable() private {\n if (msg.value > 0) {\n revert ERC1967NonPayable();\n }\n }\n}\n"},"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Storage of the initializable contract.\n *\n * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions\n * when using with upgradeable contracts.\n *\n * @custom:storage-location erc7201:openzeppelin.storage.Initializable\n */\n struct InitializableStorage {\n /**\n * @dev Indicates that the contract has been initialized.\n */\n uint64 _initialized;\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool _initializing;\n }\n\n // keccak256(abi.encode(uint256(keccak256(\"openzeppelin.storage.Initializable\")) - 1)) & ~bytes32(uint256(0xff))\n bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;\n\n /**\n * @dev The contract is already initialized.\n */\n error InvalidInitialization();\n\n /**\n * @dev The contract is not initializing.\n */\n error NotInitializing();\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint64 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any\n * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in\n * production.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n // Cache values to avoid duplicated sloads\n bool isTopLevelCall = !$._initializing;\n uint64 initialized = $._initialized;\n\n // Allowed calls:\n // - initialSetup: the contract is not in the initializing state and no previous version was\n // initialized\n // - construction: the contract is initialized at version 1 (no reininitialization) and the\n // current contract is just being deployed\n bool initialSetup = initialized == 0 && isTopLevelCall;\n bool construction = initialized == 1 && address(this).code.length == 0;\n\n if (!initialSetup && !construction) {\n revert InvalidInitialization();\n }\n $._initialized = 1;\n if (isTopLevelCall) {\n $._initializing = true;\n }\n _;\n if (isTopLevelCall) {\n $._initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint64 version) {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing || $._initialized >= version) {\n revert InvalidInitialization();\n }\n $._initialized = version;\n $._initializing = true;\n _;\n $._initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n _checkInitializing();\n _;\n }\n\n /**\n * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.\n */\n function _checkInitializing() internal view virtual {\n if (!_isInitializing()) {\n revert NotInitializing();\n }\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n // solhint-disable-next-line var-name-mixedcase\n InitializableStorage storage $ = _getInitializableStorage();\n\n if ($._initializing) {\n revert InvalidInitialization();\n }\n if ($._initialized != type(uint64).max) {\n $._initialized = type(uint64).max;\n emit Initialized(type(uint64).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint64) {\n return _getInitializableStorage()._initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _getInitializableStorage()._initializing;\n }\n\n /**\n * @dev Returns a pointer to the storage namespace.\n */\n // solhint-disable-next-line var-name-mixedcase\n function _getInitializableStorage() private pure returns (InitializableStorage storage $) {\n assembly {\n $.slot := INITIALIZABLE_STORAGE\n }\n }\n}\n"},"node_modules/fcl/solidity/src/FCL_ecdsa.sol":{"content":"//********************************************************************************************/\n// ___ _ ___ _ _ _ _\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\n// | _| '_/ -_|_-< ' \\ | (__| '_| || | '_ \\ _/ _ \\ | |__| | '_ \\\n// |_||_| \\___/__/_||_| \\___|_| \\_, | .__/\\__\\___/ |____|_|_.__/\n// |__/|_|\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\n///* License: This software is licensed under MIT License\n///* This Code may be reused including license and copyright notice.\n///* See LICENSE file at the root folder of the project.\n///* FILE: FCL_ecdsa.sol\n///*\n///*\n///* DESCRIPTION: ecdsa verification implementation\n///*\n//**************************************************************************************/\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\n// if ever used for other curve than sec256R1\n// SPDX-License-Identifier: MIT\npragma solidity >=0.8.19 <0.9.0;\n\n\nimport {FCL_Elliptic_ZZ} from \"./FCL_elliptic.sol\";\n\n\n\nlibrary FCL_ecdsa {\n // Set parameters for curve sec256r1.public\n //curve order (number of points)\n uint256 constant n = FCL_Elliptic_ZZ.n;\n \n /**\n * @dev ECDSA verification, given , signature, and public key.\n */\n\n /**\n * @dev ECDSA verification, given , signature, and public key, no calldata version\n */\n function ecdsa_verify(bytes32 message, uint256 r, uint256 s, uint256 Qx, uint256 Qy) internal view returns (bool){\n\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return false;\n }\n \n if (!FCL_Elliptic_ZZ.ecAff_isOnCurve(Qx, Qy)) {\n return false;\n }\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 scalar_u = mulmod(uint256(message), sInv, FCL_Elliptic_ZZ.n);\n uint256 scalar_v = mulmod(r, sInv, FCL_Elliptic_ZZ.n);\n uint256 x1;\n\n x1 = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S_asm(Qx, Qy, scalar_u, scalar_v);\n\n x1= addmod(x1, n-r,n );\n \n return x1 == 0;\n }\n\n function ec_recover_r1(uint256 h, uint256 v, uint256 r, uint256 s) internal view returns (address)\n {\n if (r == 0 || r >= FCL_Elliptic_ZZ.n || s == 0 || s >= FCL_Elliptic_ZZ.n) {\n return address(0);\n }\n uint256 y=FCL_Elliptic_ZZ.ec_Decompress(r, v-27);\n uint256 rinv=FCL_Elliptic_ZZ.FCL_nModInv(r);\n uint256 u1=mulmod(FCL_Elliptic_ZZ.n-addmod(0,h,FCL_Elliptic_ZZ.n), rinv,FCL_Elliptic_ZZ.n);//-hr^-1\n uint256 u2=mulmod(s, rinv,FCL_Elliptic_ZZ.n);//sr^-1\n\n uint256 Qx;\n uint256 Qy;\n (Qx,Qy)=FCL_Elliptic_ZZ.ecZZ_mulmuladd(r,y, u1, u2);\n\n return address(uint160(uint256(keccak256(abi.encodePacked(Qx, Qy)))));\n }\n\n function ecdsa_precomputed_verify(bytes32 message, uint256 r, uint256 s, address Shamir8)\n internal view\n returns (bool)\n {\n \n if (r == 0 || r >= n || s == 0 || s >= n) {\n return false;\n }\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\n if (!isOnCurve(Q[0], Q[1])) {\n return false;\n }*/\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 X;\n\n //Shamir 8 dimensions\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\n\n X= addmod(X, n-r,n );\n\n return X == 0;\n } //end ecdsa_precomputed_verify()\n\n function ecdsa_precomputed_verify(bytes32 message, uint256[2] calldata rs, address Shamir8)\n internal view\n returns (bool)\n {\n uint256 r = rs[0];\n uint256 s = rs[1];\n if (r == 0 || r >= n || s == 0 || s >= n) {\n return false;\n }\n /* Q is pushed via the contract at address Shamir8 assumed to be correct\n if (!isOnCurve(Q[0], Q[1])) {\n return false;\n }*/\n\n uint256 sInv = FCL_Elliptic_ZZ.FCL_nModInv(s);\n\n uint256 X;\n\n //Shamir 8 dimensions\n X = FCL_Elliptic_ZZ.ecZZ_mulmuladd_S8_extcode(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), Shamir8);\n\n X= addmod(X, n-r,n );\n\n return X == 0;\n } //end ecdsa_precomputed_verify()\n\n}\n"},"node_modules/fcl/solidity/src/FCL_elliptic.sol":{"content":"//********************************************************************************************/\n// ___ _ ___ _ _ _ _\n// | __| _ ___ __| |_ / __|_ _ _ _ _ __| |_ ___ | | (_) |__\n// | _| '_/ -_|_-< ' \\ | (__| '_| || | '_ \\ _/ _ \\ | |__| | '_ \\\n// |_||_| \\___/__/_||_| \\___|_| \\_, | .__/\\__\\___/ |____|_|_.__/\n// |__/|_|\n///* Copyright (C) 2022 - Renaud Dubois - This file is part of FCL (Fresh CryptoLib) project\n///* License: This software is licensed under MIT License\n///* This Code may be reused including license and copyright notice.\n///* See LICENSE file at the root folder of the project.\n///* FILE: FCL_elliptic.sol\n///*\n///*\n///* DESCRIPTION: modified XYZZ system coordinates for EVM elliptic point multiplication\n///* optimization\n///*\n//**************************************************************************************/\n//* WARNING: this code SHALL not be used for non prime order curves for security reasons.\n// Code is optimized for a=-3 only curves with prime order, constant like -1, -2 shall be replaced\n// if ever used for other curve than sec256R1\n// SPDX-License-Identifier: MIT\npragma solidity >=0.8.19 <0.9.0;\n\nlibrary FCL_Elliptic_ZZ {\n // Set parameters for curve sec256r1.\n\n // address of the ModExp precompiled contract (Arbitrary-precision exponentiation under modulo)\n address constant MODEXP_PRECOMPILE = 0x0000000000000000000000000000000000000005;\n //curve prime field modulus\n uint256 constant p = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\n //short weierstrass first coefficient\n uint256 constant a = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC;\n //short weierstrass second coefficient\n uint256 constant b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B;\n //generating point affine coordinates\n uint256 constant gx = 0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296;\n uint256 constant gy = 0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5;\n //curve order (number of points)\n uint256 constant n = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551;\n /* -2 mod p constant, used to speed up inversion and doubling (avoid negation)*/\n uint256 constant minus_2 = 0xFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFD;\n /* -2 mod n constant, used to speed up inversion*/\n uint256 constant minus_2modn = 0xFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC63254F;\n\n uint256 constant minus_1 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\n //P+1 div 4\n uint256 constant pp1div4=0x3fffffffc0000000400000000000000000000000400000000000000000000000;\n //arbitrary constant to express no quadratic residuosity\n uint256 constant _NOTSQUARE=0xFFFFFFFF00000002000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\n uint256 constant _NOTONCURVE=0xFFFFFFFF00000003000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF;\n\n /**\n * /* inversion mod n via a^(n-2), use of precompiled using little Fermat theorem\n */\n function FCL_nModInv(uint256 u) internal view returns (uint256 result) {\n assembly {\n let pointer := mload(0x40)\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(pointer, 0x20)\n mstore(add(pointer, 0x20), 0x20)\n mstore(add(pointer, 0x40), 0x20)\n // Define variables base, exponent and modulus\n mstore(add(pointer, 0x60), u)\n mstore(add(pointer, 0x80), minus_2modn)\n mstore(add(pointer, 0xa0), n)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\n result := mload(pointer)\n }\n }\n /**\n * /* @dev inversion mod nusing little Fermat theorem via a^(n-2), use of precompiled\n */\n\n function FCL_pModInv(uint256 u) internal view returns (uint256 result) {\n assembly {\n let pointer := mload(0x40)\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(pointer, 0x20)\n mstore(add(pointer, 0x20), 0x20)\n mstore(add(pointer, 0x40), 0x20)\n // Define variables base, exponent and modulus\n mstore(add(pointer, 0x60), u)\n mstore(add(pointer, 0x80), minus_2)\n mstore(add(pointer, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, pointer, 0xc0, pointer, 0x20)) { revert(0, 0) }\n result := mload(pointer)\n }\n }\n\n //Coron projective shuffling, take as input alpha as blinding factor\n function ecZZ_Coronize(uint256 alpha, uint256 x, uint256 y, uint256 zz, uint256 zzz) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\n {\n \n uint256 alpha2=mulmod(alpha,alpha,p);\n \n x3=mulmod(alpha2, x,p); //alpha^-2.x\n y3=mulmod(mulmod(alpha, alpha2,p), y,p);\n\n zz3=mulmod(zz,alpha2,p);//alpha^2 zz\n zzz3=mulmod(zzz,mulmod(alpha, alpha2,p),p);//alpha^3 zzz\n \n return (x3, y3, zz3, zzz3);\n }\n\n\n function ecZZ_Add(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2, uint256 zz2, uint256 zzz2) internal pure returns (uint256 x3, uint256 y3, uint256 zz3, uint256 zzz3)\n {\n uint256 u1=mulmod(x1,zz2,p); // U1 = X1*ZZ2\n uint256 u2=mulmod(x2, zz1,p); // U2 = X2*ZZ1\n u2=addmod(u2, p-u1, p);// P = U2-U1\n x1=mulmod(u2, u2, p);//PP\n x2=mulmod(x1, u2, p);//PPP\n \n zz3=mulmod(x1, mulmod(zz1, zz2, p),p);//ZZ3 = ZZ1*ZZ2*PP \n zzz3=mulmod(zzz1, mulmod(zzz2, x2, p),p);//ZZZ3 = ZZZ1*ZZZ2*PPP\n\n zz1=mulmod(y1, zzz2,p); // S1 = Y1*ZZZ2\n zz2=mulmod(y2, zzz1, p); // S2 = Y2*ZZZ1 \n zz2=addmod(zz2, p-zz1, p);//R = S2-S1\n zzz1=mulmod(u1, x1,p); //Q = U1*PP\n x3= addmod(addmod(mulmod(zz2, zz2, p), p-x2,p), mulmod(minus_2, zzz1,p),p); //X3 = R2-PPP-2*Q\n y3=addmod( mulmod(zz2, addmod(zzz1, p-x3, p),p), p-mulmod(zz1, x2, p),p);//R*(Q-X3)-S1*PPP\n\n return (x3, y3, zz3, zzz3);\n }\n\n/// @notice Calculate one modular square root of a given integer. Assume that p=3 mod 4.\n/// @dev Uses the ModExp precompiled contract at address 0x05 for fast computation using little Fermat theorem\n/// @param self The integer of which to find the modular inverse\n/// @return result The modular inverse of the input integer. If the modular inverse doesn't exist, it revert the tx\n\nfunction SqrtMod(uint256 self) internal view returns (uint256 result){\n assembly (\"memory-safe\") {\n // load the free memory pointer value\n let pointer := mload(0x40)\n\n // Define length of base (Bsize)\n mstore(pointer, 0x20)\n // Define the exponent size (Esize)\n mstore(add(pointer, 0x20), 0x20)\n // Define the modulus size (Msize)\n mstore(add(pointer, 0x40), 0x20)\n // Define variables base (B)\n mstore(add(pointer, 0x60), self)\n // Define the exponent (E)\n mstore(add(pointer, 0x80), pp1div4)\n // We save the point of the last argument, it will be override by the result\n // of the precompile call in order to avoid paying for the memory expansion properly\n let _result := add(pointer, 0xa0)\n // Define the modulus (M)\n mstore(_result, p)\n\n // Call the precompiled ModExp (0x05) https://www.evm.codes/precompiled#0x05\n if iszero(\n staticcall(\n not(0), // amount of gas to send\n MODEXP_PRECOMPILE, // target\n pointer, // argsOffset\n 0xc0, // argsSize (6 * 32 bytes)\n _result, // retOffset (we override M to avoid paying for the memory expansion)\n 0x20 // retSize (32 bytes)\n )\n ) { revert(0, 0) }\n\n result := mload(_result)\n// result :=addmod(result,0,p)\n }\n if(mulmod(result,result,p)!=self){\n result=_NOTSQUARE;\n }\n \n return result;\n}\n /**\n * /* @dev Convert from affine rep to XYZZ rep\n */\n function ecAff_SetZZ(uint256 x0, uint256 y0) internal pure returns (uint256[4] memory P) {\n unchecked {\n P[2] = 1; //ZZ\n P[3] = 1; //ZZZ\n P[0] = x0;\n P[1] = y0;\n }\n }\n\n function ec_Decompress(uint256 x, uint256 parity) internal view returns(uint256 y){ \n\n uint256 y2=mulmod(x,mulmod(x,x,p),p);//x3\n y2=addmod(b,addmod(y2,mulmod(x,a,p),p),p);//x3+ax+b\n\n y=SqrtMod(y2);\n if(y==_NOTSQUARE){\n return _NOTONCURVE;\n }\n if((y&1)!=(parity&1)){\n y=p-y;\n }\n }\n\n /**\n * /* @dev Convert from XYZZ rep to affine rep\n */\n /* https://hyperelliptic.org/EFD/g1p/auto-shortw-xyzz-3.html#addition-add-2008-s*/\n function ecZZ_SetAff(uint256 x, uint256 y, uint256 zz, uint256 zzz) internal view returns (uint256 x1, uint256 y1) {\n uint256 zzzInv = FCL_pModInv(zzz); //1/zzz\n y1 = mulmod(y, zzzInv, p); //Y/zzz\n uint256 _b = mulmod(zz, zzzInv, p); //1/z\n zzzInv = mulmod(_b, _b, p); //1/zz\n x1 = mulmod(x, zzzInv, p); //X/zz\n }\n\n /**\n * /* @dev Sutherland2008 doubling\n */\n /* The \"dbl-2008-s-1\" doubling formulas */\n\n function ecZZ_Dbl(uint256 x, uint256 y, uint256 zz, uint256 zzz)\n internal\n pure\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\n {\n unchecked {\n assembly {\n P0 := mulmod(2, y, p) //U = 2*Y1\n P2 := mulmod(P0, P0, p) // V=U^2\n P3 := mulmod(x, P2, p) // S = X1*V\n P1 := mulmod(P0, P2, p) // W=UV\n P2 := mulmod(P2, zz, p) //zz3=V*ZZ1\n zz := mulmod(3, mulmod(addmod(x, sub(p, zz), p), addmod(x, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n P0 := addmod(mulmod(zz, zz, p), mulmod(minus_2, P3, p), p) //X3=M^2-2S\n x := mulmod(zz, addmod(P3, sub(p, P0), p), p) //M(S-X3)\n P3 := mulmod(P1, zzz, p) //zzz3=W*zzz1\n P1 := addmod(x, sub(p, mulmod(P1, y, p)), p) //Y3= M(S-X3)-W*Y1\n }\n }\n return (P0, P1, P2, P3);\n }\n\n /**\n * @dev Sutherland2008 add a ZZ point with a normalized point and greedy formulae\n * warning: assume that P1(x1,y1)!=P2(x2,y2), true in multiplication loop with prime order (cofactor 1)\n */\n\n function ecZZ_AddN(uint256 x1, uint256 y1, uint256 zz1, uint256 zzz1, uint256 x2, uint256 y2)\n internal\n pure\n returns (uint256 P0, uint256 P1, uint256 P2, uint256 P3)\n {\n unchecked {\n if (y1 == 0) {\n return (x2, y2, 1, 1);\n }\n\n assembly {\n y1 := sub(p, y1)\n y2 := addmod(mulmod(y2, zzz1, p), y1, p)\n x2 := addmod(mulmod(x2, zz1, p), sub(p, x1), p)\n P0 := mulmod(x2, x2, p) //PP = P^2\n P1 := mulmod(P0, x2, p) //PPP = P*PP\n P2 := mulmod(zz1, P0, p) ////ZZ3 = ZZ1*PP\n P3 := mulmod(zzz1, P1, p) ////ZZZ3 = ZZZ1*PPP\n zz1 := mulmod(x1, P0, p) //Q = X1*PP\n P0 := addmod(addmod(mulmod(y2, y2, p), sub(p, P1), p), mulmod(minus_2, zz1, p), p) //R^2-PPP-2*Q\n P1 := addmod(mulmod(addmod(zz1, sub(p, P0), p), y2, p), mulmod(y1, P1, p), p) //R*(Q-X3)\n }\n //end assembly\n } //end unchecked\n return (P0, P1, P2, P3);\n }\n\n /**\n * @dev Return the zero curve in XYZZ coordinates.\n */\n function ecZZ_SetZero() internal pure returns (uint256 x, uint256 y, uint256 zz, uint256 zzz) {\n return (0, 0, 0, 0);\n }\n /**\n * @dev Check if point is the neutral of the curve\n */\n\n // uint256 x0, uint256 y0, uint256 zz0, uint256 zzz0\n function ecZZ_IsZero(uint256, uint256 y0, uint256, uint256) internal pure returns (bool) {\n return y0 == 0;\n }\n /**\n * @dev Return the zero curve in affine coordinates. Compatible with the double formulae (no special case)\n */\n\n function ecAff_SetZero() internal pure returns (uint256 x, uint256 y) {\n return (0, 0);\n }\n\n /**\n * @dev Check if the curve is the zero curve in affine rep.\n */\n // uint256 x, uint256 y)\n function ecAff_IsZero(uint256, uint256 y) internal pure returns (bool flag) {\n return (y == 0);\n }\n\n /**\n * @dev Check if a point in affine coordinates is on the curve (reject Neutral that is indeed on the curve).\n */\n function ecAff_isOnCurve(uint256 x, uint256 y) internal pure returns (bool) {\n if (x >= p || y >= p || ((x == 0) && (y == 0))) {\n return false;\n }\n unchecked {\n uint256 LHS = mulmod(y, y, p); // y^2\n uint256 RHS = addmod(mulmod(mulmod(x, x, p), x, p), mulmod(x, a, p), p); // x^3+ax\n RHS = addmod(RHS, b, p); // x^3 + a*x + b\n\n return LHS == RHS;\n }\n }\n\n /**\n * @dev Add two elliptic curve points in affine coordinates. Deal with P=Q\n */\n\n function ecAff_add(uint256 x0, uint256 y0, uint256 x1, uint256 y1) internal view returns (uint256, uint256) {\n uint256 zz0;\n uint256 zzz0;\n\n if (ecAff_IsZero(x0, y0)) return (x1, y1);\n if (ecAff_IsZero(x1, y1)) return (x0, y0);\n if((x0==x1)&&(y0==y1)) {\n (x0, y0, zz0, zzz0) = ecZZ_Dbl(x0, y0,1,1);\n }\n else{\n (x0, y0, zz0, zzz0) = ecZZ_AddN(x0, y0, 1, 1, x1, y1);\n }\n\n return ecZZ_SetAff(x0, y0, zz0, zzz0);\n }\n\n /**\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\n * Returns only x for ECDSA use \n * */\n function ecZZ_mulmuladd_S_asm(\n uint256 Q0,\n uint256 Q1, //affine rep for input point Q\n uint256 scalar_u,\n uint256 scalar_v\n ) internal view returns (uint256 X) {\n uint256 zz;\n uint256 zzz;\n uint256 Y;\n uint256 index = 255;\n uint256 H0;\n uint256 H1;\n\n unchecked {\n if (scalar_u == 0 && scalar_v == 0) return 0;\n\n (H0, H1) = ecAff_add(gx, gy, Q0, Q1); \n if((H0==0)&&(H1==0))//handling Q=-G\n {\n scalar_u=addmod(scalar_u, n-scalar_v, n);\n scalar_v=0;\n if (scalar_u == 0 && scalar_v == 0) return 0;\n }\n assembly {\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\n index := sub(index, 1)\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n } {}\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if eq(zz, 1) {\n X := gx\n Y := gy\n }\n if eq(zz, 2) {\n X := Q0\n Y := Q1\n }\n if eq(zz, 3) {\n X := H0\n Y := H1\n }\n\n index := sub(index, 1)\n zz := 1\n zzz := 1\n\n for {} gt(minus_1, index) { index := sub(index, 1) } {\n // inlined EcZZ_Dbl\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n T1 := mulmod(T1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n {\n //value of dibit\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if iszero(T4) {\n Y := sub(p, Y) //restore the -Y inversion\n continue\n } // if T4!=0\n\n if eq(T4, 1) {\n T1 := gx\n T2 := gy\n }\n if eq(T4, 2) {\n T1 := Q0\n T2 := Q1\n }\n if eq(T4, 3) {\n T1 := H0\n T2 := H1\n }\n if iszero(zz) {\n X := T1\n Y := T2\n zz := 1\n zzz := 1\n continue\n }\n // inlined EcZZ_AddN\n\n //T3:=sub(p, Y)\n //T3:=Y\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\n\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\n //todo : construct edge vector case\n if iszero(y2) {\n if iszero(T2) {\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\n T2 := mulmod(T1, T1, p) // V=U^2\n T3 := mulmod(X, T2, p) // S = X1*V\n\n T1 := mulmod(T1, T2, p) // W=UV\n y2 := mulmod(addmod(X, zz, p), addmod(X, sub(p, zz), p), p) //(X-ZZ)(X+ZZ)\n T4 := mulmod(3, y2, p) //M=3*(X-ZZ)(X+ZZ)\n\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\n\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\n\n continue\n }\n }\n\n T4 := mulmod(T2, T2, p) //PP\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\n zz := mulmod(zz, T4, p)\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\n let TT2 := mulmod(X, T4, p)\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\n\n X := T4\n }\n } //end loop\n let T := mload(0x40)\n mstore(add(T, 0x60), zz)\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n //Y:=mulmod(Y,zzz,p)//Y/zzz\n //zz :=mulmod(zz, mload(T),p) //1/z\n //zz:= mulmod(zz,zz,p) //1/zz\n X := mulmod(X, mload(T), p) //X/zz\n } //end assembly\n } //end unchecked\n\n return X;\n }\n\n\n /**\n * @dev Computation of uG+vQ using Strauss-Shamir's trick, G basepoint, Q public key\n * Returns affine representation of point (normalized) \n * */\n function ecZZ_mulmuladd(\n uint256 Q0,\n uint256 Q1, //affine rep for input point Q\n uint256 scalar_u,\n uint256 scalar_v\n ) internal view returns (uint256 X, uint256 Y) {\n uint256 zz;\n uint256 zzz;\n uint256 index = 255;\n uint256[6] memory T;\n uint256[2] memory H;\n \n unchecked {\n if (scalar_u == 0 && scalar_v == 0) return (0,0);\n\n (H[0], H[1]) = ecAff_add(gx, gy, Q0, Q1); //will not work if Q=P, obvious forbidden private key\n\n assembly {\n for { let T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1)) } eq(T4, 0) {\n index := sub(index, 1)\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n } {}\n zz := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if eq(zz, 1) {\n X := gx\n Y := gy\n }\n if eq(zz, 2) {\n X := Q0\n Y := Q1\n }\n if eq(zz, 3) {\n Y := mload(add(H,32))\n X := mload(H)\n }\n\n index := sub(index, 1)\n zz := 1\n zzz := 1\n\n for {} gt(minus_1, index) { index := sub(index, 1) } {\n // inlined EcZZ_Dbl\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n T1 := mulmod(T1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n {\n //value of dibit\n T4 := add(shl(1, and(shr(index, scalar_v), 1)), and(shr(index, scalar_u), 1))\n\n if iszero(T4) {\n Y := sub(p, Y) //restore the -Y inversion\n continue\n } // if T4!=0\n\n if eq(T4, 1) {\n T1 := gx\n T2 := gy\n }\n if eq(T4, 2) {\n T1 := Q0\n T2 := Q1\n }\n if eq(T4, 3) {\n T1 := mload(H)\n T2 := mload(add(H,32))\n }\n if iszero(zz) {\n X := T1\n Y := T2\n zz := 1\n zzz := 1\n continue\n }\n // inlined EcZZ_AddN\n\n //T3:=sub(p, Y)\n //T3:=Y\n let y2 := addmod(mulmod(T2, zzz, p), Y, p) //R\n T2 := addmod(mulmod(T1, zz, p), sub(p, X), p) //P\n\n //special extremely rare case accumulator where EcAdd is replaced by EcDbl, no need to optimize this\n //todo : construct edge vector case\n if iszero(y2) {\n if iszero(T2) {\n T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\n T2 := mulmod(T1, T1, p) // V=U^2\n T3 := mulmod(X, T2, p) // S = X1*V\n\n T1 := mulmod(T1, T2, p) // W=UV\n y2 := mulmod(addmod(X, zz, p), addmod(X, sub(p, zz), p), p) //(X-ZZ)(X+ZZ)\n T4 := mulmod(3, y2, p) //M=3*(X-ZZ)(X+ZZ)\n\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\n\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\n\n continue\n }\n }\n\n T4 := mulmod(T2, T2, p) //PP\n let TT1 := mulmod(T4, T2, p) //PPP, this one could be spared, but adding this register spare gas\n zz := mulmod(zz, T4, p)\n zzz := mulmod(zzz, TT1, p) //zz3=V*ZZ1\n let TT2 := mulmod(X, T4, p)\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, TT1), p), mulmod(minus_2, TT2, p), p)\n Y := addmod(mulmod(addmod(TT2, sub(p, T4), p), y2, p), mulmod(Y, TT1, p), p)\n\n X := T4\n }\n } //end loop\n mstore(add(T, 0x60), zzz)\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n Y:=mulmod(Y,mload(T),p)//Y/zzz\n zz :=mulmod(zz, mload(T),p) //1/z\n zz:= mulmod(zz,zz,p) //1/zz\n X := mulmod(X, zz, p) //X/zz\n } //end assembly\n } //end unchecked\n\n return (X,Y);\n }\n\n //8 dimensions Shamir's trick, using precomputations stored in Shamir8, stored as Bytecode of an external\n //contract at given address dataPointer\n //(thx to Lakhdar https://github.com/Kelvyne for EVM storage explanations and tricks)\n // the external tool to generate tables from public key is in the /sage directory\n function ecZZ_mulmuladd_S8_extcode(uint256 scalar_u, uint256 scalar_v, address dataPointer)\n internal view\n returns (uint256 X /*, uint Y*/ )\n {\n unchecked {\n uint256 zz; // third and coordinates of the point\n\n uint256[6] memory T;\n zz = 256; //start index\n\n while (T[0] == 0) {\n zz = zz - 1;\n //tbd case of msb octobit is null\n T[0] = 64\n * (\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\n );\n }\n assembly {\n extcodecopy(dataPointer, T, mload(T), 64)\n let index := sub(zz, 1)\n X := mload(T)\n let Y := mload(add(T, 32))\n let zzz := 1\n zz := 1\n\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\n for {} gt(index, 191) { index := add(index, 191) } {\n //inline Double\n {\n let TT1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(TT1, TT1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n let T1 := mulmod(TT1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\n let T5 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\n Y := addmod(mulmod(T1, Y, p), T5, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n /* compute element to access in precomputed table */\n }\n {\n let T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\n let index2 := sub(index, 64)\n let T3 :=\n add(T4, add(shl(12, and(shr(index2, scalar_v), 1)), shl(8, and(shr(index2, scalar_u), 1))))\n let index3 := sub(index2, 64)\n let T2 :=\n add(T3, add(shl(11, and(shr(index3, scalar_v), 1)), shl(7, and(shr(index3, scalar_u), 1))))\n index := sub(index3, 64)\n let T1 :=\n add(T2, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\n\n //tbd: check validity of formulae with (0,1) to remove conditional jump\n if iszero(T1) {\n Y := sub(p, Y)\n\n continue\n }\n extcodecopy(dataPointer, T, T1, 64)\n }\n\n {\n /* Access to precomputed table using extcodecopy hack */\n\n // inlined EcZZ_AddN\n if iszero(zz) {\n X := mload(T)\n Y := mload(add(T, 32))\n zz := 1\n zzz := 1\n\n continue\n }\n\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\n let T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\n\n //special case ecAdd(P,P)=EcDbl\n if iszero(y2) {\n if iszero(T2) {\n let T1 := mulmod(minus_2, Y, p) //U = 2*Y1, y free\n T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n\n T1 := mulmod(T1, T2, p) // W=UV\n y2 := mulmod(addmod(X, zz, p), addmod(X, sub(p, zz), p), p) //(X-ZZ)(X+ZZ)\n let T4 := mulmod(3, y2, p) //M=3*(X-ZZ)(X+ZZ)\n\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n T2 := mulmod(T4, addmod(T3, sub(p, X), p), p) //M(S-X3)\n\n Y := addmod(T2, mulmod(T1, Y, p), p) //Y3= M(S-X3)-W*Y1\n\n continue\n }\n }\n\n let T4 := mulmod(T2, T2, p)\n let T1 := mulmod(T4, T2, p) //\n zz := mulmod(zz, T4, p)\n //zzz3=V*ZZ1\n zzz := mulmod(zzz, T1, p) // W=UV/\n let zz1 := mulmod(X, T4, p)\n X := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\n Y := addmod(mulmod(addmod(zz1, sub(p, X), p), y2, p), mulmod(Y, T1, p), p)\n }\n } //end loop\n mstore(add(T, 0x60), zz)\n\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n zz := mload(T)\n X := mulmod(X, zz, p) //X/zz\n }\n } //end unchecked\n }\n\n \n\n // improving the extcodecopy trick : append array at end of contract\n function ecZZ_mulmuladd_S8_hackmem(uint256 scalar_u, uint256 scalar_v, uint256 dataPointer)\n internal view\n returns (uint256 X /*, uint Y*/ )\n {\n uint256 zz; // third and coordinates of the point\n\n uint256[6] memory T;\n zz = 256; //start index\n\n unchecked {\n while (T[0] == 0) {\n zz = zz - 1;\n //tbd case of msb octobit is null\n T[0] = 64\n * (\n 128 * ((scalar_v >> zz) & 1) + 64 * ((scalar_v >> (zz - 64)) & 1)\n + 32 * ((scalar_v >> (zz - 128)) & 1) + 16 * ((scalar_v >> (zz - 192)) & 1)\n + 8 * ((scalar_u >> zz) & 1) + 4 * ((scalar_u >> (zz - 64)) & 1)\n + 2 * ((scalar_u >> (zz - 128)) & 1) + ((scalar_u >> (zz - 192)) & 1)\n );\n }\n assembly {\n codecopy(T, add(mload(T), dataPointer), 64)\n X := mload(T)\n let Y := mload(add(T, 32))\n let zzz := 1\n zz := 1\n\n //loop over 1/4 of scalars thx to Shamir's trick over 8 points\n for { let index := 254 } gt(index, 191) { index := add(index, 191) } {\n let T1 := mulmod(2, Y, p) //U = 2*Y1, y free\n let T2 := mulmod(T1, T1, p) // V=U^2\n let T3 := mulmod(X, T2, p) // S = X1*V\n T1 := mulmod(T1, T2, p) // W=UV\n let T4 := mulmod(3, mulmod(addmod(X, sub(p, zz), p), addmod(X, zz, p), p), p) //M=3*(X1-ZZ1)*(X1+ZZ1)\n zzz := mulmod(T1, zzz, p) //zzz3=W*zzz1\n zz := mulmod(T2, zz, p) //zz3=V*ZZ1, V free\n\n X := addmod(mulmod(T4, T4, p), mulmod(minus_2, T3, p), p) //X3=M^2-2S\n //T2:=mulmod(T4,addmod(T3, sub(p, X),p),p)//M(S-X3)\n T2 := mulmod(T4, addmod(X, sub(p, T3), p), p) //-M(S-X3)=M(X3-S)\n\n //Y:= addmod(T2, sub(p, mulmod(T1, Y ,p)),p )//Y3= M(S-X3)-W*Y1\n Y := addmod(mulmod(T1, Y, p), T2, p) //-Y3= W*Y1-M(S-X3), we replace Y by -Y to avoid a sub in ecAdd\n\n /* compute element to access in precomputed table */\n T4 := add(shl(13, and(shr(index, scalar_v), 1)), shl(9, and(shr(index, scalar_u), 1)))\n index := sub(index, 64)\n T4 := add(T4, add(shl(12, and(shr(index, scalar_v), 1)), shl(8, and(shr(index, scalar_u), 1))))\n index := sub(index, 64)\n T4 := add(T4, add(shl(11, and(shr(index, scalar_v), 1)), shl(7, and(shr(index, scalar_u), 1))))\n index := sub(index, 64)\n T4 := add(T4, add(shl(10, and(shr(index, scalar_v), 1)), shl(6, and(shr(index, scalar_u), 1))))\n //index:=add(index,192), restore index, interleaved with loop\n\n //tbd: check validity of formulae with (0,1) to remove conditional jump\n if iszero(T4) {\n Y := sub(p, Y)\n\n continue\n }\n {\n /* Access to precomputed table using extcodecopy hack */\n codecopy(T, add(T4, dataPointer), 64)\n\n // inlined EcZZ_AddN\n\n let y2 := addmod(mulmod(mload(add(T, 32)), zzz, p), Y, p)\n T2 := addmod(mulmod(mload(T), zz, p), sub(p, X), p)\n T4 := mulmod(T2, T2, p)\n T1 := mulmod(T4, T2, p)\n T2 := mulmod(zz, T4, p) // W=UV\n zzz := mulmod(zzz, T1, p) //zz3=V*ZZ1\n let zz1 := mulmod(X, T4, p)\n T4 := addmod(addmod(mulmod(y2, y2, p), sub(p, T1), p), mulmod(minus_2, zz1, p), p)\n Y := addmod(mulmod(addmod(zz1, sub(p, T4), p), y2, p), mulmod(Y, T1, p), p)\n zz := T2\n X := T4\n }\n } //end loop\n mstore(add(T, 0x60), zz)\n\n //(X,Y)=ecZZ_SetAff(X,Y,zz, zzz);\n //T[0] = inverseModp_Hard(T[0], p); //1/zzz, inline modular inversion using precompile:\n // Define length of base, exponent and modulus. 0x20 == 32 bytes\n mstore(T, 0x20)\n mstore(add(T, 0x20), 0x20)\n mstore(add(T, 0x40), 0x20)\n // Define variables base, exponent and modulus\n //mstore(add(pointer, 0x60), u)\n mstore(add(T, 0x80), minus_2)\n mstore(add(T, 0xa0), p)\n\n // Call the precompiled contract 0x05 = ModExp\n if iszero(staticcall(not(0), 0x05, T, 0xc0, T, 0x20)) { revert(0, 0) }\n\n zz := mload(T)\n X := mulmod(X, zz, p) //X/zz\n }\n } //end unchecked\n }\n\n\n /**\n * @dev ECDSA verification using a precomputed table of multiples of P and Q stored in contract at address Shamir8\n * generation of contract bytecode for precomputations is done using sagemath code\n * (see sage directory, WebAuthn_precompute.sage)\n */\n\n /**\n * @dev ECDSA verification using a precomputed table of multiples of P and Q appended at end of contract at address endcontract\n * generation of contract bytecode for precomputations is done using sagemath code\n * (see sage directory, WebAuthn_precompute.sage)\n */\n\n function ecdsa_precomputed_hackmem(bytes32 message, uint256[2] calldata rs, uint256 endcontract)\n internal view\n returns (bool)\n {\n uint256 r = rs[0];\n uint256 s = rs[1];\n if (r == 0 || r >= n || s == 0 || s >= n) {\n return false;\n }\n /* Q is pushed via bytecode assumed to be correct\n if (!isOnCurve(Q[0], Q[1])) {\n return false;\n }*/\n\n uint256 sInv = FCL_nModInv(s);\n uint256 X;\n\n //Shamir 8 dimensions\n X = ecZZ_mulmuladd_S8_hackmem(mulmod(uint256(message), sInv, n), mulmod(r, sInv, n), endcontract);\n\n assembly {\n X := addmod(X, sub(n, r), n)\n }\n return X == 0;\n } //end ecdsa_precomputed_verify()\n\n\n\n} //EOF\n"},"node_modules/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MessageHashUtils.sol)\n\npragma solidity ^0.8.20;\n\nimport {Strings} from \"../Strings.sol\";\n\n/**\n * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing.\n *\n * The library provides methods for generating a hash of a message that conforms to the\n * https://eips.ethereum.org/EIPS/eip-191[EIP 191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712]\n * specifications.\n */\nlibrary MessageHashUtils {\n /**\n * @dev Returns the keccak256 digest of an EIP-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing a bytes32 `messageHash` with\n * `\"\\x19Ethereum Signed Message:\\n32\"` and hashing the result. It corresponds with the\n * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * NOTE: The `messageHash` parameter is intended to be the result of hashing a raw message with\n * keccak256, although any bytes32 value can be safely used because the final digest will\n * be re-hashed.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\") // 32 is the bytes-length of messageHash\n mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix\n digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)\n }\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-191 signed data with version\n * `0x45` (`personal_sign` messages).\n *\n * The digest is calculated by prefixing an arbitrary `message` with\n * `\"\\x19Ethereum Signed Message:\\n\" + len(message)` and hashing the result. It corresponds with the\n * hash signed when using the https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] JSON-RPC method.\n *\n * See {ECDSA-recover}.\n */\n function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {\n return\n keccak256(bytes.concat(\"\\x19Ethereum Signed Message:\\n\", bytes(Strings.toString(message.length)), message));\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-191 signed data with version\n * `0x00` (data with intended validator).\n *\n * The digest is calculated by prefixing an arbitrary `data` with `\"\\x19\\x00\"` and the intended\n * `validator` address. Then hashing the result.\n *\n * See {ECDSA-recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(hex\"19_00\", validator, data));\n }\n\n /**\n * @dev Returns the keccak256 digest of an EIP-712 typed data (EIP-191 version `0x01`).\n *\n * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with\n * `\\x19\\x01` and hashing the result. It corresponds to the hash signed by the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712.\n *\n * See {ECDSA-recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40)\n mstore(ptr, hex\"19_01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n digest := keccak256(ptr, 0x42)\n }\n }\n}\n"},"lib/account-abstraction/contracts/interfaces/IAggregator.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\nimport \"./PackedUserOperation.sol\";\n\n/**\n * Aggregated Signatures validator.\n */\ninterface IAggregator {\n /**\n * Validate aggregated signature.\n * Revert if the aggregated signature does not match the given list of operations.\n * @param userOps - Array of UserOperations to validate the signature for.\n * @param signature - The aggregated signature.\n */\n function validateSignatures(\n PackedUserOperation[] calldata userOps,\n bytes calldata signature\n ) external view;\n\n /**\n * Validate signature of a single userOp.\n * This method should be called by bundler after EntryPointSimulation.simulateValidation() returns\n * the aggregator this account uses.\n * First it validates the signature over the userOp. Then it returns data to be used when creating the handleOps.\n * @param userOp - The userOperation received from the user.\n * @return sigForUserOp - The value to put into the signature field of the userOp when calling handleOps.\n * (usually empty, unless account and aggregator support some kind of \"multisig\".\n */\n function validateUserOpSignature(\n PackedUserOperation calldata userOp\n ) external view returns (bytes memory sigForUserOp);\n\n /**\n * Aggregate multiple signatures into a single value.\n * This method is called off-chain to calculate the signature to pass with handleOps()\n * bundler MAY use optimized custom code perform this aggregation.\n * @param userOps - Array of UserOperations to collect the signatures from.\n * @return aggregatedSignature - The aggregated signature.\n */\n function aggregateSignatures(\n PackedUserOperation[] calldata userOps\n ) external view returns (bytes memory aggregatedSignature);\n}\n"},"lib/account-abstraction/contracts/interfaces/IPaymaster.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\nimport \"./PackedUserOperation.sol\";\n\n/**\n * The interface exposed by a paymaster contract, who agrees to pay the gas for user's operations.\n * A paymaster must hold a stake to cover the required entrypoint stake and also the gas for the transaction.\n */\ninterface IPaymaster {\n enum PostOpMode {\n // User op succeeded.\n opSucceeded,\n // User op reverted. Still has to pay for gas.\n opReverted,\n // Only used internally in the EntryPoint (cleanup after postOp reverts). Never calling paymaster with this value\n postOpReverted\n }\n\n /**\n * Payment validation: check if paymaster agrees to pay.\n * Must verify sender is the entryPoint.\n * Revert to reject this request.\n * Note that bundlers will reject this method if it changes the state, unless the paymaster is trusted (whitelisted).\n * The paymaster pre-pays using its deposit, and receive back a refund after the postOp method returns.\n * @param userOp - The user operation.\n * @param userOpHash - Hash of the user's request data.\n * @param maxCost - The maximum cost of this transaction (based on maximum gas and gas price from userOp).\n * @return context - Value to send to a postOp. Zero length to signify postOp is not required.\n * @return validationData - Signature and time-range of this operation, encoded the same as the return\n * value of validateUserOperation.\n * <20-byte> sigAuthorizer - 0 for valid signature, 1 to mark signature failure,\n * other values are invalid for paymaster.\n * <6-byte> validUntil - last timestamp this operation is valid. 0 for \"indefinite\"\n * <6-byte> validAfter - first timestamp this operation is valid\n * Note that the validation code cannot use block.timestamp (or block.number) directly.\n */\n function validatePaymasterUserOp(\n PackedUserOperation calldata userOp,\n bytes32 userOpHash,\n uint256 maxCost\n ) external returns (bytes memory context, uint256 validationData);\n\n /**\n * Post-operation handler.\n * Must verify sender is the entryPoint.\n * @param mode - Enum with the following options:\n * opSucceeded - User operation succeeded.\n * opReverted - User op reverted. The paymaster still has to pay for gas.\n * postOpReverted - never passed in a call to postOp().\n * @param context - The context value returned by validatePaymasterUserOp\n * @param actualGasCost - Actual gas used so far (without this postOp call).\n * @param actualUserOpFeePerGas - the gas price this UserOp pays. This value is based on the UserOp's maxFeePerGas\n * and maxPriorityFee (and basefee)\n * It is not the same as tx.gasprice, which is what the bundler pays.\n */\n function postOp(\n PostOpMode mode,\n bytes calldata context,\n uint256 actualGasCost,\n uint256 actualUserOpFeePerGas\n ) external;\n}\n"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165Checker.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165Checker.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Library used to query support of an interface declared via {IERC165}.\n *\n * Note that these functions return the actual result of the query: they do not\n * `revert` if an interface is not supported. It is up to the caller to decide\n * what to do in these cases.\n */\nlibrary ERC165Checker {\n // As per the EIP-165 spec, no interface should ever match 0xffffffff\n bytes4 private constant INTERFACE_ID_INVALID = 0xffffffff;\n\n /**\n * @dev Returns true if `account` supports the {IERC165} interface.\n */\n function supportsERC165(address account) internal view returns (bool) {\n // Any contract that implements ERC165 must explicitly indicate support of\n // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid\n return\n supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) &&\n !supportsERC165InterfaceUnchecked(account, INTERFACE_ID_INVALID);\n }\n\n /**\n * @dev Returns true if `account` supports the interface defined by\n * `interfaceId`. Support for {IERC165} itself is queried automatically.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {\n // query support of both ERC165 as per the spec and support of _interfaceId\n return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId);\n }\n\n /**\n * @dev Returns a boolean array where each value corresponds to the\n * interfaces passed in and whether they're supported or not. This allows\n * you to batch check interfaces for a contract where your expectation\n * is that some interfaces may not be supported.\n *\n * See {IERC165-supportsInterface}.\n */\n function getSupportedInterfaces(\n address account,\n bytes4[] memory interfaceIds\n ) internal view returns (bool[] memory) {\n // an array of booleans corresponding to interfaceIds and whether they're supported or not\n bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);\n\n // query support of ERC165 itself\n if (supportsERC165(account)) {\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]);\n }\n }\n\n return interfaceIdsSupported;\n }\n\n /**\n * @dev Returns true if `account` supports all the interfaces defined in\n * `interfaceIds`. Support for {IERC165} itself is queried automatically.\n *\n * Batch-querying can lead to gas savings by skipping repeated checks for\n * {IERC165} support.\n *\n * See {IERC165-supportsInterface}.\n */\n function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {\n // query support of ERC165 itself\n if (!supportsERC165(account)) {\n return false;\n }\n\n // query support of each interface in interfaceIds\n for (uint256 i = 0; i < interfaceIds.length; i++) {\n if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) {\n return false;\n }\n }\n\n // all interfaces supported\n return true;\n }\n\n /**\n * @notice Query if a contract implements an interface, does not check ERC165 support\n * @param account The address of the contract to query for support of an interface\n * @param interfaceId The interface identifier, as specified in ERC-165\n * @return true if the contract at account indicates support of the interface with\n * identifier interfaceId, false otherwise\n * @dev Assumes that account contains a contract that supports ERC165, otherwise\n * the behavior of this method is undefined. This precondition can be checked\n * with {supportsERC165}.\n *\n * Some precompiled contracts will falsely indicate support for a given interface, so caution\n * should be exercised when using this function.\n *\n * Interface identification is specified in ERC-165.\n */\n function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) {\n // prepare call\n bytes memory encodedParams = abi.encodeCall(IERC165.supportsInterface, (interfaceId));\n\n // perform static call\n bool success;\n uint256 returnSize;\n uint256 returnValue;\n assembly {\n success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20)\n returnSize := returndatasize()\n returnValue := mload(0x00)\n }\n\n return success && returnSize >= 0x20 && returnValue > 0;\n }\n}\n"},"src/msca/6900/v0.7/libs/FunctionReferenceDLLLib.sol":{"content":"/*\n * Copyright 2024 Circle Internet Group, Inc. All rights reserved.\n\n * SPDX-License-Identifier: GPL-3.0-or-later\n\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see .\n */\npragma solidity 0.8.24;\n\nimport {EMPTY_FUNCTION_REFERENCE, SENTINEL_BYTES21} from \"../../../../common/Constants.sol\";\nimport {\n InvalidFunctionReference, InvalidLimit, ItemAlreadyExists, ItemDoesNotExist\n} from \"../../shared/common/Errors.sol\";\nimport \"../common/Structs.sol\";\nimport {FunctionReferenceLib} from \"./FunctionReferenceLib.sol\";\n\n/**\n * @dev Enumerable & ordered doubly linked list built using mapping(bytes21 => bytes21) for function reference.\n * Item is expected to be unique.\n */\nlibrary FunctionReferenceDLLLib {\n using FunctionReferenceLib for FunctionReference;\n using FunctionReferenceLib for bytes21;\n\n modifier validFunctionReference(FunctionReference memory fr) {\n if (fr.pack() <= SENTINEL_BYTES21) {\n revert InvalidFunctionReference();\n }\n _;\n }\n\n /**\n * @dev Check if an item exists or not. O(1).\n */\n function contains(Bytes21DLL storage dll, FunctionReference memory fr) internal view returns (bool) {\n return contains(dll, fr.pack());\n }\n\n function contains(Bytes21DLL storage dll, bytes21 item) internal view returns (bool) {\n return getHeadWithoutUnpack(dll) == item || dll.next[item] != SENTINEL_BYTES21\n || dll.prev[item] != SENTINEL_BYTES21;\n }\n\n /**\n * @dev Get the count of dll. O(1).\n */\n function size(Bytes21DLL storage dll) internal view returns (uint256) {\n return dll.count;\n }\n\n /**\n * @dev Add an new item which did not exist before. Otherwise the function reverts. O(1).\n */\n function append(Bytes21DLL storage dll, FunctionReference memory fr)\n internal\n validFunctionReference(fr)\n returns (bool)\n {\n bytes21 item = fr.pack();\n if (contains(dll, item)) {\n revert ItemAlreadyExists();\n }\n bytes21 prev = getTailWithoutUnpack(dll);\n bytes21 next = SENTINEL_BYTES21;\n // prev.next = item\n dll.next[prev] = item;\n // item.next = next\n dll.next[item] = next;\n // next.prev = item\n dll.prev[next] = item;\n // item.prev = prev\n dll.prev[item] = prev;\n dll.count++;\n return true;\n }\n\n /**\n * @dev Remove an already existing item. Otherwise the function reverts. O(1).\n */\n function remove(Bytes21DLL storage dll, FunctionReference memory fr)\n internal\n validFunctionReference(fr)\n returns (bool)\n {\n bytes21 item = fr.pack();\n if (!contains(dll, item)) {\n revert ItemDoesNotExist();\n }\n // item.prev.next = item.next\n dll.next[dll.prev[item]] = dll.next[item];\n // item.next.prev = item.prev\n dll.prev[dll.next[item]] = dll.prev[item];\n delete dll.next[item];\n delete dll.prev[item];\n dll.count--;\n return true;\n }\n\n /**\n * @dev Return paginated bytes21s and next pointer bytes21. O(n).\n * @param startFR Starting bytes21, inclusive, if start == bytes21(0), this method searches from the head.\n */\n function getPaginated(Bytes21DLL storage dll, FunctionReference memory startFR, uint256 limit)\n internal\n view\n returns (FunctionReference[] memory, FunctionReference memory)\n {\n if (limit == 0) {\n revert InvalidLimit();\n }\n bytes21 start = startFR.pack();\n FunctionReference[] memory results = new FunctionReference[](limit);\n bytes21 current = start;\n if (start == SENTINEL_BYTES21) {\n current = getHeadWithoutUnpack(dll);\n }\n uint256 count = 0;\n for (; count < limit && current > SENTINEL_BYTES21; ++count) {\n results[count] = current.unpack();\n current = dll.next[current];\n }\n assembly (\"memory-safe\") {\n mstore(results, count)\n }\n return (results, current.unpack());\n }\n\n /**\n * @dev Return all the data. O(n).\n */\n function getAll(Bytes21DLL storage dll) internal view returns (FunctionReference[] memory results) {\n uint256 totalCount = size(dll);\n results = new FunctionReference[](totalCount);\n uint256 accumulatedCount = 0;\n FunctionReference memory startFR = EMPTY_FUNCTION_REFERENCE.unpack();\n for (uint256 i = 0; i < totalCount; ++i) {\n (FunctionReference[] memory currentResults, FunctionReference memory nextFR) =\n getPaginated(dll, startFR, 10);\n for (uint256 j = 0; j < currentResults.length; ++j) {\n results[accumulatedCount++] = currentResults[j];\n }\n if (nextFR.pack() == SENTINEL_BYTES21) {\n break;\n }\n startFR = nextFR;\n }\n return results;\n }\n\n function getHead(Bytes21DLL storage dll) internal view returns (FunctionReference memory) {\n return dll.next[SENTINEL_BYTES21].unpack();\n }\n\n function getTail(Bytes21DLL storage dll) internal view returns (FunctionReference memory) {\n return dll.prev[SENTINEL_BYTES21].unpack();\n }\n\n function getHeadWithoutUnpack(Bytes21DLL storage dll) private view returns (bytes21) {\n return dll.next[SENTINEL_BYTES21];\n }\n\n function getTailWithoutUnpack(Bytes21DLL storage dll) private view returns (bytes21) {\n return dll.prev[SENTINEL_BYTES21];\n }\n}\n"},"lib/account-abstraction/contracts/interfaces/IStakeManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0-only\npragma solidity >=0.7.5;\n\n/**\n * Manage deposits and stakes.\n * Deposit is just a balance used to pay for UserOperations (either by a paymaster or an account).\n * Stake is value locked for at least \"unstakeDelay\" by the staked entity.\n */\ninterface IStakeManager {\n event Deposited(address indexed account, uint256 totalDeposit);\n\n event Withdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n // Emitted when stake or unstake delay are modified.\n event StakeLocked(\n address indexed account,\n uint256 totalStaked,\n uint256 unstakeDelaySec\n );\n\n // Emitted once a stake is scheduled for withdrawal.\n event StakeUnlocked(address indexed account, uint256 withdrawTime);\n\n event StakeWithdrawn(\n address indexed account,\n address withdrawAddress,\n uint256 amount\n );\n\n /**\n * @param deposit - The entity's deposit.\n * @param staked - True if this entity is staked.\n * @param stake - Actual amount of ether staked for this entity.\n * @param unstakeDelaySec - Minimum delay to withdraw the stake.\n * @param withdrawTime - First block timestamp where 'withdrawStake' will be callable, or zero if already locked.\n * @dev Sizes were chosen so that deposit fits into one cell (used during handleOp)\n * and the rest fit into a 2nd cell (used during stake/unstake)\n * - 112 bit allows for 10^15 eth\n * - 48 bit for full timestamp\n * - 32 bit allows 150 years for unstake delay\n */\n struct DepositInfo {\n uint256 deposit;\n bool staked;\n uint112 stake;\n uint32 unstakeDelaySec;\n uint48 withdrawTime;\n }\n\n // API struct used by getStakeInfo and simulateValidation.\n struct StakeInfo {\n uint256 stake;\n uint256 unstakeDelaySec;\n }\n\n /**\n * Get deposit info.\n * @param account - The account to query.\n * @return info - Full deposit information of given account.\n */\n function getDepositInfo(\n address account\n ) external view returns (DepositInfo memory info);\n\n /**\n * Get account balance.\n * @param account - The account to query.\n * @return - The deposit (for gas payment) of the account.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * Add to the deposit of the given account.\n * @param account - The account to add to.\n */\n function depositTo(address account) external payable;\n\n /**\n * Add to the account's stake - amount and delay\n * any pending unstake is first cancelled.\n * @param _unstakeDelaySec - The new lock duration before the deposit can be withdrawn.\n */\n function addStake(uint32 _unstakeDelaySec) external payable;\n\n /**\n * Attempt to unlock the stake.\n * The value can be withdrawn (using withdrawStake) after the unstake delay.\n */\n function unlockStake() external;\n\n /**\n * Withdraw from the (unlocked) stake.\n * Must first call unlockStake and wait for the unstakeDelay to pass.\n * @param withdrawAddress - The address to send withdrawn value.\n */\n function withdrawStake(address payable withdrawAddress) external;\n\n /**\n * Withdraw from the deposit.\n * @param withdrawAddress - The address to send withdrawn value.\n * @param withdrawAmount - The amount to withdraw.\n */\n function withdrawTo(\n address payable withdrawAddress,\n uint256 withdrawAmount\n ) external;\n}\n"},"lib/account-abstraction/contracts/interfaces/INonceManager.sol":{"content":"// SPDX-License-Identifier: GPL-3.0\npragma solidity >=0.7.5;\n\ninterface INonceManager {\n\n /**\n * Return the next nonce for this sender.\n * Within a given key, the nonce values are sequenced (starting with zero, and incremented by one on each userop)\n * But UserOp with different keys can come with arbitrary order.\n *\n * @param sender the account address\n * @param key the high 192 bit of the nonce\n * @return nonce a full nonce to pass for next UserOp with this sender.\n */\n function getNonce(address sender, uint192 key)\n external view returns (uint256 nonce);\n\n /**\n * Manually increment the nonce of the sender.\n * This method is exposed just for completeness..\n * Account does NOT need to call it, neither during validation, nor elsewhere,\n * as the EntryPoint will update the nonce regardless.\n * Possible use-case is call it with various keys to \"initialize\" their nonces to one, so that future\n * UserOperations will not pay extra for the first transaction with a given key.\n */\n function incrementNonce(uint192 key) external;\n}\n"},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n"},"node_modules/@openzeppelin/contracts/proxy/beacon/IBeacon.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeacon {\n /**\n * @dev Must return an address that can be used as a delegate call target.\n *\n * {UpgradeableBeacon} will check that this address is a contract.\n */\n function implementation() external view returns (address);\n}\n"},"node_modules/@openzeppelin/contracts/utils/Address.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev The ETH balance of the account is not enough to perform the operation.\n */\n error AddressInsufficientBalance(address account);\n\n /**\n * @dev There's no code at `target` (it is not a contract).\n */\n error AddressEmptyCode(address target);\n\n /**\n * @dev A call to an address target failed. The target may have reverted.\n */\n error FailedInnerCall();\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n if (address(this).balance < amount) {\n revert AddressInsufficientBalance(address(this));\n }\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n if (!success) {\n revert FailedInnerCall();\n }\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason or custom error, it is bubbled\n * up by this function (like regular Solidity function calls). However, if\n * the call reverted with no returned reason, this function reverts with a\n * {FailedInnerCall} error.\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n if (address(this).balance < value) {\n revert AddressInsufficientBalance(address(this));\n }\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an\n * unsuccessful call.\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata\n ) internal view returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n // only check if target is a contract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n if (returndata.length == 0 && target.code.length == 0) {\n revert AddressEmptyCode(target);\n }\n return returndata;\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n * revert reason or with a default {FailedInnerCall} error.\n */\n function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n if (!success) {\n _revert(returndata);\n } else {\n return returndata;\n }\n }\n\n /**\n * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.\n */\n function _revert(bytes memory returndata) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert FailedInnerCall();\n }\n }\n}\n"},"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(newImplementation.code.length > 0);\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n}\n"},"node_modules/@openzeppelin/contracts/utils/Strings.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)\n\npragma solidity ^0.8.20;\n\nimport {Math} from \"./math/Math.sol\";\nimport {SignedMath} from \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant HEX_DIGITS = \"0123456789abcdef\";\n uint8 private constant ADDRESS_LENGTH = 20;\n\n /**\n * @dev The `value` string doesn't fit in the specified `length`.\n */\n error StringsInsufficientHexLength(uint256 value, uint256 length);\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toStringSigned(int256 value) internal pure returns (string memory) {\n return string.concat(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value)));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n uint256 localValue = value;\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = HEX_DIGITS[localValue & 0xf];\n localValue >>= 4;\n }\n if (localValue != 0) {\n revert StringsInsufficientHexLength(value, length);\n }\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal\n * representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n"},"node_modules/@openzeppelin/contracts/utils/math/Math.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n /**\n * @dev Muldiv operation overflow.\n */\n error MathOverflowedMulDiv();\n\n enum Rounding {\n Floor, // Toward negative infinity\n Ceil, // Toward positive infinity\n Trunc, // Toward zero\n Expand // Away from zero\n }\n\n /**\n * @dev Returns the addition of two unsigned integers, with an overflow flag.\n */\n function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n uint256 c = a + b;\n if (c < a) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the subtraction of two unsigned integers, with an overflow flag.\n */\n function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b > a) return (false, 0);\n return (true, a - b);\n }\n }\n\n /**\n * @dev Returns the multiplication of two unsigned integers, with an overflow flag.\n */\n function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n // Gas optimization: this is cheaper than requiring 'a' not being zero, but the\n // benefit is lost if 'b' is also tested.\n // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522\n if (a == 0) return (true, 0);\n uint256 c = a * b;\n if (c / a != b) return (false, 0);\n return (true, c);\n }\n }\n\n /**\n * @dev Returns the division of two unsigned integers, with a division by zero flag.\n */\n function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a / b);\n }\n }\n\n /**\n * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.\n */\n function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {\n unchecked {\n if (b == 0) return (false, 0);\n return (true, a % b);\n }\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds towards infinity instead\n * of rounding towards zero.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n if (b == 0) {\n // Guarantee the same behavior as in a regular Solidity division.\n return a / b;\n }\n\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or\n * denominator == 0.\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by\n * Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0 = x * y; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n if (denominator <= prod1) {\n revert MathOverflowedMulDiv();\n }\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator.\n // Always >= 1. See https://cs.stackexchange.com/q/138556/92363.\n\n uint256 twos = denominator & (0 - denominator);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also\n // works in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded\n * towards zero.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256 of a positive value rounded towards zero.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.\n */\n function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {\n return uint8(rounding) % 2 == 1;\n }\n}\n"},"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n"}},"settings":{"remappings":["@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/","@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/","@account-abstraction/=lib/account-abstraction/","@modular-account-libs/=node_modules/@modular-account-libs/src/","@solady/=node_modules/solady/src/","@fcl/=node_modules/fcl/solidity/src/","forge-std/=node_modules/forge-std/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}}