From 4cb89da78774e13a8a00d91e8e2a215262b5a5b2 Mon Sep 17 00:00:00 2001 From: antazoey Date: Fri, 6 Mar 2026 12:01:42 -0600 Subject: [PATCH 1/3] update contract manifest --- tplus/evm/manifests/tplus-contracts.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tplus/evm/manifests/tplus-contracts.json b/tplus/evm/manifests/tplus-contracts.json index c4f5324..c0f6f3c 100644 --- a/tplus/evm/manifests/tplus-contracts.json +++ b/tplus/evm/manifests/tplus-contracts.json @@ -1 +1 @@ -{"compilers":[{"contractTypes":["SigTest","MockTarget"],"name":"solidity","settings":{"optimizer":{"enabled":true,"runs":200},"outputSelection":{"src/.cache/solady/main/src/utils/ECDSA.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/EfficientHashLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/SafeTransferLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]}},"remappings":["solady=src/.cache/solady/main/src"],"viaIR":true},"version":"0.8.28+commit.7893614a"},{"contractTypes":["IL1CrossDomainMessenger","IDepositVault","SignatureTest","Settler","IAtomicSettlementCallback","ICheckpointer","DepositVault","Registry","ICredentialManager","OPStackAdminUpdateStrategy","ArbitrumOneAdminUpdateStrategy","Checkpointer","IRegistry","CredentialManager","IAdminUpdateStrategy","IAutomataDcapAttestation","IntraChainAdminUpdateStrategy"],"name":"solidity","settings":{"optimizer":{"enabled":true,"runs":200},"outputSelection":{"src/.cache/nitro-contracts/main/src/bridge/DelayBufferTypes.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IBridge.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IDelayedMessageProvider.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IInbox.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IInboxBase.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IOwnable.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/ISequencerInbox.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/Messages.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/libraries/IGasRefunder.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/ECDSA.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/EfficientHashLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/SafeTransferLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/SignatureCheckerLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/Checkpointer.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/CredentialManager.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/DepositVault.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/Registry.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IAdminUpdateStrategy.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IAtomicSettlementCallback.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IAutomataDcapAttestation.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/ICheckpointer.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/ICredentialManager.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IDepositVault.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IRegistry.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/strategies/ArbitrumOneAdminUpdateStrategy.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/strategies/IntraChainAdminUpdateStrategy.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/strategies/OPStackAdminUpdateStrategy.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]}},"remappings":["nitro-contracts=src/.cache/nitro-contracts/main/src","solady=src/.cache/solady/main/src"],"viaIR":true},"version":"0.8.30+commit.73712a01"}],"contractTypes":{"ArbitrumOneAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"InsufficientMsgValue","type":"error"},{"inputs":[],"name":"INBOX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"ArbitrumOneAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x608080604052346015576102a4908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c8063075034ae146100615763b70106971461002f575f80fd5b3461005d575f36600319011261005d576020604051734dbd4fc535ac27206064b68ffcf827b0a60bab3f8152f35b5f80fd5b606036600319011261005d576004356001600160a01b0381169081900361005d5760243567ffffffffffffffff811161005d573660238201121561005d5780600401359167ffffffffffffffff831161005d573660248460051b8401011161005d57667c585087238000341061021a576040519160208301936323c5673160e01b8552806064850160406024870152526024608485019201905f905b8082106101f0578660208761012488610127838a604435604483015203601f198101855284610238565b604051948593849263679b6ded60e01b845260048401525f602484015266470de4df8200006044840152336064840152336084840152622dc6c060a484015264012a05f20060c484015261010060e4840152518091816101048501528484015e5f828201840152601f01601f1916810103018134734dbd4fc535ac27206064b68ffcf827b0a60bab3f5af180156101e5576101be57005b602090813d83116101de575b6101d48183610238565b8101031261005d57005b503d6101ca565b6040513d5f823e3d90fd5b90919283359060018060a01b03821680920361005d576020816001938293520194019201906100fd565b631f2dda7760e21b5f5234600452667c58508723800060245260445ffd5b90601f8019910116810190811067ffffffffffffffff82111761025a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220ebaa77dd092a054679c080b6c72489a0f6279939ed0d7fdc0f0c1b834c8a133564736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{"setAdministrators(address,address[],uint256)":{"details":"This function forwards a cross-chain call to the target `vault` using Arbitrum's retryable ticket mechanism. The credential manager must supply sufficient `msg.value` to cover the maximum submission cost and gas fees for execution on the destination chain.Reverts with {InsufficientMsgValue} if `msg.value` is less than `MAX_SUBMISSION_COST + GAS_LIMIT * MAX_FEE_PER_GAS`.","params":{"newAdministrators":"The complete list of administrator addresses to set on the vault.","newWithdrawalQuorum":"The new quorum required for withdrawals.","vault":"The address of the vault contract whose administrators will be updated."}}},"version":1},"methodIdentifiers":{"INBOX()":"0xb7010697","setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c8063075034ae146100615763b70106971461002f575f80fd5b3461005d575f36600319011261005d576020604051734dbd4fc535ac27206064b68ffcf827b0a60bab3f8152f35b5f80fd5b606036600319011261005d576004356001600160a01b0381169081900361005d5760243567ffffffffffffffff811161005d573660238201121561005d5780600401359167ffffffffffffffff831161005d573660248460051b8401011161005d57667c585087238000341061021a576040519160208301936323c5673160e01b8552806064850160406024870152526024608485019201905f905b8082106101f0578660208761012488610127838a604435604483015203601f198101855284610238565b604051948593849263679b6ded60e01b845260048401525f602484015266470de4df8200006044840152336064840152336084840152622dc6c060a484015264012a05f20060c484015261010060e4840152518091816101048501528484015e5f828201840152601f01601f1916810103018134734dbd4fc535ac27206064b68ffcf827b0a60bab3f5af180156101e5576101be57005b602090813d83116101de575b6101d48183610238565b8101031261005d57005b503d6101ca565b6040513d5f823e3d90fd5b90919283359060018060a01b03821680920361005d576020816001938293520194019201906100fd565b631f2dda7760e21b5f5234600452667c58508723800060245260445ffd5b90601f8019910116810190811067ffffffffffffffff82111761025a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220ebaa77dd092a054679c080b6c72489a0f6279939ed0d7fdc0f0c1b834c8a133564736f6c634300081e0033"},"sourceId":"src/strategies/ArbitrumOneAdminUpdateStrategy.sol","sourcemap":"257:2167:24:-:0;;;;;;;;;;;;;;;;;","userdoc":{"errors":{"InsufficientMsgValue(uint256,uint256)":[{"notice":"Reverts if not enough value was sent to the update method."}]},"kind":"user","methods":{"setAdministrators(address,address[],uint256)":{"notice":"Updates the administrator set and withdrawal quorum on a vault via a retryable ticket."}},"version":1}},"Checkpointer":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadySet","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCouncilMultisig","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"name":"Withdrawals","type":"event"},{"inputs":[],"name":"CHECKPOINT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sharedSignature","type":"bytes"},{"internalType":"bytes","name":"leaderSignature","type":"bytes"},{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8[]","name":"stateRoot","type":"uint8[]"},{"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"internalType":"struct Checkpointer.Checkpoint","name":"_checkpoint","type":"tuple"}],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"councilMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setInitialCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"}],"name":"setLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setNewCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stateRoot","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateRootNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"Checkpointer","deploymentBytecode":{"bytecode":"0x608080604052346026575f80546001600160a01b03191633179055610b3e908161002b8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816307ddaf53146108be575080633ea987d31461086657806340eedabb1461083e5780634331e8dd146107ea5780635fa993b214610792578063704b6c02146107455780637438b937146106f657806374ebc7a0146106d95780638bbb26a314610150578063cc2fc84514610105578063e1193e4c146100cb5763f851a440146100a0575f80fd5b346100c7575f3660031901126100c7575f546040516001600160a01b039091168152602090f35b5f80fd5b346100c7575f3660031901126100c75760206040517ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d88152f35b346100c75760203660031901126100c7576004356005548110156100c75760209060055f5260ff8160051c5f516020610ae95f395f51905f52015460f86040519360031b161c168152f35b346100c75760603660031901126100c75760043567ffffffffffffffff81116100c7576101819036906004016108e1565b60243567ffffffffffffffff81116100c7576101a19036906004016108e1565b906044359267ffffffffffffffff84116100c7578360040191606060031986360301126100c757823593600354918286036100c75760248701916101e5838761090f565b906040519060208201928391905f905b8082106106b45750505090610216816044949303601f198101835282610945565b519020980194610226868861090f565b610232819c929c610967565b9b6102406040519d8e610945565b818d5260208d019160051b8101903682116100c75780925b82841061067757505050508a51986102886102728b610967565b9a6102806040519c8d610945565b808c52610967565b60208b019b90601f1901368d375f5b8d518110156102c857808c8f826102b36001956102c1936109d3565b5160208151910120926109d3565b5201610297565b506040518b5160208201919082908f905f5b81811061066157505050918161030361039f97959361039999979503601f198101835282610945565b5190206040519160208301937ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d885526040840152606083015260808201526080815261035060a082610945565b5190206004549060405190602082019261190160f01b84526022830152604282015260428152610381606282610945565b51902093849160018060a01b035f541693369161097f565b916109fb565b15610652576103996103be9360018060a01b036001541693369161097f565b15610652575f19821461063e5760016103db92016003558361090f565b929067ffffffffffffffff841161062a5768010000000000000000841161062a57600554846005558085106105a0575b509260055f528060051c5f5b81811061055e5750601f1982169091039081610500575b505061043a925061090f565b906040519082602083016020845252604082019060408460051b84010193815f90601e19813603015b838310610492577fef889901cd5d865c829bdf171647f02f76efbce3c0cba77197094981f41a727c87890388a1005b909192939496603f198782030188528535828112156100c7578301906020823592019167ffffffffffffffff81116100c75780360383136100c7576020828280600196849695859652848401375f828201840152601f01601f19160101999190910196019493019190610463565b5f9485925b80871061052a57505061043a94505f516020610ae95f395f51905f520155838061042e565b909260206105536001928961053e886109c5565b919060ff809160031b9316831b921b19161790565b940196019590610505565b5f5f5b6020811061058357505f516020610ae95f395f51905f52820155600101610417565b969060206105976001928a61053e866109c5565b92019701610561565b601f80860160051c910160051c5f516020610ae95f395f51905f520190601f8616806105f0575b505f516020610ae95f395f51905f52015b8181106105e5575061040b565b5f81556001016105d8565b7f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3daf8201908154905f199060200360031b1c169055866105c7565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b638baa579f60e01b5f5260045ffd5b82518452602093840193909201916001016102da565b833567ffffffffffffffff81116100c757820136601f820112156100c7576020916106a983923690848135910161097f565b815201930192610258565b90919283359060ff82168092036100c7576020816001938293520194019201906101f5565b346100c7575f3660031901126100c7576020600354604051908152f35b346100c75760203660031901126100c7575f546001600160a01b031633036107365760045461072757600480359055005b63a741a04560e01b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03811633036107365781156100c7576001600160a01b031916175f55005b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b03811633036107db576001600160a01b03191617600255005b638d62b6d960e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b031633036107db576bffffffffffffffffffffffff60a01b60015416176001555f80f35b346100c7575f3660031901126100c7576001546040516001600160a01b039091168152602090f35b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03163303610736576002546001600160a01b038116610727576001600160a01b03191617600255005b346100c7575f3660031901126100c7576002546001600160a01b03168152602090f35b9181601f840112156100c75782359167ffffffffffffffff83116100c757602083818601950101116100c757565b903590601e19813603018212156100c7570180359067ffffffffffffffff82116100c757602001918160051b360383136100c757565b90601f8019910116810190811067ffffffffffffffff82111761062a57604052565b67ffffffffffffffff811161062a5760051b60200190565b92919267ffffffffffffffff821161062a57604051916109a9601f8201601f191660200184610945565b8294818452818301116100c7578281602093845f960137010152565b3560ff811681036100c75790565b80518210156109e75760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b90915f91906001600160a01b03821615610ae05760405192600484019460248501956044860192853b15610a6457509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b979650509050815180604014610abb57604114610a815750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052610a99565b505050505f9056fe036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0a2646970667358221220f9ddb3830cc5bf0b146ee5d4475497fa0dfd801400dfcae202dc378109e06fb664736f6c634300081e0033"},"devdoc":{"details":"Designed for use in DStack-like distributed settlement systems.","events":{"Withdrawals(string[])":{"params":{"approvedWithdrawals":"List of withdrawal IDs approved in the checkpoint."}}},"kind":"dev","methods":{"checkpoint(bytes,bytes,(uint256,uint8[],string[]))":{"details":"Requires valid EIP-712 signatures from both admin and leader.","params":{"_checkpoint":"The checkpoint payload to commit.","leaderSignature":"Signature by the leader.","sharedSignature":"Signature by the admin."}},"constructor":{"details":"Sets the deployer as the initial admin."},"setAdmin(address)":{"params":{"newAdmin":"The new admin address."}},"setDomainSeparator(bytes32)":{"params":{"domainSeparator":"The domain separator to store."}},"setInitialCouncilMultisig(address)":{"params":{"newCouncilMultisig":"The council's Gnosis Safe address."}},"setLeader(address)":{"details":"This should be reviewed depending on the leader rotation mechanism.","params":{"newLeader":"The address of the new leader node."}},"setNewCouncilMultisig(address)":{"params":{"newCouncilMultisig":"The new multisig address."}}},"stateVariables":{"admin":{"details":"Should be set to the DStack app shared secret public key."},"councilMultisig":{"details":"Can rotate the leader and self."},"leader":{"details":"Leader is responsible for signing and submitting new checkpoints."},"stateRoot":{"details":"Serialized as `(user, eth_balance, usdc_balance, deposit_nonce, is_mm)` tuples. In production, this may store multiple roots and rotate."},"stateRootNonce":{"details":"Used to prevent replay attacks and enforce checkpoint ordering."}},"title":"Checkpointer","version":1},"methodIdentifiers":{"CHECKPOINT_TYPEHASH()":"0xe1193e4c","admin()":"0xf851a440","checkpoint(bytes,bytes,(uint256,uint8[],string[]))":"0x8bbb26a3","councilMultisig()":"0x07ddaf53","leader()":"0x40eedabb","setAdmin(address)":"0x704b6c02","setDomainSeparator(bytes32)":"0x7438b937","setInitialCouncilMultisig(address)":"0x3ea987d3","setLeader(address)":"0x4331e8dd","setNewCouncilMultisig(address)":"0x5fa993b2","stateRoot(uint256)":"0xcc2fc845","stateRootNonce()":"0x74ebc7a0"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816307ddaf53146108be575080633ea987d31461086657806340eedabb1461083e5780634331e8dd146107ea5780635fa993b214610792578063704b6c02146107455780637438b937146106f657806374ebc7a0146106d95780638bbb26a314610150578063cc2fc84514610105578063e1193e4c146100cb5763f851a440146100a0575f80fd5b346100c7575f3660031901126100c7575f546040516001600160a01b039091168152602090f35b5f80fd5b346100c7575f3660031901126100c75760206040517ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d88152f35b346100c75760203660031901126100c7576004356005548110156100c75760209060055f5260ff8160051c5f516020610ae95f395f51905f52015460f86040519360031b161c168152f35b346100c75760603660031901126100c75760043567ffffffffffffffff81116100c7576101819036906004016108e1565b60243567ffffffffffffffff81116100c7576101a19036906004016108e1565b906044359267ffffffffffffffff84116100c7578360040191606060031986360301126100c757823593600354918286036100c75760248701916101e5838761090f565b906040519060208201928391905f905b8082106106b45750505090610216816044949303601f198101835282610945565b519020980194610226868861090f565b610232819c929c610967565b9b6102406040519d8e610945565b818d5260208d019160051b8101903682116100c75780925b82841061067757505050508a51986102886102728b610967565b9a6102806040519c8d610945565b808c52610967565b60208b019b90601f1901368d375f5b8d518110156102c857808c8f826102b36001956102c1936109d3565b5160208151910120926109d3565b5201610297565b506040518b5160208201919082908f905f5b81811061066157505050918161030361039f97959361039999979503601f198101835282610945565b5190206040519160208301937ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d885526040840152606083015260808201526080815261035060a082610945565b5190206004549060405190602082019261190160f01b84526022830152604282015260428152610381606282610945565b51902093849160018060a01b035f541693369161097f565b916109fb565b15610652576103996103be9360018060a01b036001541693369161097f565b15610652575f19821461063e5760016103db92016003558361090f565b929067ffffffffffffffff841161062a5768010000000000000000841161062a57600554846005558085106105a0575b509260055f528060051c5f5b81811061055e5750601f1982169091039081610500575b505061043a925061090f565b906040519082602083016020845252604082019060408460051b84010193815f90601e19813603015b838310610492577fef889901cd5d865c829bdf171647f02f76efbce3c0cba77197094981f41a727c87890388a1005b909192939496603f198782030188528535828112156100c7578301906020823592019167ffffffffffffffff81116100c75780360383136100c7576020828280600196849695859652848401375f828201840152601f01601f19160101999190910196019493019190610463565b5f9485925b80871061052a57505061043a94505f516020610ae95f395f51905f520155838061042e565b909260206105536001928961053e886109c5565b919060ff809160031b9316831b921b19161790565b940196019590610505565b5f5f5b6020811061058357505f516020610ae95f395f51905f52820155600101610417565b969060206105976001928a61053e866109c5565b92019701610561565b601f80860160051c910160051c5f516020610ae95f395f51905f520190601f8616806105f0575b505f516020610ae95f395f51905f52015b8181106105e5575061040b565b5f81556001016105d8565b7f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3daf8201908154905f199060200360031b1c169055866105c7565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b638baa579f60e01b5f5260045ffd5b82518452602093840193909201916001016102da565b833567ffffffffffffffff81116100c757820136601f820112156100c7576020916106a983923690848135910161097f565b815201930192610258565b90919283359060ff82168092036100c7576020816001938293520194019201906101f5565b346100c7575f3660031901126100c7576020600354604051908152f35b346100c75760203660031901126100c7575f546001600160a01b031633036107365760045461072757600480359055005b63a741a04560e01b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03811633036107365781156100c7576001600160a01b031916175f55005b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b03811633036107db576001600160a01b03191617600255005b638d62b6d960e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b031633036107db576bffffffffffffffffffffffff60a01b60015416176001555f80f35b346100c7575f3660031901126100c7576001546040516001600160a01b039091168152602090f35b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03163303610736576002546001600160a01b038116610727576001600160a01b03191617600255005b346100c7575f3660031901126100c7576002546001600160a01b03168152602090f35b9181601f840112156100c75782359167ffffffffffffffff83116100c757602083818601950101116100c757565b903590601e19813603018212156100c7570180359067ffffffffffffffff82116100c757602001918160051b360383136100c757565b90601f8019910116810190811067ffffffffffffffff82111761062a57604052565b67ffffffffffffffff811161062a5760051b60200190565b92919267ffffffffffffffff821161062a57604051916109a9601f8201601f191660200184610945565b8294818452818301116100c7578281602093845f960137010152565b3560ff811681036100c75790565b80518210156109e75760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b90915f91906001600160a01b03821615610ae05760405192600484019460248501956044860192853b15610a6457509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b979650509050815180604014610abb57604114610a815750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052610a99565b505050505f9056fe036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0a2646970667358221220f9ddb3830cc5bf0b146ee5d4475497fa0dfd801400dfcae202dc378109e06fb664736f6c634300081e0033"},"sourceId":"src/Checkpointer.sol","sourcemap":"413:6397:13:-:0;;;;;;;2546:18;413:6397;;-1:-1:-1;;;;;;413:6397:13;2554:10;413:6397;;;;;;;;;;;;;","userdoc":{"errors":{"AlreadySet()":[{"notice":"Reverts if a value has already been set."}],"InvalidSignature()":[{"notice":"Reverts if a signature does not match the expected signer or payload."}],"NotAdmin()":[{"notice":"Reverts if caller is not the admin."}],"NotCouncilMultisig()":[{"notice":"Reverts if caller is not the current council multisig."}]},"events":{"Withdrawals(string[])":{"notice":"Emitted when a new list of approved withdrawals is recorded in a checkpoint."}},"kind":"user","methods":{"CHECKPOINT_TYPEHASH()":{"notice":"Typehash used for EIP-712 encoding of the Checkpoint struct."},"admin()":{"notice":"Address with the authority to set initial parameters."},"checkpoint(bytes,bytes,(uint256,uint8[],string[]))":{"notice":"Checkpoint submitted by a node to update the system state."},"constructor":{"notice":"Contract constructor."},"councilMultisig()":{"notice":"Gnosis Safe address used as the council multisig."},"leader()":{"notice":"Public key of the current designated leader node."},"setAdmin(address)":{"notice":"Transfers admin control to a new address."},"setDomainSeparator(bytes32)":{"notice":"Sets the EIP-712 domain separator used for verifying signatures."},"setInitialCouncilMultisig(address)":{"notice":"Sets the initial council multisig address."},"setLeader(address)":{"notice":"Sets the leader node address."},"setNewCouncilMultisig(address)":{"notice":"Allows the current council to rotate itself to a new address."},"stateRoot(uint256)":{"notice":"The current state root, encoded as a serialized vector."},"stateRootNonce()":{"notice":"Monotonically increasing nonce for checkpoint submissions."}},"notice":"Tracks and validates state root checkpoints using EIP-712 signatures from admin and leader nodes.","version":1}},"CredentialManager":{"abi":[{"inputs":[{"internalType":"address[]","name":"initialOperators","type":"address[]"},{"internalType":"uint256","name":"initialQuorumThreshold","type":"uint256"},{"internalType":"address","name":"initialRiskManager","type":"address"},{"internalType":"address","name":"initialRegistryContract","type":"address"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct CredentialManager.MeasurementProfile[]","name":"initialMeasurements","type":"tuple[]"},{"internalType":"address","name":"initialAutomataVerifier","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmbiguousState","type":"error"},{"inputs":[],"name":"CannotCancel","type":"error"},{"inputs":[],"name":"GatheringActive","type":"error"},{"inputs":[],"name":"GatheringNotActive","type":"error"},{"inputs":[],"name":"GatheringNotExpired","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientSignatures","type":"error"},{"inputs":[{"internalType":"uint256","name":"delay","type":"uint256"}],"name":"InvalidDelay","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InvalidEpoch","type":"error"},{"inputs":[],"name":"InvalidProfileConfig","type":"error"},{"inputs":[],"name":"InvalidProfileId","type":"error"},{"inputs":[{"internalType":"uint256","name":"newQuorum","type":"uint256"},{"internalType":"uint256","name":"operatorCount","type":"uint256"}],"name":"InvalidQuorum","type":"error"},{"inputs":[],"name":"InvalidQuoteLength","type":"error"},{"inputs":[],"name":"InvalidReportData","type":"error"},{"inputs":[],"name":"InvalidVaultAddr","type":"error"},{"inputs":[],"name":"InvalidVerifier","type":"error"},{"inputs":[],"name":"InvalidZkProof","type":"error"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"},{"internalType":"string","name":"field","type":"string"}],"name":"MeasurementMismatch","type":"error"},{"inputs":[],"name":"NoCandidate","type":"error"},{"inputs":[],"name":"NoStrategy","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"NotOperator","type":"error"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"}],"name":"ProfileInactive","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"proposed","type":"uint256"}],"name":"ProposedEpochTooLow","type":"error"},{"inputs":[],"name":"SignersNotSortedOrUnique","type":"error"},{"inputs":[],"name":"StrategyAlreadyExists","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyCanceled","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyExecuted","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"uint256","name":"readyAt","type":"uint256"},{"internalType":"uint256","name":"nowTs","type":"uint256"}],"name":"TimelockNotReady","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockUnknown","type":"error"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"}],"name":"VaultNotFound","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"}],"name":"AdminUpdateStrategyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"AttestedKeyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldVerifier","type":"address"},{"indexed":true,"internalType":"address","name":"newVerifier","type":"address"}],"name":"AutomataVerifierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newEpoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newCheckpointHash","type":"bytes32"}],"name":"EpochIncremented","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"LeaderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"profileId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"MeasurementProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"newMrtd","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newRtmr0","type":"bytes32"}],"name":"MeasurementsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"OperationScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"QuorumThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRegistry","type":"address"},{"indexed":true,"internalType":"address","name":"newRegistry","type":"address"}],"name":"RegistryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash1","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash2","type":"bytes32"}],"name":"RestartAmbiguityDetected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"leader","type":"address"},{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"RestartCandidateSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"RestartExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"RestartGatheringStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRiskManager","type":"address"},{"indexed":true,"internalType":"address","name":"newRiskManager","type":"address"}],"name":"RiskManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"targetOpType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"oldDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"TimelockDelayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"indexed":false,"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"}],"name":"VaultAdded","type":"event"},{"inputs":[],"name":"GATHERING_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_ADD_VAULT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_APPOINT_LEADER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_CANCEL_TIMELOCK","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_MANAGE_PROFILE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_REGISTER_STRATEGY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_RESTART","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_AUTOMATA_VERIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_DELAY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_MEASUREMENTS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_QUORUM","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_REGISTRY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_RISK_MANAGER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_VAULT_ADMINS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_WITHDRAW","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"addVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"adminUpdateStrategies","outputs":[{"internalType":"contract IAdminUpdateStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"appointLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"automataVerifier","outputs":[{"internalType":"contract IAutomataDcapAttestation","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bestCandidate","outputs":[{"internalType":"address","name":"leader","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"cancelTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct CredentialManager.MeasurementProfile","name":"profile","type":"tuple"}],"name":"executeManageProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"}],"name":"executeRegistryContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"}],"name":"executeRiskManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"}],"name":"executeUpdateAutomataVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCouncilConfig","outputs":[{"internalType":"address[]","name":"members","type":"address[]"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeader","outputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"attestedKey","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getVaults","outputs":[{"components":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"}],"internalType":"struct CredentialManager.Vault[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initiateRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRestartAmbiguous","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestCheckpointHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"measurementProfiles","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProfileId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operatorToAttestedKey","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"operators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quorumThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"contract IAdminUpdateStrategy","name":"strategy","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"registerAdminUpdateStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"registerAttestedKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registryContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resolveRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restartGatheringDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct CredentialManager.MeasurementProfile","name":"profile","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleManageProfile","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRegistryContract","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRiskManager","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleUpdateAutomataVerifier","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"setDepositVaultAdministrators","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"internalType":"bytes","name":"tdxReportBody","type":"bytes"},{"internalType":"bytes","name":"zkProof","type":"bytes"},{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"submitRestartProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockDelayFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockOps","outputs":[{"internalType":"uint64","name":"eta","type":"uint64"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"bytes32","name":"opType","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"updateQuorumThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaults","outputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"contractName":"CredentialManager","deploymentBytecode":{"bytecode":"0x6080604052346105515761485d803803806100198161056d565b92833981019060c0818303126105515780516001600160401b0381116105515781019082601f830112156105515781519161005b61005684610592565b61056d565b9260208085838152019160051b8301019185831161055157602001905b828210610555575050506020810151610093604083016105a9565b926100a0606084016105a9565b60808401519093906001600160401b03811161055157810186601f82011215610551578051906100d261005683610592565b97602060c0818b8681520194028301019181831161055157602001925b8284106104db575050505060a061010691016105a9565b6001600e555f80546001600160a01b03191633179055936001600160a01b0316928315610495576001600160a01b031693841561049557601180546001600160a01b0319166001600160a01b039290921691909117905580519081156104c457821580156104bb575b6104a4575f5b82811061038f575050506040817fc33728fb6bc64ec1c5596c946e1406ccdfb7369404098c1d6a5f4a7a29c97b63926003558151905f82526020820152a160018060a01b0319600954161760095560018060a01b0319600a541617600a556001600e555f5b81518110156102c2576101ed81836105bd565b519081511515806102b6575b6102a757602091600e545f52600d835260405f20600560a0835115159360ff1984541660ff861617845586810151600185015560408101516002850155606081015160038501556080810151600485015501519101557faa1bacadd202709f2df9c31faf4babdbb21a245021c22298bfcdf22861ca12c6600e54938492604051908152a25f198214610293576001809201600e55016101da565b634e487b7160e01b5f52601160045260245ffd5b637262f58f60e01b5f5260045ffd5b506020820151156101f9565b600b6020526202a3007ffc320c8b7cd913048d0600d8f8fbdd9fd65e3dee2c1f3796e3abba8cc47fa047556203f4807f5248b41ce7bdc12ebe0248f44130be972d690f78fe7dbe1a76d984641d9dcfc25562093a807f9b6d9405e2a268edd94615fe7f07c0d5d9dda2152c2e48f4e74379972af1c6188190557fa24d58aaa8deed8b2ff0e63d867e6fe155de046522ed61849f5647e59d04b6ba5f527f8de415b97204654c888cc41215aeac0a76fba4f899a3e239bdee8aedbbab23ef5560405161428b90816105d28239f35b6001600160a01b036103a182846105bd565b511690811561049557815f52600260205260ff60405f20541661048657815f52600260205260405f20600160ff19825416179055600154916801000000000000000083101561047257600183018060015583101561045e5760015f8181527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690940180546001600160a01b03191683179055927fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d9080a201610175565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b630da1c57360e41b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b509063158589c560e11b5f5260045260245260445ffd5b5081831161016f565b8263158589c560e11b5f526004525f60245260445ffd5b60c084830312610551576040519060c082016001600160401b03811183821017610472576040528451908115158203610551578260209260c09452828701518382015260408701516040820152606087015160608201526080870151608082015260a087015160a08201528152019301926100ef565b5f80fd5b60208091610562846105a9565b815201910190610078565b6040519190601f01601f191682016001600160401b0381118382101761047257604052565b6001600160401b0381116104725760051b60200190565b51906001600160a01b038216820361055157565b805182101561045e5760209160051b01019056fe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c806304235842146103c95780631276bcc5146103c4578063127f49ad146103bf5780631ac4d079146103ba5780631bc12e07146103b557806324242e77146103b057806326ddc1ba146103ab5780632808e92f146103a6578063280cd09d146103a1578063281cbdd41461039c57806328c1f99b146103975780632d4ab28d14610392578063317095201461038d5780633174b72714610388578063333bef221461038357806335cfd9eb1461037e57806340eedabb14610379578063413721f614610374578063478426631461036f5780634c051f141461036a5780634e970c8c146103655780635cc79144146103605780635d3ae3901461035b5780635f250f69146103565780636583c37a14610351578063669f6f351461034c5780636d70f7ae146103475780636dfb32aa146103425780637b7a91dd1461033d5780637f0152a81461033857806381392328146103335780638c64ea4a1461032e5780639005474214610329578063900cf0cf1461032457806395c825591461031f5780639d3e015a1461031a5780639fd7285c14610315578063a6aac51314610310578063acfacc861461030b578063ae5c8bfb14610306578063b34eb18214610301578063b5ed8b12146102fc578063b7635fb8146102f7578063be223838146102f2578063c7d06b54146102ed578063cd1d81ff146102e8578063ce0b1302146102e3578063d8a0bebf146102de578063d9be832c146102d9578063dd6fbaa2146102d4578063e0913aff146102cf578063e28d4906146102ca578063f5949cd6146102c5578063f5b68c67146102c0578063f698da25146102bb578063f851a440146102b6578063fb834493146102b1578063fc0e2ba7146102ac5763fdeabe1f0361000e57611ecc565b611e92565b611e68565b611e41565b611e1f565b611df8565b611dbe565b611d64565b611d2a565b611c39565b611c1c565b611be2565b611b73565b611b29565b611a4f565b6119d9565b6119b2565b6118c9565b6118ac565b6117ca565b6116f8565b6116cb565b6115f6565b61149b565b611435565b611418565b6113de565b61133c565b6111a7565b61112e565b611111565b61104e565b61100e565b610fcb565b610f91565b610f57565b610db3565b610d0b565b610cd1565b610c9c565b610c74565b610bef565b610bc7565b610a92565b610a58565b610a18565b6109bf565b610998565b610970565b610887565b61085f565b610706565b61063e565b61056c565b610545565b61050a565b6104dc565b6104ba565b610422565b9093929193606082016060835281518091526020608084019201905f5b81811061040357505050906040919460208201520152565b82516001600160a01b03168452602093840193909201916001016103eb565b346104b6575f3660031901126104b65760035460015460405190602082828152019060015f52827fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65f5b838110610494575050610484906104909303846112be565b604051938493846103ce565b0390f35b81546001600160a01b031685526020909401938592506001918201910161046c565b5f80fd5b346104b6575f3660031901126104b657602060ff601754166040519015158152f35b346104b6575f3660031901126104b6576020601254604051908152f35b6001600160a01b038116036104b657565b346104b65760203660031901126104b657600435610527816104f9565b60018060a01b03165f526005602052602060405f2054604051908152f35b346104b6575f3660031901126104b65760206040515f5160206142365f395f51905f528152f35b346104b65760203660031901126104b657600435610589816104f9565b6001600160a01b03811690811561062f575f5160206142365f395f51905f526105cd6040516020810190858252602081526105c56040826112be565b519020612db7565b6105d681612ec3565b600a80546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141f65f395f51905f525f80a37f482b97c53e48ffa324a976e2738053e9aff6eee04d8aac63b10e19411d869b825f80a3005b63d92e233d60e01b5f5260045ffd5b346104b6575f3660031901126104b65760206040517f3f98d537f24f3ae50e4a30e12fbf3e5c35cf6f40f4ce125c82c1b88e3e7cf3df8152f35b9181601f840112156104b6578235916001600160401b0383116104b6576020808501948460051b0101116104b657565b9060606003198301126104b6576004356106c1816104f9565b916024356001600160401b0381116104b657816106e091600401610678565b92909291604435906001600160401b0382116104b65761070291600401610678565b9091565b346104b657610714366106a8565b91936001600160a01b03169190821561062f57610765946107529360405160208101918252602081526107486040826112be565b5190209485612ff1565b5f5160206141d65f395f51905f52612e97565b805f52600c60205260405f209060ff825460401c1661084d575f5160206141d65f395f51905f525f52600b6020527ffc320c8b7cd913048d0600d8f8fbdd9fd65e3dee2c1f3796e3abba8cc47fa0475491821561083957815f5160206141b65f395f51905f5261082e5f5160206141d65f395f51905f52938460016107fb6107ef60209a426121d5565b6001600160401b031690565b835469ffffffffffffffffffff19166001600160401b039190911690811784559201556040519081529081906020820190565b0390a3604051908152f35b6309913ab360e31b5f52600483905260245ffd5b633599e08d60e21b5f5260045260245ffd5b346104b6575f3660031901126104b6576011546040516001600160a01b039091168152602090f35b346104b657610895366106a8565b91936001600160a01b03169190821561062f576108e6946108d39360405160208101918252602081526108c96040826112be565b519020948561316a565b5f5160206142165f395f51905f52612e97565b805f52600c60205260405f209060ff825460401c1661084d575f5160206142165f395f51905f525f52600b6020527f5585c2bd0ffb4796fa70abc2a0b1f92173aa4b9f7e1b37d256fd2a975c5abcfa5491821561083957815f5160206141b65f395f51905f5261082e5f5160206142165f395f51905f52938460016107fb6107ef60209a426121d5565b346104b6575f3660031901126104b657600a546040516001600160a01b039091168152602090f35b346104b6575f3660031901126104b65760206040515f5160206142165f395f51905f528152f35b346104b65760203660031901126104b6576004355f52600c602052608060405f206001815491015460ff604051926001600160401b0381168452818160401c161515602085015260481c16151560408301526060820152f35b346104b65760403660031901126104b657600435602435905f52600860205260405f20905f52602052602060018060a01b0360405f205416604051908152f35b346104b6575f3660031901126104b65760206040517f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd8152f35b346104b6575f3660031901126104b6576012548015610bb857421115610ba957610ac5610ac160165460ff1690565b1590565b610b9a5760175460ff16610b8b57601354610aed906001600160a01b0316613cbd565b613cbd565b610af8601554601055565b610b03601454600f55565b610b0c5f601255565b610b215f6013555f6014555f6015555f601655565b600f546010546040805183815260208101929092527f88cac99f10d8167541407023871a1cc0d797dc75e5b23f3f9f54aaf445f5602c91a16006546001600160a01b03167fd7936f419066f72741af39dde15237d9aed55a0d1d9ab0cb3280569b42c3d8f35f80a3005b6363f5b90b60e11b5f5260045ffd5b63dcd4760160e01b5f5260045ffd5b63285f264160e21b5f5260045ffd5b63cbd2c74d60e01b5f5260045ffd5b346104b6575f3660031901126104b6576006546040516001600160a01b039091168152602090f35b60c03660031901126104b6576004356024356044356001600160401b0381116104b657610c20903690600401610678565b909290606435906084356001600160401b0381116104b657610c46903690600401610678565b92909160a435966001600160401b0388116104b657610c6c610018983690600401610678565b9790966120d0565b346104b6575f3660031901126104b6576009546040516001600160a01b039091168152602090f35b346104b6575f3660031901126104b657604060018060a01b0360065416805f526005602052815f205482519182526020820152f35b346104b6575f3660031901126104b65760206040517f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f8152f35b346104b6575f3660031901126104b6576012544210610d8657610e104201804211610d8157601255610d485f6013555f6014555f6015555f601655565b60ff19601754166017557f3d364c9a6ad0fb8014a11c487ec342f3a0aaf1a55973fc1bb7353ab6824a358f6020601254604051908152a1005b6121c1565b6301fd8f7b60e41b5f5260045ffd5b6004359060ff821682036104b657565b359060ff821682036104b657565b346104b65760a03660031901126104b657610dcc610d95565b60243590604435610ddc816104f9565b6064356001600160401b0381116104b657610dfb903690600401610678565b9190926084356001600160401b0381116104b657610e1d903690600401610678565b6001600160a01b038416959094919390861561062f57610e7b610e6f610e6f610e628b610e558960ff165f52600860205260405f2090565b905f5260205260405f2090565b546001600160a01b031690565b6001600160a01b031690565b610f48576040805160ff868116602083019081529282018b90526001600160a01b038a1660608301527f0f05f8598640816bc7963f9e84995cc362736f66a37eaca8293048e25aed4067989097610f2f96610ef7959294919390929190610eef81608081015b03601f1981018352826112be565b51902061326d565b610f1087610e558560ff165f52600860205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b6040516001600160a01b039490941684521691602090a3005b63c45546f760e01b5f5260045ffd5b346104b6575f3660031901126104b65760206040517f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d938152f35b346104b6575f3660031901126104b65760206040517f8b6e6eebcf1e5aa625df96285186591a18b47d82a0e5344612aba13e51bc0e6f8152f35b346104b6575f3660031901126104b657608060018060a01b036013541660145460155460ff60165416916040519384526020840152604083015215156060820152f35b346104b65760203660031901126104b65760043561102b816104f9565b60018060a01b03165f526002602052602060ff60405f2054166040519015158152f35b346104b65760203660031901126104b65760043561106b816104f9565b6001600160a01b03811690811561062f575f5160206141d65f395f51905f526110af6040516020810190858252602081526110a76040826112be565b519020612def565b6110b881612ec3565b600980546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141f65f395f51905f525f80a37f62e09f04681da780308095cdff046660f0b1e396888312a767499401693c03e55f80a3005b346104b6575f3660031901126104b6576020600354604051908152f35b346104b65760203660031901126104b657600435335f52600260205260ff60405f2054161561119457801561062f57335f8181526005602052604081208390557fe58dd23bcf790de89fbc05578bcc206ece8cb67dee1cf099fce6ff74d052ff3e9080a3005b633b63649d60e11b5f523360045260245ffd5b346104b6576101403660031901126104b6576111c1610d95565b6024356044359160a03660631901126104b657610104356001600160401b0381116104b6576111f4903690600401610678565b9061012435946001600160401b0386116104b657611219610018963690600401610678565b9590946123e4565b634e487b7160e01b5f52603260045260245ffd5b6007548110156112515760075f5260205f209060021b01905f90565b611221565b8054821015611251575f5260205f209060021b01905f90565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b0382111761129e57604052565b61126f565b608081019081106001600160401b0382111761129e57604052565b90601f801991011681019081106001600160401b0382111761129e57604052565b604051906112ee6080836112be565b565b906040516112fd81611283565b608060ff808395546001600160401b0381168552818160401c166020860152818160481c166040860152818160501c16606086015260581c1616910152565b346104b65760203660031901126104b6576004356007548110156104b65761136661010091611235565b506113dc60ff825416916001810154906113876003600283015492016112f0565b9160405194855260208501526040840152606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565bf35b346104b6575f3660031901126104b65760206040517fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e628152f35b346104b6575f3660031901126104b6576020600f54604051908152f35b346104b65760203660031901126104b6576004355f52600d60205260c060405f2060ff81541690600181015490600281015460038201549060056004840154930154936040519515158652602086015260408501526060840152608083015260a0820152f35b346104b65760603660031901126104b6576004356024356001600160401b0381116104b6576114ce903690600401610678565b604435916001600160401b0383116104b6576114f1611517933690600401610678565b929091604051602081019061150f81610ee18a859190602083019252565b519020613383565b611529815f52600c60205260405f2090565b80546001600160401b038116156115c057604081901c60ff166115ac5760481c60ff1661159857805469ff0000000000000000001916690100000000000000000017815560010154907f4ef6805613a59a1bece0b99a00b945fffadc1bb793c7064706233d30fd438c765f80a3005b632863f91560e21b5f52600482905260245ffd5b633599e08d60e21b5f52600483905260245ffd5b633e426d5160e21b5f52600483905260245ffd5b6004359061ffff821682036104b657565b6024359061ffff821682036104b657565b346104b65760403660031901126104b6576116206116126115d4565b61161a6115e5565b9061262f565b6040518091602082016020835281518091526020604084019201905f5b81811061164b575050500390f35b9193509160206101006001926116bd6060885160ff81511684528581015186850152604081015160408501520151606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565b01940191019184939261163d565b346104b6575f3660031901126104b6576020604051610e108152f35b60c09060231901126104b657602490565b346104b6576101203660031901126104b657600435611716366116e7565b9060e4356001600160401b0381116104b657611736903690600401610678565b92610104356001600160401b0381116104b657611757903690600401610678565b908235611763816126e7565b806117be575b6117af576104909561179f95610ee161179061179a966040519283916020830195866126fb565b5190209485613499565b613c0d565b6040519081529081906020820190565b63137ec6d760e11b5f5260045ffd5b50602083013515611769565b346104b65760e03660031901126104b6576004356117e7366116e7565b611809604051602081019061180181610ee18688866126fb565b519020612e27565b9061181382612ec3565b8215611892575b7faa1bacadd202709f2df9c31faf4babdbb21a245021c22298bfcdf22861ca12c69161188d6118825f5160206141965f395f51905f5293865f52600d6020526118668160405f2061274a565b6040519485945f5160206141f65f395f51905f525f80a36126f1565b151582526020820190565b0390a2005b9150600e545f198114610d815760018101600e559161181a565b346104b6575f3660031901126104b6576020601054604051908152f35b346104b6576118d7366106a8565b91936001600160a01b03169190821561062f576119289461191593604051602081019182526020815261190b6040826112be565b519020948561359c565b5f5160206142365f395f51905f52612e97565b805f52600c60205260405f209060ff825460401c1661084d575f5160206142365f395f51905f525f52600b6020527f5248b41ce7bdc12ebe0248f44130be972d690f78fe7dbe1a76d984641d9dcfc25491821561083957815f5160206141b65f395f51905f5261082e5f5160206142365f395f51905f52938460016107fb6107ef60209a426121d5565b346104b6575f3660031901126104b65760206040515f5160206141965f395f51905f528152f35b346104b6576119e7366106a8565b92939091906001600160a01b0316801561062f575f80808093611a2f8888888c476040516020810191888352604082015260408152611a276060826112be565b51902061369f565b4790828215611a46575bf115611a4157005b612798565b506108fc611a39565b346104b65760203660031901126104b657600435611a6c816104f9565b6001600160a01b0316801561062f57611aa0604051602081019083825260208152611a986040826112be565b519020612e5f565b611aa981612ec3565b6011545f5160206142165f395f51905f5290611acd906001600160a01b0316610e6f565b601180546001600160a01b0319166001600160a01b038616179055915f5160206141f65f395f51905f525f80a36001600160a01b03167ff6879817b383066906e8355b81d5157ffe8bff151dd1946b33863aeede50ff985f80a3005b346104b6575f3660031901126104b6576020600e54604051908152f35b9181601f840112156104b6578235916001600160401b0383116104b657602083818601950101116104b657565b346104b65760a03660031901126104b6576004356024356001600160401b0381116104b657611ba6903690600401611b46565b9190604435926001600160401b0384116104b657611bcb610018943690600401611b46565b9160643593611bd9856104f9565b6084359561298c565b346104b6575f3660031901126104b65760206040517ffdc5f96508969628a00bce64abbf1ea989f16e791b70592a3122d67a7792e48c8152f35b346104b6575f3660031901126104b6576020600454604051908152f35b346104b65760603660031901126104b6576004356024356001600160401b0381116104b657611c6c903690600401610678565b906044356001600160401b0381116104b657611c8c903690600401610678565b92909184158015611d1f575b611d0557917fc33728fb6bc64ec1c5596c946e1406ccdfb7369404098c1d6a5f4a7a29c97b63949391611ce793604051602081019087825260208152611cdf6040826112be565b5190206137b5565b600354611cf382600355565b604080519182526020820192909252a1005b846001549063158589c560e11b5f5260045260245260445ffd5b506001548511611c98565b346104b6575f3660031901126104b65760206040517fa24d58aaa8deed8b2ff0e63d867e6fe155de046522ed61849f5647e59d04b6ba8152f35b346104b65760203660031901126104b6576004356001548110156104b65760015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601546040516001600160a01b039091168152602090f35b346104b6575f3660031901126104b65760206040517f5cdde72149ec19ce1ce0ecbedb38d9335aa5e1f8c43addf6e406b9c16e19f9478152f35b346104b6575f3660031901126104b65760206040515f5160206141d65f395f51905f528152f35b346104b6575f3660031901126104b6576020611e39612d1f565b604051908152f35b346104b6575f3660031901126104b6575f546040516001600160a01b039091168152602090f35b346104b65760203660031901126104b6576004355f52600b602052602060405f2054604051908152f35b346104b6575f3660031901126104b65760206040517fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a813058152f35b346104b657611eda366106a8565b6001600160a01b0385165f908152600260205260409020549294939290919060ff1615611f55576001600160a01b0384165f908152600560205260409020541561062f57604080516001600160a01b0386166020820190815261001897610ae8969093909290611f4d9082908101610ee1565b5190206138cb565b633b63649d60e11b5f526001600160a01b03841660045260245ffd5b634e487b7160e01b5f525f60045260245ffd5b916020908281520191905f5b818110611f9d5750505090565b9091926020806001928635611fb1816104f9565b848060a01b031681520194019101919091611f90565b929093611fed92608095989796988552602085015260a0604085015260a0840191611f84565b9460608201520152565b9493929160409261201d9260018060a01b03168752606060208801526060870191611f84565b930152565b6001600160401b03811161129e57601f01601f191660200190565b3d15612067573d9061204e82612022565b9161205c60405193846112be565b82523d5f602084013e565b606090565b1561207357565b60405162461bcd60e51b815260206004820152601c60248201527f53747261746567792064656c656761746563616c6c206661696c6564000000006044820152606490fd5b93929160209161201d91604087526040870191611f84565b969790979492949391936120f6610e6f610e628b610e558c5f52600860205260405f2090565b966001600160a01b038816156121b2577fc55043b6a137f66033384e3f6d9b80e72303eab38436f8fdb89899dc87ce53a2976121606121a1945f9485946121ad998f8f6121588f918f90610ee1908f604051958694602086019834948a611fc7565b5190206139e1565b61216a8b8b613d60565b60405161218f81610ee1898d8d60208501976303a81a5760e11b895260248601611ff7565b51915af461219b61203d565b5061206c565b604051938493846120b8565b0390a3565b635c7f4b4760e11b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b91908201809211610d8157565b35906001600160401b03821682036104b657565b60ff612252608080936001600160401b03612210826121e2565b1686528361222060208301610da5565b1660208701528361223360408301610da5565b1660408701528361224660608301610da5565b16606087015201610da5565b16910152565b91908260a09103126104b65760405161227081611283565b60806122bc818395612281816121e2565b855261228f60208201610da5565b60208601526122a060408201610da5565b60408601526122b160608201610da5565b606086015201610da5565b910152565b600754600160401b81101561129e578060016122e292016007556007611256565b9190916123c9576123af6080606060036112ee9560ff86511660ff198254161781556020860151600182015560408601516002820155019301516123466001600160401b0382511685906001600160401b03166001600160401b0319825416179055565b6020810151845461238a9160ff60401b1990911660409190911b68ff0000000000000000161760ff60408401511660ff60481b9060481b169060ff60481b19161790565b606082015160ff60501b1990911660509190911b60ff60501b16178455015160ff1690565b815460ff60581b191660589190911b60ff60581b16179055565b611f71565b90815260c0810192916112ee91602001906121f6565b959294909582156117af5761245d606494612491937fdcd264bd7d6d022cfcd2ef488637c26dba3344acfaad38a093f1755fe21085f5976040519960208b0160ff87169b8c82528d6040820152896060820152612444608082018c6121f6565b6101008152612455610120826112be565b519020613af7565b6124716124686112df565b60ff9092168252565b8660208201528260408201526124873685612258565b60608201526122c1565b6121ad604051928392836123ce565b6001600160401b03811161129e5760051b60200190565b6124c05f6124a0565b906124ce60405192836112be565b5f825281601f196124de5f6124a0565b01905f5b8281106124ee57505050565b6020906040516124fd816112a3565b5f81525f838201525f604082015260405161251781611283565b5f81525f848201525f60408201525f60608201525f60808201526060820152828285010152016124e2565b9061254c826124a0565b61255960405191826112be565b828152809261256a601f19916124a0565b01905f5b82811061257a57505050565b602090604051612589816112a3565b5f81525f838201525f60408201526040516125a381611283565b5f81525f848201525f60408201525f60608201525f608082015260608201528282850101520161256e565b9061ffff8091169116039061ffff8211610d8157565b80518210156112515760209160051b010190565b90604051612605816112a3565b60606122bc6003839560ff81541685526001810154602086015260028101546040860152016112f0565b6007549161ffff821692808410156126db578061ffff8316116126cf575b508261ffff821611156126c15761266e91612667916125ce565b61ffff1690565b61267781612542565b915f5b8281106126875750505090565b806126a561269f61269a600194866121d5565b611235565b506125f8565b6126af82876125e4565b526126ba81866125e4565b500161267a565b5050506126cc6124b7565b90565b61ffff9150165f61264d565b505050506126cc6124b7565b801515036104b657565b356126cc816126e7565b90929160a060c09160e084019584528035612715816126e7565b151560208501526020810135604085015260408101356060850152606081013560808501526080810135828501520135910152565b9060a0600591803561275b816126e7565b60ff801986541691151516178455602081013560018501556040810135600285015560608101356003850155608081013560048501550135910155565b6040513d5f823e3d90fd5b91906040838203126104b65782516127ba816126e7565b926020810151906001600160401b0382116104b6570181601f820112156104b6578051906127e782612022565b926127f560405194856112be565b828452602083830101116104b657815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b929061284f906126cc9593606086526060860191612816565b92600160208201526040818503910152612816565b9060a8116104b65760880190602090565b90610168116104b6576101480190602090565b90610198116104b6576101780190602090565b906101c8116104b6576101a80190602090565b906101f8116104b6576101d80190602090565b9061021c116104b6576102080190601490565b9061023c116104b65761021c0190602090565b90610244116104b65761023c0190600890565b359060208110612908575090565b5f199060200360031b1b1690565b356bffffffffffffffffffffffff19811692919060148210612936575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b356001600160c01b0319811692919060088210612971575050565b6001600160c01b031960089290920360031b82901b16169150565b9091929495936012548015908115612d15575b50610bb8576001600160a01b03871695861561062f576011546129ca906001600160a01b0316610e6f565b916001600160a01b03831615612d06576129ff925f92836040518096819582946302bc2ce760e51b84528c8c60048601612836565b03925af1908115611a41575f905f92612ce1575b5015612cc357506102488310612cb457612a7690612a3a612a348585612864565b906128fa565b612a47612a348686612875565b612a54612a348787612888565b90612a62612a34888861289b565b92612a70612a3489896128ae565b94613e22565b83612abc612ab6612ab0612a9c612a96612a9088886128c1565b90612916565b60601c90565b95612aaa612a3482886128d4565b956128e7565b90612956565b60c01c90565b926001600160a01b031603612ca5578203612ca557600f54936001600160401b0382169480861115612c865750612af8610ac160165460ff1690565b612c545760145480861115612bd65750612baa907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612b49612b3a6112df565b6001600160a01b039093168352565b6020820152836040820152612b616060820160019052565b60609060018060a01b038151166bffffffffffffffffffffffff60a01b6013541617601355602081015160145560408101516015550151151560ff801960165416911617601655565b612bb960ff1960175416601755565b604080516001600160401b039290921682526020820192909252a2565b929350509214612be5575b5050565b6015548114612be1577fa3f0eabe92ef7bacb81dba904189dc163924ee16379f429441a4117441609fff91612c22600160ff196017541617601755565b612c4f60155492604051938493846040919493926001600160401b03606083019616825260208201520152565b0390a1565b612bb9907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612b49612b3a6112df565b636762eb4960e01b5f526004526001600160401b03821660245260445ffd5b63319c9a2160e21b5f5260045ffd5b632ffd02b360e11b5f5260045ffd5b805115612cd257805190602001fd5b63e1ac453160e01b5f5260045ffd5b9050612cff91503d805f833e612cf781836112be565b8101906127a3565b905f612a13565b63baa3de5f60e01b5f5260045ffd5b905042115f61299f565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f3d4a1189ec311cad4499197cf097eefb10346f2894cdd7cbbcb2d2a48001c91860408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152612db160c0826112be565b51902090565b60405160208101915f5160206142365f395f51905f528352604082015230606082015246608082015260808152612db160a0826112be565b60405160208101915f5160206141d65f395f51905f528352604082015230606082015246608082015260808152612db160a0826112be565b60405160208101915f5160206141965f395f51905f528352604082015230606082015246608082015260808152612db160a0826112be565b60405160208101915f5160206142165f395f51905f528352604082015230606082015246608082015260808152612db160a0826112be565b906040519060208201928352604082015230606082015246608082015260808152612db160a0826112be565b805f52600c60205260405f209081546001600160401b038116906001600160401b03821615612f4d57604081901c60ff166115ac5760481c60ff16611598576001600160401b0381164210612f27575050805460ff60401b1916600160401b179055565b63c504f34d60e01b5f526004919091526001600160401b0316602452504260445260645ffd5b82633e426d5160e21b5f5260045260245ffd5b91908110156112515760051b0190565b356126cc816104f9565b91908110156112515760051b81013590601e19813603018212156104b65701908135916001600160401b0383116104b65760200182360381136104b6579190565b929192612fc782612022565b91612fd560405193846112be565b8294818452818301116104b6578281602093845f960137010152565b5f5490949192919061300b906001600160a01b0316610e6f565b331480613162575b8061315a575b613146576003549381830361311557848310801561313d575b6131245761305160045480975f5160206141d65f395f51905f52614027565b925f945f5b8781106130775750505050505050506130726112ee9160010190565b600455565b61308a613085828585612f60565b612f70565b966001600160a01b03908116908816111561311557866130c7610ac16130c08360018060a01b03165f52600260205260405f2090565b5460ff1690565b6130fa576130ed610ac16130e66130df858a8a612f7a565b3691612fbb565b89846140a8565b6130fa5750600101613056565b633b63649d60e11b5f526001600160a01b031660045260245ffd5b630da1c57360e41b5f5260045ffd5b6378f4355360e11b5f526004839052602485905260445ffd5b50848210613032565b50505050506112ee61307260045460010190565b508015613019565b508115613013565b5f54909491929190613184906001600160a01b0316610e6f565b331480613265575b8061325d575b6131465760035493818303613115578483108015613254575b613124576131ca60045480975f5160206142165f395f51905f52614027565b925f945f5b8781106131eb5750505050505050506130726112ee9160010190565b6131f9613085828585612f60565b966001600160a01b039081169088161115613115578661322f610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa57613247610ac16130e66130df858a8a612f7a565b6130fa57506001016131cf565b508482106131ab565b508015613192565b50811561318c565b5f54909491929190613287906001600160a01b0316610e6f565b33148061337b575b80613373575b613146576003549381830361311557848310801561336a575b613124576132e060045480977f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd614027565b925f945f5b8781106133015750505050505050506130726112ee9160010190565b61330f613085828585612f60565b966001600160a01b0390811690881611156131155786613345610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa5761335d610ac16130e66130df858a8a612f7a565b6130fa57506001016132e5565b508482106132ae565b508015613295565b50811561328f565b5f5490949192919061339d906001600160a01b0316610e6f565b331480613491575b80613489575b6131465760035493818303613115578483108015613480575b613124576133f660045480977fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a81305614027565b925f945f5b8781106134175750505050505050506130726112ee9160010190565b613425613085828585612f60565b966001600160a01b039081169088161115613115578661345b610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa57613473610ac16130e66130df858a8a612f7a565b6130fa57506001016133fb565b508482106133c4565b5080156133ab565b5081156133a5565b5f549094919291906134b3906001600160a01b0316610e6f565b331480613594575b8061358c575b6131465760035493818303613115578483108015613583575b613124576134f960045480975f5160206141965f395f51905f52614027565b925f945f5b87811061351a5750505050505050506130726112ee9160010190565b613528613085828585612f60565b966001600160a01b039081169088161115613115578661355e610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa57613576610ac16130e66130df858a8a612f7a565b6130fa57506001016134fe565b508482106134da565b5080156134c1565b5081156134bb565b5f549094919291906135b6906001600160a01b0316610e6f565b331480613697575b8061368f575b6131465760035493818303613115578483108015613686575b613124576135fc60045480975f5160206142365f395f51905f52614027565b925f945f5b87811061361d5750505050505050506130726112ee9160010190565b61362b613085828585612f60565b966001600160a01b0390811690881611156131155786613661610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa57613679610ac16130e66130df858a8a612f7a565b6130fa5750600101613601565b508482106135dd565b5080156135c4565b5081156135be565b5f549094919291906136b9906001600160a01b0316610e6f565b3314806137ad575b806137a5575b613146576003549381830361311557848310801561379c575b6131245761371260045480977f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d93614027565b925f945f5b8781106137335750505050505050506130726112ee9160010190565b613741613085828585612f60565b966001600160a01b0390811690881611156131155786613777610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa5761378f610ac16130e66130df858a8a612f7a565b6130fa5750600101613717565b508482106136e0565b5080156136c7565b5081156136c1565b5f549094919291906137cf906001600160a01b0316610e6f565b3314806138c3575b806138bb575b61314657600354938183036131155784831080156138b2575b6131245761382860045480977f5cdde72149ec19ce1ce0ecbedb38d9335aa5e1f8c43addf6e406b9c16e19f947614027565b925f945f5b8781106138495750505050505050506130726112ee9160010190565b613857613085828585612f60565b966001600160a01b039081169088161115613115578661388d610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa576138a5610ac16130e66130df858a8a612f7a565b6130fa575060010161382d565b508482106137f6565b5080156137dd565b5081156137d7565b5f549094919291906138e5906001600160a01b0316610e6f565b3314806139d9575b806139d1575b61314657600354938183036131155784831080156139c8575b6131245761393e60045480977f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f614027565b925f945f5b87811061395f5750505050505050506130726112ee9160010190565b61396d613085828585612f60565b966001600160a01b03908116908816111561311557866139a3610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa576139bb610ac16130e66130df858a8a612f7a565b6130fa5750600101613943565b5084821061390c565b5080156138f3565b5081156138ed565b5f549094919291906139fb906001600160a01b0316610e6f565b331480613aef575b80613ae7575b6131465760035493818303613115578483108015613ade575b61312457613a5460045480977f3f98d537f24f3ae50e4a30e12fbf3e5c35cf6f40f4ce125c82c1b88e3e7cf3df614027565b925f945f5b878110613a755750505050505050506130726112ee9160010190565b613a83613085828585612f60565b966001600160a01b0390811690881611156131155786613ab9610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa57613ad1610ac16130e66130df858a8a612f7a565b6130fa5750600101613a59565b50848210613a22565b508015613a09565b508115613a03565b5f54909491929190613b11906001600160a01b0316610e6f565b331480613c05575b80613bfd575b6131465760035493818303613115578483108015613bf4575b61312457613b6a60045480977fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e62614027565b925f945f5b878110613b8b5750505050505050506130726112ee9160010190565b613b99613085828585612f60565b966001600160a01b0390811690881611156131155786613bcf610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa57613be7610ac16130e66130df858a8a612f7a565b6130fa5750600101613b6f565b50848210613b38565b508015613b1f565b508115613b19565b613c24905f5160206141965f395f51905f52612e97565b90815f52600c60205260405f2060ff815460401c166115ac575f5160206141965f395f51905f525f52600b6020527f9b6d9405e2a268edd94615fe7f07c0d5d9dda2152c2e48f4e74379972af1c618548015613cab575f5160206141b65f395f51905f526121ad5f5160206141965f395f51905f52938460016107fb6107ef8a97426121d5565b6309913ab360e31b5f5260045260245ffd5b6001600160a01b0381165f8181526002602052604090205490919060ff1615613d4d576001600160a01b0381165f908152600560205260409020541561062f57600680546001600160a01b031916831790556001600160a01b03165f90815260056020526040902054907f2c8c895ef6e3978e12490ffd8cd3b92d4717b223562f851382f5daf74f587b515f80a3565b50633b63649d60e11b5f5260045260245ffd5b6007545f5b818110613d855763dfffe2f960e01b5f526004839052602484905260445ffd5b613d9161269f82611235565b8360ff8251161480613dba575b613dab5750600101613d65565b6040015160601c949350505050565b5084602082015114613d9e565b9060405160c081018181106001600160401b0382111761129e5760405260a06005829460ff81541615158452600181015460208501526002810154604085015260038101546060850152600481015460808501520154910152565b93929190613e40613e3b865f52600d60205260405f2090565b613dc7565b94613e4e610ac18751151590565b61401557506020850180511561062f5751808203613fd9575050604084015180151580613fcf575b613f91575050606083015180151580613f87575b613f49575050608082015180151580613f3f575b613f0157505060a0015180151580613ef7575b613eb9575050565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523360d81b608482015260a490fd5b5080821415613eb1565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264292a26a91960d91b608482015260a490fd5b5080821415613e9e565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523160d81b608482015260a490fd5b5080821415613e8a565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264052544d52360dc1b608482015260a490fd5b5080821415613e76565b60405163fef6c5cf60e01b81526004808201929092526024810192909252606060448301526064820152631354951160e21b608482015260a490fd5b6350dfe91360e01b5f5260045260245ffd5b916040519160208301937f4a3d56bf3b5708e5b633d12931f9923b37fde6895d6bd92957bbfa92cd00303985526040840152606083015260808201526080815261407260a0826112be565b51902061407d612d1f565b9060405190602082019261190160f01b84526022830152604282015260428152612db16062826112be565b90915f91906001600160a01b0382161561418d5760405192600484019460248501956044860192853b1561411157509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b9796505090508151806040146141685760411461412e5750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052614146565b505050505f9056feea4a6847c3f47fe0f98dcfe2e2c074e6cb42f6d74c367b33ae8516f537e775829cc91136b2c7668ecd202c7008f17e818e108b5448a7b7fd48bd2ca6b4aab51fb40912900bb80b6bc5e38d8489266de7299eedb40b03490214410117ef53ff9279883188dbf80e171cf94b3b44b6437b838158b1d3a5df6ccc709eeb7c5217296acb9fef2a4a1ecaa044f4c8979d9f48b0d5be623c860275be31c4cbd34c169cb2d153886d95f8f2d4836fb16c9fac869e1ce9cfc93d919a0f7dfe38439b9771a2646970667358221220e0e92d56df95f5865ed5237b33c5990684fc5c337264026f0c7f338483f1599a64736f6c634300081e0033"},"devdoc":{"details":"This contract acts as the governance layer and the vault registry. It manages the set of authorized operators, enforces quorum consensus for critical updates, and maintains the registry of deposit vaults across different chains. It combines immediate multi-sig actions for operational tasks with timelocked actions for high-risk configuration changes.","errors":{"InsufficientSignatures(uint256,uint256)":[{"params":{"provided":"The number of signatures provided.","required":"The current `quorumThreshold` required."}}],"InvalidDelay(uint256)":[{"params":{"delay":"The provided delay in seconds."}}],"InvalidQuorum(uint256,uint256)":[{"params":{"newQuorum":"The proposed threshold.","operatorCount":"The total number of registered operators."}}],"NotOperator(address)":[{"params":{"signer":"The address recovered from the signature."}}],"SignersNotSortedOrUnique()":[{"details":"Signatures must be sorted strictly ascending (A < B) to prevent duplicate counting in O(N)."}],"TimelockAlreadyCanceled(bytes32)":[{"params":{"opId":"The operation hash."}}],"TimelockAlreadyExecuted(bytes32)":[{"params":{"opId":"The operation hash."}}],"TimelockNotReady(bytes32,uint256,uint256)":[{"params":{"nowTs":"The current block timestamp.","opId":"The unique hash of the operation.","readyAt":"The timestamp when the operation becomes executable."}}],"TimelockUnknown(bytes32)":[{"params":{"opId":"The operation hash."}}],"VaultNotFound(uint256,uint256)":[{"params":{"routingId":"The routing ID of the vault.","vmId":"The Chain ID for EVM chains requested."}}]},"kind":"dev","methods":{"addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":{"details":"This list is append-only. New vaults can be added, but existing ones cannot be removed.","params":{"routingId":"The routing ID of the vault.","signatures":"Corresponding signatures.","signers":"Sorted array of signers.","vaultAddr":"The address of the vault (as bytes32).","vmId":"The Chain ID for EVM chains requested."}},"cancelTimelock(bytes32,address[],bytes[])":{"details":"Can be called at any time before execution to prevent a malicious or erroneous update.","params":{"opId":"The hash of the operation to cancel."}},"constructor":{"params":{"initialOperators":"The list of addresses that will form the initial governance council.","initialQuorumThreshold":"The number of signatures required for valid governance actions.","initialRegistryContract":"The initial Registry Contract address.","initialRiskManager":"The initial Risk Manager address."}},"domainSeparator()":{"returns":{"_0":"The domain separator hash."}},"executeRegistryContract(address)":{"params":{"newRegistry":"The address that was previously scheduled."}},"executeRiskManager(address)":{"params":{"newRiskManager":"The address that was previously scheduled."}},"getCouncilConfig()":{"details":"Let's operators query for 'k, n' thresholds and the current council member list\"."},"getLeader()":{"details":"When querying current leader, then the contract returns the active operator_pubkey and attested_pubkey."},"getVaults(uint16,uint16)":{"details":"The input types are intentionally `uint16` to preserve the function selector `0x9fd7285c` for backward compatibility with existing Rust clients.","params":{"end":"The end index (exclusive).","start":"The start index."},"returns":{"_0":"An array of Vault structs."}},"registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":{"details":"Used to define how the Credential Manager talks to L2s (e.g., via bridges). Only one strategy can be registered per chain.","params":{"routingId":"The routing ID of the vault.","signatures":"Corresponding signatures.","signers":"Sorted array of signers.","strategy":"The address of the strategy contract.","vmId":"The Chain ID for EVM chains requested."}},"registerAttestedKey(bytes32)":{"details":"Maps the attested_pubkey of a new CE joining the quorum.","params":{"newAttestedKey":"The address derived from the TEE's public key."}},"scheduleRegistryContract(address,address[],bytes[])":{"params":{"newRegistry":"The proposed new Registry address."},"returns":{"opId":"The unique hash of the scheduled operation."}},"scheduleRiskManager(address,address[],bytes[])":{"details":"The operation cannot be executed until `TIMELOCK_DELAY` has passed.","params":{"newRiskManager":"The proposed new Risk Manager address."},"returns":{"opId":"The unique hash of the scheduled operation."}},"scheduleUpdateAutomataVerifier(address,address[],bytes[])":{"details":"Operators vote to update the verifier and the update is proposed with a timelocked delay."},"setDepositVaultAdministrators(uint256,uint256,address[],uint256,address[],bytes[])":{"details":"This function acts as a proxy. It verifies the operator quorum locally, then delegate-calls the strategy to execute the actual logic (e.g., sending an L1->L2 message).","params":{"newAdministrators":"The list of new admin addresses for that vault.","newWithdrawalQuorum":"The new quorum requirement for that vault.","routingId":"The routing ID of the vault.","signatures":"Corresponding signatures.","signers":"Sorted array of signers.","vmId":"The Chain ID for EVM chains requested."}},"submitRestartProof(uint256,bytes,bytes,address,bytes32)":{"details":"We compare Epochs. The highest epoch wins.","params":{"checkpointHash":"The state hash being served.","newLeader":"The address claiming leadership.","tdxReportBody":"The 'Public Output' of the ZK Circuit (The TEE Quote Body).","zkProof":"The Groth16 proof bytes."}},"updateQuorumThreshold(uint256,address[],bytes[])":{"details":"Requires a quorum of the *current* operators to approve.","params":{"newThreshold":"The new minimum number of signatures.","signatures":"Corresponding signatures.","signers":"Sorted array of signers."}}},"stateVariables":{"OP_APPOINT_LEADER":{"details":"Used for appointing a leader in the absence of a leader - for bootstrap or emergency recovery."},"_ACTION_TYPEHASH":{"details":"Generic Action typehash used for all governance signatures. Structure: Action(bytes32 opType, bytes32 paramsHash, uint256 nonce)"},"_EIP712_DOMAIN_TYPEHASH":{"details":"EIP-712 Domain Separator typehash."},"_NAME_HASH":{"details":"EIP-712 name hash for this contract."},"_VERSION_HASH":{"details":"EIP-712 version hash."},"adminUpdateStrategies":{"details":"Used to abstract cross-chain messaging logic (e.g., LayerZero, Optimism Messenger)."},"epoch":{"details":"Incremented on every successful restart."},"governanceNonce":{"details":"Included in every signed hash to strictly order operations and prevent replay attacks."},"latestCheckpointHash":{"details":"New nodes verify this hash against the leader's data to ensure they are on the correct fork."},"leader":{"details":"The leader is responsible for coordinating the clearing engine."},"operatorToAttestedKey":{"details":"Used to verify that a TEE signature belongs to a specific operator."},"operators":{"details":"These keys form the root of trust for the system."},"timelockDelayFor":{"details":"e.g., OP_SET_REGISTRY -> 72 hours."},"vaults":{"details":"This list is strictly append-only; vaults cannot be removed to prevent history modification."}},"title":"CredentialManager","version":1},"methodIdentifiers":{"GATHERING_DURATION()":"0xa6aac513","OP_ADD_VAULT()":"0x90054742","OP_APPOINT_LEADER()":"0x4e970c8c","OP_CANCEL_TIMELOCK()":"0xfc0e2ba7","OP_MANAGE_PROFILE()":"0xb7635fb8","OP_REGISTER_STRATEGY()":"0x333bef22","OP_RESTART()":"0xd8a0bebf","OP_SET_AUTOMATA_VERIFIER()":"0x2d4ab28d","OP_SET_DELAY()":"0xe0913aff","OP_SET_MEASUREMENTS()":"0x6583c37a","OP_SET_QUORUM()":"0xf5949cd6","OP_SET_REGISTRY()":"0x1bc12e07","OP_SET_RISK_MANAGER()":"0xf5b68c67","OP_SET_VAULT_ADMINS()":"0x26ddc1ba","OP_WITHDRAW()":"0x5f250f69","addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":"0x81392328","admin()":"0xf851a440","adminUpdateStrategies(uint256,uint256)":"0x3174b727","appointLeader(address,address[],bytes[])":"0xfdeabe1f","automataVerifier()":"0x280cd09d","bestCandidate()":"0x669f6f35","cancelTimelock(bytes32,address[],bytes[])":"0x9d3e015a","domainSeparator()":"0xf698da25","epoch()":"0x900cf0cf","executeManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32))":"0xae5c8bfb","executeRegistryContract(address)":"0x24242e77","executeRiskManager(address)":"0x6dfb32aa","executeUpdateAutomataVerifier(address)":"0xc7d06b54","getCouncilConfig()":"0x04235842","getLeader()":"0x4c051f14","getVaults(uint16,uint16)":"0x9fd7285c","governanceNonce()":"0xd9be832c","initiateRestart()":"0x5cc79144","isOperator(address)":"0x6d70f7ae","isRestartAmbiguous()":"0x1276bcc5","latestCheckpointHash()":"0xb34eb182","leader()":"0x40eedabb","measurementProfiles(uint256)":"0x95c82559","nextProfileId()":"0xcd1d81ff","operatorToAttestedKey(address)":"0x1ac4d079","operators(uint256)":"0xe28d4906","quorumThreshold()":"0x7b7a91dd","registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":"0x5d3ae390","registerAttestedKey(bytes32)":"0x7f0152a8","registryContract()":"0x28c1f99b","resolveRestart()":"0x35cfd9eb","restartGatheringDeadline()":"0x127f49ad","riskManager()":"0x47842663","scheduleManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32),address[],bytes[])":"0xacfacc86","scheduleRegistryContract(address,address[],bytes[])":"0xb5ed8b12","scheduleRiskManager(address,address[],bytes[])":"0x2808e92f","scheduleUpdateAutomataVerifier(address,address[],bytes[])":"0x281cbdd4","setDepositVaultAdministrators(uint256,uint256,address[],uint256,address[],bytes[])":"0x413721f6","submitRestartProof(uint256,bytes,bytes,address,bytes32)":"0xce0b1302","timelockDelayFor(bytes32)":"0xfb834493","timelockOps(bytes32)":"0x31709520","updateQuorumThreshold(uint256,address[],bytes[])":"0xdd6fbaa2","vaults(uint256)":"0x8c64ea4a","withdraw(address,address[],bytes[])":"0xbe223838"},"runtimeBytecode":{"bytecode":"0x6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c806304235842146103c95780631276bcc5146103c4578063127f49ad146103bf5780631ac4d079146103ba5780631bc12e07146103b557806324242e77146103b057806326ddc1ba146103ab5780632808e92f146103a6578063280cd09d146103a1578063281cbdd41461039c57806328c1f99b146103975780632d4ab28d14610392578063317095201461038d5780633174b72714610388578063333bef221461038357806335cfd9eb1461037e57806340eedabb14610379578063413721f614610374578063478426631461036f5780634c051f141461036a5780634e970c8c146103655780635cc79144146103605780635d3ae3901461035b5780635f250f69146103565780636583c37a14610351578063669f6f351461034c5780636d70f7ae146103475780636dfb32aa146103425780637b7a91dd1461033d5780637f0152a81461033857806381392328146103335780638c64ea4a1461032e5780639005474214610329578063900cf0cf1461032457806395c825591461031f5780639d3e015a1461031a5780639fd7285c14610315578063a6aac51314610310578063acfacc861461030b578063ae5c8bfb14610306578063b34eb18214610301578063b5ed8b12146102fc578063b7635fb8146102f7578063be223838146102f2578063c7d06b54146102ed578063cd1d81ff146102e8578063ce0b1302146102e3578063d8a0bebf146102de578063d9be832c146102d9578063dd6fbaa2146102d4578063e0913aff146102cf578063e28d4906146102ca578063f5949cd6146102c5578063f5b68c67146102c0578063f698da25146102bb578063f851a440146102b6578063fb834493146102b1578063fc0e2ba7146102ac5763fdeabe1f0361000e57611ecc565b611e92565b611e68565b611e41565b611e1f565b611df8565b611dbe565b611d64565b611d2a565b611c39565b611c1c565b611be2565b611b73565b611b29565b611a4f565b6119d9565b6119b2565b6118c9565b6118ac565b6117ca565b6116f8565b6116cb565b6115f6565b61149b565b611435565b611418565b6113de565b61133c565b6111a7565b61112e565b611111565b61104e565b61100e565b610fcb565b610f91565b610f57565b610db3565b610d0b565b610cd1565b610c9c565b610c74565b610bef565b610bc7565b610a92565b610a58565b610a18565b6109bf565b610998565b610970565b610887565b61085f565b610706565b61063e565b61056c565b610545565b61050a565b6104dc565b6104ba565b610422565b9093929193606082016060835281518091526020608084019201905f5b81811061040357505050906040919460208201520152565b82516001600160a01b03168452602093840193909201916001016103eb565b346104b6575f3660031901126104b65760035460015460405190602082828152019060015f52827fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65f5b838110610494575050610484906104909303846112be565b604051938493846103ce565b0390f35b81546001600160a01b031685526020909401938592506001918201910161046c565b5f80fd5b346104b6575f3660031901126104b657602060ff601754166040519015158152f35b346104b6575f3660031901126104b6576020601254604051908152f35b6001600160a01b038116036104b657565b346104b65760203660031901126104b657600435610527816104f9565b60018060a01b03165f526005602052602060405f2054604051908152f35b346104b6575f3660031901126104b65760206040515f5160206142365f395f51905f528152f35b346104b65760203660031901126104b657600435610589816104f9565b6001600160a01b03811690811561062f575f5160206142365f395f51905f526105cd6040516020810190858252602081526105c56040826112be565b519020612db7565b6105d681612ec3565b600a80546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141f65f395f51905f525f80a37f482b97c53e48ffa324a976e2738053e9aff6eee04d8aac63b10e19411d869b825f80a3005b63d92e233d60e01b5f5260045ffd5b346104b6575f3660031901126104b65760206040517f3f98d537f24f3ae50e4a30e12fbf3e5c35cf6f40f4ce125c82c1b88e3e7cf3df8152f35b9181601f840112156104b6578235916001600160401b0383116104b6576020808501948460051b0101116104b657565b9060606003198301126104b6576004356106c1816104f9565b916024356001600160401b0381116104b657816106e091600401610678565b92909291604435906001600160401b0382116104b65761070291600401610678565b9091565b346104b657610714366106a8565b91936001600160a01b03169190821561062f57610765946107529360405160208101918252602081526107486040826112be565b5190209485612ff1565b5f5160206141d65f395f51905f52612e97565b805f52600c60205260405f209060ff825460401c1661084d575f5160206141d65f395f51905f525f52600b6020527ffc320c8b7cd913048d0600d8f8fbdd9fd65e3dee2c1f3796e3abba8cc47fa0475491821561083957815f5160206141b65f395f51905f5261082e5f5160206141d65f395f51905f52938460016107fb6107ef60209a426121d5565b6001600160401b031690565b835469ffffffffffffffffffff19166001600160401b039190911690811784559201556040519081529081906020820190565b0390a3604051908152f35b6309913ab360e31b5f52600483905260245ffd5b633599e08d60e21b5f5260045260245ffd5b346104b6575f3660031901126104b6576011546040516001600160a01b039091168152602090f35b346104b657610895366106a8565b91936001600160a01b03169190821561062f576108e6946108d39360405160208101918252602081526108c96040826112be565b519020948561316a565b5f5160206142165f395f51905f52612e97565b805f52600c60205260405f209060ff825460401c1661084d575f5160206142165f395f51905f525f52600b6020527f5585c2bd0ffb4796fa70abc2a0b1f92173aa4b9f7e1b37d256fd2a975c5abcfa5491821561083957815f5160206141b65f395f51905f5261082e5f5160206142165f395f51905f52938460016107fb6107ef60209a426121d5565b346104b6575f3660031901126104b657600a546040516001600160a01b039091168152602090f35b346104b6575f3660031901126104b65760206040515f5160206142165f395f51905f528152f35b346104b65760203660031901126104b6576004355f52600c602052608060405f206001815491015460ff604051926001600160401b0381168452818160401c161515602085015260481c16151560408301526060820152f35b346104b65760403660031901126104b657600435602435905f52600860205260405f20905f52602052602060018060a01b0360405f205416604051908152f35b346104b6575f3660031901126104b65760206040517f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd8152f35b346104b6575f3660031901126104b6576012548015610bb857421115610ba957610ac5610ac160165460ff1690565b1590565b610b9a5760175460ff16610b8b57601354610aed906001600160a01b0316613cbd565b613cbd565b610af8601554601055565b610b03601454600f55565b610b0c5f601255565b610b215f6013555f6014555f6015555f601655565b600f546010546040805183815260208101929092527f88cac99f10d8167541407023871a1cc0d797dc75e5b23f3f9f54aaf445f5602c91a16006546001600160a01b03167fd7936f419066f72741af39dde15237d9aed55a0d1d9ab0cb3280569b42c3d8f35f80a3005b6363f5b90b60e11b5f5260045ffd5b63dcd4760160e01b5f5260045ffd5b63285f264160e21b5f5260045ffd5b63cbd2c74d60e01b5f5260045ffd5b346104b6575f3660031901126104b6576006546040516001600160a01b039091168152602090f35b60c03660031901126104b6576004356024356044356001600160401b0381116104b657610c20903690600401610678565b909290606435906084356001600160401b0381116104b657610c46903690600401610678565b92909160a435966001600160401b0388116104b657610c6c610018983690600401610678565b9790966120d0565b346104b6575f3660031901126104b6576009546040516001600160a01b039091168152602090f35b346104b6575f3660031901126104b657604060018060a01b0360065416805f526005602052815f205482519182526020820152f35b346104b6575f3660031901126104b65760206040517f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f8152f35b346104b6575f3660031901126104b6576012544210610d8657610e104201804211610d8157601255610d485f6013555f6014555f6015555f601655565b60ff19601754166017557f3d364c9a6ad0fb8014a11c487ec342f3a0aaf1a55973fc1bb7353ab6824a358f6020601254604051908152a1005b6121c1565b6301fd8f7b60e41b5f5260045ffd5b6004359060ff821682036104b657565b359060ff821682036104b657565b346104b65760a03660031901126104b657610dcc610d95565b60243590604435610ddc816104f9565b6064356001600160401b0381116104b657610dfb903690600401610678565b9190926084356001600160401b0381116104b657610e1d903690600401610678565b6001600160a01b038416959094919390861561062f57610e7b610e6f610e6f610e628b610e558960ff165f52600860205260405f2090565b905f5260205260405f2090565b546001600160a01b031690565b6001600160a01b031690565b610f48576040805160ff868116602083019081529282018b90526001600160a01b038a1660608301527f0f05f8598640816bc7963f9e84995cc362736f66a37eaca8293048e25aed4067989097610f2f96610ef7959294919390929190610eef81608081015b03601f1981018352826112be565b51902061326d565b610f1087610e558560ff165f52600860205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b6040516001600160a01b039490941684521691602090a3005b63c45546f760e01b5f5260045ffd5b346104b6575f3660031901126104b65760206040517f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d938152f35b346104b6575f3660031901126104b65760206040517f8b6e6eebcf1e5aa625df96285186591a18b47d82a0e5344612aba13e51bc0e6f8152f35b346104b6575f3660031901126104b657608060018060a01b036013541660145460155460ff60165416916040519384526020840152604083015215156060820152f35b346104b65760203660031901126104b65760043561102b816104f9565b60018060a01b03165f526002602052602060ff60405f2054166040519015158152f35b346104b65760203660031901126104b65760043561106b816104f9565b6001600160a01b03811690811561062f575f5160206141d65f395f51905f526110af6040516020810190858252602081526110a76040826112be565b519020612def565b6110b881612ec3565b600980546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141f65f395f51905f525f80a37f62e09f04681da780308095cdff046660f0b1e396888312a767499401693c03e55f80a3005b346104b6575f3660031901126104b6576020600354604051908152f35b346104b65760203660031901126104b657600435335f52600260205260ff60405f2054161561119457801561062f57335f8181526005602052604081208390557fe58dd23bcf790de89fbc05578bcc206ece8cb67dee1cf099fce6ff74d052ff3e9080a3005b633b63649d60e11b5f523360045260245ffd5b346104b6576101403660031901126104b6576111c1610d95565b6024356044359160a03660631901126104b657610104356001600160401b0381116104b6576111f4903690600401610678565b9061012435946001600160401b0386116104b657611219610018963690600401610678565b9590946123e4565b634e487b7160e01b5f52603260045260245ffd5b6007548110156112515760075f5260205f209060021b01905f90565b611221565b8054821015611251575f5260205f209060021b01905f90565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b0382111761129e57604052565b61126f565b608081019081106001600160401b0382111761129e57604052565b90601f801991011681019081106001600160401b0382111761129e57604052565b604051906112ee6080836112be565b565b906040516112fd81611283565b608060ff808395546001600160401b0381168552818160401c166020860152818160481c166040860152818160501c16606086015260581c1616910152565b346104b65760203660031901126104b6576004356007548110156104b65761136661010091611235565b506113dc60ff825416916001810154906113876003600283015492016112f0565b9160405194855260208501526040840152606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565bf35b346104b6575f3660031901126104b65760206040517fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e628152f35b346104b6575f3660031901126104b6576020600f54604051908152f35b346104b65760203660031901126104b6576004355f52600d60205260c060405f2060ff81541690600181015490600281015460038201549060056004840154930154936040519515158652602086015260408501526060840152608083015260a0820152f35b346104b65760603660031901126104b6576004356024356001600160401b0381116104b6576114ce903690600401610678565b604435916001600160401b0383116104b6576114f1611517933690600401610678565b929091604051602081019061150f81610ee18a859190602083019252565b519020613383565b611529815f52600c60205260405f2090565b80546001600160401b038116156115c057604081901c60ff166115ac5760481c60ff1661159857805469ff0000000000000000001916690100000000000000000017815560010154907f4ef6805613a59a1bece0b99a00b945fffadc1bb793c7064706233d30fd438c765f80a3005b632863f91560e21b5f52600482905260245ffd5b633599e08d60e21b5f52600483905260245ffd5b633e426d5160e21b5f52600483905260245ffd5b6004359061ffff821682036104b657565b6024359061ffff821682036104b657565b346104b65760403660031901126104b6576116206116126115d4565b61161a6115e5565b9061262f565b6040518091602082016020835281518091526020604084019201905f5b81811061164b575050500390f35b9193509160206101006001926116bd6060885160ff81511684528581015186850152604081015160408501520151606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565b01940191019184939261163d565b346104b6575f3660031901126104b6576020604051610e108152f35b60c09060231901126104b657602490565b346104b6576101203660031901126104b657600435611716366116e7565b9060e4356001600160401b0381116104b657611736903690600401610678565b92610104356001600160401b0381116104b657611757903690600401610678565b908235611763816126e7565b806117be575b6117af576104909561179f95610ee161179061179a966040519283916020830195866126fb565b5190209485613499565b613c0d565b6040519081529081906020820190565b63137ec6d760e11b5f5260045ffd5b50602083013515611769565b346104b65760e03660031901126104b6576004356117e7366116e7565b611809604051602081019061180181610ee18688866126fb565b519020612e27565b9061181382612ec3565b8215611892575b7faa1bacadd202709f2df9c31faf4babdbb21a245021c22298bfcdf22861ca12c69161188d6118825f5160206141965f395f51905f5293865f52600d6020526118668160405f2061274a565b6040519485945f5160206141f65f395f51905f525f80a36126f1565b151582526020820190565b0390a2005b9150600e545f198114610d815760018101600e559161181a565b346104b6575f3660031901126104b6576020601054604051908152f35b346104b6576118d7366106a8565b91936001600160a01b03169190821561062f576119289461191593604051602081019182526020815261190b6040826112be565b519020948561359c565b5f5160206142365f395f51905f52612e97565b805f52600c60205260405f209060ff825460401c1661084d575f5160206142365f395f51905f525f52600b6020527f5248b41ce7bdc12ebe0248f44130be972d690f78fe7dbe1a76d984641d9dcfc25491821561083957815f5160206141b65f395f51905f5261082e5f5160206142365f395f51905f52938460016107fb6107ef60209a426121d5565b346104b6575f3660031901126104b65760206040515f5160206141965f395f51905f528152f35b346104b6576119e7366106a8565b92939091906001600160a01b0316801561062f575f80808093611a2f8888888c476040516020810191888352604082015260408152611a276060826112be565b51902061369f565b4790828215611a46575bf115611a4157005b612798565b506108fc611a39565b346104b65760203660031901126104b657600435611a6c816104f9565b6001600160a01b0316801561062f57611aa0604051602081019083825260208152611a986040826112be565b519020612e5f565b611aa981612ec3565b6011545f5160206142165f395f51905f5290611acd906001600160a01b0316610e6f565b601180546001600160a01b0319166001600160a01b038616179055915f5160206141f65f395f51905f525f80a36001600160a01b03167ff6879817b383066906e8355b81d5157ffe8bff151dd1946b33863aeede50ff985f80a3005b346104b6575f3660031901126104b6576020600e54604051908152f35b9181601f840112156104b6578235916001600160401b0383116104b657602083818601950101116104b657565b346104b65760a03660031901126104b6576004356024356001600160401b0381116104b657611ba6903690600401611b46565b9190604435926001600160401b0384116104b657611bcb610018943690600401611b46565b9160643593611bd9856104f9565b6084359561298c565b346104b6575f3660031901126104b65760206040517ffdc5f96508969628a00bce64abbf1ea989f16e791b70592a3122d67a7792e48c8152f35b346104b6575f3660031901126104b6576020600454604051908152f35b346104b65760603660031901126104b6576004356024356001600160401b0381116104b657611c6c903690600401610678565b906044356001600160401b0381116104b657611c8c903690600401610678565b92909184158015611d1f575b611d0557917fc33728fb6bc64ec1c5596c946e1406ccdfb7369404098c1d6a5f4a7a29c97b63949391611ce793604051602081019087825260208152611cdf6040826112be565b5190206137b5565b600354611cf382600355565b604080519182526020820192909252a1005b846001549063158589c560e11b5f5260045260245260445ffd5b506001548511611c98565b346104b6575f3660031901126104b65760206040517fa24d58aaa8deed8b2ff0e63d867e6fe155de046522ed61849f5647e59d04b6ba8152f35b346104b65760203660031901126104b6576004356001548110156104b65760015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601546040516001600160a01b039091168152602090f35b346104b6575f3660031901126104b65760206040517f5cdde72149ec19ce1ce0ecbedb38d9335aa5e1f8c43addf6e406b9c16e19f9478152f35b346104b6575f3660031901126104b65760206040515f5160206141d65f395f51905f528152f35b346104b6575f3660031901126104b6576020611e39612d1f565b604051908152f35b346104b6575f3660031901126104b6575f546040516001600160a01b039091168152602090f35b346104b65760203660031901126104b6576004355f52600b602052602060405f2054604051908152f35b346104b6575f3660031901126104b65760206040517fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a813058152f35b346104b657611eda366106a8565b6001600160a01b0385165f908152600260205260409020549294939290919060ff1615611f55576001600160a01b0384165f908152600560205260409020541561062f57604080516001600160a01b0386166020820190815261001897610ae8969093909290611f4d9082908101610ee1565b5190206138cb565b633b63649d60e11b5f526001600160a01b03841660045260245ffd5b634e487b7160e01b5f525f60045260245ffd5b916020908281520191905f5b818110611f9d5750505090565b9091926020806001928635611fb1816104f9565b848060a01b031681520194019101919091611f90565b929093611fed92608095989796988552602085015260a0604085015260a0840191611f84565b9460608201520152565b9493929160409261201d9260018060a01b03168752606060208801526060870191611f84565b930152565b6001600160401b03811161129e57601f01601f191660200190565b3d15612067573d9061204e82612022565b9161205c60405193846112be565b82523d5f602084013e565b606090565b1561207357565b60405162461bcd60e51b815260206004820152601c60248201527f53747261746567792064656c656761746563616c6c206661696c6564000000006044820152606490fd5b93929160209161201d91604087526040870191611f84565b969790979492949391936120f6610e6f610e628b610e558c5f52600860205260405f2090565b966001600160a01b038816156121b2577fc55043b6a137f66033384e3f6d9b80e72303eab38436f8fdb89899dc87ce53a2976121606121a1945f9485946121ad998f8f6121588f918f90610ee1908f604051958694602086019834948a611fc7565b5190206139e1565b61216a8b8b613d60565b60405161218f81610ee1898d8d60208501976303a81a5760e11b895260248601611ff7565b51915af461219b61203d565b5061206c565b604051938493846120b8565b0390a3565b635c7f4b4760e11b5f5260045ffd5b634e487b7160e01b5f52601160045260245ffd5b91908201809211610d8157565b35906001600160401b03821682036104b657565b60ff612252608080936001600160401b03612210826121e2565b1686528361222060208301610da5565b1660208701528361223360408301610da5565b1660408701528361224660608301610da5565b16606087015201610da5565b16910152565b91908260a09103126104b65760405161227081611283565b60806122bc818395612281816121e2565b855261228f60208201610da5565b60208601526122a060408201610da5565b60408601526122b160608201610da5565b606086015201610da5565b910152565b600754600160401b81101561129e578060016122e292016007556007611256565b9190916123c9576123af6080606060036112ee9560ff86511660ff198254161781556020860151600182015560408601516002820155019301516123466001600160401b0382511685906001600160401b03166001600160401b0319825416179055565b6020810151845461238a9160ff60401b1990911660409190911b68ff0000000000000000161760ff60408401511660ff60481b9060481b169060ff60481b19161790565b606082015160ff60501b1990911660509190911b60ff60501b16178455015160ff1690565b815460ff60581b191660589190911b60ff60581b16179055565b611f71565b90815260c0810192916112ee91602001906121f6565b959294909582156117af5761245d606494612491937fdcd264bd7d6d022cfcd2ef488637c26dba3344acfaad38a093f1755fe21085f5976040519960208b0160ff87169b8c82528d6040820152896060820152612444608082018c6121f6565b6101008152612455610120826112be565b519020613af7565b6124716124686112df565b60ff9092168252565b8660208201528260408201526124873685612258565b60608201526122c1565b6121ad604051928392836123ce565b6001600160401b03811161129e5760051b60200190565b6124c05f6124a0565b906124ce60405192836112be565b5f825281601f196124de5f6124a0565b01905f5b8281106124ee57505050565b6020906040516124fd816112a3565b5f81525f838201525f604082015260405161251781611283565b5f81525f848201525f60408201525f60608201525f60808201526060820152828285010152016124e2565b9061254c826124a0565b61255960405191826112be565b828152809261256a601f19916124a0565b01905f5b82811061257a57505050565b602090604051612589816112a3565b5f81525f838201525f60408201526040516125a381611283565b5f81525f848201525f60408201525f60608201525f608082015260608201528282850101520161256e565b9061ffff8091169116039061ffff8211610d8157565b80518210156112515760209160051b010190565b90604051612605816112a3565b60606122bc6003839560ff81541685526001810154602086015260028101546040860152016112f0565b6007549161ffff821692808410156126db578061ffff8316116126cf575b508261ffff821611156126c15761266e91612667916125ce565b61ffff1690565b61267781612542565b915f5b8281106126875750505090565b806126a561269f61269a600194866121d5565b611235565b506125f8565b6126af82876125e4565b526126ba81866125e4565b500161267a565b5050506126cc6124b7565b90565b61ffff9150165f61264d565b505050506126cc6124b7565b801515036104b657565b356126cc816126e7565b90929160a060c09160e084019584528035612715816126e7565b151560208501526020810135604085015260408101356060850152606081013560808501526080810135828501520135910152565b9060a0600591803561275b816126e7565b60ff801986541691151516178455602081013560018501556040810135600285015560608101356003850155608081013560048501550135910155565b6040513d5f823e3d90fd5b91906040838203126104b65782516127ba816126e7565b926020810151906001600160401b0382116104b6570181601f820112156104b6578051906127e782612022565b926127f560405194856112be565b828452602083830101116104b657815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b929061284f906126cc9593606086526060860191612816565b92600160208201526040818503910152612816565b9060a8116104b65760880190602090565b90610168116104b6576101480190602090565b90610198116104b6576101780190602090565b906101c8116104b6576101a80190602090565b906101f8116104b6576101d80190602090565b9061021c116104b6576102080190601490565b9061023c116104b65761021c0190602090565b90610244116104b65761023c0190600890565b359060208110612908575090565b5f199060200360031b1b1690565b356bffffffffffffffffffffffff19811692919060148210612936575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b356001600160c01b0319811692919060088210612971575050565b6001600160c01b031960089290920360031b82901b16169150565b9091929495936012548015908115612d15575b50610bb8576001600160a01b03871695861561062f576011546129ca906001600160a01b0316610e6f565b916001600160a01b03831615612d06576129ff925f92836040518096819582946302bc2ce760e51b84528c8c60048601612836565b03925af1908115611a41575f905f92612ce1575b5015612cc357506102488310612cb457612a7690612a3a612a348585612864565b906128fa565b612a47612a348686612875565b612a54612a348787612888565b90612a62612a34888861289b565b92612a70612a3489896128ae565b94613e22565b83612abc612ab6612ab0612a9c612a96612a9088886128c1565b90612916565b60601c90565b95612aaa612a3482886128d4565b956128e7565b90612956565b60c01c90565b926001600160a01b031603612ca5578203612ca557600f54936001600160401b0382169480861115612c865750612af8610ac160165460ff1690565b612c545760145480861115612bd65750612baa907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612b49612b3a6112df565b6001600160a01b039093168352565b6020820152836040820152612b616060820160019052565b60609060018060a01b038151166bffffffffffffffffffffffff60a01b6013541617601355602081015160145560408101516015550151151560ff801960165416911617601655565b612bb960ff1960175416601755565b604080516001600160401b039290921682526020820192909252a2565b929350509214612be5575b5050565b6015548114612be1577fa3f0eabe92ef7bacb81dba904189dc163924ee16379f429441a4117441609fff91612c22600160ff196017541617601755565b612c4f60155492604051938493846040919493926001600160401b03606083019616825260208201520152565b0390a1565b612bb9907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612b49612b3a6112df565b636762eb4960e01b5f526004526001600160401b03821660245260445ffd5b63319c9a2160e21b5f5260045ffd5b632ffd02b360e11b5f5260045ffd5b805115612cd257805190602001fd5b63e1ac453160e01b5f5260045ffd5b9050612cff91503d805f833e612cf781836112be565b8101906127a3565b905f612a13565b63baa3de5f60e01b5f5260045ffd5b905042115f61299f565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f3d4a1189ec311cad4499197cf097eefb10346f2894cdd7cbbcb2d2a48001c91860408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152612db160c0826112be565b51902090565b60405160208101915f5160206142365f395f51905f528352604082015230606082015246608082015260808152612db160a0826112be565b60405160208101915f5160206141d65f395f51905f528352604082015230606082015246608082015260808152612db160a0826112be565b60405160208101915f5160206141965f395f51905f528352604082015230606082015246608082015260808152612db160a0826112be565b60405160208101915f5160206142165f395f51905f528352604082015230606082015246608082015260808152612db160a0826112be565b906040519060208201928352604082015230606082015246608082015260808152612db160a0826112be565b805f52600c60205260405f209081546001600160401b038116906001600160401b03821615612f4d57604081901c60ff166115ac5760481c60ff16611598576001600160401b0381164210612f27575050805460ff60401b1916600160401b179055565b63c504f34d60e01b5f526004919091526001600160401b0316602452504260445260645ffd5b82633e426d5160e21b5f5260045260245ffd5b91908110156112515760051b0190565b356126cc816104f9565b91908110156112515760051b81013590601e19813603018212156104b65701908135916001600160401b0383116104b65760200182360381136104b6579190565b929192612fc782612022565b91612fd560405193846112be565b8294818452818301116104b6578281602093845f960137010152565b5f5490949192919061300b906001600160a01b0316610e6f565b331480613162575b8061315a575b613146576003549381830361311557848310801561313d575b6131245761305160045480975f5160206141d65f395f51905f52614027565b925f945f5b8781106130775750505050505050506130726112ee9160010190565b600455565b61308a613085828585612f60565b612f70565b966001600160a01b03908116908816111561311557866130c7610ac16130c08360018060a01b03165f52600260205260405f2090565b5460ff1690565b6130fa576130ed610ac16130e66130df858a8a612f7a565b3691612fbb565b89846140a8565b6130fa5750600101613056565b633b63649d60e11b5f526001600160a01b031660045260245ffd5b630da1c57360e41b5f5260045ffd5b6378f4355360e11b5f526004839052602485905260445ffd5b50848210613032565b50505050506112ee61307260045460010190565b508015613019565b508115613013565b5f54909491929190613184906001600160a01b0316610e6f565b331480613265575b8061325d575b6131465760035493818303613115578483108015613254575b613124576131ca60045480975f5160206142165f395f51905f52614027565b925f945f5b8781106131eb5750505050505050506130726112ee9160010190565b6131f9613085828585612f60565b966001600160a01b039081169088161115613115578661322f610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa57613247610ac16130e66130df858a8a612f7a565b6130fa57506001016131cf565b508482106131ab565b508015613192565b50811561318c565b5f54909491929190613287906001600160a01b0316610e6f565b33148061337b575b80613373575b613146576003549381830361311557848310801561336a575b613124576132e060045480977f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd614027565b925f945f5b8781106133015750505050505050506130726112ee9160010190565b61330f613085828585612f60565b966001600160a01b0390811690881611156131155786613345610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa5761335d610ac16130e66130df858a8a612f7a565b6130fa57506001016132e5565b508482106132ae565b508015613295565b50811561328f565b5f5490949192919061339d906001600160a01b0316610e6f565b331480613491575b80613489575b6131465760035493818303613115578483108015613480575b613124576133f660045480977fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a81305614027565b925f945f5b8781106134175750505050505050506130726112ee9160010190565b613425613085828585612f60565b966001600160a01b039081169088161115613115578661345b610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa57613473610ac16130e66130df858a8a612f7a565b6130fa57506001016133fb565b508482106133c4565b5080156133ab565b5081156133a5565b5f549094919291906134b3906001600160a01b0316610e6f565b331480613594575b8061358c575b6131465760035493818303613115578483108015613583575b613124576134f960045480975f5160206141965f395f51905f52614027565b925f945f5b87811061351a5750505050505050506130726112ee9160010190565b613528613085828585612f60565b966001600160a01b039081169088161115613115578661355e610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa57613576610ac16130e66130df858a8a612f7a565b6130fa57506001016134fe565b508482106134da565b5080156134c1565b5081156134bb565b5f549094919291906135b6906001600160a01b0316610e6f565b331480613697575b8061368f575b6131465760035493818303613115578483108015613686575b613124576135fc60045480975f5160206142365f395f51905f52614027565b925f945f5b87811061361d5750505050505050506130726112ee9160010190565b61362b613085828585612f60565b966001600160a01b0390811690881611156131155786613661610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa57613679610ac16130e66130df858a8a612f7a565b6130fa5750600101613601565b508482106135dd565b5080156135c4565b5081156135be565b5f549094919291906136b9906001600160a01b0316610e6f565b3314806137ad575b806137a5575b613146576003549381830361311557848310801561379c575b6131245761371260045480977f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d93614027565b925f945f5b8781106137335750505050505050506130726112ee9160010190565b613741613085828585612f60565b966001600160a01b0390811690881611156131155786613777610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa5761378f610ac16130e66130df858a8a612f7a565b6130fa5750600101613717565b508482106136e0565b5080156136c7565b5081156136c1565b5f549094919291906137cf906001600160a01b0316610e6f565b3314806138c3575b806138bb575b61314657600354938183036131155784831080156138b2575b6131245761382860045480977f5cdde72149ec19ce1ce0ecbedb38d9335aa5e1f8c43addf6e406b9c16e19f947614027565b925f945f5b8781106138495750505050505050506130726112ee9160010190565b613857613085828585612f60565b966001600160a01b039081169088161115613115578661388d610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa576138a5610ac16130e66130df858a8a612f7a565b6130fa575060010161382d565b508482106137f6565b5080156137dd565b5081156137d7565b5f549094919291906138e5906001600160a01b0316610e6f565b3314806139d9575b806139d1575b61314657600354938183036131155784831080156139c8575b6131245761393e60045480977f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f614027565b925f945f5b87811061395f5750505050505050506130726112ee9160010190565b61396d613085828585612f60565b966001600160a01b03908116908816111561311557866139a3610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa576139bb610ac16130e66130df858a8a612f7a565b6130fa5750600101613943565b5084821061390c565b5080156138f3565b5081156138ed565b5f549094919291906139fb906001600160a01b0316610e6f565b331480613aef575b80613ae7575b6131465760035493818303613115578483108015613ade575b61312457613a5460045480977f3f98d537f24f3ae50e4a30e12fbf3e5c35cf6f40f4ce125c82c1b88e3e7cf3df614027565b925f945f5b878110613a755750505050505050506130726112ee9160010190565b613a83613085828585612f60565b966001600160a01b0390811690881611156131155786613ab9610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa57613ad1610ac16130e66130df858a8a612f7a565b6130fa5750600101613a59565b50848210613a22565b508015613a09565b508115613a03565b5f54909491929190613b11906001600160a01b0316610e6f565b331480613c05575b80613bfd575b6131465760035493818303613115578483108015613bf4575b61312457613b6a60045480977fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e62614027565b925f945f5b878110613b8b5750505050505050506130726112ee9160010190565b613b99613085828585612f60565b966001600160a01b0390811690881611156131155786613bcf610ac16130c08360018060a01b03165f52600260205260405f2090565b6130fa57613be7610ac16130e66130df858a8a612f7a565b6130fa5750600101613b6f565b50848210613b38565b508015613b1f565b508115613b19565b613c24905f5160206141965f395f51905f52612e97565b90815f52600c60205260405f2060ff815460401c166115ac575f5160206141965f395f51905f525f52600b6020527f9b6d9405e2a268edd94615fe7f07c0d5d9dda2152c2e48f4e74379972af1c618548015613cab575f5160206141b65f395f51905f526121ad5f5160206141965f395f51905f52938460016107fb6107ef8a97426121d5565b6309913ab360e31b5f5260045260245ffd5b6001600160a01b0381165f8181526002602052604090205490919060ff1615613d4d576001600160a01b0381165f908152600560205260409020541561062f57600680546001600160a01b031916831790556001600160a01b03165f90815260056020526040902054907f2c8c895ef6e3978e12490ffd8cd3b92d4717b223562f851382f5daf74f587b515f80a3565b50633b63649d60e11b5f5260045260245ffd5b6007545f5b818110613d855763dfffe2f960e01b5f526004839052602484905260445ffd5b613d9161269f82611235565b8360ff8251161480613dba575b613dab5750600101613d65565b6040015160601c949350505050565b5084602082015114613d9e565b9060405160c081018181106001600160401b0382111761129e5760405260a06005829460ff81541615158452600181015460208501526002810154604085015260038101546060850152600481015460808501520154910152565b93929190613e40613e3b865f52600d60205260405f2090565b613dc7565b94613e4e610ac18751151590565b61401557506020850180511561062f5751808203613fd9575050604084015180151580613fcf575b613f91575050606083015180151580613f87575b613f49575050608082015180151580613f3f575b613f0157505060a0015180151580613ef7575b613eb9575050565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523360d81b608482015260a490fd5b5080821415613eb1565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264292a26a91960d91b608482015260a490fd5b5080821415613e9e565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523160d81b608482015260a490fd5b5080821415613e8a565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264052544d52360dc1b608482015260a490fd5b5080821415613e76565b60405163fef6c5cf60e01b81526004808201929092526024810192909252606060448301526064820152631354951160e21b608482015260a490fd5b6350dfe91360e01b5f5260045260245ffd5b916040519160208301937f4a3d56bf3b5708e5b633d12931f9923b37fde6895d6bd92957bbfa92cd00303985526040840152606083015260808201526080815261407260a0826112be565b51902061407d612d1f565b9060405190602082019261190160f01b84526022830152604282015260428152612db16062826112be565b90915f91906001600160a01b0382161561418d5760405192600484019460248501956044860192853b1561411157509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b9796505090508151806040146141685760411461412e5750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052614146565b505050505f9056feea4a6847c3f47fe0f98dcfe2e2c074e6cb42f6d74c367b33ae8516f537e775829cc91136b2c7668ecd202c7008f17e818e108b5448a7b7fd48bd2ca6b4aab51fb40912900bb80b6bc5e38d8489266de7299eedb40b03490214410117ef53ff9279883188dbf80e171cf94b3b44b6437b838158b1d3a5df6ccc709eeb7c5217296acb9fef2a4a1ecaa044f4c8979d9f48b0d5be623c860275be31c4cbd34c169cb2d153886d95f8f2d4836fb16c9fac869e1ce9cfc93d919a0f7dfe38439b9771a2646970667358221220e0e92d56df95f5865ed5237b33c5990684fc5c337264026f0c7f338483f1599a64736f6c634300081e0033"},"sourceId":"src/CredentialManager.sol","sourcemap":"858:47851:14:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;858:47851:14;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;858:47851:14;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12513:1;858:47851;-1:-1:-1;858:47851:14;;-1:-1:-1;;;;;;858:47851:14;17085:10;858:47851;;;;-1:-1:-1;;;;;858:47851:14;;17110:32;;17106:58;;-1:-1:-1;;;;;858:47851:14;;17178:37;;17174:63;;17247:68;858:47851;;-1:-1:-1;;;;;;858:47851:14;-1:-1:-1;;;;;858:47851:14;;;;;;;;;;;;;18522:6;;18518:59;;18591:27;;:57;;;;858:47851;18587:135;;-1:-1:-1;18752:5:14;;;;;;858:47851;;;;;19111:49;858:47851;;;;;;-1:-1:-1;858:47851:14;;;;;;19111:49;858:47851;;;;;;17393:32;858:47851;;;17393:32;858:47851;;;;;;;17435:42;858:47851;;;17435:42;858:47851;;12513:1;858:47851;-1:-1:-1;17635:3:14;858:47851;;17603:30;;;;;17684:22;;;;:::i;:::-;;858:47851;;;;;17788:32;;;17635:3;17784:67;;858:47851;;12513:1;858:47851;-1:-1:-1;858:47851:14;17866:19;858:47851;;;-1:-1:-1;858:47851:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18884:10;858:47851;;;;;;;;;;;;;;;;;;;;;;;;17923:50;12513:1;858:47851;;;;;;;;;17923:50;-1:-1:-1;;858:47851:14;;;;;;;;12513:1;858:47851;;17588:13;;858:47851;;;;-1:-1:-1;858:47851:14;17247:68;858:47851;;;-1:-1:-1;858:47851:14;17784:67;17829:22;;;-1:-1:-1;17829:22:14;858:47851;-1:-1:-1;17829:22:14;17788:32;17800:6;858:47851;17800:6;;858:47851;17800:20;17788:32;;17603:30;18052:16;858:47851;;18092:8;858:47851;;18146:8;858:47851;;18202:6;858:47851;;;;9379:25;-1:-1:-1;858:47851:14;;;;;;;;;;;;18759:3;-1:-1:-1;;;;;18791:19:14;;;;:::i;:::-;858:47851;;18828:16;;;18824:42;;858:47851;-1:-1:-1;858:47851:14;18884:10;858:47851;;;;-1:-1:-1;858:47851:14;;;18880:53;;858:47851;-1:-1:-1;858:47851:14;18884:10;858:47851;;;-1:-1:-1;858:47851:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;858:47851:14;;;;;;;;;-1:-1:-1;;;;;;858:47851:14;;;;;;19019:17;;-1:-1:-1;19019:17:14;858:47851;18737:13;;858:47851;;;;-1:-1:-1;858:47851:14;;;;;-1:-1:-1;858:47851:14;;;;;-1:-1:-1;858:47851:14;;;;;-1:-1:-1;858:47851:14;18880:53;18907:26;;;-1:-1:-1;18907:26:14;;-1:-1:-1;18907:26:14;18824:42;17151:13;;;-1:-1:-1;18853:13:14;;-1:-1:-1;18853:13:14;18587:135;18537:40;;;;;-1:-1:-1;18671:40:14;;858:47851;;;;-1:-1:-1;18671:40:14;18591:57;18622:26;;;;18591:57;;18518:59;18537:40;;;;-1:-1:-1;18537:40:14;;858:47851;-1:-1:-1;858:47851:14;;;-1:-1:-1;18537:40:14;858:47851;;;;;;;;;;;;;;-1:-1:-1;;;;;858:47851:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;858:47851:14;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;858:47851:14;;;-1:-1:-1;;;;;858:47851:14;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;858:47851:14;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;858:47851:14;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o","userdoc":{"errors":{"CannotCancel()":[{"notice":"Thrown when attempting to cancel an operation that cannot be canceled (e.g., already executed)."}],"InsufficientSignatures(uint256,uint256)":[{"notice":"Thrown when the number of valid signatures provided is less than the required threshold."}],"InvalidDelay(uint256)":[{"notice":"Thrown when a timelock delay is set to 0 (invalid safety margin)."}],"InvalidEpoch(uint256,uint256)":[{"notice":"Thrown when the supplied epoch is invalid"}],"InvalidProfileConfig()":[{"notice":"Thrown when the used profile is configured incorrectly."}],"InvalidProfileId()":[{"notice":"Thrown when the used profile does not exist."}],"InvalidQuorum(uint256,uint256)":[{"notice":"Thrown when attempting to set a quorum threshold that is 0 or greater than the total operators."}],"InvalidQuoteLength()":[{"notice":"Thrown when a Quote length is invalid."}],"InvalidReportData()":[{"notice":"Thrown when a Quote ReportData does not match params."}],"InvalidVaultAddr()":[{"notice":"Thrown when a Vault address is empty (bytes32(0))."}],"InvalidVerifier()":[{"notice":"Thrown when a Quote verifier is invalid."}],"InvalidZkProof()":[{"notice":"Thrown when the ZK Proof attesting measurements is invalid."}],"MeasurementMismatch(bytes32,bytes32,string)":[{"notice":"Thrown when the measured TEE state does not match the expected state."}],"NoStrategy()":[{"notice":"Thrown when attempting to update vault admins on a chain that has no registered strategy."}],"NotOperator(address)":[{"notice":"Thrown when a signature belongs to an address that is not a registered operator."}],"ProfileInactive(uint256)":[{"notice":"Thrown when the used profile is not active."}],"SignersNotSortedOrUnique()":[{"notice":"Thrown when the provided signatures are not sorted by signer address or contain duplicates."}],"StrategyAlreadyExists()":[{"notice":"Thrown when attempting to register a strategy for a chain that already has one."}],"TimelockAlreadyCanceled(bytes32)":[{"notice":"Thrown when attempting to execute or cancel an operation that has already been canceled."}],"TimelockAlreadyExecuted(bytes32)":[{"notice":"Thrown when attempting to execute or schedule an operation that has already been executed."}],"TimelockNotReady(bytes32,uint256,uint256)":[{"notice":"Thrown when attempting to execute a timelock before the delay has elapsed."}],"TimelockUnknown(bytes32)":[{"notice":"Thrown when attempting to act on a timelock ID that does not exist or was never scheduled."}],"VaultNotFound(uint256,uint256)":[{"notice":"Thrown when a requested vault cannot be found for the specified chain."}],"ZeroAddress()":[{"notice":"Thrown when a critical configuration address (e.g., Risk Manager) is set to address(0)."}]},"events":{"AdminUpdateStrategyRegistered(uint256,uint256,address)":{"notice":"Emitted when a new cross-chain strategy is registered."},"AttestedKeyRegistered(address,bytes32)":{"notice":"Emitted when a new attested key for an operator is registered."},"DepositVaultAdministratorsUpdated(uint256,address[],uint256)":{"notice":"Emitted when the admin set of a remote vault is updated."},"DepositVaultAdministratorsUpdated(uint256,uint256,address[],uint256)":{"notice":"Emitted when a new cross-chain strategy is registered."},"LeaderUpdated(address,bytes32)":{"notice":"Emitted when the quorum leader is updated."},"MeasurementsUpdated(bytes32,bytes32)":{"notice":"Emitted when the measurements are updated."},"OperatorAdded(address)":{"notice":"Emitted when a new operator is added during initialization."},"QuorumThresholdUpdated(uint256,uint256)":{"notice":"Emitted when the signature threshold is updated."},"VaultAdded(uint256,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8))":{"notice":"Emitted when a new vault is added to the registry."}},"kind":"user","methods":{"addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":{"notice":"Registers a new deposit vault to the system."},"admin()":{"notice":"TEMP Admin path, to be revised later."},"adminUpdateStrategies(uint256,uint256)":{"notice":"Maps a RoutingID to the VMID to the Strategy Contract responsible for sending messages to it."},"appointLeader(address,address[],bytes[])":{"notice":"Manually appoints a leader. Used for bootstrapping or emergency recovery."},"cancelTimelock(bytes32,address[],bytes[])":{"notice":"Cancels a pending timelocked operation."},"constructor":{"notice":"Initializes the Credential Manager with the initial operator set and configuration."},"domainSeparator()":{"notice":"Returns the EIP-712 domain separator used for verifying governance signatures."},"epoch()":{"notice":"Tracks the logical era of the TEE state to prevent replay attacks."},"executeRegistryContract(address)":{"notice":"Executes a pending Registry Contract update if the timelock has expired."},"executeRiskManager(address)":{"notice":"Executes a pending Risk Manager update if the timelock has expired."},"executeUpdateAutomataVerifier(address)":{"notice":"Sxecudes a timelocked update for the Automata Verifier address."},"getCouncilConfig()":{"notice":"Returns the full Council configuration."},"getLeader()":{"notice":"Returns the current Leader's Operator Address and Attested Key."},"getVaults(uint16,uint16)":{"notice":"Returns a paginated list of registered vaults."},"governanceNonce()":{"notice":"A monotonically increasing nonce for governance actions."},"initiateRestart()":{"notice":"Step 1: Initiates the gathering window if the system is down."},"isOperator(address)":{"notice":"Lookup to check if an address is an operator."},"latestCheckpointHash()":{"notice":"The hash of the system state (inventory) associated with the current epoch."},"leader()":{"notice":"The current active leader (Operator Address)."},"measurementProfiles(uint256)":{"notice":"The current \"Gold Image\" measurements required for valid Quotes. Matches based on profile."},"operatorToAttestedKey(address)":{"notice":"Maps Operator (EOA) -> Attested Key (TEE Address)."},"operators(uint256)":{"notice":"The list of authorized Clearing Engine operator addresses (EOAs)."},"quorumThreshold()":{"notice":"The minimum number of signatures required to execute a governance action."},"registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":{"notice":"Registers a strategy contract to handle updates for a specific chain."},"registerAttestedKey(bytes32)":{"notice":"Allows an operator to register their TEE's attested key."},"registryContract()":{"notice":"The address of the global Registry Contract used for asset/settler configurations."},"resolveRestart()":{"notice":"Step 3: Finalizes the restart after the window closes."},"riskManager()":{"notice":"The address of the Risk Manager (or multisig) authorized to adjust risk parameters."},"scheduleManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32),address[],bytes[])":{"notice":"Governance proposes adding or updating a measurement profile (e.g., for Phala or GCP)."},"scheduleRegistryContract(address,address[],bytes[])":{"notice":"Schedules a timelocked update for the Registry Contract address."},"scheduleRiskManager(address,address[],bytes[])":{"notice":"Schedules a timelocked update for the Risk Manager address."},"scheduleUpdateAutomataVerifier(address,address[],bytes[])":{"notice":"Schedules a timelocked update for the Automata Verifier."},"setDepositVaultAdministrators(uint256,uint256,address[],uint256,address[],bytes[])":{"notice":"Updates the administrators or withdrawal quorum for a vault on a remote chain."},"submitRestartProof(uint256,bytes,bytes,address,bytes32)":{"notice":"Restarts the system using a Trustless ZK Proof (Automata / SP1). The contract stores the \"Best\" candidate."},"timelockDelayFor(bytes32)":{"notice":"Configuration mapping for how long specific operations must be delayed."},"timelockOps(bytes32)":{"notice":"Stores the status of individual scheduled operations by their hash ID."},"updateQuorumThreshold(uint256,address[],bytes[])":{"notice":"Updates the number of signatures required for valid governance actions."},"vaults(uint256)":{"notice":"The registry of all authorized Deposit Vaults."},"withdraw(address,address[],bytes[])":{"notice":"Withdraw funds held by this contract."}},"notice":"The centralized Root of Trust for the TEE Clearing Engine.","version":1}},"DepositVault":{"abi":[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_credentialManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EmptyOrders","type":"error"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAdministrators","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAmountFromExecutor","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"given","type":"uint256"}],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"MissedQuorum","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCredentialManager","type":"error"},{"inputs":[],"name":"NotExecutor","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroWithdrawalQuorum","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"numAdminsAfter","type":"uint256"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[],"name":"AdministratorSetReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldCredentialManager","type":"address"},{"indexed":false,"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"CredentialManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"account","type":"uint64"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"account","type":"uint64"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"Settled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"WithdrawalQuorumChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"account","type":"uint64"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"},{"internalType":"address","name":"executor","type":"address"}],"name":"addSettlerExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"administrators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedSettlers","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManagerChangeDelayBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"depositCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct DepositVault.Settlement","name":"order","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"executeAtomicSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getApprovedSettlers","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAdministrator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSignatureUse","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingSettlements","outputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct DepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"address","name":"target","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct DepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct DepositVault.SignedSettlement[]","name":"orders","type":"tuple[]"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"name":"pullBatchSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"}],"name":"pushBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"removeSettler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"setCredentialManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setDepositorStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"settlementCaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"settlementCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct DepositVault.Withdrawal","name":"withdrawal","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes32","name":"epochHash","type":"bytes32"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"withdrawalCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"DepositVault","deploymentBytecode":{"bytecode":"0x60803460ad57601f611d9c38819003918201601f19168301916001600160401b0383118484101760b157808492604094855283398101031260ad57604b602060458360c5565b920160c5565b6138406006556001600160a01b03909116908115609e576001600160a01b0316908115609e5760018060a01b03195f5416175f5560018060a01b03196001541617600155604051611cc390816100d98239f35b63d92e233d60e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820360ad5756fe60806040526004361015610011575f80fd5b5f3560e01c80630a2eb301146117d75780630b9b17a61461162357806313af4035146115d85780631f7b44831461159357806321e6652c146114e6578063224b93e11461148a57806323c5673114611228578063267f84cc14610f845780632b0c1a1e14610f5c5780633684f4ac14610eb05780633a87fe4d14610e7857806341774bfe14610d255780634bf0d33114610ce85780635fe53eca146109c75780637438b9371461099657806375538ec61461083a5780638da5cb5b146108135780638dff2305146107ce57806392698ac61461071857806393ea8a7d146106fb578063987b71ce146106b657806398af97721461067e578063a33c9d0014610661578063ad9fa8bc1461053c578063d89d1510146104fa578063d8c8785d146104dd578063e4402369146101b35763f585b64f1461014d575f80fd5b346101a05760603660031901126101a057610166611804565b61016e61181a565b5f549091906001600160a01b031633036101a4576001600160a01b038216156101a05761019e9160443591611bc6565b005b5f80fd5b6330cd747160e01b5f5260045ffd5b346101a05760a03660031901126101a0576004356001600160401b0381116101a0576101e390369060040161185a565b90602435604435916001600160401b0383168093036101a0576064356001600160a01b03811691908281036101a057608435908142116104ce57845f52600960205260405f20865f5260205260405f20546101a057610241336119c8565b156104bf57845f52600a60205260405f20865f5260205260405f2054936002549488156104b0575f5b898110610298578989895f52600a60205260405f20905f5260205261029460405f20918254611a11565b9055005b6102a3818b88611b31565b9160808301359080820361049b57508291908989838e8e8b866bffffffffffffffffffffffff196102d38b611a4a565b60601b169260208b013597889760408d019d8e6001600160601b0319906102f990611a4a565b60601b1690606001359961030e978b93611a5e565b8051906020012091610320918d611b31565b60a0810161032d91611aeb565b9061033792611bb1565b6001830180841161048757958c5f5260096020528d60405f20905f5260205260405f209360405192610368846118e4565b60a0883603126101a05761039860405193610382856118ff565b61038b8a611830565b8552866020860152611830565b604084015260608301526080820152815260208101928784528054600160401b811015610473576103ce916001820181556118b7565b939093610460579051805184546001600160a01b03199081166001600160a01b03928316178655602083015160018781019190915560408401516002880180548416918516919091179055606084015160038801556080939093015160048701559251600590950180549093169416939093179055909261045a9190879061045590611a4a565b611bc6565b0161026a565b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6306427aeb60e01b5f5260045260245260445ffd5b63164bb4b560e11b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b630407b05b60e31b5f5260045ffd5b346101a0575f3660031901126101a0576020600f54604051908152f35b346101a05760203660031901126101a057600435600d548110156101a057610523602091611983565b905460405160039290921b1c6001600160a01b03168152f35b346101a05760403660031901126101a05760043561055861181a565b5f549091906001600160a01b031633036101a457805f52600760205260ff60405f2054161561060a575b5f52600360205260405f2090600182019160018060a01b0382165f528260205260ff60405f205416156105b157005b8054600160401b811015610473576105ce916001820181556119b3565b81546001600160a01b0393841660039290921b82811b94901b19169290921790555f90815260209190915260409020805460ff19166001179055005b600454600160401b8110156104735761064361062d82600185940160045561199b565b819391549060031b91821b915f19901b19161790565b9055805f52600760205260405f20600160ff19825416179055610582565b346101a0575f3660031901126101a0576020600654604051908152f35b346101a05760203660031901126101a0576001600160a01b0361069f611804565b165f526008602052602060405f2054604051908152f35b346101a05760403660031901126101a0576106cf611844565b6004355f52600b6020526001600160401b0360405f2091165f52602052602060405f2054604051908152f35b346101a0575f3660031901126101a0576020600554604051908152f35b346101a0575f3660031901126101a0576040518060206004549283815201809260045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b905f5b8181106107b8575050508161077691038261191a565b604051918291602083019060208452518091526040830191905f5b81811061079f575050500390f35b8251845285945060209384019390920191600101610791565b8254845260209093019260019283019201610760565b346101a05760403660031901126101a0576107e7611844565b6004355f52600a6020526001600160401b0360405f2091165f52602052602060405f2054604051908152f35b346101a0575f3660031901126101a0575f546040516001600160a01b039091168152602090f35b346101a05760803660031901126101a057600435610856611844565b906044356001600160a01b03811681036101a05760643590335f52600e60205260ff60405f205416156109645781156109395761089582303384611b53565b825f52600b60205260405f206001600160401b0385165f52602052827fe2a2bdf36e2c262c44c94cde71107e3d083338d05880f1d98e34aef60a57732361090760405f2054946040519182916001600160401b038a16968360209093929193604081019460018060a01b031681520152565b0390a45f52600b6020526001600160401b0360405f2091165f5260205260405f20805490600182018092116104875755005b606460405162461bcd60e51b81526020600482015260046024820152635a65726f60e01b6044820152fd5b60405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b6044820152606490fd5b346101a05760203660031901126101a0575f546001600160a01b031633036101a4576002546101a057600435600255005b346101a057366003190161012081126101a0576060136101a057606435608435906001600160401b0382168092036101a05760a435906001600160a01b03821682036101a05760c43592610104356001600160401b0381116101a057610a3190369060040161185a565b929093600554958042116104ce57868510610cd157825f52600c60205260405f20845f5260205260405f20549660443597808903610cba5750610a7386611ad4565b96610a81604051988961191a565b868852601f19610a9088611ad4565b013660208a01375f906002546001600160601b0319610aad611a1e565b60601b16602435956040519160208301937f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba8552604084015260608301528660808301528860a08301528c60c083015260e082015260e4356101008201526001600160601b03198760601b166101208201526101208152610b306101408261191a565b519020905f5b89811015610caa57610b57610b508260051b840184611aeb565b9085611c17565b6001600160a01b038116908115610c9b57610b71906119c8565b15610c9b5760015f828e5b888310610c6b575b505050610c4b575b50848414610b9c57600101610b36565b50505091939550919395505b818110610c36575050825f52600c60205260405f20845f5260205260405f2080549060018201809211610487577f014b9c5afdefb51fefc3d39536fa7cd9723837d5a8b663cd7fd19ebd127987c793610c0a9284925543600f55610455611a1e565b610c12611a1e565b604080516001600160a01b039092168252602082019290925290819081015b0390a4005b6326a15da760e01b5f5260045260245260445ffd5b610c58858d969396611b1d565b525f19811461048757600101928c610b8c565b6001600160a01b0390610c7f908490611b1d565b511614610c9057600101828e610b7c565b50505f8e828e610b84565b638baa579f60e01b5f5260045ffd5b5050509193955091939550610ba8565b88906306427aeb60e01b5f5260045260245260445ffd5b86856326a15da760e01b5f5260045260245260445ffd5b346101a05760203660031901126101a0576001600160a01b03610d09611804565b165f52600e602052602060ff60405f2054166040519015158152f35b346101a05760203660031901126101a0575f54600435906001600160a01b031633036101a4576004545f828152600760205260408120805460ff191690555b818110610def575b50505f52600360205260405f205f60018201905b8254811015610dc35780610d96600192856119b3565b838060a01b0391549060031b1c16828060a01b03165f528260205260405f2060ff19815416905501610d80565b82545f84558381610dd057005b5f5260205f20908101905b818110610de457005b5f8155600101610ddb565b82610df98261199b565b90549060031b1c14610e0d57600101610d64565b905f1981019081116104875761062d610e28610e359261199b565b90549060031b1c9261199b565b90556004548015610e64575f1901610e4c8161199b565b8154905f199060031b1b191690556004558180610d6c565b634e487b7160e01b5f52603160045260245ffd5b346101a05760203660031901126101a0576004356004548110156101a057610ea160209161199b565b90549060031b1c604051908152f35b346101a05760603660031901126101a057610ec9611844565b604435906004355f5260096020526001600160401b0360405f2091165f5260205260405f2080548210156101a05760c091610f03916118b7565b50610f0d8161193b565b6005909101546040805183516001600160a01b039081168252602080860151908301528285015181169282019290925260608085015190820152608093840151938101939093521660a0820152f35b346101a0575f3660031901126101a0576001546040516001600160a01b039091168152602090f35b346101a057366003190161014081126101a05760a0136101a05760a43560c4356001600160401b0381168091036101a05760e43591610104356001600160401b0381116101a057610fd990369060040161188a565b93610124356001600160401b0381116101a057610ffa90369060040161188a565b9590928242116104ce575f85815260036020908152604080832033845260010190915290205460ff161561121957845f52600a60205260405f20865f5260205260405f20549660843597808903610cba57506110a190600254956110956001600160601b0319611068611a1e565b60601b16968b8b8b6024359b6001600160601b0319611085611a34565b60601b168d6064359d8e93611a5e565b60208151910120611bb1565b43600f55845f52600a60205260405f20865f5260205260405f2090815460018101809111610487576020925560846110d7611a1e565b846040519586948593631f8eac2760e11b855260018060a01b0316600485015289602485015260606044850152816064850152848401375f838284010152601f801991011681010301815f335af190811561120e575f916111dc575b508181106111c757906111737ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c939261116a611a34565b30903390611b53565b6111808233610455611a1e565b610c3161118b611a1e565b91611194611a34565b604080516001600160a01b0395861681526020810196909652931692840192909252606083019190915281906080820190565b63d44c3d9d60e01b5f5260045260245260445ffd5b90506020813d602011611206575b816111f76020938361191a565b810103126101a0575186611133565b3d91506111ea565b6040513d5f823e3d90fd5b6361968ebb60e11b5f5260045ffd5b346101a05760403660031901126101a0576004356001600160401b0381116101a05761125890369060040161185a565b600154909190602435906001600160a01b0316330361147b576001811061146c57808310611456575f5b838110156112be576001600160a01b036112a1600583901b8501611a4a565b16156112af57600101611282565b63d92e233d60e01b5f5260045ffd5b5091906001600160401b03821161047357600160401b821161047357600d5482600d55808310611412575b50600d5f525f5b8281106113d757837f74e3f7a222a002bb0346144c8442604f86b79a5319301c8b2393dbe33ba3f1ec5f80a1600d545f5b81811061136c5782600554908060055580820361133a57005b7f71847092dda23e5394806b377214ca90449cdd1413463150e7f577ccefea54d89160409182519182526020820152a1005b61137581611983565b905460018301929160031b1c6001600160a01b031682821161048757604080516001600160a01b0392909216825260208201939093526001927f723c2b747529ca7f5eb53a74808f4a8b9bf264f0fc450fd904900151da74548a91a101611321565b60019060206113e584611a4a565b930192817fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50155016112f0565b600d5f527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb59081019083015b81811061144b57506112e9565b5f815560010161143e565b82633e1a6b7d60e21b5f5260045260245260445ffd5b6345f8facb60e11b5f5260045ffd5b6326b672e560e01b5f5260045ffd5b346101a05760403660031901126101a0576114a3611804565b602435908115158092036101a0575f546001600160a01b031633036101a45760018060a01b03165f52600e60205260405f209060ff801983541691161790555f80f35b346101a05760203660031901126101a0576114ff611804565b5f546001600160a01b031633036101a4576001600160a01b031680156112af5761152e600f5460065490611a11565b4310156115845760407feb63fb900cbf0301de00619a02ae3f5996820dabc03207c0e0d97046e521d7b99160015490806001600160601b0360a01b83161760015582519160018060a01b031682526020820152a1005b636fed7d8560e01b5f5260045ffd5b346101a05760403660031901126101a0576115ac611844565b6004355f52600c6020526001600160401b0360405f2091165f52602052602060405f2054604051908152f35b346101a05760203660031901126101a0576115f1611804565b5f54906001600160a01b03821633036101a4576001600160a01b03169081156112af576001600160a01b031916175f55005b346101a05760403660031901126101a05760043561163f611844565b611648336119c8565b156104bf576001600160401b0316905f5b815f52600960205260405f20835f5260205260405f205463ffffffff821610156117685763ffffffff90825f52600960205260405f20845f526020526116a28160405f206118b7565b506116eb604051916116b3836118e4565b6116bc8161193b565b8084526005909101546001600160a01b0390811660208501819052604083015160609093015192309216611b53565b51608080820151825160208085015160408087015160609788015182516001600160a01b0396871681529485019390935293909316928201929092529384015291869186917ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c9190a41663ffffffff811461048757600101611659565b505f52600960205260405f20905f5260205260405f208054905f81558161178b57005b81600602916006830403610487575f5260205f20908101905b8181106117ad57005b805f600692555f60018201555f60028201555f60038201555f60048201555f6005820155016117a4565b346101a05760203660031901126101a05760206117fa6117f5611804565b6119c8565b6040519015158152f35b600435906001600160a01b03821682036101a057565b602435906001600160a01b03821682036101a057565b35906001600160a01b03821682036101a057565b602435906001600160401b03821682036101a057565b9181601f840112156101a0578235916001600160401b0383116101a0576020808501948460051b0101116101a057565b9181601f840112156101a0578235916001600160401b0383116101a057602083818601950101116101a057565b80548210156118d0575f52600660205f20910201905f90565b634e487b7160e01b5f52603260045260245ffd5b604081019081106001600160401b0382111761047357604052565b60a081019081106001600160401b0382111761047357604052565b90601f801991011681019081106001600160401b0382111761047357604052565b90604051611948816118ff565b82546001600160a01b039081168252600184015460208301526002840154166040820152600383015460608201526004909201546080830152565b600d548110156118d057600d5f5260205f2001905f90565b6004548110156118d05760045f5260205f2001905f90565b80548210156118d0575f5260205f2001905f90565b600d54905f5b8281106119dc575050505f90565b6119e581611983565b905460039190911b1c6001600160a01b0390811690831614611a09576001016119ce565b505050600190565b9190820180921161048757565b6004356001600160a01b03811681036101a05790565b6044356001600160a01b03811681036101a05790565b356001600160a01b03811681036101a05790565b989796959493929190604051997fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208c015260408b015260608a0152608089015260a088015260c087015260e08601526101008501526101208401526101408301526101408252611ad26101608361191a565b565b6001600160401b0381116104735760051b60200190565b903590601e19813603018212156101a057018035906001600160401b0382116101a0576020019181360383136101a057565b80518210156118d05760209160051b010190565b91908110156118d05760051b8101359060be19813603018212156101a0570190565b916040519360605260405260601b602c526323b872dd60601b600c5260205f6064601c82855af1908160015f51141615611b93575b50505f606052604052565b3b153d171015611ba4575f80611b88565b637939f4245f526004601cfd5b916117f591611bbf93611c17565b15610c9b57565b919060145260345263a9059cbb60601b5f5260205f6044601082855af1908160015f51141615611bf9575b50505f603452565b3b153d171015611c0a575f80611bf1565b6390b8ec185f526004601cfd5b604080515f95949093918114611c6257604114611c3357505050565b604080929395508101355f1a60205281375b5f526020604060805f60015afa505f6060523d6060185191604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b0316606052909250611c4556fea2646970667358221220759248af50aaddb85c7923e0a741f511253ffd21881e408db3f18ad98ccafffb64736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{"addSettlerExecutor(bytes32,address)":{"details":"Reverts with `NotOwner`; Only the admin can set the settler executor.","params":{"executor":": The settler's assigned executor address.","settler":": The settler's tplus account key."}},"constructor":{"details":"Reverts with `ZeroAddress()` if `_owner` is null.Reverts with `ZeroAddress()` if `_credentialManager` is null.","params":{"_credentialManager":"The address of the credential manager.","_owner":"The address to set as the owner."}},"deposit(bytes32,uint64,address,uint256)":{"details":"Reverts if the amount is 0.","params":{"account":": The account index of the specified user that will be credited with the deposit","amount":": The amount of the token to deposit.","tokenAddress":": The address of the token to deposit.","user":": The user whose account will be credited with the deposit."}},"executeAtomicSettlement((address,uint256,address,uint256,uint256),bytes32,uint64,uint256,bytes,bytes)":{"details":"Reverts with `Expired` if the block timestamp is greater than `validUntil`.Reverts with `NotExecutor`; Only the executor can settle.Reverts with `InvalidNonce` if the nonce has already been used.Reverts with `SignatureError` if the signer is not an admin.Reverts with `InsufficientAmountFromExecutor` if the `order.amountIn` is less than what the executor reports","params":{"account":": The account index of the t+ user that will be used for settlement","data":": The data to execute as part of settlement callback.","order":": The settlement order.","signature":": The signature from the t+ clearing engine.","user":": The t+ user who is executing the settlement.","validUntil":": How long until the signature expires."}},"getApprovedSettlers()":{"returns":{"_0":"An array of addresses (as bytes32) that are currently approved settlers."}},"pullBatchSettlement(((address,uint256,address,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":{"details":"Reverts with `Expired` if the block timestamp is greater than `validUntil`.Reverts if a batch settlement has already started.Reverts with `NotAdmin`; Only an admin can execute the settlement.Reverts with `InvalidNonce` if the nonce has already been used.Reverts with `SignatureError` if the signer is not an admin.","params":{"orders":": The settlement orders.","target":": The target address to send the token to, pull tokens from, and execute callback on.","user":": The t+ user who is executing the settlement.","validUntil":": The timestamp when the settlement signature expires."}},"pushBatchSettlements(bytes32,uint64)":{"details":"Reverts with `NotAdmin`; Only an admin can execute the settlement.","params":{"account":": The account of the t+ user to execute settlement against","user":": The t+ user who is executing the settlement."}},"removeSettler(bytes32)":{"details":"Reverts with `NotOwner`; Only the admin can remove a settler.","params":{"settler":": The settler's tplus account key."}},"setDomainSeparator(bytes32)":{"details":"Reverts with `NotOwner`; Only the admin can set the domain separator.","params":{"domainSeparator":": The value to set."}},"setOwner(address)":{"details":"Reverts with `NotOwner`; Only the owner can set a new owner."},"withdraw((address,uint256,uint256),bytes32,uint64,address,uint256,bytes32,bytes[])":{"details":"Reverts with `Expired` if the block timestamp is greater than `validUntil`.Reverts with `InvalidNonce` if the nonce has already been used.Reverts with `SignatureError` if the signer is not an admin.","params":{"account":": The account of the t+ user that will be debited by the withdrawal.","signatures":": t+ clearing engine signatures.","target":": The target address to send the token to.","user":": The user whose account will be debited by the withdrawal.","validUntil":": The timestamp when the withdrawal signature expires.","withdrawal":": The withdrawal token and amount."}}},"stateVariables":{"credentialManager":{"details":"In production, this will be an upgradeable proxy"},"owner":{"details":"Should be set to the DStack container shared secret address."},"settlementCaps":{"details":"Currently unused \u2014 implementation pending design finalization."}},"version":1},"methodIdentifiers":{"addSettlerExecutor(bytes32,address)":"0xad9fa8bc","administrators(uint256)":"0xd89d1510","approvedSettlers(uint256)":"0x3a87fe4d","canDeposit(address)":"0x4bf0d331","credentialManager()":"0x2b0c1a1e","credentialManagerChangeDelayBlocks()":"0xa33c9d00","deposit(bytes32,uint64,address,uint256)":"0x75538ec6","depositCounts(bytes32,uint64)":"0x987b71ce","executeAtomicSettlement((address,uint256,address,uint256,uint256),bytes32,uint64,uint256,bytes,bytes)":"0x267f84cc","getApprovedSettlers()":"0x92698ac6","isAdministrator(address)":"0x0a2eb301","lastSignatureUse()":"0xd8c8785d","owner()":"0x8da5cb5b","ownerWithdrawToken(address,address,uint256)":"0xf585b64f","pendingSettlements(bytes32,uint64,uint256)":"0x3684f4ac","pullBatchSettlement(((address,uint256,address,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":"0xe4402369","pushBatchSettlements(bytes32,uint64)":"0x0b9b17a6","removeSettler(bytes32)":"0x41774bfe","setAdministrators(address[],uint256)":"0x23c56731","setCredentialManager(address)":"0x21e6652c","setDepositorStatus(address,bool)":"0x224b93e1","setDomainSeparator(bytes32)":"0x7438b937","setOwner(address)":"0x13af4035","settlementCaps(address)":"0x98af9772","settlementCounts(bytes32,uint64)":"0x8dff2305","withdraw((address,uint256,uint256),bytes32,uint64,address,uint256,bytes32,bytes[])":"0x5fe53eca","withdrawalCounts(bytes32,uint64)":"0x1f7b4483","withdrawalQuorum()":"0x93ea8a7d"},"runtimeBytecode":{"bytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c80630a2eb301146117d75780630b9b17a61461162357806313af4035146115d85780631f7b44831461159357806321e6652c146114e6578063224b93e11461148a57806323c5673114611228578063267f84cc14610f845780632b0c1a1e14610f5c5780633684f4ac14610eb05780633a87fe4d14610e7857806341774bfe14610d255780634bf0d33114610ce85780635fe53eca146109c75780637438b9371461099657806375538ec61461083a5780638da5cb5b146108135780638dff2305146107ce57806392698ac61461071857806393ea8a7d146106fb578063987b71ce146106b657806398af97721461067e578063a33c9d0014610661578063ad9fa8bc1461053c578063d89d1510146104fa578063d8c8785d146104dd578063e4402369146101b35763f585b64f1461014d575f80fd5b346101a05760603660031901126101a057610166611804565b61016e61181a565b5f549091906001600160a01b031633036101a4576001600160a01b038216156101a05761019e9160443591611bc6565b005b5f80fd5b6330cd747160e01b5f5260045ffd5b346101a05760a03660031901126101a0576004356001600160401b0381116101a0576101e390369060040161185a565b90602435604435916001600160401b0383168093036101a0576064356001600160a01b03811691908281036101a057608435908142116104ce57845f52600960205260405f20865f5260205260405f20546101a057610241336119c8565b156104bf57845f52600a60205260405f20865f5260205260405f2054936002549488156104b0575f5b898110610298578989895f52600a60205260405f20905f5260205261029460405f20918254611a11565b9055005b6102a3818b88611b31565b9160808301359080820361049b57508291908989838e8e8b866bffffffffffffffffffffffff196102d38b611a4a565b60601b169260208b013597889760408d019d8e6001600160601b0319906102f990611a4a565b60601b1690606001359961030e978b93611a5e565b8051906020012091610320918d611b31565b60a0810161032d91611aeb565b9061033792611bb1565b6001830180841161048757958c5f5260096020528d60405f20905f5260205260405f209360405192610368846118e4565b60a0883603126101a05761039860405193610382856118ff565b61038b8a611830565b8552866020860152611830565b604084015260608301526080820152815260208101928784528054600160401b811015610473576103ce916001820181556118b7565b939093610460579051805184546001600160a01b03199081166001600160a01b03928316178655602083015160018781019190915560408401516002880180548416918516919091179055606084015160038801556080939093015160048701559251600590950180549093169416939093179055909261045a9190879061045590611a4a565b611bc6565b0161026a565b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6306427aeb60e01b5f5260045260245260445ffd5b63164bb4b560e11b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b630407b05b60e31b5f5260045ffd5b346101a0575f3660031901126101a0576020600f54604051908152f35b346101a05760203660031901126101a057600435600d548110156101a057610523602091611983565b905460405160039290921b1c6001600160a01b03168152f35b346101a05760403660031901126101a05760043561055861181a565b5f549091906001600160a01b031633036101a457805f52600760205260ff60405f2054161561060a575b5f52600360205260405f2090600182019160018060a01b0382165f528260205260ff60405f205416156105b157005b8054600160401b811015610473576105ce916001820181556119b3565b81546001600160a01b0393841660039290921b82811b94901b19169290921790555f90815260209190915260409020805460ff19166001179055005b600454600160401b8110156104735761064361062d82600185940160045561199b565b819391549060031b91821b915f19901b19161790565b9055805f52600760205260405f20600160ff19825416179055610582565b346101a0575f3660031901126101a0576020600654604051908152f35b346101a05760203660031901126101a0576001600160a01b0361069f611804565b165f526008602052602060405f2054604051908152f35b346101a05760403660031901126101a0576106cf611844565b6004355f52600b6020526001600160401b0360405f2091165f52602052602060405f2054604051908152f35b346101a0575f3660031901126101a0576020600554604051908152f35b346101a0575f3660031901126101a0576040518060206004549283815201809260045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b905f5b8181106107b8575050508161077691038261191a565b604051918291602083019060208452518091526040830191905f5b81811061079f575050500390f35b8251845285945060209384019390920191600101610791565b8254845260209093019260019283019201610760565b346101a05760403660031901126101a0576107e7611844565b6004355f52600a6020526001600160401b0360405f2091165f52602052602060405f2054604051908152f35b346101a0575f3660031901126101a0575f546040516001600160a01b039091168152602090f35b346101a05760803660031901126101a057600435610856611844565b906044356001600160a01b03811681036101a05760643590335f52600e60205260ff60405f205416156109645781156109395761089582303384611b53565b825f52600b60205260405f206001600160401b0385165f52602052827fe2a2bdf36e2c262c44c94cde71107e3d083338d05880f1d98e34aef60a57732361090760405f2054946040519182916001600160401b038a16968360209093929193604081019460018060a01b031681520152565b0390a45f52600b6020526001600160401b0360405f2091165f5260205260405f20805490600182018092116104875755005b606460405162461bcd60e51b81526020600482015260046024820152635a65726f60e01b6044820152fd5b60405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b6044820152606490fd5b346101a05760203660031901126101a0575f546001600160a01b031633036101a4576002546101a057600435600255005b346101a057366003190161012081126101a0576060136101a057606435608435906001600160401b0382168092036101a05760a435906001600160a01b03821682036101a05760c43592610104356001600160401b0381116101a057610a3190369060040161185a565b929093600554958042116104ce57868510610cd157825f52600c60205260405f20845f5260205260405f20549660443597808903610cba5750610a7386611ad4565b96610a81604051988961191a565b868852601f19610a9088611ad4565b013660208a01375f906002546001600160601b0319610aad611a1e565b60601b16602435956040519160208301937f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba8552604084015260608301528660808301528860a08301528c60c083015260e082015260e4356101008201526001600160601b03198760601b166101208201526101208152610b306101408261191a565b519020905f5b89811015610caa57610b57610b508260051b840184611aeb565b9085611c17565b6001600160a01b038116908115610c9b57610b71906119c8565b15610c9b5760015f828e5b888310610c6b575b505050610c4b575b50848414610b9c57600101610b36565b50505091939550919395505b818110610c36575050825f52600c60205260405f20845f5260205260405f2080549060018201809211610487577f014b9c5afdefb51fefc3d39536fa7cd9723837d5a8b663cd7fd19ebd127987c793610c0a9284925543600f55610455611a1e565b610c12611a1e565b604080516001600160a01b039092168252602082019290925290819081015b0390a4005b6326a15da760e01b5f5260045260245260445ffd5b610c58858d969396611b1d565b525f19811461048757600101928c610b8c565b6001600160a01b0390610c7f908490611b1d565b511614610c9057600101828e610b7c565b50505f8e828e610b84565b638baa579f60e01b5f5260045ffd5b5050509193955091939550610ba8565b88906306427aeb60e01b5f5260045260245260445ffd5b86856326a15da760e01b5f5260045260245260445ffd5b346101a05760203660031901126101a0576001600160a01b03610d09611804565b165f52600e602052602060ff60405f2054166040519015158152f35b346101a05760203660031901126101a0575f54600435906001600160a01b031633036101a4576004545f828152600760205260408120805460ff191690555b818110610def575b50505f52600360205260405f205f60018201905b8254811015610dc35780610d96600192856119b3565b838060a01b0391549060031b1c16828060a01b03165f528260205260405f2060ff19815416905501610d80565b82545f84558381610dd057005b5f5260205f20908101905b818110610de457005b5f8155600101610ddb565b82610df98261199b565b90549060031b1c14610e0d57600101610d64565b905f1981019081116104875761062d610e28610e359261199b565b90549060031b1c9261199b565b90556004548015610e64575f1901610e4c8161199b565b8154905f199060031b1b191690556004558180610d6c565b634e487b7160e01b5f52603160045260245ffd5b346101a05760203660031901126101a0576004356004548110156101a057610ea160209161199b565b90549060031b1c604051908152f35b346101a05760603660031901126101a057610ec9611844565b604435906004355f5260096020526001600160401b0360405f2091165f5260205260405f2080548210156101a05760c091610f03916118b7565b50610f0d8161193b565b6005909101546040805183516001600160a01b039081168252602080860151908301528285015181169282019290925260608085015190820152608093840151938101939093521660a0820152f35b346101a0575f3660031901126101a0576001546040516001600160a01b039091168152602090f35b346101a057366003190161014081126101a05760a0136101a05760a43560c4356001600160401b0381168091036101a05760e43591610104356001600160401b0381116101a057610fd990369060040161188a565b93610124356001600160401b0381116101a057610ffa90369060040161188a565b9590928242116104ce575f85815260036020908152604080832033845260010190915290205460ff161561121957845f52600a60205260405f20865f5260205260405f20549660843597808903610cba57506110a190600254956110956001600160601b0319611068611a1e565b60601b16968b8b8b6024359b6001600160601b0319611085611a34565b60601b168d6064359d8e93611a5e565b60208151910120611bb1565b43600f55845f52600a60205260405f20865f5260205260405f2090815460018101809111610487576020925560846110d7611a1e565b846040519586948593631f8eac2760e11b855260018060a01b0316600485015289602485015260606044850152816064850152848401375f838284010152601f801991011681010301815f335af190811561120e575f916111dc575b508181106111c757906111737ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c939261116a611a34565b30903390611b53565b6111808233610455611a1e565b610c3161118b611a1e565b91611194611a34565b604080516001600160a01b0395861681526020810196909652931692840192909252606083019190915281906080820190565b63d44c3d9d60e01b5f5260045260245260445ffd5b90506020813d602011611206575b816111f76020938361191a565b810103126101a0575186611133565b3d91506111ea565b6040513d5f823e3d90fd5b6361968ebb60e11b5f5260045ffd5b346101a05760403660031901126101a0576004356001600160401b0381116101a05761125890369060040161185a565b600154909190602435906001600160a01b0316330361147b576001811061146c57808310611456575f5b838110156112be576001600160a01b036112a1600583901b8501611a4a565b16156112af57600101611282565b63d92e233d60e01b5f5260045ffd5b5091906001600160401b03821161047357600160401b821161047357600d5482600d55808310611412575b50600d5f525f5b8281106113d757837f74e3f7a222a002bb0346144c8442604f86b79a5319301c8b2393dbe33ba3f1ec5f80a1600d545f5b81811061136c5782600554908060055580820361133a57005b7f71847092dda23e5394806b377214ca90449cdd1413463150e7f577ccefea54d89160409182519182526020820152a1005b61137581611983565b905460018301929160031b1c6001600160a01b031682821161048757604080516001600160a01b0392909216825260208201939093526001927f723c2b747529ca7f5eb53a74808f4a8b9bf264f0fc450fd904900151da74548a91a101611321565b60019060206113e584611a4a565b930192817fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50155016112f0565b600d5f527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb59081019083015b81811061144b57506112e9565b5f815560010161143e565b82633e1a6b7d60e21b5f5260045260245260445ffd5b6345f8facb60e11b5f5260045ffd5b6326b672e560e01b5f5260045ffd5b346101a05760403660031901126101a0576114a3611804565b602435908115158092036101a0575f546001600160a01b031633036101a45760018060a01b03165f52600e60205260405f209060ff801983541691161790555f80f35b346101a05760203660031901126101a0576114ff611804565b5f546001600160a01b031633036101a4576001600160a01b031680156112af5761152e600f5460065490611a11565b4310156115845760407feb63fb900cbf0301de00619a02ae3f5996820dabc03207c0e0d97046e521d7b99160015490806001600160601b0360a01b83161760015582519160018060a01b031682526020820152a1005b636fed7d8560e01b5f5260045ffd5b346101a05760403660031901126101a0576115ac611844565b6004355f52600c6020526001600160401b0360405f2091165f52602052602060405f2054604051908152f35b346101a05760203660031901126101a0576115f1611804565b5f54906001600160a01b03821633036101a4576001600160a01b03169081156112af576001600160a01b031916175f55005b346101a05760403660031901126101a05760043561163f611844565b611648336119c8565b156104bf576001600160401b0316905f5b815f52600960205260405f20835f5260205260405f205463ffffffff821610156117685763ffffffff90825f52600960205260405f20845f526020526116a28160405f206118b7565b506116eb604051916116b3836118e4565b6116bc8161193b565b8084526005909101546001600160a01b0390811660208501819052604083015160609093015192309216611b53565b51608080820151825160208085015160408087015160609788015182516001600160a01b0396871681529485019390935293909316928201929092529384015291869186917ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c9190a41663ffffffff811461048757600101611659565b505f52600960205260405f20905f5260205260405f208054905f81558161178b57005b81600602916006830403610487575f5260205f20908101905b8181106117ad57005b805f600692555f60018201555f60028201555f60038201555f60048201555f6005820155016117a4565b346101a05760203660031901126101a05760206117fa6117f5611804565b6119c8565b6040519015158152f35b600435906001600160a01b03821682036101a057565b602435906001600160a01b03821682036101a057565b35906001600160a01b03821682036101a057565b602435906001600160401b03821682036101a057565b9181601f840112156101a0578235916001600160401b0383116101a0576020808501948460051b0101116101a057565b9181601f840112156101a0578235916001600160401b0383116101a057602083818601950101116101a057565b80548210156118d0575f52600660205f20910201905f90565b634e487b7160e01b5f52603260045260245ffd5b604081019081106001600160401b0382111761047357604052565b60a081019081106001600160401b0382111761047357604052565b90601f801991011681019081106001600160401b0382111761047357604052565b90604051611948816118ff565b82546001600160a01b039081168252600184015460208301526002840154166040820152600383015460608201526004909201546080830152565b600d548110156118d057600d5f5260205f2001905f90565b6004548110156118d05760045f5260205f2001905f90565b80548210156118d0575f5260205f2001905f90565b600d54905f5b8281106119dc575050505f90565b6119e581611983565b905460039190911b1c6001600160a01b0390811690831614611a09576001016119ce565b505050600190565b9190820180921161048757565b6004356001600160a01b03811681036101a05790565b6044356001600160a01b03811681036101a05790565b356001600160a01b03811681036101a05790565b989796959493929190604051997fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208c015260408b015260608a0152608089015260a088015260c087015260e08601526101008501526101208401526101408301526101408252611ad26101608361191a565b565b6001600160401b0381116104735760051b60200190565b903590601e19813603018212156101a057018035906001600160401b0382116101a0576020019181360383136101a057565b80518210156118d05760209160051b010190565b91908110156118d05760051b8101359060be19813603018212156101a0570190565b916040519360605260405260601b602c526323b872dd60601b600c5260205f6064601c82855af1908160015f51141615611b93575b50505f606052604052565b3b153d171015611ba4575f80611b88565b637939f4245f526004601cfd5b916117f591611bbf93611c17565b15610c9b57565b919060145260345263a9059cbb60601b5f5260205f6044601082855af1908160015f51141615611bf9575b50505f603452565b3b153d171015611c0a575f80611bf1565b6390b8ec185f526004601cfd5b604080515f95949093918114611c6257604114611c3357505050565b604080929395508101355f1a60205281375b5f526020604060805f60015afa505f6060523d6060185191604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b0316606052909250611c4556fea2646970667358221220759248af50aaddb85c7923e0a741f511253ffd21881e408db3f18ad98ccafffb64736f6c634300081e0033"},"sourceId":"src/DepositVault.sol","sourcemap":"325:24671:15:-:0;;;;;;;;;;;;;-1:-1:-1;;325:24671:15;;;;-1:-1:-1;;;;;325:24671:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;1329:5;;325:24671;-1:-1:-1;;;;;325:24671:15;;;;7267:20;;7263:46;;-1:-1:-1;;;;;325:24671:15;;7323:32;;7319:58;;325:24671;;;;;;-1:-1:-1;325:24671:15;;;-1:-1:-1;325:24671:15;;;;;;;7411:38;325:24671;;;7411:38;325:24671;;;;;;;;;;7319:58;7296:13;;;-1:-1:-1;7364:13:15;;-1:-1:-1;7364:13:15;325:24671;-1:-1:-1;325:24671:15;;;;;;-1:-1:-1;325:24671:15;;;;;-1:-1:-1;325:24671:15;;;;-1:-1:-1;;;;;325:24671:15;;;;;;:::o","userdoc":{"errors":{"EmptyOrders()":[{"notice":"Reverts if an order array is empty."}],"Expired()":[{"notice":"Reverts if a signed operation is past its deadline."}],"InsufficientAdministrators(uint256,uint256)":[{"notice":"Reverts if insufficient administrators are provided when setting the administrators"}],"InsufficientAmountFromExecutor(uint256,uint256)":[{"notice":"Reverts if a settlement callback returns an insufficient input token amount"}],"InvalidNonce(uint256,uint256)":[{"notice":"Reverts if the nonce used in a transaction is incorrect."}],"InvalidSignature()":[{"notice":"Reverts if the signature provided is invalid."}],"MissedQuorum(uint256,uint256)":[{"notice":"Reverts when an insufficient number of signatures are provided for a withdrawal request"}],"NotAdmin()":[{"notice":"Reverts if the caller is not an admin."}],"NotCredentialManager()":[{"notice":"Reverts if the caller is not the credential manager"}],"NotExecutor()":[{"notice":"Reverts if the caller is not the authorized executor."}],"NotOwner()":[{"notice":"Reverts if the caller is not the owner."}],"TooSoon()":[{"notice":"Reverts if an insufficient number of blocks have elapsed since the last signature use"}],"ZeroAddress()":[{"notice":"Reverts when given the zero address."}],"ZeroWithdrawalQuorum()":[{"notice":"Reverts if a new withdrawal quorum value is equal to zero"}]},"events":{"AdminAdded(address,uint256)":{"notice":"Signals that a new administrator has been added to the vault"},"AdministratorSetReset()":{"notice":"Indicates that the set of administrators has been cleared and is now empty"},"CredentialManagerChanged(address,address)":{"notice":"Signals that the credential manager address has changed"},"Deposited(bytes32,uint64,uint256,address,uint256)":{"notice":"Signals a deposit."},"Settled(bytes32,uint64,uint256,address,uint256,address,uint256)":{"notice":"Signals a settlement."},"WithdrawalQuorumChanged(uint256,uint256)":{"notice":"Signals that the withdrawal quorum has changed"},"Withdrew(bytes32,uint64,uint256,address,uint256)":{"notice":"Signals a withdrawal."}},"kind":"user","methods":{"addSettlerExecutor(bytes32,address)":{"notice":"Sets the settle executor."},"administrators(uint256)":{"notice":"Set of administrators"},"approvedSettlers(uint256)":{"notice":"List of all approved settler IDs."},"constructor":{"notice":"Initializes the contract and sets the owner."},"credentialManager()":{"notice":"The address responsible for adding or removing administrators"},"deposit(bytes32,uint64,address,uint256)":{"notice":"Deposits a token into the vault."},"depositCounts(bytes32,uint64)":{"notice":"Maps (settler ID, account_index) pairs to their deposit count (nonce)."},"executeAtomicSettlement((address,uint256,address,uint256,uint256),bytes32,uint64,uint256,bytes,bytes)":{"notice":"Executes an atomic settlement."},"getApprovedSettlers()":{"notice":"Get the array of approved settlers."},"lastSignatureUse()":{"notice":"Block number of latest signature use"},"owner()":{"notice":"The admin approves settlements and withdrawals."},"pendingSettlements(bytes32,uint64,uint256)":{"notice":"Maps (settler ID, account_index) pairs to their queue of pending batch settlements."},"pullBatchSettlement(((address,uint256,address,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":{"notice":"Pulls funds for execution during a settlement batch."},"pushBatchSettlements(bytes32,uint64)":{"notice":"Pushes expected funds from a batch settlement to the deposit vault."},"removeSettler(bytes32)":{"notice":"Removes a settler."},"setDomainSeparator(bytes32)":{"notice":"Sets the domain separators for EIP-712 signatures."},"setOwner(address)":{"notice":"Sets the owner of the vault."},"settlementCaps(address)":{"notice":"Maximum total tokens that can be settled in a single block for each token."},"settlementCounts(bytes32,uint64)":{"notice":"Maps (settler ID, account_index) pairs to their settlement count (nonce)."},"withdraw((address,uint256,uint256),bytes32,uint64,address,uint256,bytes32,bytes[])":{"notice":"Withdraws a token from the vault."},"withdrawalCounts(bytes32,uint64)":{"notice":"Maps (settler ID, account_index) pairs to their withdrawal count (nonce)."},"withdrawalQuorum()":{"notice":"Minimum number of administrator signatures to approve a withdrawal request"}},"version":1}},"IAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"IAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IAdminUpdateStrategy.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IAtomicSettlementCallback":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onAtomicSettlement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"contractName":"IAtomicSettlementCallback","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"onAtomicSettlement(address,uint256,bytes)":"0x3f1d584e"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IAtomicSettlementCallback.sol","sourcemap":"","userdoc":{"kind":"user","methods":{"onAtomicSettlement(address,uint256,bytes)":{"notice":"Computes the minimum expected quantity of `token` that will be received by the deposit vault upon execution of an atomic settlement request"}},"version":1}},"IAutomataDcapAttestation":{"abi":[{"inputs":[{"internalType":"bytes","name":"output","type":"bytes"},{"internalType":"enum IAutomataDcapAttestation.ZkCoProcessorType","name":"zkvm","type":"uint8"},{"internalType":"bytes","name":"proofBytes","type":"bytes"}],"name":"verifyAndAttestWithZKProof","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"errorData","type":"bytes"}],"stateMutability":"nonpayable","type":"function"}],"contractName":"IAutomataDcapAttestation","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"details":"Bindings for the 'AutomataDcapAttestation' contract. Compatible with Automata V3 ZK Coprocessor logic.","kind":"dev","methods":{"verifyAndAttestWithZKProof(bytes,uint8,bytes)":{"params":{"output":"The Public Values (Journal) - effectively the Quote Body.","proofBytes":"The actual (Groth16) proof.","zkvm":"The type of ZKVM used."},"returns":{"errorData":"Error message if failed, or empty if success.","success":"True if valid."}}},"version":1},"methodIdentifiers":{"verifyAndAttestWithZKProof(bytes,uint8,bytes)":"0x57859ce0"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IAutomataDcapAttestation.sol","sourcemap":"","userdoc":{"kind":"user","methods":{"verifyAndAttestWithZKProof(bytes,uint8,bytes)":{"notice":"Verifies a SNARK proof (Groth16) for a TEE Quote."}},"notice":"Interface for Automata's DCAP Attestation Verifier (V3)","version":1}},"ICheckpointer":{"abi":[{"inputs":[],"name":"AlreadySet","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCouncilMultisig","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"name":"Withdrawals","type":"event"},{"inputs":[],"name":"CHECKPOINT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sharedSignature","type":"bytes"},{"internalType":"bytes","name":"leaderSignature","type":"bytes"},{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8[]","name":"stateRoot","type":"uint8[]"},{"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"internalType":"struct ICheckpointer.Checkpoint","name":"_checkpoint","type":"tuple"}],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"councilMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setInitialCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"}],"name":"setLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setNewCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stateRoot","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateRootNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"ICheckpointer","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"CHECKPOINT_TYPEHASH()":"0xe1193e4c","admin()":"0xf851a440","checkpoint(bytes,bytes,(uint256,uint8[],string[]))":"0x8bbb26a3","councilMultisig()":"0x07ddaf53","leader()":"0x40eedabb","setAdmin(address)":"0x704b6c02","setDomainSeparator(bytes32)":"0x7438b937","setInitialCouncilMultisig(address)":"0x3ea987d3","setLeader(address)":"0x4331e8dd","setNewCouncilMultisig(address)":"0x5fa993b2","stateRoot(uint256)":"0xcc2fc845","stateRootNonce()":"0x74ebc7a0"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/ICheckpointer.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"ICredentialManager":{"abi":[{"inputs":[],"name":"NoStrategy","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"StrategyAlreadyExists","type":"error"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"}],"name":"VaultNotFound","type":"error"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"addr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"}],"name":"addVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"adminUpdateStrategies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getVaults","outputs":[{"components":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint64","name":"vmId","type":"uint64"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"}],"internalType":"struct ICredentialManager.Vault[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"address","name":"strategy","type":"address"}],"name":"registerAdminUpdateStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"idx","type":"uint256"}],"name":"removeVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setDepositVaultAdministrators","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaults","outputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"contractName":"ICredentialManager","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8))":"0x8e723ccc","admin()":"0xf851a440","adminUpdateStrategies(uint256,uint256)":"0x3174b727","getVaults(uint16,uint16)":"0x9fd7285c","registerAdminUpdateStrategy(uint256,uint256,address)":"0x54491683","removeVault(uint256)":"0xeaadd976","setDepositVaultAdministrators(uint256,uint256,address[],uint256)":"0x9ebc068e","vaults(uint256)":"0x8c64ea4a","withdraw(address)":"0x51cff8d9"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/ICredentialManager.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IDepositVault":{"abi":[{"inputs":[],"name":"EmptyOrders","type":"error"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAdministrators","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"given","type":"uint256"}],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"MissedQuorum","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCredentialManager","type":"error"},{"inputs":[],"name":"NotExecutor","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroWithdrawalQuorum","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"numAdminsAfter","type":"uint256"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[],"name":"AdministratorSetReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldCredentialManager","type":"address"},{"indexed":false,"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"CredentialManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"Settled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"WithdrawalQuorumChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[],"name":"ORDER_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"},{"internalType":"address","name":"executor","type":"address"}],"name":"addSettlerExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"administrators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedSettlers","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManagerChangeDelayBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"depositCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct IDepositVault.Settlement","name":"order","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"executeAtomicSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getApprovedSettlers","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAdministrator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSignatureUse","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingSettlements","outputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct IDepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"address","name":"target","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct IDepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IDepositVault.SignedSettlement[]","name":"orders","type":"tuple[]"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"name":"pullBatchSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"}],"name":"pushBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"removeSettler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"setCredentialManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setDepositorStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"settlementCaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"settlementCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct IDepositVault.Withdrawal","name":"withdrawal","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes32","name":"epochHash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"withdrawalCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"IDepositVault","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"ORDER_TYPEHASH()":"0xf973a209","addSettlerExecutor(bytes32,address)":"0xad9fa8bc","administrators(uint256)":"0xd89d1510","approvedSettlers(uint256)":"0x3a87fe4d","canDeposit(address)":"0x4bf0d331","credentialManager()":"0x2b0c1a1e","credentialManagerChangeDelayBlocks()":"0xa33c9d00","deposit(bytes32,address,uint256)":"0xd954863c","depositCounts(bytes32)":"0x3d63ea93","executeAtomicSettlement((address,uint256,address,uint256,uint256),bytes32,uint256,bytes,bytes)":"0xbf5b0e6f","getApprovedSettlers()":"0x92698ac6","isAdministrator(address)":"0x0a2eb301","lastSignatureUse()":"0xd8c8785d","owner()":"0x8da5cb5b","ownerWithdrawToken(address,address,uint256)":"0xf585b64f","pendingSettlements(bytes32,uint256)":"0x2fe7a797","pullBatchSettlement(((address,uint256,address,uint256,uint256),bytes)[],bytes32,address,uint256)":"0x9a39f344","pushBatchSettlements(bytes32)":"0xc8c57ba6","removeSettler(bytes32)":"0x41774bfe","setAdministrators(address[],uint256)":"0x23c56731","setCredentialManager(address)":"0x21e6652c","setDepositorStatus(address,bool)":"0x224b93e1","setDomainSeparator(bytes32)":"0x7438b937","setOwner(address)":"0x13af4035","settlementCaps(address)":"0x98af9772","settlementCounts(bytes32)":"0xa815476f","withdraw((address,uint256,uint256),bytes32,address,uint256,bytes32,bytes)":"0x3b3c2a03","withdrawalCounts(bytes32)":"0x82ff8b1e","withdrawalQuorum()":"0x93ea8a7d"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IDepositVault.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IL1CrossDomainMessenger":{"abi":[{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"}],"name":"sendMessage","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"IL1CrossDomainMessenger","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"sendMessage(address,bytes,uint32)":"0x3dbb202b"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/strategies/OPStackAdminUpdateStrategy.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IRegistry":{"abi":[{"inputs":[],"name":"ChainAlreadyExists","type":"error"},{"inputs":[],"name":"IndexOutOfBounds","type":"error"},{"inputs":[],"name":"InvalidBufferMultiple","type":"error"},{"inputs":[],"name":"InvalidCollateralFactor","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsClamps","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsConfiguration","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsFactors","type":"error"},{"inputs":[],"name":"InvalidInterestKinks","type":"error"},{"inputs":[],"name":"InvalidLiabilityFactor","type":"error"},{"inputs":[],"name":"InvalidMaxFundingRate","type":"error"},{"inputs":[],"name":"InvalidMaxUtilizationRate","type":"error"},{"inputs":[],"name":"InvalidRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUtilizationCap","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"}],"name":"NoPendingRiskParameters","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotRiskManager","type":"error"},{"inputs":[],"name":"RiskManagerNotSet","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"},{"internalType":"uint256","name":"eligibleAt","type":"uint256"}],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chain","type":"uint64"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"Max1HrDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chain","type":"uint64"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MaxDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chain","type":"uint64"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MinWeightChanged","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"}],"name":"applyPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAccount","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint16","name":"index","type":"uint16"}],"name":"getAssetData","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct IRegistry.AssetData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"}],"name":"getAssetIndex","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getAssets","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct IRegistry.AssetData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"pendingRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters","name":"parameters","type":"tuple"},{"internalType":"uint256","name":"validAfter","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManagerMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskParameterChangeDelaySeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"riskParameters","outputs":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct IRegistry.AssetData","name":"data","type":"tuple"}],"name":"setAssetData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"account","type":"bytes32"}],"name":"setFeeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"chain","type":"uint16"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMax1HrDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"chain","type":"uint16"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMaxDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"chain","type":"uint16"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMinWeight","type":"uint256"}],"name":"setMinWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"},{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters","name":"parameters","type":"tuple"}],"name":"setPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"multisig","type":"address"}],"name":"setRiskManagerMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters","name":"params","type":"tuple"}],"name":"validateRiskParameters","outputs":[],"stateMutability":"pure","type":"function"}],"contractName":"IRegistry","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"admin()":"0xf851a440","applyPendingRiskParameters(uint16)":"0x6cbb0b54","feeAccount()":"0x65e17c9d","getAssetData(uint64,uint16)":"0xf247ceb9","getAssetIndex(uint64,bytes32)":"0x39006126","getAssets(uint16,uint16)":"0x0cb661c7","getRiskParameters(uint16,uint16)":"0xf0fef575","pendingRiskParameters(uint16)":"0xa812e224","riskManagerMultisig()":"0x525ea8b7","riskParameterChangeDelaySeconds()":"0x04cd46f9","riskParameters(uint16)":"0x114bb9c5","setAdmin(address)":"0x704b6c02","setAssetData((uint16,bytes32,uint64,uint256,uint256,uint256))":"0xe4380c93","setFeeAccount(bytes32)":"0xe2a0a600","setMax1HrDeposits(uint16,uint16,uint256)":"0x3c0f2a2f","setMaxDeposits(uint16,uint16,uint256)":"0xe492729d","setMinWeight(uint16,uint16,uint256)":"0xc515c8c6","setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0xb4bb0646","setRiskManagerMultisig(address)":"0x4ffcbdfb","validateRiskParameters((uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0x57990261"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IRegistry.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IntraChainAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"IntraChainAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x6080806040523460155761017e908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c63075034ae14610027575f80fd5b6060366003190112610144576004356001600160a01b038116908190036101445760243567ffffffffffffffff8111610144573660238201121561014457806004013567ffffffffffffffff8111610144573660248260051b8401011161014457823b15610144579083916323c5673160e01b8352806044840160406004860152526024606484019201905f905b8082106101145750505091815f818195604435602483015203925af18015610109576100df575080f35b905067ffffffffffffffff81116100f557604052005b634e487b7160e01b5f52604160045260245ffd5b6040513d5f823e3d90fd5b9193509183356001600160a01b0381169190829003610144576020816001938293520194019201859392916100b5565b5f80fdfea26469706673582212202e107e1054c7643167531235c2ca21a0a676fb179958378fd086626f108417fa64736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f905f3560e01c63075034ae14610027575f80fd5b6060366003190112610144576004356001600160a01b038116908190036101445760243567ffffffffffffffff8111610144573660238201121561014457806004013567ffffffffffffffff8111610144573660248260051b8401011161014457823b15610144579083916323c5673160e01b8352806044840160406004860152526024606484019201905f905b8082106101145750505091815f818195604435602483015203925af18015610109576100df575080f35b905067ffffffffffffffff81116100f557604052005b634e487b7160e01b5f52604160045260245ffd5b6040513d5f823e3d90fd5b9193509183356001600160a01b0381169190829003610144576020816001938293520194019201859392916100b5565b5f80fdfea26469706673582212202e107e1054c7643167531235c2ca21a0a676fb179958378fd086626f108417fa64736f6c634300081e0033"},"sourceId":"src/strategies/IntraChainAdminUpdateStrategy.sol","sourcemap":"290:322:25:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"notice":"Use this strategy when updating the vault on the same chain as the credential manager.","version":1}},"MockTarget":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onAtomicSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"}],"contractName":"MockTarget","deploymentBytecode":{"bytecode":"0x6080806040523460135760b1908160188239f35b5f80fdfe6004361015600b575f80fd5b5f3560e01c633f1d584e14601d575f80fd5b3460775760603660031901126077576004356001600160a01b0381160360775760443567ffffffffffffffff811160775736602382011215607757806004013567ffffffffffffffff811160775736910160240111607757005b5f80fdfea26469706673582212206cf91bafe3a0f54d58f9735d82a4757234fa3d217135826792ecef05e5d5837c64736f6c634300081c0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"onAtomicSettlement(address,uint256,bytes)":"0x3f1d584e"},"runtimeBytecode":{"bytecode":"0x6004361015600b575f80fd5b5f3560e01c633f1d584e14601d575f80fd5b3460775760603660031901126077576004356001600160a01b0381160360775760443567ffffffffffffffff811160775736602382011215607757806004013567ffffffffffffffff811160775736910160240111607757005b5f80fdfea26469706673582212206cf91bafe3a0f54d58f9735d82a4757234fa3d217135826792ecef05e5d5837c64736f6c634300081c0033"},"sourceId":"src/MockTarget.sol","sourcemap":"149:148:4:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}},"OPStackAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"address","name":"l1CrossDomainMessenger","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ZeroMessengerAddress","type":"error"},{"inputs":[],"name":"L1_CROSS_DOMAIN_MESSENGER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"L2_GAS_LIMIT","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"OPStackAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x60a034608057601f61033938819003918201601f19168301916001600160401b03831184841017608457808492602094604052833981010312608057516001600160a01b038116808203608057156071576080526040516102a090816100998239608051818181605401526101590152f35b637dc8404d60e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c908163075034ae146100a4575080635e743ef7146100865763f904facb1461003f575f80fd5b346100835780600319360112610083576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346100835780600319360112610083576020604051622dc6c08152f35b90506060366003190112610200576004356001600160a01b03811690819003610200576024359167ffffffffffffffff831161020057366023840112156102005782600401359267ffffffffffffffff8411610200573660248560051b8301011161020057928160208101946323c5673160e01b8652826064830160406024850152526024608483019101925f905b8082106102045750506101579250604435604483015203601f198101835282610234565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610200575f926084604051809681958294633dbb202b60e01b84526004840152606060248401525180918160648501528484015e8181018301879052622dc6c06044830152601f01601f1916810103019134905af180156101f5576101e7575080f35b6101f391505f90610234565b005b6040513d5f823e3d90fd5b5f80fd5b9092509083356001600160a01b038116919082900361020057602081600193829352019401920184929391610133565b90601f8019910116810190811067ffffffffffffffff82111761025657604052565b634e487b7160e01b5f52604160045260245ffdfea264697066735822122004f87248a949ed7aa2c0a05b9a4143d56eee5dc0be463317275b1915e6f76ba564736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{"setAdministrators(address,address[],uint256)":{"details":"Sends a cross-domain message from L1 \u2192 L2 using the OP Stack messengerForwards msg.value directly to the L1 messenger","params":{"newAdministrators":"The full administrator set","newWithdrawalQuorum":"The withdrawal quorum","vault":"The L2 vault address"}}},"version":1},"methodIdentifiers":{"L1_CROSS_DOMAIN_MESSENGER()":"0xf904facb","L2_GAS_LIMIT()":"0x5e743ef7","setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f905f3560e01c908163075034ae146100a4575080635e743ef7146100865763f904facb1461003f575f80fd5b346100835780600319360112610083576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346100835780600319360112610083576020604051622dc6c08152f35b90506060366003190112610200576004356001600160a01b03811690819003610200576024359167ffffffffffffffff831161020057366023840112156102005782600401359267ffffffffffffffff8411610200573660248560051b8301011161020057928160208101946323c5673160e01b8652826064830160406024850152526024608483019101925f905b8082106102045750506101579250604435604483015203601f198101835282610234565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610200575f926084604051809681958294633dbb202b60e01b84526004840152606060248401525180918160648501528484015e8181018301879052622dc6c06044830152601f01601f1916810103019134905af180156101f5576101e7575080f35b6101f391505f90610234565b005b6040513d5f823e3d90fd5b5f80fd5b9092509083356001600160a01b038116919082900361020057602081600193829352019401920184929391610133565b90601f8019910116810190811067ffffffffffffffff82111761025657604052565b634e487b7160e01b5f52604160045260245ffdfea264697066735822122004f87248a949ed7aa2c0a05b9a4143d56eee5dc0be463317275b1915e6f76ba564736f6c634300081e0033"},"sourceId":"src/strategies/OPStackAdminUpdateStrategy.sol","sourcemap":"446:1455:26:-:0;;;;;;;;;;;;;-1:-1:-1;;446:1455:26;;;;-1:-1:-1;;;;;446:1455:26;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;446:1455:26;;;;;;;868:36;864:71;;945:50;;446:1455;;;;;;;;945:50;446:1455;;;;;;;;;;;864:71;913:22;;;-1:-1:-1;913:22:26;;-1:-1:-1;913:22:26;446:1455;-1:-1:-1;446:1455:26;;;;;;-1:-1:-1;446:1455:26;;;;;-1:-1:-1;446:1455:26","userdoc":{"errors":{"ZeroMessengerAddress()":[{"notice":"Reverts if messenger address is zero."}]},"kind":"user","methods":{"L1_CROSS_DOMAIN_MESSENGER()":{"notice":"L1 CrossDomainMessenger."},"L2_GAS_LIMIT()":{"notice":"Conservative gas limit for L2 execution."},"setAdministrators(address,address[],uint256)":{"notice":"Updates the administrator set and withdrawal quorum on an OP Stack L2 vault"}},"notice":"Admin update strategy for OP Stack chains (Optimism, Base, Unichain, etc)","version":1}},"Registry":{"abi":[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ChainAlreadyExists","type":"error"},{"inputs":[],"name":"IndexOutOfBounds","type":"error"},{"inputs":[],"name":"InvalidBufferMultiple","type":"error"},{"inputs":[],"name":"InvalidCollateralFactor","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsClamps","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsConfiguration","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsFactors","type":"error"},{"inputs":[],"name":"InvalidInterestKinks","type":"error"},{"inputs":[],"name":"InvalidLiabilityFactor","type":"error"},{"inputs":[],"name":"InvalidMaxFundingRate","type":"error"},{"inputs":[],"name":"InvalidMaxUtilizationRate","type":"error"},{"inputs":[],"name":"InvalidRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUtilizationCap","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"}],"name":"NoPendingRiskParameters","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotRiskManager","type":"error"},{"inputs":[],"name":"RiskManagerNotSet","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"},{"internalType":"uint256","name":"eligibleAt","type":"uint256"}],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"Max1HrDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MaxDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MinWeightChanged","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"}],"name":"applyPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAccount","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"}],"name":"getAssetData","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct Registry.AssetData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"}],"name":"getAssetIndex","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getAssets","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct Registry.AssetData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"pendingRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters","name":"parameters","type":"tuple"},{"internalType":"uint256","name":"validAfter","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManagerMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskParameterChangeDelaySeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"riskParameters","outputs":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct Registry.AssetData","name":"data","type":"tuple"}],"name":"setAssetData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"account","type":"bytes32"}],"name":"setFeeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMax1HrDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMaxDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMinWeight","type":"uint256"}],"name":"setMinWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"},{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters","name":"parameters","type":"tuple"}],"name":"setPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"multisig","type":"address"}],"name":"setRiskManagerMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters","name":"params","type":"tuple"}],"name":"validateRiskParameters","outputs":[],"stateMutability":"pure","type":"function"}],"contractName":"Registry","deploymentBytecode":{"bytecode":"0x608034607657601f6122e038819003918201601f19168301916001600160401b03831184841017607a57808492602094604052833981010312607657516001600160a01b03811690819003607657620151806002555f80546001600160a01b031916919091179055604051612251908161008f8239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816304cd46f91461115d575080630cb661c7146110e4578063114bb9c5146110165780632491905014610f655780633a076ddd14610ec05780634ffcbdfb14610e6d578063525ea8b714610e455780635799026114610e0b57806365e17c9d14610dee578063698670e314610dba5780636cbb0b54146109d5578063704b6c0214610951578063a7b7b47014610858578063a812e22414610801578063af8c83381461074b578063b4bb064614610418578063bc67a603146101ec578063e2a0a600146101b3578063f0fef575146101235763f851a440146100f8575f80fd5b3461011f575f36600319011261011f575f546040516001600160a01b039091168152602090f35b5f80fd5b3461011f57604036600319011261011f5761014d61013f611177565b610147611188565b90611f7c565b6040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061018457505050500390f35b919360019193955060206101a38192603f198a82030186528851611643565b9601920192018594939192610175565b3461011f57602036600319011261011f576001546001600160a01b031633036101de57600435600755005b6206732360e51b5f5260045ffd5b3461011f5760e036600319011261011f5760405161020981611230565b610211611177565b815260208101906024358252604060431936011261011f576040519161023683611215565b6044356001600160401b038116810361011f5783526064356001600160401b038116810361011f5760208401526040820192835260608201916084358352608081019160a435835260a0820160c435815260018060a01b036001541633036101de5761ffff83511660055410610409578151156103fa5761ffff8351165f52600660205260405f20938651966001600160401b036020818a511699015116936001600160401b0389165f528660205260405f206001600160401b0386165f52602052600160405f2001546103eb5760059460018801976001600160401b038954159b165f526020526001600160401b0360405f2091165f5260205261ffff60405f2096511661ffff19875416178655516001860155519561035a8760028701611e68565b516003850155516004840155519101558054600160401b8110156103d75761038791600182018155611844565b9190916103c45761039791611e68565b61039d57005b600554600181018091116103b057600555005b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b6329409fff60e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b634e23d03560e01b5f5260045ffd5b3461011f57604036600319011261011f57610431611177565b6024356001600160401b03811161011f5761045090369060040161130a565b6001549091906001600160a01b031633036101de5761047861ffff6005549216918210611b00565b61048182611b8d565b61048d60025442611796565b906040519261049b84611215565b8352602083019182525f52600360205260405f20915160ff81511683549061ff00602084015160081b169161ffff19161717835560408101516001840155606081015160028401556080810151600384015560a081015160048401556005830160c0820151151560ff801983541691161790556006830160e0820151908151916001600160401b0383116103d7576020906105368484611e28565b01905f5260205f205f5b838110610737575050505060078301610100820151908151916001600160401b0383116103d7576020906105748484611e28565b01905f5260205f205f5b838110610723575050505060088301610120820151908151916001600160401b0383116103d7576020906105b28484611e28565b01905f5260205f205f5b83811061070f575050505060098301610140820151908151916001600160401b0383116103d7576020906105f08484611e28565b01905f5260205f205f5b8381106106fb5750505050610160810151600a840155610180810151600b8401556101a0810151600c8401556101c0810151600d840155600e83016101e0820151908151916001600160401b0383116103d75760209061065a8484611e28565b01905f5260205f205f5b8381106106e75750505050600f8301610200820151908151916001600160401b0383116103d7576020906106988484611e28565b01905f5260205f205f5b8381106106d35761022085015160108801556102408501516011880155610260850151601288015585516013880155005b6001906020845194019381840155016106a2565b600190602084519401938184015501610664565b6001906020845194019381840155016105fa565b6001906020845194019381840155016105bc565b60019060208451940193818401550161057e565b600190602084519401938184015501610540565b3461011f57610759366111ea565b6001549092906001600160a01b031633036101de576107fc7f9b0a62bc173ccdd4228691d9af5cbe894061fb605491498f20216dc69fdcee1e936005546107a661ffff8616918210611b00565b6107af84611b35565b6107bb60208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600401805490839055905194859485611b49565b0390a1005b3461011f57602036600319011261011f5761ffff61081d611177565b165f52600360205261084e60405f206013610837826114ff565b910154604051928392604084526040840190611643565b9060208301520390f35b3461011f57610866366111ea565b6001549092906001600160a01b031633036101de576107fc7f61add8ab6aedaf5e8c15fd0f3b5dc7239de9517bae157dc6f09438d619959a5b936005546108b361ffff8616918210611b00565b805f52600660205260405f206001600160401b036108d086611b35565b165f5260205260405f2060208501906001600160401b036108f083611b35565b165f52602052600560405f200154915f52600660205260405f206001600160401b0361091b87611b35565b165f526020526001600160401b0361093660405f2092611b35565b165f5260205281600560405f20015560405194859485611b49565b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b03811633036109c6578115806109b3575b6109a4576001600160a01b031916175f55005b632b47857560e01b5f5260045ffd5b506001546001600160a01b031615610991565b637bfa4b9f60e01b5f5260045ffd5b3461011f57602036600319011261011f576109ee611177565b610a0161ffff6005549216918210611b00565b805f52600360205260405f20601360405191610a1c83611215565b610a25816114ff565b83520154602082019080825215610da7575142811015610d91575051610a4a81611b8d565b815f52600460205260405f209060ff81511682549061ff00602084015160081b169161ffff19161717825560408101516001830155606081015160028301556080810151600383015560a081015160048301556005820160c0820151151560ff801983541691161790556006820160e0820151908151916001600160401b0383116103d757602090610adc8484611e28565b01905f5260205f205f5b838110610d7d575050505060078201610100820151908151916001600160401b0383116103d757602090610b1a8484611e28565b01905f5260205f205f5b838110610d69575050505060088201610120820151908151916001600160401b0383116103d757602090610b588484611e28565b01905f5260205f205f5b838110610d55575050505060098201610140820151908151916001600160401b0383116103d757602090610b968484611e28565b01905f5260205f205f5b838110610d415750505050610160810151600a830155610180810151600b8301556101a0810151600c8301556101c0810151600d830155600e82016101e0820151908151916001600160401b0383116103d757602090610c008484611e28565b01905f5260205f205f5b838110610d2d5750505050600f8201610200820151908151916001600160401b0383116103d757602090610c3e8484611e28565b01905f5260205f205f5b838110610d195786866012610260886102208101516010850155610240810151601185015501519101555f5260036020525f601360408220828155826001820155826002820155826003820155826004820155826005820155610cad60068201611df8565b610cb960078201611df8565b610cc560088201611df8565b610cd160098201611df8565b82600a82015582600b82015582600c82015582600d820155610cf5600e8201611df8565b610d01600f8201611df8565b82601082015582601182015582601282015501555f80f35b600190602084519401938184015501610c48565b600190602084519401938184015501610c0a565b600190602084519401938184015501610ba0565b600190602084519401938184015501610b62565b600190602084519401938184015501610b24565b600190602084519401938184015501610ae6565b82636bfedefd60e11b5f5260045260245260445ffd5b8263193e674760e21b5f5260045260245ffd5b3461011f5736600319016060811261011f5760401361011f576020610de0604435611d61565b63ffffffff60405191168152f35b3461011f575f36600319011261011f576020600754604051908152f35b3461011f57602036600319011261011f576004356001600160401b03811161011f57610e3e610e4391369060040161130a565b611b8d565b005b3461011f575f36600319011261011f576001546040516001600160a01b039091168152602090f35b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b031633036109c6576bffffffffffffffffffffffff60a01b60015416176001555f80f35b3461011f5736600319016060811261011f5760401361011f5760443561ffff811680910361011f57610ef06117a3565b505f52600660205260405f206004356001600160401b038116810361011f57806001600160401b039150165f5260205260405f206024356001600160401b038116810361011f57806001600160401b039150165f5260205260e0610f5660405f20611881565b610f636040518092611199565bf35b3461011f57610f73366111ea565b6001549092906001600160a01b031633036101de576107fc7f35095f4ef942f9cb4170d9a93adc7fe9ebc8faf2df4a91b87b0dced92784718f93600554610fc061ffff8616918210611b00565b610fc984611b35565b610fd560208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600301805490839055905194859485611b49565b3461011f57602036600319011261011f5761ffff611032611177565b165f5260046020526101c060ff60405f20805490600181015460028201546003830154600484015486600586015416600a86015490600b87015492600c88015494600d8901549660108a015498601260118c01549b01549b60206040519e8f92818116845260081c1691015260408d015260608c015260808b015260a08a0152151560c089015260e08801526101008701526101208601526101408501526101608401526101808301526101a0820152f35b3461011f57604036600319011261011f5761110e611100611177565b611108611188565b906118ed565b6040518091602082016020835281518091526020604084019201905f5b818110611139575050500390f35b91935091602060e08261114f6001948851611199565b01940191019184939261112b565b3461011f575f36600319011261011f576020906002548152f35b6004359061ffff8216820361011f57565b6024359061ffff8216820361011f57565b60a060c09161ffff8151168452602081015160208501526001600160401b03602060408301518281511660408801520151166060850152606081015160808501526080810151828501520151910152565b600319016080811261011f5760401361011f5760049060443561ffff8116810361011f579060643590565b604081019081106001600160401b038211176103d757604052565b60c081019081106001600160401b038211176103d757604052565b61028081019081106001600160401b038211176103d757604052565b90601f801991011681019081106001600160401b038211176103d757604052565b359060ff8216820361011f57565b6001600160401b0381116103d75760051b60200190565b9080601f8301121561011f5781356112c481611296565b926112d26040519485611267565b81845260208085019260051b82010192831161011f57602001905b8282106112fa5750505090565b81358152602091820191016112ed565b9190916102808184031261011f57604051906113258261124b565b819361133082611288565b835261133e60208301611288565b602084015260408201356040840152606082013560608401526080820135608084015260a082013560a084015260c0820135801515810361011f5760c084015260e08201356001600160401b03811161011f578161139d9184016112ad565b60e08401526101008201356001600160401b03811161011f57816113c29184016112ad565b6101008401526101208201356001600160401b03811161011f57816113e89184016112ad565b6101208401526101408201356001600160401b03811161011f578161140e9184016112ad565b6101408401526101608201356101608401526101808201356101808401526101a08201356101a08401526101c08201356101c08401526101e08201356001600160401b03811161011f57816114649184016112ad565b6101e0840152610200820135916001600160401b03831161011f576114906102609392849383016112ad565b6102008501526102208101356102208501526102408101356102408501520135910152565b90604051918281549182825260208201905f5260205f20925f5b8181106114e65750506114e492500383611267565b565b84548352600194850194879450602090930192016114cf565b9060405161150c8161124b565b6102606012829460ff8154818116865260081c166020850152600181015460408501526002810154606085015260038101546080850152600481015460a085015260ff600582015416151560c0850152611568600682016114b5565b60e0850152611579600782016114b5565b61010085015261158b600882016114b5565b61012085015261159d600982016114b5565b610140850152600a810154610160850152600b810154610180850152600c8101546101a0850152600d8101546101c08501526115db600e82016114b5565b6101e08501526115ed600f82016114b5565b610200850152601081015461022085015260118101546102408501520154910152565b90602080835192838152019201905f5b81811061162d5750505090565b8251845260209384019390920191600101611620565b9060ff825116815260ff602083015116602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c0820151151560c08201526102608061174e61173a6116f66116e26116ce6116ba60e08a015161028060e08b01526102808a0190611610565b6101008a01518982036101008b0152611610565b6101208901518882036101208a0152611610565b610140880151878203610140890152611610565b6101608701516101608701526101808701516101808701526101a08701516101a08701526101c08701516101c08701526101e08701518682036101e0880152611610565b610200860151858203610200870152611610565b93610220810151610220850152610240810151610240850152015191015290565b35906001600160401b038216820361011f57565b61ffff1661ffff81146103b05760010190565b919082018092116103b057565b604051906117b082611230565b5f60a0838281528260208201526040516117c981611215565b83815283602082015260408201528260608201528260808201520152565b604051906117f6602083611267565b5f80835282815b82811061180957505050565b6020906118146117a3565b828285010152016117fd565b9061ffff8091169116039061ffff82116103b057565b5f1981146103b05760010190565b8054821015611859575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b80518210156118595760209160051b010190565b9060405161188e81611230565b60a06005829461ffff8154168452600181015460208501526040516118b281611215565b6001600160401b036002830154818116835260401c166020820152604085015260038101546060850152600481015460808501520154910152565b6005545f9290835b61ffff85168281101561192b576119259161191f915f526006602052600160405f20015490611796565b94611783565b936118f5565b5093509193909361ffff81169380851015611ae3578061ffff871611611af4575b5061ffff851694848610611ae35761ffff9161196c919693959496611820565b1661197681611296565b916119846040519384611267565b818352601f1961199383611296565b015f5b818110611ac05750505f905f945f5b61ffff811689811080611ab7575b15611aab575f52600660205260405f209460018601948554995f915b8b831080611aa2575b15611a85578581101580611a7c575b611a04575b6119f86119fe91611836565b92611836565b916119cf565b611a0e8389611844565b50546001600160401b0381166001600160401b03165f528960205260405f209060401c6001600160401b03166001600160401b03165f5260205260405f209a80611a5790611836565b9b611a6190611881565b611a6b828d61186d565b52611a76908b61186d565b506119ec565b508681106119e7565b9b9497509550509750611a9790611783565b9792969390976119a5565b50838b106119d8565b50949750505050505050565b508588106119b3565b602090611ad19896949793986117a3565b82828801015201969195929496611996565b505092505050611af16117e7565b90565b61ffff1694505f61194c565b15611b0757565b60405162461bcd60e51b815260206004820152600660248201526508585cdcd95d60d21b6044820152606490fd5b356001600160401b038116810361011f5790565b9094939261ffff6080936001600160401b03611b78602060a087019a83611b6f8261176f565b1688520161176f565b16602085015216604083015260608201520152565b606460ff82511611611d5257606460ff60208301511611611d4357670de0b6b3a764000060a082015111611d345761047661022082015111611d255761047661024082015111611d1657610260810151620f42408110908115611d09575b50611cfa5760e08101611bfe8151612108565b15611ceb57611c0d9051612180565b15611ceb576101208101611c218151612108565b15611cdc57611c309051612180565b15611cdc57611c436101008201516121b0565b15611ccd57611c566101408201516121b0565b15611cbe576101e0810161020081515192019182515103611caf57611c7b9051612108565b15611ca057611c8a90516121e4565b15611c9157565b637015a03b60e01b5f5260045ffd5b6329f7281b60e21b5f5260045ffd5b63bfa51ee360e01b5f5260045ffd5b635646ba3b60e11b5f5260045ffd5b630adc448560e21b5f5260045ffd5b630376a9ef60e31b5f5260045ffd5b6365c991a560e01b5f5260045ffd5b63adb838cd60e01b5f5260045ffd5b621e84809150115f611beb565b6328be116d60e21b5f5260045ffd5b63076eb25360e11b5f5260045ffd5b63cc15654960e01b5f5260045ffd5b632a7f863d60e21b5f5260045ffd5b6302f22cad60e61b5f5260045ffd5b6004356001600160401b038116810361011f57602435916001600160401b038316830361011f575f6001600160401b038060055494169416905b61ffff811684811015611dea57805f52600660205260405f20865f5260205260405f20835f52602052600160405f2001548414611de15750611ddc90611783565b611d9b565b94505050505090565b50505050505063ffffffff90565b8054905f815581611e07575050565b5f5260205f20908101905b818110611e1d575050565b5f8155600101611e12565b90600160401b81116103d757815491818155828210611e4657505050565b5f5260205f2091820191015b818110611e5d575050565b5f8155600101611e52565b906001600160401b038151166fffffffffffffffff00000000000000006020845493836001600160401b03198616178655015160401b16916fffffffffffffffffffffffffffffffff191617179055565b60405190611ec8602083611267565b5f80835282815b828110611edb57505050565b602090604051611eea8161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828501015201611ecf565b60055461ffff80831694939116808510156120fb578061ffff8316116120f3575b508361ffff8216106120e75761ffff91611fb691611820565b16611fc081611296565b92611fce6040519485611267565b818452601f19611fdd83611296565b015f5b8181106120465750505f5b61ffff811690838210156120405781830161ffff81116103b05761203b9261ffff61203592165f52600460205261202460405f206114ff565b61202e828a61186d565b528761186d565b50611783565b611feb565b50505050565b6020906040516120558161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828901015201611fe0565b50509050611af1611eb9565b90505f611f9d565b5050509050611af1611eb9565b8051905f908215801561216c575b612165575f915b83831061212d5750505050600190565b612137838361186d565b5190620f4240821161215c5781106121545760019092019161211d565b505050505f90565b50505050505f90565b5050505f90565b508051156118595760208101511515612116565b8051801515918261219057505090565b5f19820192509082116103b057620f4240916121ab9161186d565b511490565b8051905f90815b8383106121c75750505050600190565b6121d1838361186d565b51908110612154576001909201916121b7565b8051905f90620f423f5b8383106121fe5750505050600190565b612208838361186d565b51908111612154576001909201916121ee56fea26469706673582212201a0e5b061dbc5669db9937ab714356062c9af05eea7b1d4bb9eeaf0073ef81fe64736f6c634300081e0033"},"devdoc":{"details":"Uses admin and multisig roles to control sensitive operations like asset registration and risk configuration.","kind":"dev","methods":{"applyPendingRiskParameters(uint16)":{"details":"Reverts with `\"!asset\"` if index >= assets.count.Reverts with `NoPendingRiskParameters` if there are no pending risk parameters for the specified assetReverts with `TooSoon` if the pending risk parameters are not yet eligible","params":{"index":"The asset index."}},"constructor":{"details":"Sets the deployer as the initial admin.","params":{"_admin":"The admin controller of the vault."}},"getAssetData((uint64,uint64),uint16)":{"params":{"chainId":"the chain ID to query.","index":"The asset index to query."},"returns":{"_0":"The corresponding AssetData struct."}},"getAssetIndex((uint64,uint64),bytes32)":{"params":{"assetAddress":"The asset address (as bytes32).","chainId":"The chain ID to search."},"returns":{"_0":"The index of the asset, or `type(uint32).max` if not found."}},"getAssets(uint16,uint16)":{"params":{"end":"The end index (not-inclusive).","start":"The start index (inclusive)."},"returns":{"_0":"An array of AssetData structs."}},"getRiskParameters(uint16,uint16)":{"params":{"end":"The end index (not inclusive).","start":"The start index (inclusive)."},"returns":{"_0":"An array of RiskParameters."}},"setAdmin(address)":{"details":"Reverts with `NotAdmin`; Only the admin can set a new admin.The new administrator address is allowed to be the null address. Setting the administrator to this address disables administration of the registry contract.","params":{"newAdmin":"The new admin address."}},"setAssetData((uint16,bytes32,(uint64,uint64),uint256,uint256,uint256))":{"details":"Automatically adds new assets or chain instances if not already present.Reverts with `NotRiskManager`; Only the risk manager can set asset data.","params":{"data":"The chain-specific asset data."}},"setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":{"details":"Reverts with `NotRiskManager`; Only the risk manager can set risk parameters.Reverts with `\"!asset\"` if index >= assets.count.","params":{"index":"The asset index.","parameters":"The risk parameters to set"}},"setRiskManagerMultisig(address)":{"details":"Reverts with `NotAdmin`; Only the admin can set a risk manager.","params":{"multisig":"The new address to set."}}},"title":"Registry","version":1},"methodIdentifiers":{"admin()":"0xf851a440","applyPendingRiskParameters(uint16)":"0x6cbb0b54","feeAccount()":"0x65e17c9d","getAssetData((uint64,uint64),uint16)":"0x3a076ddd","getAssetIndex((uint64,uint64),bytes32)":"0x698670e3","getAssets(uint16,uint16)":"0x0cb661c7","getRiskParameters(uint16,uint16)":"0xf0fef575","pendingRiskParameters(uint16)":"0xa812e224","riskManagerMultisig()":"0x525ea8b7","riskParameterChangeDelaySeconds()":"0x04cd46f9","riskParameters(uint16)":"0x114bb9c5","setAdmin(address)":"0x704b6c02","setAssetData((uint16,bytes32,(uint64,uint64),uint256,uint256,uint256))":"0xbc67a603","setFeeAccount(bytes32)":"0xe2a0a600","setMax1HrDeposits((uint64,uint64),uint16,uint256)":"0xaf8c8338","setMaxDeposits((uint64,uint64),uint16,uint256)":"0x24919050","setMinWeight((uint64,uint64),uint16,uint256)":"0xa7b7b470","setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0xb4bb0646","setRiskManagerMultisig(address)":"0x4ffcbdfb","validateRiskParameters((uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0x57990261"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816304cd46f91461115d575080630cb661c7146110e4578063114bb9c5146110165780632491905014610f655780633a076ddd14610ec05780634ffcbdfb14610e6d578063525ea8b714610e455780635799026114610e0b57806365e17c9d14610dee578063698670e314610dba5780636cbb0b54146109d5578063704b6c0214610951578063a7b7b47014610858578063a812e22414610801578063af8c83381461074b578063b4bb064614610418578063bc67a603146101ec578063e2a0a600146101b3578063f0fef575146101235763f851a440146100f8575f80fd5b3461011f575f36600319011261011f575f546040516001600160a01b039091168152602090f35b5f80fd5b3461011f57604036600319011261011f5761014d61013f611177565b610147611188565b90611f7c565b6040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061018457505050500390f35b919360019193955060206101a38192603f198a82030186528851611643565b9601920192018594939192610175565b3461011f57602036600319011261011f576001546001600160a01b031633036101de57600435600755005b6206732360e51b5f5260045ffd5b3461011f5760e036600319011261011f5760405161020981611230565b610211611177565b815260208101906024358252604060431936011261011f576040519161023683611215565b6044356001600160401b038116810361011f5783526064356001600160401b038116810361011f5760208401526040820192835260608201916084358352608081019160a435835260a0820160c435815260018060a01b036001541633036101de5761ffff83511660055410610409578151156103fa5761ffff8351165f52600660205260405f20938651966001600160401b036020818a511699015116936001600160401b0389165f528660205260405f206001600160401b0386165f52602052600160405f2001546103eb5760059460018801976001600160401b038954159b165f526020526001600160401b0360405f2091165f5260205261ffff60405f2096511661ffff19875416178655516001860155519561035a8760028701611e68565b516003850155516004840155519101558054600160401b8110156103d75761038791600182018155611844565b9190916103c45761039791611e68565b61039d57005b600554600181018091116103b057600555005b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b6329409fff60e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b634e23d03560e01b5f5260045ffd5b3461011f57604036600319011261011f57610431611177565b6024356001600160401b03811161011f5761045090369060040161130a565b6001549091906001600160a01b031633036101de5761047861ffff6005549216918210611b00565b61048182611b8d565b61048d60025442611796565b906040519261049b84611215565b8352602083019182525f52600360205260405f20915160ff81511683549061ff00602084015160081b169161ffff19161717835560408101516001840155606081015160028401556080810151600384015560a081015160048401556005830160c0820151151560ff801983541691161790556006830160e0820151908151916001600160401b0383116103d7576020906105368484611e28565b01905f5260205f205f5b838110610737575050505060078301610100820151908151916001600160401b0383116103d7576020906105748484611e28565b01905f5260205f205f5b838110610723575050505060088301610120820151908151916001600160401b0383116103d7576020906105b28484611e28565b01905f5260205f205f5b83811061070f575050505060098301610140820151908151916001600160401b0383116103d7576020906105f08484611e28565b01905f5260205f205f5b8381106106fb5750505050610160810151600a840155610180810151600b8401556101a0810151600c8401556101c0810151600d840155600e83016101e0820151908151916001600160401b0383116103d75760209061065a8484611e28565b01905f5260205f205f5b8381106106e75750505050600f8301610200820151908151916001600160401b0383116103d7576020906106988484611e28565b01905f5260205f205f5b8381106106d35761022085015160108801556102408501516011880155610260850151601288015585516013880155005b6001906020845194019381840155016106a2565b600190602084519401938184015501610664565b6001906020845194019381840155016105fa565b6001906020845194019381840155016105bc565b60019060208451940193818401550161057e565b600190602084519401938184015501610540565b3461011f57610759366111ea565b6001549092906001600160a01b031633036101de576107fc7f9b0a62bc173ccdd4228691d9af5cbe894061fb605491498f20216dc69fdcee1e936005546107a661ffff8616918210611b00565b6107af84611b35565b6107bb60208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600401805490839055905194859485611b49565b0390a1005b3461011f57602036600319011261011f5761ffff61081d611177565b165f52600360205261084e60405f206013610837826114ff565b910154604051928392604084526040840190611643565b9060208301520390f35b3461011f57610866366111ea565b6001549092906001600160a01b031633036101de576107fc7f61add8ab6aedaf5e8c15fd0f3b5dc7239de9517bae157dc6f09438d619959a5b936005546108b361ffff8616918210611b00565b805f52600660205260405f206001600160401b036108d086611b35565b165f5260205260405f2060208501906001600160401b036108f083611b35565b165f52602052600560405f200154915f52600660205260405f206001600160401b0361091b87611b35565b165f526020526001600160401b0361093660405f2092611b35565b165f5260205281600560405f20015560405194859485611b49565b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b03811633036109c6578115806109b3575b6109a4576001600160a01b031916175f55005b632b47857560e01b5f5260045ffd5b506001546001600160a01b031615610991565b637bfa4b9f60e01b5f5260045ffd5b3461011f57602036600319011261011f576109ee611177565b610a0161ffff6005549216918210611b00565b805f52600360205260405f20601360405191610a1c83611215565b610a25816114ff565b83520154602082019080825215610da7575142811015610d91575051610a4a81611b8d565b815f52600460205260405f209060ff81511682549061ff00602084015160081b169161ffff19161717825560408101516001830155606081015160028301556080810151600383015560a081015160048301556005820160c0820151151560ff801983541691161790556006820160e0820151908151916001600160401b0383116103d757602090610adc8484611e28565b01905f5260205f205f5b838110610d7d575050505060078201610100820151908151916001600160401b0383116103d757602090610b1a8484611e28565b01905f5260205f205f5b838110610d69575050505060088201610120820151908151916001600160401b0383116103d757602090610b588484611e28565b01905f5260205f205f5b838110610d55575050505060098201610140820151908151916001600160401b0383116103d757602090610b968484611e28565b01905f5260205f205f5b838110610d415750505050610160810151600a830155610180810151600b8301556101a0810151600c8301556101c0810151600d830155600e82016101e0820151908151916001600160401b0383116103d757602090610c008484611e28565b01905f5260205f205f5b838110610d2d5750505050600f8201610200820151908151916001600160401b0383116103d757602090610c3e8484611e28565b01905f5260205f205f5b838110610d195786866012610260886102208101516010850155610240810151601185015501519101555f5260036020525f601360408220828155826001820155826002820155826003820155826004820155826005820155610cad60068201611df8565b610cb960078201611df8565b610cc560088201611df8565b610cd160098201611df8565b82600a82015582600b82015582600c82015582600d820155610cf5600e8201611df8565b610d01600f8201611df8565b82601082015582601182015582601282015501555f80f35b600190602084519401938184015501610c48565b600190602084519401938184015501610c0a565b600190602084519401938184015501610ba0565b600190602084519401938184015501610b62565b600190602084519401938184015501610b24565b600190602084519401938184015501610ae6565b82636bfedefd60e11b5f5260045260245260445ffd5b8263193e674760e21b5f5260045260245ffd5b3461011f5736600319016060811261011f5760401361011f576020610de0604435611d61565b63ffffffff60405191168152f35b3461011f575f36600319011261011f576020600754604051908152f35b3461011f57602036600319011261011f576004356001600160401b03811161011f57610e3e610e4391369060040161130a565b611b8d565b005b3461011f575f36600319011261011f576001546040516001600160a01b039091168152602090f35b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b031633036109c6576bffffffffffffffffffffffff60a01b60015416176001555f80f35b3461011f5736600319016060811261011f5760401361011f5760443561ffff811680910361011f57610ef06117a3565b505f52600660205260405f206004356001600160401b038116810361011f57806001600160401b039150165f5260205260405f206024356001600160401b038116810361011f57806001600160401b039150165f5260205260e0610f5660405f20611881565b610f636040518092611199565bf35b3461011f57610f73366111ea565b6001549092906001600160a01b031633036101de576107fc7f35095f4ef942f9cb4170d9a93adc7fe9ebc8faf2df4a91b87b0dced92784718f93600554610fc061ffff8616918210611b00565b610fc984611b35565b610fd560208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600301805490839055905194859485611b49565b3461011f57602036600319011261011f5761ffff611032611177565b165f5260046020526101c060ff60405f20805490600181015460028201546003830154600484015486600586015416600a86015490600b87015492600c88015494600d8901549660108a015498601260118c01549b01549b60206040519e8f92818116845260081c1691015260408d015260608c015260808b015260a08a0152151560c089015260e08801526101008701526101208601526101408501526101608401526101808301526101a0820152f35b3461011f57604036600319011261011f5761110e611100611177565b611108611188565b906118ed565b6040518091602082016020835281518091526020604084019201905f5b818110611139575050500390f35b91935091602060e08261114f6001948851611199565b01940191019184939261112b565b3461011f575f36600319011261011f576020906002548152f35b6004359061ffff8216820361011f57565b6024359061ffff8216820361011f57565b60a060c09161ffff8151168452602081015160208501526001600160401b03602060408301518281511660408801520151166060850152606081015160808501526080810151828501520151910152565b600319016080811261011f5760401361011f5760049060443561ffff8116810361011f579060643590565b604081019081106001600160401b038211176103d757604052565b60c081019081106001600160401b038211176103d757604052565b61028081019081106001600160401b038211176103d757604052565b90601f801991011681019081106001600160401b038211176103d757604052565b359060ff8216820361011f57565b6001600160401b0381116103d75760051b60200190565b9080601f8301121561011f5781356112c481611296565b926112d26040519485611267565b81845260208085019260051b82010192831161011f57602001905b8282106112fa5750505090565b81358152602091820191016112ed565b9190916102808184031261011f57604051906113258261124b565b819361133082611288565b835261133e60208301611288565b602084015260408201356040840152606082013560608401526080820135608084015260a082013560a084015260c0820135801515810361011f5760c084015260e08201356001600160401b03811161011f578161139d9184016112ad565b60e08401526101008201356001600160401b03811161011f57816113c29184016112ad565b6101008401526101208201356001600160401b03811161011f57816113e89184016112ad565b6101208401526101408201356001600160401b03811161011f578161140e9184016112ad565b6101408401526101608201356101608401526101808201356101808401526101a08201356101a08401526101c08201356101c08401526101e08201356001600160401b03811161011f57816114649184016112ad565b6101e0840152610200820135916001600160401b03831161011f576114906102609392849383016112ad565b6102008501526102208101356102208501526102408101356102408501520135910152565b90604051918281549182825260208201905f5260205f20925f5b8181106114e65750506114e492500383611267565b565b84548352600194850194879450602090930192016114cf565b9060405161150c8161124b565b6102606012829460ff8154818116865260081c166020850152600181015460408501526002810154606085015260038101546080850152600481015460a085015260ff600582015416151560c0850152611568600682016114b5565b60e0850152611579600782016114b5565b61010085015261158b600882016114b5565b61012085015261159d600982016114b5565b610140850152600a810154610160850152600b810154610180850152600c8101546101a0850152600d8101546101c08501526115db600e82016114b5565b6101e08501526115ed600f82016114b5565b610200850152601081015461022085015260118101546102408501520154910152565b90602080835192838152019201905f5b81811061162d5750505090565b8251845260209384019390920191600101611620565b9060ff825116815260ff602083015116602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c0820151151560c08201526102608061174e61173a6116f66116e26116ce6116ba60e08a015161028060e08b01526102808a0190611610565b6101008a01518982036101008b0152611610565b6101208901518882036101208a0152611610565b610140880151878203610140890152611610565b6101608701516101608701526101808701516101808701526101a08701516101a08701526101c08701516101c08701526101e08701518682036101e0880152611610565b610200860151858203610200870152611610565b93610220810151610220850152610240810151610240850152015191015290565b35906001600160401b038216820361011f57565b61ffff1661ffff81146103b05760010190565b919082018092116103b057565b604051906117b082611230565b5f60a0838281528260208201526040516117c981611215565b83815283602082015260408201528260608201528260808201520152565b604051906117f6602083611267565b5f80835282815b82811061180957505050565b6020906118146117a3565b828285010152016117fd565b9061ffff8091169116039061ffff82116103b057565b5f1981146103b05760010190565b8054821015611859575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b80518210156118595760209160051b010190565b9060405161188e81611230565b60a06005829461ffff8154168452600181015460208501526040516118b281611215565b6001600160401b036002830154818116835260401c166020820152604085015260038101546060850152600481015460808501520154910152565b6005545f9290835b61ffff85168281101561192b576119259161191f915f526006602052600160405f20015490611796565b94611783565b936118f5565b5093509193909361ffff81169380851015611ae3578061ffff871611611af4575b5061ffff851694848610611ae35761ffff9161196c919693959496611820565b1661197681611296565b916119846040519384611267565b818352601f1961199383611296565b015f5b818110611ac05750505f905f945f5b61ffff811689811080611ab7575b15611aab575f52600660205260405f209460018601948554995f915b8b831080611aa2575b15611a85578581101580611a7c575b611a04575b6119f86119fe91611836565b92611836565b916119cf565b611a0e8389611844565b50546001600160401b0381166001600160401b03165f528960205260405f209060401c6001600160401b03166001600160401b03165f5260205260405f209a80611a5790611836565b9b611a6190611881565b611a6b828d61186d565b52611a76908b61186d565b506119ec565b508681106119e7565b9b9497509550509750611a9790611783565b9792969390976119a5565b50838b106119d8565b50949750505050505050565b508588106119b3565b602090611ad19896949793986117a3565b82828801015201969195929496611996565b505092505050611af16117e7565b90565b61ffff1694505f61194c565b15611b0757565b60405162461bcd60e51b815260206004820152600660248201526508585cdcd95d60d21b6044820152606490fd5b356001600160401b038116810361011f5790565b9094939261ffff6080936001600160401b03611b78602060a087019a83611b6f8261176f565b1688520161176f565b16602085015216604083015260608201520152565b606460ff82511611611d5257606460ff60208301511611611d4357670de0b6b3a764000060a082015111611d345761047661022082015111611d255761047661024082015111611d1657610260810151620f42408110908115611d09575b50611cfa5760e08101611bfe8151612108565b15611ceb57611c0d9051612180565b15611ceb576101208101611c218151612108565b15611cdc57611c309051612180565b15611cdc57611c436101008201516121b0565b15611ccd57611c566101408201516121b0565b15611cbe576101e0810161020081515192019182515103611caf57611c7b9051612108565b15611ca057611c8a90516121e4565b15611c9157565b637015a03b60e01b5f5260045ffd5b6329f7281b60e21b5f5260045ffd5b63bfa51ee360e01b5f5260045ffd5b635646ba3b60e11b5f5260045ffd5b630adc448560e21b5f5260045ffd5b630376a9ef60e31b5f5260045ffd5b6365c991a560e01b5f5260045ffd5b63adb838cd60e01b5f5260045ffd5b621e84809150115f611beb565b6328be116d60e21b5f5260045ffd5b63076eb25360e11b5f5260045ffd5b63cc15654960e01b5f5260045ffd5b632a7f863d60e21b5f5260045ffd5b6302f22cad60e61b5f5260045ffd5b6004356001600160401b038116810361011f57602435916001600160401b038316830361011f575f6001600160401b038060055494169416905b61ffff811684811015611dea57805f52600660205260405f20865f5260205260405f20835f52602052600160405f2001548414611de15750611ddc90611783565b611d9b565b94505050505090565b50505050505063ffffffff90565b8054905f815581611e07575050565b5f5260205f20908101905b818110611e1d575050565b5f8155600101611e12565b90600160401b81116103d757815491818155828210611e4657505050565b5f5260205f2091820191015b818110611e5d575050565b5f8155600101611e52565b906001600160401b038151166fffffffffffffffff00000000000000006020845493836001600160401b03198616178655015160401b16916fffffffffffffffffffffffffffffffff191617179055565b60405190611ec8602083611267565b5f80835282815b828110611edb57505050565b602090604051611eea8161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828501015201611ecf565b60055461ffff80831694939116808510156120fb578061ffff8316116120f3575b508361ffff8216106120e75761ffff91611fb691611820565b16611fc081611296565b92611fce6040519485611267565b818452601f19611fdd83611296565b015f5b8181106120465750505f5b61ffff811690838210156120405781830161ffff81116103b05761203b9261ffff61203592165f52600460205261202460405f206114ff565b61202e828a61186d565b528761186d565b50611783565b611feb565b50505050565b6020906040516120558161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828901015201611fe0565b50509050611af1611eb9565b90505f611f9d565b5050509050611af1611eb9565b8051905f908215801561216c575b612165575f915b83831061212d5750505050600190565b612137838361186d565b5190620f4240821161215c5781106121545760019092019161211d565b505050505f90565b50505050505f90565b5050505f90565b508051156118595760208101511515612116565b8051801515918261219057505090565b5f19820192509082116103b057620f4240916121ab9161186d565b511490565b8051905f90815b8383106121c75750505050600190565b6121d1838361186d565b51908110612154576001909201916121b7565b8051905f90620f423f5b8383106121fe5750505050600190565b612208838361186d565b51908111612154576001909201916121ee56fea26469706673582212201a0e5b061dbc5669db9937ab714356062c9af05eea7b1d4bb9eeaf0073ef81fe64736f6c634300081e0033"},"sourceId":"src/Registry.sol","sourcemap":"306:22119:16:-:0;;;;;;;;;;;;;-1:-1:-1;;306:22119:16;;;;-1:-1:-1;;;;;306:22119:16;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;306:22119:16;;;;;;;;699:6;;306:22119;-1:-1:-1;306:22119:16;;-1:-1:-1;;;;;;306:22119:16;;;;;;;;;;;;;;;;;-1:-1:-1;306:22119:16;;;;;;-1:-1:-1;306:22119:16;;;;;-1:-1:-1;306:22119:16","userdoc":{"errors":{"ChainAlreadyExists()":[{"notice":"Reverts if adding a chain to an asset that already exists."}],"IndexOutOfBounds()":[{"notice":"Reverts if the asset index is out of bounds."}],"InvalidBufferMultiple()":[{"notice":"Reverts if the buffer multiple value is less than 1% or greater than 2%."}],"InvalidCollateralFactor()":[{"notice":"Reverts if the collateral factor (CF) specified as part of risk parameters is greater than one"}],"InvalidInitialMarginsClamps()":[{"notice":"Reverts if the initial margin clamps specified as part of risk parameters are not increasing or are above 100"}],"InvalidInitialMarginsConfiguration()":[{"notice":"Reverts if the size of the initial margin clamps does not match the size of the initial margin factors (specified as part of risk parameters)"}],"InvalidInitialMarginsFactors()":[{"notice":"Reverts if the initial margin clamps specified as part of risk parameters are not decreasing or are above 100"}],"InvalidInterestKinks()":[{"notice":"Reverts if the interest kinks specified as part of risk parameters are not increasing from 0 to 1"}],"InvalidLiabilityFactor()":[{"notice":"Reverts if the liability factor (LF) specified as part of risk parameters is greater than one"}],"InvalidMaxFundingRate()":[{"notice":"Reverts if the funding rate cap specified as part of risk parameters is greater than ~1000% APR"}],"InvalidMaxUtilizationRate()":[{"notice":"Reverts if the utilization rate cap specified as part of risk parameters is greater than ~1000% APR"}],"InvalidRateInterestKinks()":[{"notice":"Reverts if the interest rates specified as part of risk parameters are not increasing"}],"InvalidUSDInterestKinks()":[{"notice":"Reverts if the USD-denominated interest kinks specified as part of risk parameters are not increasing from 0 to 1"}],"InvalidUSDRateInterestKinks()":[{"notice":"Reverts if the USD-denominated interest rates specified as part of risk parameters are not increasing"}],"InvalidUtilizationCap()":[{"notice":"Reverts if the utilization cap specified as part of risk parameters is greater than one"}],"NoPendingRiskParameters(uint16)":[{"notice":"Reverts if there is are no risk parameters queued for the specified asset"}],"NotAdmin()":[{"notice":"Reverts if caller is not the admin."}],"NotRiskManager()":[{"notice":"Reverts if caller is not the risk manager multisig."}],"RiskManagerNotSet()":[{"notice":"Reverts if the risk manager is not set."}],"TooSoon(uint16,uint256)":[{"notice":"Reverts if the pending risk parameters are not yet eligible for application"}],"ZeroAddress()":[{"notice":"Reverts if an address is zero."}]},"events":{"Max1HrDepositChanged((uint64,uint64),uint16,uint256,uint256)":{"notice":"Signals that the maximum hourly deposit has changed for a given asset"},"MaxDepositChanged((uint64,uint64),uint16,uint256,uint256)":{"notice":"Signals that the maximum deposit has changed for a given asset"},"MinWeightChanged((uint64,uint64),uint16,uint256,uint256)":{"notice":"Signals that the minimum weight has changed for a given asset"}},"kind":"user","methods":{"admin()":{"notice":"Address of the admin; primarily used for initial setup."},"applyPendingRiskParameters(uint16)":{"notice":"Applies the pending risk parameters for the specified asset if they exist."},"constructor":{"notice":"Contract constructor."},"feeAccount()":{"notice":"Account for receiving fees and paying rewards."},"getAssetData((uint64,uint64),uint16)":{"notice":"Retrieves asset data for a specific asset and chain."},"getAssetIndex((uint64,uint64),bytes32)":{"notice":"Returns the asset index for a given chain and address."},"getAssets(uint16,uint16)":{"notice":"Returns all registered asset data across all chains."},"getRiskParameters(uint16,uint16)":{"notice":"Returns the full list of risk parameters for all registered assets."},"pendingRiskParameters(uint16)":{"notice":"Mapping of asset index to new risk parameters to be applied to the registry, but only after they become eligible"},"riskManagerMultisig()":{"notice":"Multisig wallet address responsible for managing risk-related configurations."},"riskParameterChangeDelaySeconds()":{"notice":"Number of seconds to wait before new risk parameters become effective"},"riskParameters(uint16)":{"notice":"Mapping of asset index to associated risk parameters."},"setAdmin(address)":{"notice":"Updates the admin address."},"setAssetData((uint16,bytes32,(uint64,uint64),uint256,uint256,uint256))":{"notice":"Sets or updates asset data for a specific asset index and chain."},"setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":{"notice":"Sets pending risk parameters for a specific asset index."},"setRiskManagerMultisig(address)":{"notice":"Updates the risk manager multisig address."}},"notice":"Central registry for managing assets and associated risk parameters across multiple chains.","version":1}},"Settler":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onAtomicSettlement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"contractName":"Settler","deploymentBytecode":{"bytecode":"0x6080806040523460135760c0908160188239f35b5f80fdfe60808060405260043610156011575f80fd5b5f3560e01c633f1d584e146023575f80fd5b3460865760603660031901126086576004356001600160a01b0381160360865760443567ffffffffffffffff811160865736602382011215608657806004013567ffffffffffffffff81116086573691016024011160865780620f424060209252f35b5f80fdfea2646970667358221220a8714c703f33fadc15c70b5e85fe4339baf5c2eadde619da4d23e7a4d23416e264736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"onAtomicSettlement(address,uint256,bytes)":"0x3f1d584e"},"runtimeBytecode":{"bytecode":"0x60808060405260043610156011575f80fd5b5f3560e01c633f1d584e146023575f80fd5b3460865760603660031901126086576004356001600160a01b0381160360865760443567ffffffffffffffff811160865736602382011215608657806004013567ffffffffffffffff81116086573691016024011160865780620f424060209252f35b5f80fdfea2646970667358221220a8714c703f33fadc15c70b5e85fe4339baf5c2eadde619da4d23e7a4d23416e264736f6c634300081e0033"},"sourceId":"src/Settler.sol","sourcemap":"59:173:0:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}},"SigTest":{"abi":[{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"check","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"contractName":"SigTest","deploymentBytecode":{"bytecode":"0x608080604052346015576101c9908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c63197ff59b14610024575f80fd5b346100a35760603660031901126100a3576004356001600160a01b03811681036100a35760443567ffffffffffffffff81116100a357366023820112156100a357806004013567ffffffffffffffff81116100a35736602482840101116100a3576020926024610099930190602435906100a7565b6040519015158152f35b5f80fd5b92939290915f906001600160a01b0383161561018a576040519160048301602484019560448501916064860193873b156101115750936064938a80948a9b9c9460209b9a9998630b135d3f60e11b8a525260408a52523701915afa9051630b135d3f60e11b141690565b99935050939550508060401461015e5760411461012e5750505050565b60408092939496508101355f1a60205281375b5f526020600160805f825afa511860601b3d11915f606052604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b031660605291935090610141565b505f945050505056fea26469706673582212208a106949f349498c2239c8e95c70bad1b3b3e62a5294423000b592793b14c09564736f6c634300081c0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"check(address,bytes32,bytes)":"0x197ff59b"},"runtimeBytecode":{"bytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c63197ff59b14610024575f80fd5b346100a35760603660031901126100a3576004356001600160a01b03811681036100a35760443567ffffffffffffffff81116100a357366023820112156100a357806004013567ffffffffffffffff81116100a35736602482840101116100a3576020926024610099930190602435906100a7565b6040519015158152f35b5f80fd5b92939290915f906001600160a01b0383161561018a576040519160048301602484019560448501916064860193873b156101115750936064938a80948a9b9c9460209b9a9998630b135d3f60e11b8a525260408a52523701915afa9051630b135d3f60e11b141690565b99935050939550508060401461015e5760411461012e5750505050565b60408092939496508101355f1a60205281375b5f526020600160805f825afa511860601b3d11915f606052604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b031660605291935090610141565b505f945050505056fea26469706673582212208a106949f349498c2239c8e95c70bad1b3b3e62a5294423000b592793b14c09564736f6c634300081c0033"},"sourceId":"src/SigTest.sol","sourcemap":"140:221:1:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}},"SignatureTest":{"abi":[{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct SignatureTest.Settlement","name":"order","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"name":"getSettlementPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getSigningAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct SignatureTest.Withdrawal","name":"withdrawal","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes32","name":"epochHash","type":"bytes32"}],"name":"getWithdrawalPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"}],"contractName":"SignatureTest","deploymentBytecode":{"bytecode":"0x608080604052346015576103e4908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c908163035563461461025e5750806336116c161461018b5780637438b937146101735780639e5c3980146100735763f698da2514610053575f80fd5b3461006f575f36600319011261006f5760205f54604051908152f35b5f80fd5b3461006f573660031901610100811261006f5760a01361006f5760c43567ffffffffffffffff811680910361006f575f546bffffffffffffffffffffffff196100ba610362565b60601b16916044356001600160a01b038116810361006f5761016f93604051937fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208601526040850152606084015260243560808401526bffffffffffffffffffffffff199060601b1660a083015260643560c083015260a43560e083015261010082015260843561012082015260e435610140820152610140815261016361016082610378565b60405191829182610338565b0390f35b3461006f57602036600319011261006f576004355f55005b3461006f57366003190160e0811261006f5760601361006f576084356001600160a01b038116810361006f575f5461016f916bffffffffffffffffffffffff196101d3610362565b60601b16604051927f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba602085015260408401526060830152602435608083015260643560a083015260443560c083015260a43560e083015260c4356101008301526bffffffffffffffffffffffff199060601b16610120820152610120815261016361014082610378565b3461006f57604036600319011261006f576004356024359167ffffffffffffffff831161006f573660238401121561006f5782600401359167ffffffffffffffff831161006f5760248401366024858701011161006f576020945f9480604014610310576041146102e057505050505b6040516001600160a01b039091168152f35b604092939450606401355f1a855281375b5f5281604060805f60015afa505f6060523d60601851906040526102ce565b506044013560ff81901c601b01865290356040526001600160ff1b03166060529091506102f1565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b6004356001600160a01b038116810361006f5790565b90601f8019910116810190811067ffffffffffffffff82111761039a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a2f355b36c760bb58250919fd43010925bdca95acc99830f86f5bc7e95898c4064736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"domainSeparator()":"0xf698da25","getSettlementPayload((address,uint256,address,uint256,uint256),bytes32,uint64,uint256)":"0x9e5c3980","getSigningAddress(bytes32,bytes)":"0x03556346","getWithdrawalPayload((address,uint256,uint256),bytes32,address,uint256,bytes32)":"0x36116c16","setDomainSeparator(bytes32)":"0x7438b937"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f3560e01c908163035563461461025e5750806336116c161461018b5780637438b937146101735780639e5c3980146100735763f698da2514610053575f80fd5b3461006f575f36600319011261006f5760205f54604051908152f35b5f80fd5b3461006f573660031901610100811261006f5760a01361006f5760c43567ffffffffffffffff811680910361006f575f546bffffffffffffffffffffffff196100ba610362565b60601b16916044356001600160a01b038116810361006f5761016f93604051937fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208601526040850152606084015260243560808401526bffffffffffffffffffffffff199060601b1660a083015260643560c083015260a43560e083015261010082015260843561012082015260e435610140820152610140815261016361016082610378565b60405191829182610338565b0390f35b3461006f57602036600319011261006f576004355f55005b3461006f57366003190160e0811261006f5760601361006f576084356001600160a01b038116810361006f575f5461016f916bffffffffffffffffffffffff196101d3610362565b60601b16604051927f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba602085015260408401526060830152602435608083015260643560a083015260443560c083015260a43560e083015260c4356101008301526bffffffffffffffffffffffff199060601b16610120820152610120815261016361014082610378565b3461006f57604036600319011261006f576004356024359167ffffffffffffffff831161006f573660238401121561006f5782600401359167ffffffffffffffff831161006f5760248401366024858701011161006f576020945f9480604014610310576041146102e057505050505b6040516001600160a01b039091168152f35b604092939450606401355f1a855281375b5f5281604060805f60015afa505f6060523d60601851906040526102ce565b506044013560ff81901c601b01865290356040526001600160ff1b03166060529091506102f1565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b6004356001600160a01b038116810361006f5790565b90601f8019910116810190811067ffffffffffffffff82111761039a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a2f355b36c760bb58250919fd43010925bdca95acc99830f86f5bc7e95898c4064736f6c634300081e0033"},"sourceId":"src/SignatureTest.sol","sourcemap":"112:2016:17:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}}},"manifest":"ethpm/3","sources":{"src/Checkpointer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {EfficientHashLib} from \"solady/utils/EfficientHashLib.sol\";\nimport {SignatureCheckerLib} from \"solady/utils/SignatureCheckerLib.sol\";\n\n/**\n * @title Checkpointer\n * @notice Tracks and validates state root checkpoints using EIP-712 signatures from admin and leader nodes.\n * @dev Designed for use in DStack-like distributed settlement systems.\n */\ncontract Checkpointer {\n /**\n * @notice Address with the authority to set initial parameters.\n * @dev Should be set to the DStack app shared secret public key.\n */\n address public admin;\n\n /**\n * @notice Public key of the current designated leader node.\n * @dev Leader is responsible for signing and submitting new checkpoints.\n */\n address public leader;\n\n /**\n * @notice Gnosis Safe address used as the council multisig.\n * @dev Can rotate the leader and self.\n */\n address public councilMultisig;\n\n /**\n * @notice Monotonically increasing nonce for checkpoint submissions.\n * @dev Used to prevent replay attacks and enforce checkpoint ordering.\n */\n uint256 public stateRootNonce;\n\n /// @notice Typehash used for EIP-712 encoding of the Checkpoint struct.\n bytes32 public constant CHECKPOINT_TYPEHASH =\n keccak256(\"Checkpoint(uint256 nonce,uint8[] stateRoot,string[] approvedWithdrawals)\");\n\n /**\n * @notice Emitted when a new list of approved withdrawals is recorded in a checkpoint.\n * @param approvedWithdrawals List of withdrawal IDs approved in the checkpoint.\n */\n event Withdrawals(string[] approvedWithdrawals);\n\n /// @notice Cached domain separator for EIP-712 signature verification.\n bytes32 internal _domainSeparator;\n\n /**\n * @notice The current state root, encoded as a serialized vector.\n * @dev Serialized as `(user, eth_balance, usdc_balance, deposit_nonce, is_mm)` tuples.\n * In production, this may store multiple roots and rotate.\n */\n uint8[] public stateRoot;\n\n /// @notice Reverts if caller is not the admin.\n error NotAdmin();\n\n /// @notice Reverts if a value has already been set.\n error AlreadySet();\n\n /// @notice Reverts if caller is not the current council multisig.\n error NotCouncilMultisig();\n\n /// @notice Reverts if a signature does not match the expected signer or payload.\n error InvalidSignature();\n\n /**\n * @notice Contract constructor.\n * @dev Sets the deployer as the initial admin.\n */\n constructor() {\n admin = msg.sender;\n }\n\n /**\n * @notice Sets the EIP-712 domain separator used for verifying signatures.\n * @param domainSeparator The domain separator to store.\n */\n function setDomainSeparator(bytes32 domainSeparator) external {\n if (msg.sender != admin) revert NotAdmin();\n if (_domainSeparator != 0) revert AlreadySet();\n _domainSeparator = domainSeparator;\n }\n\n /**\n * @notice Transfers admin control to a new address.\n * @param newAdmin The new admin address.\n */\n function setAdmin(address newAdmin) external {\n if (msg.sender != admin) revert NotAdmin();\n require(newAdmin != address(0));\n admin = newAdmin;\n }\n\n /**\n * @notice Sets the initial council multisig address.\n * @param newCouncilMultisig The council's Gnosis Safe address.\n */\n function setInitialCouncilMultisig(address newCouncilMultisig) external {\n if (msg.sender != admin) revert NotAdmin();\n if (councilMultisig != address(0)) revert AlreadySet();\n councilMultisig = newCouncilMultisig;\n }\n\n /**\n * @notice Allows the current council to rotate itself to a new address.\n * @param newCouncilMultisig The new multisig address.\n */\n function setNewCouncilMultisig(address newCouncilMultisig) external {\n if (msg.sender != councilMultisig) revert NotCouncilMultisig();\n councilMultisig = newCouncilMultisig;\n }\n\n /**\n * @notice Sets the leader node address.\n * @dev This should be reviewed depending on the leader rotation mechanism.\n * @param newLeader The address of the new leader node.\n */\n function setLeader(address newLeader) external {\n if (msg.sender != councilMultisig) revert NotCouncilMultisig();\n leader = newLeader;\n }\n\n /**\n * @notice Checkpoint submitted by a node to update the system state.\n * @dev Requires valid EIP-712 signatures from both admin and leader.\n * @param sharedSignature Signature by the admin.\n * @param leaderSignature Signature by the leader.\n * @param _checkpoint The checkpoint payload to commit.\n */\n function checkpoint(\n bytes calldata sharedSignature,\n bytes calldata leaderSignature,\n Checkpoint calldata _checkpoint\n ) external {\n require(_checkpoint.nonce == stateRootNonce); // dev: Nonce mismatch\n\n // Compute the EIP-712 struct hash.\n bytes32 structHash = EfficientHashLib.hash(\n abi.encode(\n CHECKPOINT_TYPEHASH,\n _checkpoint.nonce,\n EfficientHashLib.hash(abi.encodePacked(_checkpoint.stateRoot)),\n hashStringArray(_checkpoint.approvedWithdrawals)\n )\n );\n\n // Check both admin and leader signatures.\n bytes32 digest =\n EfficientHashLib.hash(abi.encodePacked(\"\\x19\\x01\", _domainSeparator, structHash));\n\n if (!SignatureCheckerLib.isValidSignatureNow(admin, digest, sharedSignature)) {\n revert InvalidSignature();\n }\n\n if (!SignatureCheckerLib.isValidSignatureNow(leader, digest, leaderSignature)) {\n revert InvalidSignature();\n }\n\n stateRootNonce++;\n stateRoot = _checkpoint.stateRoot;\n\n emit Withdrawals(_checkpoint.approvedWithdrawals);\n }\n\n /**\n * @notice Internal helper for hashing an array of strings.\n * @dev Each string is hashed individually and packed before final hashing.\n * @param arr The array of strings to hash.\n * @return A single keccak256 hash of the packed array of hashed strings.\n */\n function hashStringArray(string[] memory arr) internal pure returns (bytes32) {\n bytes32[] memory hashedStrings = new bytes32[](arr.length);\n for (uint256 i = 0; i < arr.length; i++) {\n hashedStrings[i] = EfficientHashLib.hash(bytes(arr[i]));\n }\n return EfficientHashLib.hash(abi.encodePacked(hashedStrings));\n }\n\n /**\n * @notice Struct defining a checkpoint message.\n * @dev Checkpoints include the current state root, a nonce, and a list of approved withdrawals.\n */\n struct Checkpoint {\n uint256 nonce;\n uint8[] stateRoot;\n string[] approvedWithdrawals;\n }\n}\n","urls":[]},"src/CredentialManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {SignatureCheckerLib} from \"solady/utils/SignatureCheckerLib.sol\";\nimport {EfficientHashLib} from \"solady/utils/EfficientHashLib.sol\";\nimport {IAdminUpdateStrategy} from \"./interfaces/IAdminUpdateStrategy.sol\";\nimport {IAutomataDcapAttestation} from \"./interfaces/IAutomataDcapAttestation.sol\";\n\n/// @title CredentialManager\n/// @notice The centralized Root of Trust for the TEE Clearing Engine.\n/// @dev This contract acts as the governance layer and the vault registry. It manages the\n/// set of authorized operators, enforces quorum consensus for critical updates, and\n/// maintains the registry of deposit vaults across different chains.\n/// It combines immediate multi-sig actions for operational tasks with timelocked\n/// actions for high-risk configuration changes.\ncontract CredentialManager {\n using SignatureCheckerLib for address;\n\n // =============================================================\n // STRUCTS\n // =============================================================\n\n /// @notice Configuration for a specific chain/vault.\n struct ChainConfig {\n uint64 blockTimeMs;\n // Confs\n uint8 defaultConfirmations;\n uint8 depositIngestConfirmations;\n uint8 withdrawalIngestConfirmations;\n uint8 settlementIngestConfirmations;\n }\n\n /// @notice Represents a deposit vault deployed on a specific chain.\n /// @dev Addresses are stored as bytes32 to support non-EVM chains (e.g., Solana, SVM).\n struct Vault {\n uint8 routingId;\n uint256 vmId; // ChainId for EVM chains.\n /// @notice The address of the vault on that chain (left-aligned or native format).\n bytes32 vaultAddress;\n ChainConfig config;\n }\n\n /// @notice Tracks the lifecycle state of a timelocked operation.\n struct TimelockOp {\n /// @notice The timestamp (seconds since unix epoch) after which the operation can be executed.\n uint64 eta;\n /// @notice True if the operation has already been executed.\n bool executed;\n /// @notice True if the operation was explicitly canceled by the operators.\n bool canceled;\n /// @notice The type hash of the operation (e.g., OP_SET_RISK_MANAGER) for verification.\n bytes32 opType;\n }\n\n /// @notice Defines the expected state of the TEE software.\n struct MeasurementProfile {\n bool active; // Is this profile currently allowed?\n bytes32 mrtd; // Mandatory (Code Identity)\n bytes32 rtmr0; // Optional (Set to 0 to skip check)\n bytes32 rtmr1; // Optional\n bytes32 rtmr2; // Optional\n bytes32 rtmr3; // Optional\n }\n\n struct RestartCandidate {\n address leader;\n uint256 epoch;\n bytes32 checkpointHash;\n bool exists;\n }\n\n // =============================================================\n // ERRORS\n // =============================================================\n\n /// @notice Thrown when a signature belongs to an address that is not a registered operator.\n /// @param signer The address recovered from the signature.\n error NotOperator(address signer);\n\n /// @notice Thrown when the provided signatures are not sorted by signer address or contain duplicates.\n /// @dev Signatures must be sorted strictly ascending (A < B) to prevent duplicate counting in O(N).\n error SignersNotSortedOrUnique();\n\n /// @notice Thrown when the number of valid signatures provided is less than the required threshold.\n /// @param provided The number of signatures provided.\n /// @param required The current `quorumThreshold` required.\n error InsufficientSignatures(uint256 provided, uint256 required);\n\n /// @notice Thrown when attempting to set a quorum threshold that is 0 or greater than the total operators.\n /// @param newQuorum The proposed threshold.\n /// @param operatorCount The total number of registered operators.\n error InvalidQuorum(uint256 newQuorum, uint256 operatorCount);\n\n /// @notice Thrown when attempting to execute a timelock before the delay has elapsed.\n /// @param opId The unique hash of the operation.\n /// @param readyAt The timestamp when the operation becomes executable.\n /// @param nowTs The current block timestamp.\n error TimelockNotReady(bytes32 opId, uint256 readyAt, uint256 nowTs);\n\n /// @notice Thrown when attempting to act on a timelock ID that does not exist or was never scheduled.\n /// @param opId The operation hash.\n error TimelockUnknown(bytes32 opId);\n\n /// @notice Thrown when attempting to execute or schedule an operation that has already been executed.\n /// @param opId The operation hash.\n error TimelockAlreadyExecuted(bytes32 opId);\n\n /// @notice Thrown when attempting to execute or cancel an operation that has already been canceled.\n /// @param opId The operation hash.\n error TimelockAlreadyCanceled(bytes32 opId);\n\n /// @notice Thrown when a timelock delay is set to 0 (invalid safety margin).\n /// @param delay The provided delay in seconds.\n error InvalidDelay(uint256 delay);\n\n /// @notice Thrown when attempting to cancel an operation that cannot be canceled (e.g., already executed).\n error CannotCancel();\n\n /// @notice Thrown when a critical configuration address (e.g., Risk Manager) is set to address(0).\n error ZeroAddress();\n\n /// @notice Thrown when a Vault address is empty (bytes32(0)).\n error InvalidVaultAddr();\n\n /// @notice Thrown when attempting to register a strategy for a chain that already has one.\n error StrategyAlreadyExists();\n\n /// @notice Thrown when attempting to update vault admins on a chain that has no registered strategy.\n error NoStrategy();\n\n /// @notice Thrown when a requested vault cannot be found for the specified chain.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n error VaultNotFound(uint256 routingId, uint256 vmId);\n\n /// @notice Thrown when the measured TEE state does not match the expected state.\n error MeasurementMismatch(bytes32 expected, bytes32 actual, string field);\n\n /// @notice Thrown when the ZK Proof attesting measurements is invalid.\n error InvalidZkProof();\n\n /// @notice Thrown when the supplied epoch is invalid\n error InvalidEpoch(uint256 expected, uint256 actual);\n /// @notice Thrown when a Quote ReportData does not match params.\n error InvalidReportData();\n /// @notice Thrown when a Quote length is invalid.\n error InvalidQuoteLength();\n /// @notice Thrown when a Quote verifier is invalid.\n error InvalidVerifier();\n /// @notice Thrown when the used profile is not active.\n error ProfileInactive(uint256 profileId);\n /// @notice Thrown when the used profile does not exist.\n error InvalidProfileId();\n /// @notice Thrown when the used profile is configured incorrectly.\n error InvalidProfileConfig();\n\n // Certificate gathering errors\n error GatheringActive();\n error GatheringNotActive();\n error GatheringNotExpired();\n error AmbiguousState();\n error NoCandidate();\n error ProposedEpochTooLow(uint256 current, uint256 proposed);\n\n // =============================================================\n // CONSTANTS & TYPEHASHES\n // =============================================================\n\n /// @dev EIP-712 Domain Separator typehash.\n bytes32 private constant _EIP712_DOMAIN_TYPEHASH = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n\n /// @dev EIP-712 name hash for this contract.\n bytes32 private constant _NAME_HASH = keccak256(\"CredentialManager\");\n\n /// @dev EIP-712 version hash.\n bytes32 private constant _VERSION_HASH = keccak256(\"1\");\n\n /// @dev Generic Action typehash used for all governance signatures.\n /// Structure: Action(bytes32 opType, bytes32 paramsHash, uint256 nonce)\n bytes32 private constant _ACTION_TYPEHASH =\n keccak256(\"Action(bytes32 opType,bytes32 paramsHash,uint256 nonce)\");\n\n /// @dev Used for appointing a leader in the absence of a leader - for bootstrap or emergency recovery.\n bytes32 public constant OP_APPOINT_LEADER = keccak256(\"OP_APPOINT_LEADER\");\n\n // --- Operation Types (for Signature Verification) ---\n\n // Immediate Actions (Executed immediately upon valid quorum)\n bytes32 public constant OP_SET_QUORUM = keccak256(\"OP_SET_QUORUM\");\n bytes32 public constant OP_ADD_VAULT = keccak256(\"OP_ADD_VAULT\");\n bytes32 public constant OP_REGISTER_STRATEGY = keccak256(\"OP_REGISTER_ADMIN_UPDATE_STRATEGY\");\n bytes32 public constant OP_SET_VAULT_ADMINS = keccak256(\"OP_SET_DEPOSIT_VAULT_ADMINS\");\n bytes32 public constant OP_CANCEL_TIMELOCK = keccak256(\"OP_CANCEL_TIMELOCK\");\n bytes32 public constant OP_WITHDRAW = keccak256(\"OP_WITHDRAW\");\n\n // Timelocked Actions (Scheduled first, executed later)\n bytes32 public constant OP_SET_RISK_MANAGER = keccak256(\"OP_SET_RISK_MANAGER\");\n bytes32 public constant OP_SET_REGISTRY = keccak256(\"OP_SET_REGISTRY\");\n bytes32 public constant OP_SET_MEASUREMENTS = keccak256(\"OP_SET_MEASUREMENTS\");\n bytes32 public constant OP_SET_DELAY = keccak256(\"OP_SET_DELAY\");\n bytes32 public constant OP_MANAGE_PROFILE = keccak256(\"OP_MANAGE_PROFILE\");\n\n // Restarts\n bytes32 public constant OP_RESTART = keccak256(\"OP_RESTART\");\n bytes32 public constant OP_SET_AUTOMATA_VERIFIER = keccak256(\"OP_SET_AUTOMATA_VERIFIER\");\n\n // Certificate gathering\n uint256 public constant GATHERING_DURATION = 1 hours;\n\n // =============================================================\n // STORAGE\n // =============================================================\n\n // --- Governance State ---\n\n /// @notice TEMP Admin path, to be revised later.\n address public admin;\n\n /// @notice The list of authorized Clearing Engine operator addresses (EOAs).\n /// @dev These keys form the root of trust for the system.\n address[] public operators;\n\n /// @notice Lookup to check if an address is an operator.\n mapping(address => bool) public isOperator;\n\n /// @notice The minimum number of signatures required to execute a governance action.\n uint256 public quorumThreshold;\n\n /// @notice A monotonically increasing nonce for governance actions.\n /// @dev Included in every signed hash to strictly order operations and prevent replay attacks.\n uint256 public governanceNonce;\n\n /// @notice Maps Operator (EOA) -> Attested Key (TEE Address).\n /// @dev Used to verify that a TEE signature belongs to a specific operator.\n mapping(address => bytes32) public operatorToAttestedKey;\n\n /// @notice The current active leader (Operator Address).\n /// @dev The leader is responsible for coordinating the clearing engine.\n address public leader;\n\n // --- Execution State (Vault Registry) ---\n\n /// @notice The registry of all authorized Deposit Vaults.\n /// @dev This list is strictly append-only; vaults cannot be removed to prevent history modification.\n Vault[] public vaults;\n\n /// @notice Maps a RoutingID to the VMID to the Strategy Contract responsible for sending messages to it.\n /// @dev Used to abstract cross-chain messaging logic (e.g., LayerZero, Optimism Messenger).\n mapping(uint256 => mapping(uint256 => IAdminUpdateStrategy)) public adminUpdateStrategies;\n\n // --- Configuration ---\n\n /// @notice The address of the Risk Manager (or multisig) authorized to adjust risk parameters.\n address public riskManager;\n\n /// @notice The address of the global Registry Contract used for asset/settler configurations.\n address public registryContract;\n\n // --- Timelock State ---\n\n /// @notice Configuration mapping for how long specific operations must be delayed.\n /// @dev e.g., OP_SET_REGISTRY -> 72 hours.\n mapping(bytes32 => uint256) public timelockDelayFor;\n\n /// @notice Stores the status of individual scheduled operations by their hash ID.\n mapping(bytes32 => TimelockOp) public timelockOps;\n\n // --- TDX measurements ---\n\n /// @notice The current \"Gold Image\" measurements required for valid Quotes. Matches based on profile.\n mapping(uint256 => MeasurementProfile) public measurementProfiles;\n uint256 public nextProfileId = 1;\n\n // --- Restarts ---\n\n /// @notice Tracks the logical era of the TEE state to prevent replay attacks.\n /// @dev Incremented on every successful restart.\n uint256 public epoch;\n\n /// @notice The hash of the system state (inventory) associated with the current epoch.\n /// @dev New nodes verify this hash against the leader's data to ensure they are on the correct fork.\n bytes32 public latestCheckpointHash;\n\n // ZK Verifier Contract (Automata)\n IAutomataDcapAttestation public automataVerifier;\n\n // --- Certificate gathering ---\n uint256 public restartGatheringDeadline; // 0 = Inactive, >0 = Active\n RestartCandidate public bestCandidate;\n bool public isRestartAmbiguous;\n\n // =============================================================\n // EVENTS\n // =============================================================\n\n /// @notice Emitted when a new operator is added during initialization.\n event OperatorAdded(address indexed operator);\n\n /// @notice Emitted when the signature threshold is updated.\n event QuorumThresholdUpdated(uint256 oldThreshold, uint256 newThreshold);\n\n /// @notice Emitted when a new vault is added to the registry.\n event VaultAdded(\n uint256 indexed routingId, uint256 indexed vmId, bytes32 vaultAddr, ChainConfig config\n );\n\n /// @notice Emitted when a new cross-chain strategy is registered.\n event DepositVaultAdministratorsUpdated(\n uint256 indexed routingId,\n uint256 indexed vmId,\n address[] newAdministrators,\n uint256 newWithdrawalQuorum\n );\n\n /// @notice Emitted when the admin set of a remote vault is updated.\n event DepositVaultAdministratorsUpdated(\n uint256 indexed chainId, address[] newAdministrators, uint256 newWithdrawalQuorum\n );\n\n /// @notice Emitted when a new cross-chain strategy is registered.\n event AdminUpdateStrategyRegistered(\n uint256 indexed routingId, uint256 indexed vmId, address strategy\n );\n\n /// @notice Emitted when a new attested key for an operator is registered.\n event AttestedKeyRegistered(address indexed operator, bytes32 indexed newAttestedKey);\n\n /// @notice Emitted when the quorum leader is updated.\n event LeaderUpdated(address indexed newLeader, bytes32 indexed newAttestedKey);\n\n // Timelock Events\n event OperationScheduled(bytes32 indexed opId, bytes32 indexed opType, uint256 eta);\n event OperationExecuted(bytes32 indexed opId, bytes32 indexed opType);\n event OperationCanceled(bytes32 indexed opId, bytes32 indexed opType);\n\n event RiskManagerUpdated(address indexed oldRiskManager, address indexed newRiskManager);\n event RegistryUpdated(address indexed oldRegistry, address indexed newRegistry);\n event TimelockDelayUpdated(bytes32 indexed targetOpType, uint256 oldDelay, uint256 newDelay);\n\n // Measurement & Restart Events\n /// @notice Emitted when the measurements are updated.\n event MeasurementsUpdated(bytes32 newMrtd, bytes32 newRtmr0);\n event MeasurementProfileUpdated(uint256 indexed profileId, bool active);\n event EpochIncremented(uint256 newEpoch, bytes32 newCheckpointHash);\n event RestartExecuted(address indexed newLeader, uint256 indexed epoch);\n event AutomataVerifierUpdated(address indexed oldVerifier, address indexed newVerifier);\n\n // Certificate gathering events\n event RestartGatheringStarted(uint256 deadline);\n event RestartCandidateSubmitted(address indexed leader, uint256 epoch, bytes32 checkpointHash);\n event RestartAmbiguityDetected(uint256 epoch, bytes32 hash1, bytes32 hash2);\n\n // =============================================================\n // INITIALIZATION\n // =============================================================\n\n /// @notice Initializes the Credential Manager with the initial operator set and configuration.\n /// @param initialOperators The list of addresses that will form the initial governance council.\n /// @param initialQuorumThreshold The number of signatures required for valid governance actions.\n /// @param initialRiskManager The initial Risk Manager address.\n /// @param initialRegistryContract The initial Registry Contract address.\n constructor(\n address[] memory initialOperators,\n uint256 initialQuorumThreshold,\n address initialRiskManager,\n address initialRegistryContract,\n MeasurementProfile[] memory initialMeasurements,\n address initialAutomataVerifier\n ) {\n admin = msg.sender;\n\n if (initialRiskManager == address(0)) revert ZeroAddress();\n if (initialRegistryContract == address(0)) revert ZeroAddress();\n automataVerifier = IAutomataDcapAttestation(initialAutomataVerifier);\n\n _initOperators(initialOperators, initialQuorumThreshold);\n\n riskManager = initialRiskManager;\n registryContract = initialRegistryContract;\n // Start IDs at 1 so 0 can be used as a null/sentinel value\n nextProfileId = 1;\n\n for (uint256 i = 0; i < initialMeasurements.length; i++) {\n MeasurementProfile memory p = initialMeasurements[i];\n\n // Safety Check: Active profiles must have an MRTD\n if (p.active && p.mrtd == bytes32(0)) revert InvalidProfileConfig();\n\n measurementProfiles[nextProfileId] = p;\n emit MeasurementProfileUpdated(nextProfileId, p.active);\n nextProfileId++;\n }\n\n // Default Timelocks\n timelockDelayFor[OP_SET_RISK_MANAGER] = 48 hours;\n timelockDelayFor[OP_SET_REGISTRY] = 72 hours;\n timelockDelayFor[OP_MANAGE_PROFILE] = 7 days;\n timelockDelayFor[OP_SET_DELAY] = 7 days;\n }\n\n /// @dev Internal helper to process the operator list and set the threshold.\n function _initOperators(address[] memory initialOperators, uint256 initialQuorumThreshold)\n internal\n {\n uint256 n = initialOperators.length;\n if (n == 0) revert InvalidQuorum(initialQuorumThreshold, 0);\n if (initialQuorumThreshold == 0 || initialQuorumThreshold > n) {\n revert InvalidQuorum(initialQuorumThreshold, n);\n }\n\n for (uint256 i = 0; i < n; i++) {\n address op = initialOperators[i];\n if (op == address(0)) revert ZeroAddress();\n if (isOperator[op]) revert SignersNotSortedOrUnique();\n isOperator[op] = true;\n operators.push(op);\n emit OperatorAdded(op);\n }\n quorumThreshold = initialQuorumThreshold;\n emit QuorumThresholdUpdated(0, initialQuorumThreshold);\n }\n\n // =============================================================\n // QUORUM & KEYS\n // =============================================================\n\n /// @notice Allows an operator to register their TEE's attested key.\n /// @dev Maps the attested_pubkey of a new CE joining the quorum.\n /// @param newAttestedKey The address derived from the TEE's public key.\n function registerAttestedKey(bytes32 newAttestedKey) external {\n if (!isOperator[msg.sender]) revert NotOperator(msg.sender);\n if (newAttestedKey == bytes32(0)) revert ZeroAddress();\n\n operatorToAttestedKey[msg.sender] = newAttestedKey;\n emit AttestedKeyRegistered(msg.sender, newAttestedKey);\n }\n\n /// @notice Returns the full Council configuration.\n /// @dev Let's operators query for 'k, n' thresholds and the current council member list\".\n function getCouncilConfig()\n external\n view\n returns (address[] memory members, uint256 k, uint256 n)\n {\n return (operators, quorumThreshold, operators.length);\n }\n\n /// @notice Returns the current Leader's Operator Address and Attested Key.\n /// @dev When querying current leader, then the contract returns the active operator_pubkey and attested_pubkey.\n function getLeader() external view returns (address operator, bytes32 attestedKey) {\n return (leader, operatorToAttestedKey[leader]);\n }\n\n /// @dev Internal helper to update mappings.\n function _setAttestedKey(address op, bytes32 attKey) internal {\n operatorToAttestedKey[op] = attKey;\n emit AttestedKeyRegistered(op, attKey);\n }\n\n /// @dev Internal helper to rotate the leader for use in restarts.\n function _updateLeader(address newLeader) internal {\n if (!isOperator[newLeader]) revert NotOperator(newLeader);\n // Check bytes32 zero\n if (operatorToAttestedKey[newLeader] == bytes32(0)) revert ZeroAddress();\n leader = newLeader;\n\n emit LeaderUpdated(newLeader, operatorToAttestedKey[newLeader]);\n }\n\n /// @notice Manually appoints a leader. Used for bootstrapping or emergency recovery.\n function appointLeader(\n address newLeader,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (!isOperator[newLeader]) revert NotOperator(newLeader);\n\n // Leader MUST have a registered key, or they cannot sign Attestations/Checkpoints\n if (operatorToAttestedKey[newLeader] == bytes32(0)) revert ZeroAddress();\n\n bytes32 paramsHash = keccak256(abi.encode(newLeader));\n _requireQuorum(OP_APPOINT_LEADER, paramsHash, signers, signatures);\n\n _updateLeader(newLeader);\n }\n\n // =============================================================\n // RESTART CERTIFICATION & CERTIFICATE GATHERING\n // =============================================================\n\n /// @notice Step 1: Initiates the gathering window if the system is down.\n function initiateRestart() external {\n if (restartGatheringDeadline > block.timestamp) revert GatheringActive();\n\n // Start 1 hour window\n restartGatheringDeadline = block.timestamp + GATHERING_DURATION;\n\n // Clear previous state\n delete bestCandidate;\n isRestartAmbiguous = false;\n\n emit RestartGatheringStarted(restartGatheringDeadline);\n }\n\n /// @notice Restarts the system using a Trustless ZK Proof (Automata / SP1). The contract stores the \"Best\" candidate.\n /// @dev We compare Epochs. The highest epoch wins.\n /// @param tdxReportBody The 'Public Output' of the ZK Circuit (The TEE Quote Body).\n /// @param zkProof The Groth16 proof bytes.\n /// @param newLeader The address claiming leadership.\n /// @param checkpointHash The state hash being served.\n function submitRestartProof(\n uint256 profileId,\n bytes calldata tdxReportBody,\n bytes calldata zkProof,\n address newLeader,\n bytes32 checkpointHash\n ) external {\n if (restartGatheringDeadline == 0 || block.timestamp > restartGatheringDeadline) {\n revert GatheringNotActive();\n }\n if (newLeader == address(0)) revert ZeroAddress();\n if (address(automataVerifier) == address(0)) revert InvalidVerifier();\n\n // 1. ZK Verification\n // Assert that the 'tdxReportBody' was indeed generated by a genuine Intel TDX hardware\n // running the code logic proved by the ZK circuit.\n (bool success, bytes memory errorData) = automataVerifier.verifyAndAttestWithZKProof(\n tdxReportBody,\n IAutomataDcapAttestation.ZkCoProcessorType.Succinct, // Opinionated: Use SP1\n zkProof\n );\n\n // Handle failure explicitly\n if (!success) {\n // Forward the error from Automata if possible, or generic revert\n if (errorData.length > 0) {\n assembly {\n let retLen := mload(errorData)\n revert(add(32, errorData), retLen)\n }\n } else {\n revert InvalidZkProof();\n }\n }\n\n // 2. Policy Check (The \"Gold Image\")\n // Verify that the Code Hash (MRTD) inside the verified body matches our governance.\n // MRTD is at offset 136. We take the first 32 bytes of the SHA384.\n if (tdxReportBody.length < 584) revert InvalidQuoteLength();\n bytes32 qMrtd = bytes32(tdxReportBody[136:168]);\n\n // RTMRs start at 328. Stride is 48 bytes.\n bytes32 qRtmr0 = bytes32(tdxReportBody[328:360]);\n bytes32 qRtmr1 = bytes32(tdxReportBody[376:408]);\n bytes32 qRtmr2 = bytes32(tdxReportBody[424:456]);\n bytes32 qRtmr3 = bytes32(tdxReportBody[472:504]);\n\n verifyMeasurements(profileId, qMrtd, qRtmr0, qRtmr1, qRtmr2, qRtmr3);\n\n // 3. Identity Binding\n // Verify that the TEE explicitly committed to this Leader and Checkpoint in ReportData.\n // [Leader (20) | Checkpoint (32) | Epoch (8) | ProcessedCount (4)]\n // Total 64 bytes at Offset 520\n // A. Extract Leader (Bytes 520..540)\n address recoveredLeader = address(bytes20(tdxReportBody[520:540]));\n\n // B. Extract Checkpoint (Bytes 540..572)\n bytes32 recoveredCheckpoint = bytes32(tdxReportBody[540:572]);\n\n // C. Extract Epoch (Bytes 572..580)\n // We read 8 bytes, cast to uint64.\n uint64 recoveredEpoch = uint64(bytes8(tdxReportBody[572:580]));\n\n if (recoveredLeader != newLeader) revert InvalidReportData();\n if (recoveredCheckpoint != checkpointHash) revert InvalidReportData();\n\n // 5. Monotonicity Check\n if (recoveredEpoch <= epoch) {\n revert ProposedEpochTooLow(epoch, recoveredEpoch);\n }\n\n // If this is the first valid candidate\n if (!bestCandidate.exists) {\n bestCandidate = RestartCandidate({\n leader: newLeader,\n epoch: recoveredEpoch,\n checkpointHash: checkpointHash,\n exists: true\n });\n emit RestartCandidateSubmitted(newLeader, recoveredEpoch, checkpointHash);\n return;\n }\n\n // If we already have a candidate, COMPARE.\n\n // Case 1: Proposed Epoch is HIGHER -> Replace Best\n if (recoveredEpoch > bestCandidate.epoch) {\n // Strictly better epoch -> Replace\n bestCandidate = RestartCandidate({\n leader: newLeader,\n epoch: recoveredEpoch,\n checkpointHash: checkpointHash,\n exists: true\n });\n isRestartAmbiguous = false;\n emit RestartCandidateSubmitted(newLeader, recoveredEpoch, checkpointHash);\n }\n // Case 2: Proposed Epoch is EQUAL\n else if (recoveredEpoch == bestCandidate.epoch) {\n // If Hash is DIFFERENT -> SPLIT BRAIN\n if (checkpointHash != bestCandidate.checkpointHash) {\n isRestartAmbiguous = true;\n emit RestartAmbiguityDetected(\n recoveredEpoch, bestCandidate.checkpointHash, checkpointHash\n );\n }\n // If Hash is SAME, ignore (duplicate proposal)\n }\n // Case 3: Proposed Epoch is LOWER -> Ignore\n }\n\n /// @notice Step 3: Finalizes the restart after the window closes.\n function resolveRestart() external {\n if (restartGatheringDeadline == 0) revert GatheringNotActive();\n if (block.timestamp <= restartGatheringDeadline) revert GatheringNotExpired();\n\n if (!bestCandidate.exists) revert NoCandidate();\n if (isRestartAmbiguous) revert AmbiguousState();\n\n // Apply State\n _updateLeader(bestCandidate.leader);\n latestCheckpointHash = bestCandidate.checkpointHash;\n epoch = bestCandidate.epoch;\n\n // Reset Gathering\n restartGatheringDeadline = 0;\n delete bestCandidate;\n\n emit EpochIncremented(epoch, latestCheckpointHash);\n emit RestartExecuted(leader, epoch);\n }\n\n // =============================================================\n // GOVERNANCE VERIFICATION\n // =============================================================\n\n /// @notice Returns the EIP-712 domain separator used for verifying governance signatures.\n /// @return The domain separator hash.\n function domainSeparator() public view returns (bytes32) {\n return keccak256(\n abi.encode(\n _EIP712_DOMAIN_TYPEHASH, _NAME_HASH, _VERSION_HASH, block.chainid, address(this)\n )\n );\n }\n\n /// @dev Reconstructs the signed EIP-712 digest for a specific action.\n function _hashAction(bytes32 opType, bytes32 paramsHash, uint256 nonce)\n internal\n view\n returns (bytes32)\n {\n bytes32 structHash = keccak256(abi.encode(_ACTION_TYPEHASH, opType, paramsHash, nonce));\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator(), structHash));\n }\n\n /// @notice Verifies that a payload has been signed by a valid quorum of operators.\n /// @dev This is the core access control modifier. It verifies:\n /// 1. Sufficient signatures (k of n).\n /// 2. Signers are valid operators.\n /// 3. Signatures are unique and sorted (to prevent duplicates).\n /// 4. The payload matches the expected operation type and parameters.\n /// 5. Increments the nonce to prevent replay attacks.\n /// @param opType The operation identifier (e.g., OP_ADD_VAULT).\n /// @param paramsHash The keccak256 hash of the abi-encoded parameters.\n /// @param signers An array of operator addresses who signed the payload. Must be sorted ascending.\n /// @param signatures An array of signatures corresponding to the signers.\n function _requireQuorum(\n bytes32 opType,\n bytes32 paramsHash,\n address[] calldata signers,\n bytes[] calldata signatures\n ) internal {\n // If sender is admin and no signatures provided, skip verification.\n if (msg.sender == admin && signers.length == 0 && signatures.length == 0) {\n // Increment nonce anyway to simulate state change/prevent strict replays\n unchecked {\n governanceNonce++;\n }\n return;\n }\n uint256 q = quorumThreshold;\n if (signers.length != signatures.length) revert SignersNotSortedOrUnique();\n if (signers.length < q || signatures.length < q) {\n revert InsufficientSignatures(signers.length, q);\n }\n\n bytes32 digest = _hashAction(opType, paramsHash, governanceNonce);\n\n address prev = address(0);\n for (uint256 i = 0; i < q; i++) {\n address signer = signers[i];\n // Enforce sorted order to check for duplicates (O(N) vs O(N^2))\n if (signer <= prev) revert SignersNotSortedOrUnique();\n prev = signer;\n\n if (!isOperator[signer]) revert NotOperator(signer);\n\n // Handles EIP-1271 and EOA signatures.\n if (!signer.isValidSignatureNow(digest, signatures[i])) revert NotOperator(signer);\n }\n\n // Increment nonce to invalidate this hash for future use\n unchecked {\n governanceNonce++;\n }\n }\n\n // =============================================================\n // IMMEDIATE ACTIONS\n // =============================================================\n\n /// @notice Updates the number of signatures required for valid governance actions.\n /// @dev Requires a quorum of the *current* operators to approve.\n /// @param newThreshold The new minimum number of signatures.\n /// @param signers Sorted array of signers.\n /// @param signatures Corresponding signatures.\n function updateQuorumThreshold(\n uint256 newThreshold,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (newThreshold == 0 || newThreshold > operators.length) {\n revert InvalidQuorum(newThreshold, operators.length);\n }\n\n bytes32 paramsHash = keccak256(abi.encode(newThreshold));\n _requireQuorum(OP_SET_QUORUM, paramsHash, signers, signatures);\n\n uint256 oldThreshold = quorumThreshold;\n quorumThreshold = newThreshold;\n\n emit QuorumThresholdUpdated(oldThreshold, newThreshold);\n }\n\n /// @notice Registers a new deposit vault to the system.\n /// @dev This list is append-only. New vaults can be added, but existing ones cannot be removed.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n /// @param vaultAddr The address of the vault (as bytes32).\n /// @param signers Sorted array of signers.\n /// @param signatures Corresponding signatures.\n function addVault(\n uint8 routingId,\n uint256 vmId,\n bytes32 vaultAddr,\n ChainConfig calldata config,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (vaultAddr == bytes32(0)) revert InvalidVaultAddr();\n\n bytes32 paramsHash = keccak256(abi.encode(routingId, vmId, vaultAddr, config));\n _requireQuorum(OP_ADD_VAULT, paramsHash, signers, signatures);\n\n vaults.push(\n Vault({routingId: routingId, vmId: vmId, vaultAddress: vaultAddr, config: config})\n );\n emit VaultAdded(routingId, vmId, vaultAddr, config);\n }\n\n /// @notice Registers a strategy contract to handle updates for a specific chain.\n /// @dev Used to define how the Credential Manager talks to L2s (e.g., via bridges).\n /// Only one strategy can be registered per chain.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n /// @param strategy The address of the strategy contract.\n /// @param signers Sorted array of signers.\n /// @param signatures Corresponding signatures.\n function registerAdminUpdateStrategy(\n uint8 routingId,\n uint256 vmId,\n IAdminUpdateStrategy strategy,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (address(strategy) == address(0)) revert ZeroAddress();\n if (address(adminUpdateStrategies[routingId][vmId]) != address(0)) {\n revert StrategyAlreadyExists();\n }\n\n bytes32 paramsHash = keccak256(abi.encode(routingId, vmId, address(strategy)));\n _requireQuorum(OP_REGISTER_STRATEGY, paramsHash, signers, signatures);\n\n adminUpdateStrategies[routingId][vmId] = strategy;\n emit AdminUpdateStrategyRegistered(routingId, vmId, address(strategy));\n }\n\n /// @notice Updates the administrators or withdrawal quorum for a vault on a remote chain.\n /// @dev This function acts as a proxy. It verifies the operator quorum locally, then\n /// delegate-calls the strategy to execute the actual logic (e.g., sending an L1->L2 message).\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n /// @param newAdministrators The list of new admin addresses for that vault.\n /// @param newWithdrawalQuorum The new quorum requirement for that vault.\n /// @param signers Sorted array of signers.\n /// @param signatures Corresponding signatures.\n function setDepositVaultAdministrators(\n uint256 routingId,\n uint256 vmId,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external payable {\n IAdminUpdateStrategy strategy = adminUpdateStrategies[routingId][vmId];\n if (address(strategy) == address(0)) revert NoStrategy();\n\n // Include msg.value in hash to prevent replay attacks where a signature for a 0-fee\n // transaction is replayed on a high-fee transaction.\n bytes32 paramsHash = keccak256(\n abi.encode(routingId, vmId, newAdministrators, newWithdrawalQuorum, msg.value)\n );\n _requireQuorum(OP_SET_VAULT_ADMINS, paramsHash, signers, signatures);\n\n // Delegatecall allows this contract to retain its identity (msg.sender) when calling the bridge.\n (bool ok,) = address(strategy)\n .delegatecall(\n abi.encodeWithSelector(\n strategy.setAdministrators.selector,\n _getVaultAddress(routingId, vmId),\n newAdministrators,\n newWithdrawalQuorum\n )\n );\n require(ok, \"Strategy delegatecall failed\");\n emit DepositVaultAdministratorsUpdated(\n routingId, vmId, newAdministrators, newWithdrawalQuorum\n );\n }\n\n /// @notice Withdraw funds held by this contract.\n function withdraw(address account, address[] calldata signers, bytes[] calldata signatures)\n external\n {\n if (account == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(account, address(this).balance));\n _requireQuorum(OP_WITHDRAW, paramsHash, signers, signatures);\n payable(account).transfer(address(this).balance);\n }\n\n // =============================================================\n // VIEW HELPERS\n // =============================================================\n\n /// @notice Returns a paginated list of registered vaults.\n /// @dev The input types are intentionally `uint16` to preserve the function selector\n /// `0x9fd7285c` for backward compatibility with existing Rust clients.\n /// @param start The start index.\n /// @param end The end index (exclusive).\n /// @return An array of Vault structs.\n function getVaults(uint16 start, uint16 end) external view returns (Vault[] memory) {\n uint256 count = vaults.length;\n if (start >= count) return new Vault[](0);\n if (end > count) end = uint16(count);\n if (end <= start) return new Vault[](0);\n\n uint256 len = uint256(end - start);\n Vault[] memory out = new Vault[](len);\n for (uint256 i = 0; i < len; i++) {\n out[i] = vaults[uint256(start) + i];\n }\n return out;\n }\n\n function _getVaultAddress(uint256 routingId, uint256 vmId) internal view returns (address) {\n uint256 len = vaults.length;\n for (uint256 i; i < len; ++i) {\n Vault memory vault = vaults[i];\n if (vault.routingId == routingId && vault.vmId == vmId) {\n // Convert bytes32 to address (assuming left-aligned or standard encoding).\n // Shifts right 96 bits to recover the 160-bit address if it was stored left-aligned.\n return address(uint160(uint256(vault.vaultAddress >> 96)));\n }\n }\n revert VaultNotFound(routingId, vmId);\n }\n\n // =============================================================\n // TIMELOCKED ACTIONS\n // =============================================================\n\n /// @notice Schedules a timelocked update for the Risk Manager address.\n /// @dev The operation cannot be executed until `TIMELOCK_DELAY` has passed.\n /// @param newRiskManager The proposed new Risk Manager address.\n /// @return opId The unique hash of the scheduled operation.\n function scheduleRiskManager(\n address newRiskManager,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n if (newRiskManager == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRiskManager));\n _requireQuorum(OP_SET_RISK_MANAGER, paramsHash, signers, signatures);\n opId = _schedule(OP_SET_RISK_MANAGER, paramsHash);\n }\n\n /// @notice Executes a pending Risk Manager update if the timelock has expired.\n /// @param newRiskManager The address that was previously scheduled.\n function executeRiskManager(address newRiskManager) external {\n if (newRiskManager == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRiskManager));\n bytes32 opId = _opId(OP_SET_RISK_MANAGER, paramsHash);\n\n _executeTimelock(opId);\n\n address old = riskManager;\n riskManager = newRiskManager;\n emit OperationExecuted(opId, OP_SET_RISK_MANAGER);\n emit RiskManagerUpdated(old, newRiskManager);\n }\n\n /// @notice Schedules a timelocked update for the Registry Contract address.\n /// @param newRegistry The proposed new Registry address.\n /// @return opId The unique hash of the scheduled operation.\n function scheduleRegistryContract(\n address newRegistry,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n if (newRegistry == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRegistry));\n _requireQuorum(OP_SET_REGISTRY, paramsHash, signers, signatures);\n opId = _schedule(OP_SET_REGISTRY, paramsHash);\n }\n\n /// @notice Executes a pending Registry Contract update if the timelock has expired.\n /// @param newRegistry The address that was previously scheduled.\n function executeRegistryContract(address newRegistry) external {\n if (newRegistry == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRegistry));\n bytes32 opId = _opId(OP_SET_REGISTRY, paramsHash);\n\n _executeTimelock(opId);\n\n address old = registryContract;\n registryContract = newRegistry;\n emit OperationExecuted(opId, OP_SET_REGISTRY);\n emit RegistryUpdated(old, newRegistry);\n }\n\n // Timelocked measurement actions\n\n /// @notice Validates measurements against a specific approved Profile.\n /// @dev Supports \"Partial Matching\": If the Profile has bytes32(0) for an RTMR,\n /// skips checking that specific register (accommodating different provider patterns).\n function verifyMeasurements(\n uint256 profileId,\n bytes32 checkMrtd,\n bytes32 checkRtmr0,\n bytes32 checkRtmr1,\n bytes32 checkRtmr2,\n bytes32 checkRtmr3\n ) internal view {\n MeasurementProfile memory profile = measurementProfiles[profileId];\n\n if (!profile.active) revert ProfileInactive(profileId);\n if (profile.mrtd == bytes32(0)) revert ZeroAddress();\n\n // MRTD is always mandatory\n if (checkMrtd != profile.mrtd) revert MeasurementMismatch(profile.mrtd, checkMrtd, \"MRTD\");\n\n // RTMRs are conditional based on the Profile configuration\n if (profile.rtmr0 != bytes32(0) && checkRtmr0 != profile.rtmr0) {\n revert MeasurementMismatch(profile.rtmr0, checkRtmr0, \"RTMR0\");\n }\n\n if (profile.rtmr1 != bytes32(0) && checkRtmr1 != profile.rtmr1) {\n revert MeasurementMismatch(profile.rtmr1, checkRtmr1, \"RTMR1\");\n }\n\n if (profile.rtmr2 != bytes32(0) && checkRtmr2 != profile.rtmr2) {\n revert MeasurementMismatch(profile.rtmr2, checkRtmr2, \"RTMR2\");\n }\n\n if (profile.rtmr3 != bytes32(0) && checkRtmr3 != profile.rtmr3) {\n revert MeasurementMismatch(profile.rtmr3, checkRtmr3, \"RTMR3\");\n }\n }\n\n /// @notice Governance proposes adding or updating a measurement profile (e.g., for Phala or GCP).\n function scheduleManageProfile(\n uint256 profileId,\n MeasurementProfile calldata profile,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n // Anti-Bricking: MRTD must never be zero if activating\n if (profile.active && profile.mrtd == bytes32(0)) revert InvalidVaultAddr();\n\n bytes32 paramsHash = keccak256(abi.encode(profileId, profile));\n _requireQuorum(OP_MANAGE_PROFILE, paramsHash, signers, signatures);\n opId = _schedule(OP_MANAGE_PROFILE, paramsHash);\n }\n\n function executeManageProfile(uint256 profileId, MeasurementProfile calldata profile) external {\n bytes32 paramsHash = keccak256(abi.encode(profileId, profile));\n bytes32 opId = _opId(OP_MANAGE_PROFILE, paramsHash);\n\n _executeTimelock(opId);\n\n // Auto-increment ID if adding a new one with ID 0\n uint256 idToUpdate = profileId;\n if (idToUpdate == 0) {\n idToUpdate = nextProfileId++;\n }\n\n measurementProfiles[idToUpdate] = profile;\n emit OperationExecuted(opId, OP_MANAGE_PROFILE);\n emit MeasurementProfileUpdated(idToUpdate, profile.active);\n }\n\n /// @notice Sxecudes a timelocked update for the Automata Verifier address.\n function executeUpdateAutomataVerifier(address newVerifier) external {\n if (newVerifier == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newVerifier));\n bytes32 opId = _opId(OP_SET_AUTOMATA_VERIFIER, paramsHash);\n _executeTimelock(opId);\n\n address old = address(automataVerifier);\n automataVerifier = IAutomataDcapAttestation(newVerifier);\n\n emit OperationExecuted(opId, OP_SET_AUTOMATA_VERIFIER);\n emit AutomataVerifierUpdated(old, newVerifier);\n }\n\n /// @notice Schedules a timelocked update for the Automata Verifier.\n /// @dev Operators vote to update the verifier and the update is proposed with a timelocked delay.\n function scheduleUpdateAutomataVerifier(\n address newVerifier,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n if (newVerifier == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newVerifier));\n _requireQuorum(OP_SET_AUTOMATA_VERIFIER, paramsHash, signers, signatures);\n opId = _schedule(OP_SET_AUTOMATA_VERIFIER, paramsHash);\n }\n\n // Timelock cancellation\n\n /// @notice Cancels a pending timelocked operation.\n /// @dev Can be called at any time before execution to prevent a malicious or erroneous update.\n /// @param opId The hash of the operation to cancel.\n function cancelTimelock(bytes32 opId, address[] calldata signers, bytes[] calldata signatures)\n external\n {\n bytes32 paramsHash = keccak256(abi.encode(opId));\n _requireQuorum(OP_CANCEL_TIMELOCK, paramsHash, signers, signatures);\n\n TimelockOp storage op = timelockOps[opId];\n if (op.eta == 0) revert TimelockUnknown(opId);\n if (op.executed) revert TimelockAlreadyExecuted(opId);\n if (op.canceled) revert TimelockAlreadyCanceled(opId);\n\n op.canceled = true;\n emit OperationCanceled(opId, op.opType);\n }\n\n // =============================================================\n // TIMELOCK INTERNAL LOGIC\n // =============================================================\n\n /// @dev Deterministically generates the operation ID hash.\n function _opId(bytes32 opType, bytes32 paramsHash) internal view returns (bytes32) {\n return keccak256(abi.encode(opType, paramsHash, address(this), block.chainid));\n }\n\n /// @dev Internal helper to schedule an operation.\n function _schedule(bytes32 opType, bytes32 paramsHash) internal returns (bytes32 opId) {\n opId = _opId(opType, paramsHash);\n TimelockOp storage op = timelockOps[opId];\n if (op.executed) revert TimelockAlreadyExecuted(opId);\n\n uint256 delay = timelockDelayFor[opType];\n if (delay == 0) revert InvalidDelay(delay);\n\n uint64 eta = uint64(block.timestamp + delay);\n op.eta = eta;\n op.executed = false;\n op.canceled = false;\n op.opType = opType;\n emit OperationScheduled(opId, opType, eta);\n }\n\n /// @dev Internal helper to validate if an operation is ready for execution.\n function _executeTimelock(bytes32 opId) internal {\n TimelockOp storage op = timelockOps[opId];\n if (op.eta == 0) revert TimelockUnknown(opId);\n if (op.executed) revert TimelockAlreadyExecuted(opId);\n if (op.canceled) revert TimelockAlreadyCanceled(opId);\n if (block.timestamp < op.eta) revert TimelockNotReady(opId, op.eta, block.timestamp);\n op.executed = true;\n }\n\n /// @notice Allows the contract to receive ETH (needed for strategies that require fees).\n receive() external payable {}\n}\n","urls":[]},"src/DepositVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {SafeTransferLib} from \"solady/utils/SafeTransferLib.sol\";\nimport {EfficientHashLib} from \"solady/utils/EfficientHashLib.sol\";\nimport {ECDSA} from \"solady/utils/ECDSA.sol\";\nimport {IAtomicSettlementCallback} from \"./interfaces/IAtomicSettlementCallback.sol\";\n\ncontract DepositVault {\n /**\n * @notice The admin approves settlements and withdrawals.\n * @dev Should be set to the DStack container shared secret address.\n */\n address public owner;\n\n /**\n * @notice The address responsible for adding or removing administrators\n * @dev In production, this will be an upgradeable proxy\n */\n address public credentialManager;\n\n /// @notice Domain separator used for signature verification. It should include the routing ID, the vm ID, this\n /// vault address, and the settlement schema version.\n bytes32 internal _domainSeparator;\n\n /// @notice Maps settler IDs to their executor addresses.\n mapping(bytes32 => SettlerInfo) settlerExecutorMap;\n\n /// @notice List of all approved settler IDs.\n bytes32[] public approvedSettlers;\n\n /// @notice Minimum number of administrator signatures to approve a withdrawal request\n uint256 public withdrawalQuorum;\n\n uint256 public credentialManagerChangeDelayBlocks = 14400;\n\n /// @notice Tracks which settler IDs have been approved.\n mapping(bytes32 => bool) internal settlerIsApproved;\n\n /**\n * @notice Maximum total tokens that can be settled in a single block for each token.\n * @dev Currently unused \u2014 implementation pending design finalization.\n */\n mapping(address => uint256) public settlementCaps;\n\n /// @notice Maps (settler ID, account_index) pairs to their queue of pending batch settlements.\n mapping(bytes32 => mapping(uint64 => PendingSettlement[])) public pendingSettlements;\n\n /// @notice Maps (settler ID, account_index) pairs to their settlement count (nonce).\n mapping(bytes32 => mapping(uint64 => uint256)) public settlementCounts;\n\n /// @notice Maps (settler ID, account_index) pairs to their deposit count (nonce).\n mapping(bytes32 => mapping(uint64 => uint256)) public depositCounts;\n\n /// @notice Maps (settler ID, account_index) pairs to their withdrawal count (nonce).\n mapping(bytes32 => mapping(uint64 => uint256)) public withdrawalCounts;\n\n /// @notice Set of administrators\n address[] public administrators;\n\n // TODO: Delete before official production.\n mapping(address => bool) public canDeposit;\n\n /// @notice Block number of latest signature use\n uint256 public lastSignatureUse;\n\n /**\n * Makes the signature unambiguous that it is for settlements.\n */\n bytes32 constant SETTLEMENT_TYPEHASH = keccak256(\"SettlementApprovalV1\");\n\n /**\n * Makes the signature unambiguous that it is for withdrawals.\n */\n bytes32 constant WITHDRAWAL_TYPEHASH = keccak256(\"WithdrawalApprovalV1\");\n\n /**\n * @notice A single settlement request for token swaps.\n * @dev Used in both atomic and batch settlements.\n */\n struct Settlement {\n address tokenOut;\n uint256 amountOut;\n address tokenIn;\n uint256 amountIn;\n uint256 nonce;\n }\n\n /// @notice A settlement plus an off-chain signature from an authorized party.\n struct SignedSettlement {\n Settlement settlement;\n bytes signature;\n }\n\n /**\n * @notice Stores pending settlements for a given (user ID, account_index) pair when batch settlement is used.\n * @dev Target is the address expected to execute the settlement.\n */\n struct PendingSettlement {\n Settlement settlement;\n address target;\n }\n\n /// @notice Records a withdrawal.\n struct Withdrawal {\n address tokenAddress;\n uint256 amount;\n uint256 nonce;\n }\n\n /// @notice Information about a settler account.\n struct SettlerInfo {\n address[] executors;\n mapping(address => bool) isExecutor;\n }\n\n /// @notice Signals a settlement.\n event Settled(\n bytes32 indexed user,\n uint64 indexed account,\n uint256 indexed nonce,\n address tokenOut,\n uint256 amountOut,\n address tokenIn,\n uint256 amountIn\n );\n\n /// @notice Indicates that the set of administrators has been cleared and is now empty\n event AdministratorSetReset();\n\n /// @notice Signals that the withdrawal quorum has changed\n event WithdrawalQuorumChanged(uint256 previous, uint256 current);\n\n /// @notice Signals that the credential manager address has changed\n event CredentialManagerChanged(address oldCredentialManager, address newCredentialManager);\n\n /// @notice Signals that a new administrator has been added to the vault\n event AdminAdded(address newAdmin, uint256 numAdminsAfter);\n\n /// @notice Signals a deposit.\n event Deposited(\n bytes32 indexed user,\n uint64 indexed account,\n uint256 indexed nonce,\n address tokenAddress,\n uint256 amount\n );\n\n /// @notice Signals a withdrawal.\n event Withdrew(\n bytes32 indexed user,\n uint64 indexed account,\n uint256 indexed nonce,\n address tokenAddress,\n uint256 amount\n );\n\n /// @notice Reverts if the caller is not the owner.\n error NotOwner();\n\n /// @notice Reverts if a settlement callback returns an insufficient input token amount\n error InsufficientAmountFromExecutor(uint256 actual, uint256 required);\n\n /// @notice Reverts if an insufficient number of blocks have elapsed since the last signature use\n error TooSoon();\n\n /// @notice Reverts if the caller is not the credential manager\n error NotCredentialManager();\n\n /// @notice Reverts if a new withdrawal quorum value is equal to zero\n error ZeroWithdrawalQuorum();\n\n /// @notice Reverts if insufficient administrators are provided when setting the administrators\n error InsufficientAdministrators(uint256 actual, uint256 required);\n\n /// @notice Reverts if the caller is not an admin.\n error NotAdmin();\n\n /// @notice Reverts if the caller is not the authorized executor.\n error NotExecutor();\n\n /// @notice Reverts if a signed operation is past its deadline.\n error Expired();\n\n /// @notice Reverts if the nonce used in a transaction is incorrect.\n error InvalidNonce(uint256 expected, uint256 given);\n\n /// @notice Reverts if the signature provided is invalid.\n error InvalidSignature();\n\n /// @notice Reverts if an order array is empty.\n error EmptyOrders();\n\n /// @notice Reverts when given the zero address.\n error ZeroAddress();\n\n /// @notice Reverts when an insufficient number of signatures are provided for a withdrawal request\n error MissedQuorum(uint256 provided, uint256 required);\n\n /**\n * @notice Initializes the contract and sets the owner.\n * @param _owner The address to set as the owner.\n * @param _credentialManager The address of the credential manager.\n * @dev Reverts with `ZeroAddress()` if `_owner` is null.\n * @dev Reverts with `ZeroAddress()` if `_credentialManager` is null.\n */\n constructor(address _owner, address _credentialManager) {\n if (_owner == address(0)) revert ZeroAddress();\n if (_credentialManager == address(0)) revert ZeroAddress();\n owner = _owner;\n credentialManager = _credentialManager;\n }\n\n function isAdministrator(address account) public view returns (bool) {\n for (uint256 i = 0; i < administrators.length; i++) {\n if (administrators[i] == account) return true;\n }\n\n return false;\n }\n\n /**\n * @notice Sets the owner of the vault.\n * @dev Reverts with `NotOwner`; Only the owner can set a new owner.\n */\n function setOwner(address newOwner) external {\n if (msg.sender != owner) revert NotOwner();\n if (newOwner == address(0)) revert ZeroAddress();\n owner = newOwner;\n }\n\n function setCredentialManager(address newCredentialManager) external {\n if (msg.sender != owner) revert NotOwner();\n if (newCredentialManager == address(0)) revert ZeroAddress();\n /* TODO(jmcph4): check against `latestApproval`! */\n if (block.number >= lastSignatureUse + credentialManagerChangeDelayBlocks) {\n revert TooSoon();\n }\n address oldCredentialManager = credentialManager;\n credentialManager = newCredentialManager;\n emit CredentialManagerChanged(oldCredentialManager, newCredentialManager);\n }\n\n function setAdministrators(address[] calldata newAdministrators, uint256 newWithdrawalQuorum)\n external\n {\n if (msg.sender != credentialManager) revert NotCredentialManager();\n if (newWithdrawalQuorum < 1) revert ZeroWithdrawalQuorum();\n if (newAdministrators.length < newWithdrawalQuorum) {\n revert InsufficientAdministrators(newAdministrators.length, newWithdrawalQuorum);\n }\n\n // It's critical there are no zero-addresses; otherwise, errored signatures may mistakenly pass.\n for (uint256 i = 0; i < newAdministrators.length; i++) {\n if (newAdministrators[i] == address(0)) revert ZeroAddress();\n }\n\n administrators = newAdministrators;\n emit AdministratorSetReset();\n\n for (uint256 i = 0; i < administrators.length; i++) {\n address currAdmin = administrators[i];\n emit AdminAdded(currAdmin, i + 1);\n }\n\n uint256 oldWithdrawalQuorum = withdrawalQuorum;\n withdrawalQuorum = newWithdrawalQuorum;\n if (oldWithdrawalQuorum != newWithdrawalQuorum) {\n emit WithdrawalQuorumChanged(oldWithdrawalQuorum, newWithdrawalQuorum);\n }\n }\n\n /**\n * @notice Sets the domain separators for EIP-712 signatures.\n * @param domainSeparator: The value to set.\n * @dev Reverts with `NotOwner`; Only the admin can set the domain separator.\n */\n function setDomainSeparator(bytes32 domainSeparator) external {\n if (msg.sender != owner) revert NotOwner();\n require(_domainSeparator == 0); // dev: Already set.\n _domainSeparator = domainSeparator;\n }\n\n /**\n * @notice Sets the settle executor.\n * @param settler: The settler's tplus account key.\n * @param executor: The settler's assigned executor address.\n * @dev Reverts with `NotOwner`; Only the admin can set the settler executor.\n */\n function addSettlerExecutor(bytes32 settler, address executor) external {\n if (msg.sender != owner) revert NotOwner();\n\n if (!settlerIsApproved[settler]) {\n approvedSettlers.push(settler);\n settlerIsApproved[settler] = true;\n }\n\n SettlerInfo storage data = settlerExecutorMap[settler];\n if (!data.isExecutor[executor]) {\n data.executors.push(executor);\n data.isExecutor[executor] = true;\n }\n }\n\n /**\n * @notice Removes a settler.\n * @param settler: The settler's tplus account key.\n * @dev Reverts with `NotOwner`; Only the admin can remove a settler.\n */\n function removeSettler(bytes32 settler) external {\n if (msg.sender != owner) revert NotOwner();\n uint256 length = approvedSettlers.length;\n\n settlerIsApproved[settler] = false;\n\n for (uint256 i = 0; i < length; i++) {\n if (approvedSettlers[i] == settler) {\n // Move last element to this spot and pop the last element.\n approvedSettlers[i] = approvedSettlers[length - 1];\n approvedSettlers.pop();\n break;\n }\n }\n\n // Remove all executors.\n SettlerInfo storage info = settlerExecutorMap[settler];\n for (uint256 i = 0; i < info.executors.length; i++) {\n address exec = info.executors[i];\n info.isExecutor[exec] = false;\n }\n delete info.executors;\n }\n\n /**\n * @notice Deposits a token into the vault.\n * @param user: The user whose account will be credited with the deposit.\n * @param account: The account index of the specified user that will be credited with the deposit\n * @param tokenAddress: The address of the token to deposit.\n * @param amount: The amount of the token to deposit.\n * @dev Reverts if the amount is 0.\n */\n function deposit(bytes32 user, uint64 account, address tokenAddress, uint256 amount) external {\n require(canDeposit[msg.sender], \"!depositor\");\n require(amount != 0, \"Zero\");\n\n // Move tokens from the target user to this vault.\n SafeTransferLib.safeTransferFrom(tokenAddress, msg.sender, address(this), amount);\n\n emit Deposited(user, account, depositCounts[user][account], tokenAddress, amount);\n depositCounts[user][account] += 1;\n }\n\n // TODO: Delete this method and notion of approved-depositor before official production.\n function setDepositorStatus(address depositor, bool allowed) external {\n if (msg.sender != owner) revert NotOwner();\n canDeposit[depositor] = allowed;\n }\n\n /**\n * @notice Executes an atomic settlement.\n * @param order: The settlement order.\n * @param user: The t+ user who is executing the settlement.\n * @param account: The account index of the t+ user that will be used for settlement\n * @param validUntil: How long until the signature expires.\n * @param data: The data to execute as part of settlement callback.\n * @param signature: The signature from the t+ clearing engine.\n * @dev Reverts with `Expired` if the block timestamp is greater than `validUntil`.\n * @dev Reverts with `NotExecutor`; Only the executor can settle.\n * @dev Reverts with `InvalidNonce` if the nonce has already been used.\n * @dev Reverts with `SignatureError` if the signer is not an admin.\n * @dev Reverts with `InsufficientAmountFromExecutor` if the `order.amountIn` is less than what the executor reports\n */\n function executeAtomicSettlement(\n Settlement calldata order,\n bytes32 user,\n uint64 account,\n uint256 validUntil,\n bytes calldata data,\n bytes calldata signature\n ) external {\n if (block.timestamp > validUntil) revert Expired();\n if (!settlerExecutorMap[user].isExecutor[msg.sender]) revert NotExecutor();\n\n uint256 expectedNonce = settlementCounts[user][account];\n if (order.nonce != expectedNonce) revert InvalidNonce(expectedNonce, order.nonce);\n\n bytes32 digest = keccak256(\n bytes.concat(\n SETTLEMENT_TYPEHASH,\n _domainSeparator,\n bytes32(uint256(uint160(order.tokenOut)) << 96),\n bytes32(order.amountOut),\n bytes32(uint256(uint160(order.tokenIn)) << 96),\n bytes32(order.amountIn),\n user,\n bytes32(uint256(uint160(account))),\n bytes32(order.nonce),\n bytes32(validUntil)\n )\n );\n\n // Check the signature and record latest signature usage if it's valid\n checkApproval(digest, signature);\n lastSignatureUse = block.number;\n\n // Ensure to bump the nonce _before_ the callback to avoid signature replay.\n settlementCounts[user][account] += 1;\n\n // Invoke callback on the executor\n uint256 expectedAmountIn = IAtomicSettlementCallback(msg.sender)\n .onAtomicSettlement(order.tokenOut, order.amountOut, data);\n if (expectedAmountIn < order.amountIn) {\n revert InsufficientAmountFromExecutor(expectedAmountIn, order.amountIn);\n }\n\n // Transfer tokens IN from the executor\n SafeTransferLib.safeTransferFrom(order.tokenIn, msg.sender, address(this), expectedAmountIn);\n\n // Transfer tokens OUT to the executor\n SafeTransferLib.safeTransfer(order.tokenOut, msg.sender, order.amountOut);\n\n emit Settled(\n user,\n account,\n order.nonce,\n order.tokenOut,\n order.amountOut,\n order.tokenIn,\n order.amountIn\n );\n }\n\n /**\n * @notice Pulls funds for execution during a settlement batch.\n * @param orders: The settlement orders.\n * @param user: The t+ user who is executing the settlement.\n * @param target: The target address to send the token to, pull tokens from, and execute callback on.\n * @param validUntil: The timestamp when the settlement signature expires.\n * @dev Reverts with `Expired` if the block timestamp is greater than `validUntil`.\n * @dev Reverts if a batch settlement has already started.\n * @dev Reverts with `NotAdmin`; Only an admin can execute the settlement.\n * @dev Reverts with `InvalidNonce` if the nonce has already been used.\n * @dev Reverts with `SignatureError` if the signer is not an admin.\n */\n function pullBatchSettlement(\n SignedSettlement[] calldata orders,\n bytes32 user,\n uint64 account,\n address target,\n uint256 validUntil\n ) external {\n if (block.timestamp > validUntil) revert Expired();\n require(pendingSettlements[user][account].length == 0);\n if (!isAdministrator(msg.sender)) revert NotAdmin();\n\n uint256 expectedNonce = settlementCounts[user][account];\n bytes32 domainSeparator = _domainSeparator;\n uint256 ordersLength = orders.length;\n if (ordersLength == 0) revert EmptyOrders();\n\n for (uint256 i = 0; i < ordersLength; ++i) {\n Settlement calldata s = orders[i].settlement;\n\n uint256 nonce = s.nonce;\n if (nonce != expectedNonce) revert InvalidNonce(expectedNonce, nonce);\n\n bytes32 digest = keccak256(\n bytes.concat(\n SETTLEMENT_TYPEHASH,\n domainSeparator,\n bytes32(uint256(uint160(s.tokenOut)) << 96),\n bytes32(s.amountOut),\n bytes32(uint256(uint160(s.tokenIn)) << 96),\n bytes32(s.amountIn),\n user,\n bytes32(uint256(uint160(account))),\n bytes32(s.nonce),\n bytes32(validUntil)\n )\n );\n\n checkApproval(digest, orders[i].signature);\n expectedNonce = nonce + 1;\n\n pendingSettlements[user][account].push(\n PendingSettlement({settlement: s, target: target})\n );\n SafeTransferLib.safeTransfer(s.tokenOut, target, s.amountOut);\n }\n\n settlementCounts[user][account] += ordersLength;\n }\n\n /**\n * @notice Pushes expected funds from a batch settlement to the deposit vault.\n * @param user: The t+ user who is executing the settlement.\n * @param account: The account of the t+ user to execute settlement against\n * @dev Reverts with `NotAdmin`; Only an admin can execute the settlement.\n */\n function pushBatchSettlements(bytes32 user, uint64 account) external {\n if (!isAdministrator(msg.sender)) revert NotAdmin();\n\n for (uint32 i = 0; i < pendingSettlements[user][account].length; i++) {\n PendingSettlement memory pendingSettlement = pendingSettlements[user][account][i];\n\n SafeTransferLib.safeTransferFrom(\n pendingSettlement.settlement.tokenIn,\n pendingSettlement.target,\n address(this),\n pendingSettlement.settlement.amountIn\n );\n emit Settled(\n user,\n account,\n pendingSettlement.settlement.nonce,\n pendingSettlement.settlement.tokenOut,\n pendingSettlement.settlement.amountOut,\n pendingSettlement.settlement.tokenIn,\n pendingSettlement.settlement.amountIn\n );\n }\n delete pendingSettlements[user][account];\n }\n\n /**\n * @notice Withdraws a token from the vault.\n * @param withdrawal: The withdrawal token and amount.\n * @param user: The user whose account will be debited by the withdrawal.\n * @param account: The account of the t+ user that will be debited by the withdrawal.\n * @param target: The target address to send the token to.\n * @param validUntil: The timestamp when the withdrawal signature expires.\n * @param signatures: t+ clearing engine signatures.\n * @dev Reverts with `Expired` if the block timestamp is greater than `validUntil`.\n * @dev Reverts with `InvalidNonce` if the nonce has already been used.\n * @dev Reverts with `SignatureError` if the signer is not an admin.\n */\n function withdraw(\n Withdrawal calldata withdrawal,\n bytes32 user,\n uint64 account,\n address target,\n uint256 validUntil,\n bytes32 epochHash,\n bytes[] calldata signatures\n ) external {\n /* PERF(jmcph4): cache storage variable to the stack */\n uint256 quorum = withdrawalQuorum;\n if (block.timestamp > validUntil) revert Expired();\n if (signatures.length < withdrawalQuorum) {\n revert MissedQuorum(signatures.length, quorum);\n }\n\n uint256 expectedNonce = withdrawalCounts[user][account];\n if (withdrawal.nonce != expectedNonce) {\n revert InvalidNonce(expectedNonce, withdrawal.nonce);\n }\n\n /**\n * BEGIN SIGNATURE CHECKS *************************\n */\n\n // Set of administrators that have provided signatures for this withdrawal\n address[] memory seenAdmins = new address[](signatures.length);\n uint256 numSeenAdmins = 0;\n\n // PERF(jmcph4): No need to recompute inside the loop body\n bytes32 digest = keccak256(\n bytes.concat(\n WITHDRAWAL_TYPEHASH,\n _domainSeparator,\n bytes32(uint256(uint160((withdrawal.tokenAddress))) << 96),\n bytes32(withdrawal.amount),\n user,\n bytes32(withdrawal.nonce),\n bytes32(validUntil),\n bytes32(epochHash),\n bytes32(uint256(uint160(target)) << 96)\n )\n );\n\n for (uint256 i = 0; i < signatures.length; i++) {\n /* Verify the signature.\n *\n * This determines whether the digest is really signed by the provided\n * signature and computes the signer's address.\n */\n address signer = ECDSA.tryRecoverCalldata(digest, signatures[i]);\n if (signer == address(0)) revert InvalidSignature();\n\n // Check that the recovered signer is in fact an administrator\n if (!isAdministrator(signer)) revert InvalidSignature();\n\n /* Check that this administrator is unique. Without this step, a\n * single admin could provide `k` signatures where `k == withdrawalQuorum`\n * and we'd happily approve the withdrawal.\n */\n bool isCurrentSignerUnique = true;\n for (uint256 j = 0; j < numSeenAdmins; j++) {\n if (seenAdmins[j] == signer) {\n isCurrentSignerUnique = false;\n break;\n }\n }\n if (isCurrentSignerUnique) {\n seenAdmins[numSeenAdmins] = signer;\n numSeenAdmins++;\n }\n if (numSeenAdmins == quorum) break;\n }\n\n if (numSeenAdmins < quorum) revert MissedQuorum(numSeenAdmins, quorum);\n\n /**\n * END SIGNATURE CHECKS *************************\n */\n\n // SAFETY(jmcph4): Purposely bump the nonce as close to signature verification as possible, to alleviate callback concerns.\n withdrawalCounts[user][account] += 1;\n\n // Record latest signature usage\n lastSignatureUse = block.number;\n\n SafeTransferLib.safeTransfer(withdrawal.tokenAddress, target, withdrawal.amount);\n emit Withdrew(user, account, withdrawal.nonce, withdrawal.tokenAddress, withdrawal.amount);\n }\n\n /**\n * @notice Get the array of approved settlers.\n * @return An array of addresses (as bytes32) that are currently approved settlers.\n */\n function getApprovedSettlers() external view returns (bytes32[] memory) {\n return approvedSettlers;\n }\n\n // TODO: Delete this method before official production.\n function ownerWithdrawToken(address token, address to, uint256 amount) external {\n if (msg.sender != owner) revert NotOwner();\n require(to != address(0));\n SafeTransferLib.safeTransfer(token, to, amount);\n }\n\n function checkApproval(bytes32 digest, bytes calldata signature) internal view {\n address signer = ECDSA.tryRecoverCalldata(digest, signature);\n if (!isAdministrator(signer)) revert InvalidSignature();\n }\n}\n","urls":[]},"src/Registry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @title Registry\n * @notice Central registry for managing assets and associated risk parameters across multiple chains.\n * @dev Uses admin and multisig roles to control sensitive operations like asset registration and risk configuration.\n */\ncontract Registry {\n /// @notice Address of the admin; primarily used for initial setup.\n address public admin;\n\n /// @notice Multisig wallet address responsible for managing risk-related configurations.\n address public riskManagerMultisig;\n\n /// @notice Number of seconds to wait before new risk parameters become effective\n uint256 public riskParameterChangeDelaySeconds = 1 days;\n\n /// @notice Mapping of asset index to new risk parameters to be applied to the registry, but only after they become eligible\n mapping(uint16 => PendingRiskParameters) public pendingRiskParameters;\n\n /// @notice Mapping of asset index to associated risk parameters.\n mapping(uint16 => RiskParameters) public riskParameters;\n\n /// @notice Registry of all registered assets and associated chain data.\n AssetRegistry assets;\n\n /// @notice Account for receiving fees and paying rewards.\n bytes32 public feeAccount;\n\n /// @notice Signals that the maximum deposit has changed for a given asset\n event MaxDepositChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n\n /// @notice Signals that the maximum hourly deposit has changed for a given asset\n event Max1HrDepositChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n\n /// @notice Signals that the minimum weight has changed for a given asset\n event MinWeightChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n\n /// @notice Defines risk-related configuration parameters for an asset.\n struct RiskParameters {\n /// @notice Percentage of asset value that can be counted as collateral (e.g., 90 = 90%).\n uint8 collateralFactor;\n\n /// @notice Percentage multiplier applied to liabilities for risk calculations (e.g., 90 = 90%).\n uint8 liabilityFactor;\n\n /// @notice Maximum allowable collateral amount for this asset. May be unenforced on-chain.\n uint256 maxCollateral;\n\n /// @notice Maximum total open interest allowed for derivatives positions.\n uint256 maxOpenInterest;\n\n /// @notice Maximum open interest allowed for spot positions.\n uint256 maxSpotOpenInterest;\n\n /// @notice Maximum allowed utilization ratio of available liquidity.\n uint256 maxUtilization;\n\n /// @notice If true, asset can only be used in isolated margin mode.\n bool isolatedOnly;\n\n /// @notice Utilization points where the interest rate curve slope changes, scaled in 1/100th of a basis point.\n uint256[] interestKinks;\n\n /// @notice Interest rates corresponding to `interestKinks`, scaled in 1/100th of a basis point.\n uint256[] kinkInterestRates;\n\n /// @notice USD-denominated utilization kink points, scaled in 1/100th of a basis point.\n uint256[] usdInterestKinks;\n\n /// @notice USD-denominated interest rates corresponding to `usdInterestKinks`, scaled in 1/100th of a basis point.\n uint256[] usdKinkInterestRates;\n\n /// @notice Multiplier applied to skew-based pricing adjustments, scaled in 1/100th of a basis point.\n uint256 skewModifier;\n\n /// @notice Skew threshold at which maximum skew adjustment applies, scaled in 1/100th of a basis point.\n uint256 skewCliff;\n\n /// @notice Base funding rate applied regardless of skew direction, scaled in 1/100th of a basis point.\n int256 baseFundingRate;\n\n /// @notice Maximum allowed premium adjustment, scaled in 1/100th of a basis point.\n uint256 premiumClamp;\n\n /// @notice Maximum premium impact applied during initial margin calculation, scaled in 1/100th of a basis point.\n uint256[] initialMarginClamps;\n\n /// @notice Multipliers applied to position size when calculating initial margin, scaled in 1/100th of a basis point.\n uint256[] initialMarginFactors;\n\n /// @notice Maximum absolute funding rate allowed, scaled in 1/100th of a basis point.\n uint256 maxFundingRate;\n\n /// @notice Maximum interest rate applied at full utilization, scaled in 1/100th of a basis point.\n uint256 maxUtilizationRate;\n\n /// @notice Additional safety buffer multiplier applied to risk calculations, scaled in 1/100th of a basis point.\n uint256 bufferMultiple;\n }\n\n struct PendingRiskParameters {\n RiskParameters parameters;\n uint256 validAfter;\n }\n\n /**\n * @notice Struct for managing a list of registered assets.\n * @dev Assets are stored by index and can span multiple chains.\n */\n struct AssetRegistry {\n uint256 count; // Total number of assets.\n mapping(uint16 => Asset) registry; // Mapping from index to asset struct.\n }\n\n /**\n * @notice Struct for identifying a chain.\n */\n struct ChainId {\n // The routing ID e.g. 0=EVM style chains.\n uint64 routingId;\n\n // e.g. EVM chainId.\n uint64 vmId;\n }\n\n /**\n * @notice Struct representing an asset across multiple chains.\n */\n struct Asset {\n mapping(uint64 => mapping(uint64 => AssetData)) data; // Routing ID => Chain ID => AssetData.\n ChainId[] chains; // List of all known chain IDs for this asset.\n }\n\n /**\n * @notice Chain-specific metadata for an asset.\n * @dev Uses bytes32 for `assetAddress` to support non-EVM chains like Solana.\n */\n struct AssetData {\n uint16 index;\n bytes32 assetAddress;\n ChainId chainId;\n uint256 maxDeposits; // Cap on deposits (collateral cap).\n uint256 max1hrDeposits; // Cap on fungible deposits over one hour\n uint256 minWeight; // Raw weight value (not percentage)\n }\n\n /// @notice Reverts if caller is not the admin.\n error NotAdmin();\n\n /// @notice Reverts if there is are no risk parameters queued for the specified asset\n error NoPendingRiskParameters(uint16 asset);\n\n /// @notice Reverts if the pending risk parameters are not yet eligible for application\n error TooSoon(uint16 asset, uint256 eligibleAt);\n\n /// @notice Reverts if caller is not the risk manager multisig.\n error NotRiskManager();\n\n /// @notice Reverts if the asset index is out of bounds.\n error IndexOutOfBounds();\n\n /// @notice Reverts if the collateral factor (CF) specified as part of risk parameters is greater than one\n error InvalidCollateralFactor();\n\n /// @notice Reverts if the liability factor (LF) specified as part of risk parameters is greater than one\n error InvalidLiabilityFactor();\n\n /// @notice Reverts if the utilization cap specified as part of risk parameters is greater than one\n error InvalidUtilizationCap();\n\n /// @notice Reverts if the funding rate cap specified as part of risk parameters is greater than ~1000% APR\n error InvalidMaxFundingRate();\n\n /// @notice Reverts if the utilization rate cap specified as part of risk parameters is greater than ~1000% APR\n error InvalidMaxUtilizationRate();\n\n /// @notice Reverts if the buffer multiple value is less than 1% or greater than 2%.\n error InvalidBufferMultiple();\n\n /// @notice Reverts if the interest kinks specified as part of risk parameters are not increasing from 0 to 1\n error InvalidInterestKinks();\n\n /// @notice Reverts if the interest rates specified as part of risk parameters are not increasing\n error InvalidRateInterestKinks();\n\n /// @notice Reverts if the USD-denominated interest kinks specified as part of risk parameters are not increasing from 0 to 1\n error InvalidUSDInterestKinks();\n\n /// @notice Reverts if the USD-denominated interest rates specified as part of risk parameters are not increasing\n error InvalidUSDRateInterestKinks();\n\n /// @notice Reverts if the size of the initial margin clamps does not match the size of the initial margin factors (specified as part of risk parameters)\n error InvalidInitialMarginsConfiguration();\n\n /// @notice Reverts if the initial margin clamps specified as part of risk parameters are not increasing or are above 100\n error InvalidInitialMarginsClamps();\n\n /// @notice Reverts if the initial margin clamps specified as part of risk parameters are not decreasing or are above 100\n error InvalidInitialMarginsFactors();\n\n /// @notice Reverts if adding a chain to an asset that already exists.\n error ChainAlreadyExists();\n\n /// @notice Reverts if an address is zero.\n error ZeroAddress();\n\n /// @notice Reverts if the risk manager is not set.\n error RiskManagerNotSet();\n\n /**\n * @notice Contract constructor.\n * @param _admin The admin controller of the vault.\n * @dev Sets the deployer as the initial admin.\n */\n constructor(address _admin) {\n admin = _admin;\n }\n\n /**\n * @notice Updates the risk manager multisig address.\n * @param multisig The new address to set.\n * @dev Reverts with `NotAdmin`; Only the admin can set a risk manager.\n */\n function setRiskManagerMultisig(address multisig) external {\n if (msg.sender != admin) revert NotAdmin();\n riskManagerMultisig = multisig;\n }\n\n /**\n * @notice Updates the admin address.\n * @param newAdmin The new admin address.\n * @dev Reverts with `NotAdmin`; Only the admin can set a new admin.\n * @dev The new administrator address is allowed to be the null address.\n * Setting the administrator to this address disables administration\n * of the registry contract.\n */\n function setAdmin(address newAdmin) external {\n if (msg.sender != admin) revert NotAdmin();\n if (newAdmin == address(0) && riskManagerMultisig == address(0)) {\n revert RiskManagerNotSet();\n }\n admin = newAdmin;\n }\n\n /**\n * @notice Sets or updates asset data for a specific asset index and chain.\n * @dev Automatically adds new assets or chain instances if not already present.\n * @param data The chain-specific asset data.\n * @dev Reverts with `NotRiskManager`; Only the risk manager can set asset data.\n */\n function setAssetData(AssetData memory data) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n if (data.index > assets.count) revert IndexOutOfBounds();\n\n // Prevent registering asset with zero-address. Zero-address means that asset\n // has not yet been set on a chain, where is this case it has.\n if (data.assetAddress == bytes32(0)) revert ZeroAddress();\n\n Asset storage reg = assets.registry[data.index];\n\n uint64 routingId = data.chainId.routingId;\n uint64 vmId = data.chainId.vmId;\n\n // Cannot edit the chain or address when already set.\n if (reg.data[routingId][vmId].assetAddress != bytes32(0)) {\n revert ChainAlreadyExists();\n }\n\n bool isNewAsset = reg.chains.length == 0;\n reg.data[routingId][vmId] = data;\n reg.chains.push(data.chainId);\n\n if (isNewAsset) {\n assets.count += 1;\n }\n }\n\n function setMaxDeposits(ChainId calldata chainId, uint16 index, uint256 newMaxDeposit)\n external\n {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n\n uint64 routingId = chainId.routingId;\n uint64 vmId = chainId.vmId;\n\n uint256 oldMaxDeposit = assets.registry[index].data[routingId][vmId].maxDeposits;\n assets.registry[index].data[routingId][vmId].maxDeposits = newMaxDeposit;\n emit MaxDepositChanged(chainId, index, oldMaxDeposit, newMaxDeposit);\n }\n\n function setMax1HrDeposits(ChainId calldata chainId, uint16 index, uint256 newMaxDeposit)\n external\n {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n\n uint64 routingId = chainId.routingId;\n uint64 vmId = chainId.vmId;\n\n uint256 oldMaxDeposit = assets.registry[index].data[routingId][vmId].max1hrDeposits;\n assets.registry[index].data[routingId][vmId].max1hrDeposits = newMaxDeposit;\n emit Max1HrDepositChanged(chainId, index, oldMaxDeposit, newMaxDeposit);\n }\n\n function setMinWeight(ChainId calldata chain, uint16 index, uint256 newMinWeight) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n uint256 oldMinWeight = assets.registry[index].data[chain.routingId][chain.vmId].minWeight;\n assets.registry[index].data[chain.routingId][chain.vmId].minWeight = newMinWeight;\n emit MinWeightChanged(chain, index, oldMinWeight, newMinWeight);\n }\n\n /**\n * @notice Retrieves asset data for a specific asset and chain.\n * @param chainId the chain ID to query.\n * @param index The asset index to query.\n * @return The corresponding AssetData struct.\n */\n function getAssetData(ChainId calldata chainId, uint16 index)\n external\n view\n returns (AssetData memory)\n {\n return assets.registry[index].data[chainId.routingId][chainId.vmId];\n }\n\n /**\n * @notice Returns all registered asset data across all chains.\n * @return An array of AssetData structs.\n * @param start The start index (inclusive).\n * @param end The end index (not-inclusive).\n */\n function getAssets(uint16 start, uint16 end) external view returns (AssetData[] memory) {\n // First, compute the total flattened entries\n uint256 totalEntries = 0;\n for (uint16 i = 0; i < assets.count; i++) {\n totalEntries += assets.registry[i].chains.length;\n }\n\n // Return empty array if start >= totalEntries\n if (start >= totalEntries) {\n return new AssetData[](0);\n }\n\n if (end > totalEntries) {\n // casting to 'uint16' is safe because we won't ever that many assets.\n // forge-lint: disable-next-line(unsafe-typecast)\n end = uint16(totalEntries);\n }\n\n if (end < start) {\n return new AssetData[](0);\n }\n\n uint16 length = end - start;\n AssetData[] memory result = new AssetData[](length);\n\n uint256 r = 0;\n uint256 resIdx = 0;\n\n for (uint16 i = 0; i < assets.count && resIdx < length; ++i) {\n Asset storage asset = assets.registry[i];\n uint256 chainsLen = asset.chains.length;\n\n for (uint256 c = 0; c < chainsLen && resIdx < length; ++c) {\n if (r >= start && r < end) {\n ChainId storage chain = asset.chains[c];\n result[resIdx++] = asset.data[chain.routingId][chain.vmId];\n }\n\n ++r;\n }\n }\n\n return result;\n }\n\n /**\n * @notice Returns the asset index for a given chain and address.\n * @param chainId The chain ID to search.\n * @param assetAddress The asset address (as bytes32).\n * @return The index of the asset, or `type(uint32).max` if not found.\n */\n function getAssetIndex(ChainId calldata chainId, bytes32 assetAddress)\n external\n view\n returns (uint32)\n {\n uint64 routingId = chainId.routingId;\n uint64 vmId = chainId.vmId;\n\n for (uint16 i = 0; i < assets.count; i++) {\n if (assetAddress == assets.registry[i].data[routingId][vmId].assetAddress) {\n return i;\n }\n }\n return type(uint32).max;\n }\n\n /**\n * @notice Sets pending risk parameters for a specific asset index.\n * @param index The asset index.\n * @param parameters The risk parameters to set\n * @dev Reverts with `NotRiskManager`; Only the risk manager can set risk parameters.\n * @dev Reverts with `\"!asset\"` if index >= assets.count.\n */\n function setPendingRiskParameters(uint16 index, RiskParameters memory parameters) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n validateRiskParameters(parameters);\n PendingRiskParameters memory pendingParams = PendingRiskParameters({\n parameters: parameters, validAfter: block.timestamp + riskParameterChangeDelaySeconds\n });\n pendingRiskParameters[index] = pendingParams;\n }\n\n /**\n * @notice Applies the pending risk parameters for the specified asset if they exist.\n * @param index The asset index.\n * @dev Reverts with `\"!asset\"` if index >= assets.count.\n * @dev Reverts with `NoPendingRiskParameters` if there are no pending risk parameters for the specified asset\n * @dev Reverts with `TooSoon` if the pending risk parameters are not yet eligible\n */\n function applyPendingRiskParameters(uint16 index) external {\n require(index < assets.count, \"!asset\");\n PendingRiskParameters memory pendingParams = pendingRiskParameters[index];\n if (pendingParams.validAfter == 0) revert NoPendingRiskParameters(index);\n if (pendingParams.validAfter >= block.timestamp) {\n revert TooSoon(index, pendingParams.validAfter);\n }\n RiskParameters memory params = pendingParams.parameters;\n validateRiskParameters(params);\n riskParameters[index] = params;\n delete pendingRiskParameters[index];\n }\n\n function validateRiskParameters(RiskParameters memory params) public pure {\n if (params.collateralFactor > 1e2) revert InvalidCollateralFactor();\n if (params.liabilityFactor > 1e2) revert InvalidLiabilityFactor();\n if (params.maxUtilization > 1e18) revert InvalidUtilizationCap();\n if (params.maxFundingRate > 1142) revert InvalidMaxFundingRate();\n if (params.maxUtilizationRate > 1142) revert InvalidMaxUtilizationRate();\n\n uint256 bufferMultiple = params.bufferMultiple;\n if (bufferMultiple < 1e6 || bufferMultiple > 2e6) revert InvalidBufferMultiple();\n\n if (!validateStartAtZeroIsAlwaysBelowOneAndIncreases(params.interestKinks)) {\n revert InvalidInterestKinks();\n }\n if (!validateLastIsOne(params.interestKinks)) revert InvalidInterestKinks();\n if (!validateStartAtZeroIsAlwaysBelowOneAndIncreases(params.usdInterestKinks)) {\n revert InvalidUSDInterestKinks();\n }\n if (!validateLastIsOne(params.usdInterestKinks)) revert InvalidUSDInterestKinks();\n\n if (!validateIncreases(params.kinkInterestRates)) {\n revert InvalidRateInterestKinks();\n }\n if (!validateIncreases(params.usdKinkInterestRates)) {\n revert InvalidUSDRateInterestKinks();\n }\n\n if (params.initialMarginClamps.length != params.initialMarginFactors.length) {\n revert InvalidInitialMarginsConfiguration();\n }\n if (!validateStartAtZeroIsAlwaysBelowOneAndIncreases(params.initialMarginClamps)) {\n revert InvalidInitialMarginsClamps();\n }\n if (!validateIMFactors(params.initialMarginFactors)) revert InvalidInitialMarginsFactors();\n }\n\n /**\n * @notice Last point should be (1_000_000)\n */\n function validateLastIsOne(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n return len != 0 && xs[len - 1] == 1_000_000;\n }\n\n /**\n * @notice Validate that a series of values is increasing\n */\n function validateIncreases(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n uint256 prev = 0;\n\n for (uint256 i; i < len; ++i) {\n uint256 cur = xs[i];\n if (cur < prev) return false;\n prev = cur;\n }\n\n return true;\n }\n\n /**\n * @notice IM clamps must always increase and be <= 1 (1_000_000), and first point must be 0\n */\n function validateStartAtZeroIsAlwaysBelowOneAndIncreases(uint256[] memory xs)\n internal\n pure\n returns (bool)\n {\n uint256 len = xs.length;\n uint256 prev = 0;\n\n if (len == 0 || xs[0] != 0) {\n return false;\n }\n\n for (uint256 i; i < len; ++i) {\n uint256 cur = xs[i];\n if (cur > 1_000_000) return false;\n if (cur < prev) return false;\n prev = cur;\n }\n\n return true;\n }\n\n /**\n * @notice IM factors must always decreases and be < 1 (1_000_000)\n */\n function validateIMFactors(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n uint256 prev = 999_999;\n\n for (uint256 i; i < len; ++i) {\n uint256 cur = xs[i];\n if (cur > prev) return false;\n prev = cur;\n }\n\n return true;\n }\n\n function sumIsOne(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n uint256 sum;\n\n for (uint256 i; i < len; ++i) {\n sum += xs[i];\n if (sum > 1e6) return false;\n }\n\n return sum == 1e6;\n }\n\n /**\n * @notice Returns the full list of risk parameters for all registered assets.\n * @return An array of RiskParameters.\n * @param start The start index (inclusive).\n * @param end The end index (not inclusive).\n */\n function getRiskParameters(uint16 start, uint16 end)\n external\n view\n returns (RiskParameters[] memory)\n {\n uint16 count = uint16(assets.count);\n\n if (start >= count) {\n return new RiskParameters[](0);\n }\n\n if (end > count) {\n end = count;\n }\n\n if (end < start) {\n return new RiskParameters[](0);\n }\n\n uint256 length = end - start;\n RiskParameters[] memory result = new RiskParameters[](length);\n\n for (uint16 i = 0; i < length; ++i) {\n result[i] = riskParameters[start + i];\n }\n\n return result;\n }\n\n function setFeeAccount(bytes32 account) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n feeAccount = account;\n }\n}\n","urls":[]},"src/interfaces/IAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IAdminUpdateStrategy {\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable;\n}\n","urls":[]},"src/interfaces/IAtomicSettlementCallback.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IAtomicSettlementCallback {\n /// @notice Computes the minimum expected quantity of `token` that will be\n /// received by the deposit vault upon execution of an atomic\n /// settlement request\n function onAtomicSettlement(address token, uint256 amount, bytes calldata data)\n external\n returns (uint256);\n}\n","urls":[]},"src/interfaces/IAutomataDcapAttestation.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @notice Interface for Automata's DCAP Attestation Verifier (V3)\n/// @dev Bindings for the 'AutomataDcapAttestation' contract.\n/// Compatible with Automata V3 ZK Coprocessor logic.\ninterface IAutomataDcapAttestation {\n // Enum definition from Automata's library\n enum ZkCoProcessorType {\n RiscZero,\n Succinct // SP1\n }\n\n /// @notice Verifies a SNARK proof (Groth16) for a TEE Quote.\n /// @param output The Public Values (Journal) - effectively the Quote Body.\n /// @param zkvm The type of ZKVM used.\n /// @param proofBytes The actual (Groth16) proof.\n /// @return success True if valid.\n /// @return errorData Error message if failed, or empty if success.\n function verifyAndAttestWithZKProof(\n bytes calldata output,\n ZkCoProcessorType zkvm,\n bytes calldata proofBytes\n ) external returns (bool success, bytes memory errorData);\n}\n","urls":[]},"src/interfaces/ICheckpointer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface ICheckpointer {\n struct Checkpoint {\n uint256 nonce;\n uint8[] stateRoot;\n string[] approvedWithdrawals;\n }\n\n error AlreadySet();\n error InvalidSignature();\n error NotAdmin();\n error NotCouncilMultisig();\n\n event Withdrawals(string[] approvedWithdrawals);\n\n function CHECKPOINT_TYPEHASH() external view returns (bytes32);\n function admin() external view returns (address);\n function checkpoint(\n bytes memory sharedSignature,\n bytes memory leaderSignature,\n Checkpoint memory _checkpoint\n ) external;\n function councilMultisig() external view returns (address);\n function leader() external view returns (address);\n function setAdmin(address newAdmin) external;\n function setDomainSeparator(bytes32 domainSeparator) external;\n function setInitialCouncilMultisig(address newCouncilMultisig) external;\n function setLeader(address newLeader) external;\n function setNewCouncilMultisig(address newCouncilMultisig) external;\n function stateRoot(uint256) external view returns (uint8);\n function stateRootNonce() external view returns (uint256);\n}\n","urls":[]},"src/interfaces/ICredentialManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface CredentialManager {\n struct ChainConfig {\n uint64 blockTimeMs;\n uint8 defaultConfirmations;\n uint8 depositIngestConfirmations;\n uint8 withdrawalIngestConfirmations;\n uint8 settlementIngestConfirmations;\n }\n\n struct MeasurementProfile {\n bool active;\n bytes32 mrtd;\n bytes32 rtmr0;\n bytes32 rtmr1;\n bytes32 rtmr2;\n bytes32 rtmr3;\n }\n\n struct Vault {\n uint8 routingId;\n uint256 vmId;\n bytes32 vaultAddress;\n ChainConfig config;\n }\n\n error AmbiguousState();\n error CannotCancel();\n error GatheringActive();\n error GatheringNotActive();\n error GatheringNotExpired();\n error InsufficientSignatures(uint256 provided, uint256 required);\n error InvalidDelay(uint256 delay);\n error InvalidEpoch(uint256 expected, uint256 actual);\n error InvalidProfileConfig();\n error InvalidProfileId();\n error InvalidQuorum(uint256 newQuorum, uint256 operatorCount);\n error InvalidQuoteLength();\n error InvalidReportData();\n error InvalidVaultAddr();\n error InvalidVerifier();\n error MeasurementMismatch(bytes32 expected, bytes32 actual, string field);\n error NoCandidate();\n error NoStrategy();\n error NotOperator(address signer);\n error ProfileInactive(uint256 profileId);\n error ProposedEpochTooLow(uint256 current, uint256 proposed);\n error SignersNotSortedOrUnique();\n error StrategyAlreadyExists();\n error TimelockAlreadyCanceled(bytes32 opId);\n error TimelockAlreadyExecuted(bytes32 opId);\n error TimelockNotReady(bytes32 opId, uint256 readyAt, uint256 nowTs);\n error TimelockUnknown(bytes32 opId);\n error VaultNotFound(uint256 routingId, uint256 vmId);\n error ZeroAddress();\n\n event AdminUpdateStrategyRegistered(\n uint256 indexed routingId, uint256 indexed vmId, address strategy\n );\n event AttestedKeyRegistered(address indexed operator, bytes32 indexed newAttestedKey);\n event AutomataVerifierUpdated(address indexed oldVerifier, address indexed newVerifier);\n event DepositVaultAdministratorsUpdated(\n uint256 indexed routingId,\n uint256 indexed vmId,\n address[] newAdministrators,\n uint256 newWithdrawalQuorum\n );\n event DepositVaultAdministratorsUpdated(\n uint256 indexed chainId, address[] newAdministrators, uint256 newWithdrawalQuorum\n );\n event EpochIncremented(uint256 newEpoch, bytes32 newCheckpointHash);\n event LeaderUpdated(address indexed newLeader, bytes32 indexed newAttestedKey);\n event MeasurementProfileUpdated(uint256 indexed profileId, bool active);\n event MeasurementsUpdated(bytes32 newMrtd, bytes32 newRtmr0);\n event OperationCanceled(bytes32 indexed opId, bytes32 indexed opType);\n event OperationExecuted(bytes32 indexed opId, bytes32 indexed opType);\n event OperationScheduled(bytes32 indexed opId, bytes32 indexed opType, uint256 eta);\n event OperatorAdded(address indexed operator);\n event QuorumThresholdUpdated(uint256 oldThreshold, uint256 newThreshold);\n event RegistryUpdated(address indexed oldRegistry, address indexed newRegistry);\n event RestartAmbiguityDetected(uint256 epoch, bytes32 hash1, bytes32 hash2);\n event RestartCandidateSubmitted(address indexed leader, uint256 epoch, bytes32 checkpointHash);\n event RestartExecuted(address indexed newLeader, uint256 indexed epoch);\n event RestartGatheringStarted(uint256 deadline);\n event RiskManagerUpdated(address indexed oldRiskManager, address indexed newRiskManager);\n event TimelockDelayUpdated(bytes32 indexed targetOpType, uint256 oldDelay, uint256 newDelay);\n event VaultAdded(\n uint256 indexed routingId, uint256 indexed vmId, bytes32 vaultAddr, ChainConfig config\n );\n\n receive() external payable;\n\n function GATHERING_DURATION() external view returns (uint256);\n function OP_ADD_VAULT() external view returns (bytes32);\n function OP_APPOINT_LEADER() external view returns (bytes32);\n function OP_CANCEL_TIMELOCK() external view returns (bytes32);\n function OP_MANAGE_PROFILE() external view returns (bytes32);\n function OP_REGISTER_STRATEGY() external view returns (bytes32);\n function OP_RESTART() external view returns (bytes32);\n function OP_SET_AUTOMATA_VERIFIER() external view returns (bytes32);\n function OP_SET_DELAY() external view returns (bytes32);\n function OP_SET_MEASUREMENTS() external view returns (bytes32);\n function OP_SET_QUORUM() external view returns (bytes32);\n function OP_SET_REGISTRY() external view returns (bytes32);\n function OP_SET_RISK_MANAGER() external view returns (bytes32);\n function OP_SET_VAULT_ADMINS() external view returns (bytes32);\n function OP_WITHDRAW() external view returns (bytes32);\n function addVault(\n uint8 routingId,\n uint256 vmId,\n bytes32 vaultAddr,\n ChainConfig memory config,\n address[] memory signers,\n bytes[] memory signatures\n ) external;\n function admin() external view returns (address);\n function adminUpdateStrategies(uint256, uint256) external view returns (address);\n function appointLeader(address newLeader, address[] memory signers, bytes[] memory signatures)\n external;\n function automataVerifier() external view returns (address);\n function bestCandidate()\n external\n view\n returns (address leader, uint256 epoch, bytes32 checkpointHash, bool exists);\n function cancelTimelock(bytes32 opId, address[] memory signers, bytes[] memory signatures)\n external;\n function domainSeparator() external view returns (bytes32);\n function epoch() external view returns (uint256);\n function executeManageProfile(uint256 profileId, MeasurementProfile memory profile) external;\n function executeRegistryContract(address newRegistry) external;\n function executeRiskManager(address newRiskManager) external;\n function executeUpdateAutomataVerifier(address newVerifier) external;\n function getCouncilConfig()\n external\n view\n returns (address[] memory members, uint256 k, uint256 n);\n function getLeader() external view returns (address operator, bytes32 attestedKey);\n function getVaults(uint16 start, uint16 end) external view returns (Vault[] memory);\n function governanceNonce() external view returns (uint256);\n function initiateRestart() external;\n function isOperator(address) external view returns (bool);\n function isRestartAmbiguous() external view returns (bool);\n function latestCheckpointHash() external view returns (bytes32);\n function leader() external view returns (address);\n function measurementProfiles(uint256)\n external\n view\n returns (\n bool active,\n bytes32 mrtd,\n bytes32 rtmr0,\n bytes32 rtmr1,\n bytes32 rtmr2,\n bytes32 rtmr3\n );\n function nextProfileId() external view returns (uint256);\n function operatorToAttestedKey(address) external view returns (bytes32);\n function operators(uint256) external view returns (address);\n function quorumThreshold() external view returns (uint256);\n function registerAdminUpdateStrategy(\n uint8 routingId,\n uint256 vmId,\n address strategy,\n address[] memory signers,\n bytes[] memory signatures\n ) external;\n function registerAttestedKey(bytes32 newAttestedKey) external;\n function registryContract() external view returns (address);\n function resolveRestart() external;\n function restartGatheringDeadline() external view returns (uint256);\n function riskManager() external view returns (address);\n function scheduleManageProfile(\n uint256 profileId,\n MeasurementProfile memory profile,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function scheduleRegistryContract(\n address newRegistry,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function scheduleRiskManager(\n address newRiskManager,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function scheduleUpdateAutomataVerifier(\n address newVerifier,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function setDepositVaultAdministrators(\n uint256 routingId,\n uint256 vmId,\n address[] memory newAdministrators,\n uint256 newWithdrawalQuorum,\n address[] memory signers,\n bytes[] memory signatures\n ) external payable;\n function submitRestartProof(\n uint256 profileId,\n bytes memory tdxReportBody,\n bytes memory zkProof,\n address newLeader,\n bytes32 checkpointHash\n ) external;\n function timelockDelayFor(bytes32) external view returns (uint256);\n function timelockOps(bytes32)\n external\n view\n returns (uint64 eta, bool executed, bool canceled, bytes32 opType);\n function updateQuorumThreshold(\n uint256 newThreshold,\n address[] memory signers,\n bytes[] memory signatures\n ) external;\n function vaults(uint256)\n external\n view\n returns (uint8 routingId, uint256 vmId, bytes32 vaultAddress, ChainConfig memory config);\n function verifyMeasurements(\n uint256 profileId,\n bytes32 checkMrtd,\n bytes32 checkRtmr0,\n bytes32 checkRtmr1,\n bytes32 checkRtmr2,\n bytes32 checkRtmr3\n ) external view;\n function withdraw(address account, address[] memory signers, bytes[] memory signatures) external;\n}\n","urls":[]},"src/interfaces/IDepositVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IDepositVault {\n struct Settlement {\n address tokenOut;\n uint256 amountOut;\n address tokenIn;\n uint256 amountIn;\n uint256 nonce;\n }\n\n struct SignedSettlement {\n Settlement settlement;\n bytes signature;\n }\n\n struct Withdrawal {\n address tokenAddress;\n uint256 amount;\n uint256 nonce;\n }\n\n error EmptyOrders();\n error Expired();\n error InsufficientAdministrators(uint256 actual, uint256 required);\n error InvalidNonce(uint256 expected, uint256 given);\n error InvalidSignature();\n error NotAdmin();\n error NotCredentialManager();\n error NotExecutor();\n error NotOwner();\n error TooSoon();\n error ZeroAddress();\n error ZeroWithdrawalQuorum();\n error MissedQuorum(uint256 provided, uint256 required);\n\n event AdminAdded(address newAdmin, uint256 numAdminsAfter);\n event AdministratorSetReset();\n event CredentialManagerChanged(address oldCredentialManager, address newCredentialManager);\n event Deposited(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n event Settled(\n bytes32 indexed user,\n uint256 indexed nonce,\n address tokenOut,\n uint256 amountOut,\n address tokenIn,\n uint256 amountIn\n );\n event WithdrawalQuorumChanged(uint256 previous, uint256 current);\n event Withdrew(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n\n function ORDER_TYPEHASH() external view returns (bytes32);\n function addSettlerExecutor(bytes32 settler, address executor) external;\n function administrators(uint256) external view returns (address);\n function approvedSettlers(uint256) external view returns (bytes32);\n function canDeposit(address) external view returns (bool);\n function credentialManager() external view returns (address);\n function credentialManagerChangeDelayBlocks() external view returns (uint256);\n function deposit(bytes32 user, address tokenAddress, uint256 amount) external;\n function depositCounts(bytes32) external view returns (uint256);\n function executeAtomicSettlement(\n Settlement memory order,\n bytes32 user,\n uint256 validUntil,\n bytes memory data,\n bytes memory signature\n ) external;\n function getApprovedSettlers() external view returns (bytes32[] memory);\n function isAdministrator(address account) external view returns (bool);\n function lastSignatureUse() external view returns (uint256);\n function owner() external view returns (address);\n function ownerWithdrawToken(address token, address to, uint256 amount) external;\n function pendingSettlements(bytes32, uint256)\n external\n view\n returns (Settlement memory settlement, address target);\n function pullBatchSettlement(\n SignedSettlement[] memory orders,\n bytes32 user,\n address target,\n uint256 validUntil\n ) external;\n function pushBatchSettlements(bytes32 user) external;\n function removeSettler(bytes32 settler) external;\n function setAdministrators(address[] memory newAdministrators, uint256 newWithdrawalQuorum)\n external;\n function setCredentialManager(address newCredentialManager) external;\n function setDepositorStatus(address depositor, bool allowed) external;\n function setDomainSeparator(bytes32 domainSeparator) external;\n function setOwner(address newOwner) external;\n function settlementCaps(address) external view returns (uint256);\n function settlementCounts(bytes32) external view returns (uint256);\n function withdraw(\n Withdrawal memory withdrawal,\n bytes32 user,\n address target,\n uint256 validUntil,\n bytes32 epochHash,\n bytes memory signature\n ) external;\n function withdrawalCounts(bytes32) external view returns (uint256);\n function withdrawalQuorum() external view returns (uint256);\n}\n","urls":[]},"src/interfaces/IRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IRegistry {\n struct AssetData {\n uint16 index;\n bytes32 assetAddress;\n uint64 chainId;\n uint256 maxDeposits;\n uint256 max1hrDeposits;\n uint256 minWeight;\n }\n\n struct RiskParameters {\n uint8 collateralFactor;\n uint8 liabilityFactor;\n uint256 maxCollateral;\n uint256 maxOpenInterest;\n uint256 maxSpotOpenInterest;\n uint256 maxUtilization;\n bool isolatedOnly;\n uint256[] interestKinks;\n uint256[] kinkInterestRates;\n uint256[] usdInterestKinks;\n uint256[] usdKinkInterestRates;\n uint256 skewModifier;\n uint256 skewCliff;\n int256 baseFundingRate;\n uint256 premiumClamp;\n uint256[] initialMarginClamps;\n uint256[] initialMarginFactors;\n uint256 maxFundingRate;\n uint256 maxUtilizationRate;\n uint256 bufferMultiple;\n }\n\n error ChainAlreadyExists();\n error IndexOutOfBounds();\n error InvalidBufferMultiple();\n error InvalidCollateralFactor();\n error InvalidInitialMarginsClamps();\n error InvalidInitialMarginsConfiguration();\n error InvalidInitialMarginsFactors();\n error InvalidInterestKinks();\n error InvalidLiabilityFactor();\n error InvalidMaxFundingRate();\n error InvalidMaxUtilizationRate();\n error InvalidRateInterestKinks();\n error InvalidUSDInterestKinks();\n error InvalidUSDRateInterestKinks();\n error InvalidUtilizationCap();\n error NoPendingRiskParameters(uint16 asset);\n error NotAdmin();\n error NotRiskManager();\n error RiskManagerNotSet();\n error TooSoon(uint16 asset, uint256 eligibleAt);\n error ZeroAddress();\n\n event Max1HrDepositChanged(uint64 chain, uint16 index, uint256 previous, uint256 current);\n event MaxDepositChanged(uint64 chain, uint16 index, uint256 previous, uint256 current);\n event MinWeightChanged(uint64 chain, uint16 index, uint256 previous, uint256 current);\n\n function admin() external view returns (address);\n function applyPendingRiskParameters(uint16 index) external;\n function feeAccount() external view returns (bytes32);\n function getAssetData(uint64 chainId, uint16 index) external view returns (AssetData memory);\n function getAssetIndex(uint64 chainId, bytes32 assetAddress) external view returns (uint32);\n function getAssets(uint16 start, uint16 end) external view returns (AssetData[] memory);\n function getRiskParameters(uint16 start, uint16 end)\n external\n view\n returns (RiskParameters[] memory);\n function pendingRiskParameters(uint16)\n external\n view\n returns (RiskParameters memory parameters, uint256 validAfter);\n function riskManagerMultisig() external view returns (address);\n function riskParameterChangeDelaySeconds() external view returns (uint256);\n function riskParameters(uint16)\n external\n view\n returns (\n uint8 collateralFactor,\n uint8 liabilityFactor,\n uint256 maxCollateral,\n uint256 maxOpenInterest,\n uint256 maxSpotOpenInterest,\n uint256 maxUtilization,\n bool isolatedOnly,\n uint256 skewModifier,\n uint256 skewCliff,\n int256 baseFundingRate,\n uint256 premiumClamp,\n uint256 maxFundingRate,\n uint256 maxUtilizationRate,\n uint256 bufferMultiple\n );\n function setAdmin(address newAdmin) external;\n function setAssetData(AssetData memory data) external;\n function setFeeAccount(bytes32 account) external;\n function setMax1HrDeposits(uint16 chain, uint16 index, uint256 newMaxDeposit) external;\n function setMaxDeposits(uint16 chain, uint16 index, uint256 newMaxDeposit) external;\n function setMinWeight(uint16 chain, uint16 index, uint256 newMinWeight) external;\n function setPendingRiskParameters(uint16 index, RiskParameters memory parameters) external;\n function setRiskManagerMultisig(address multisig) external;\n function validateRiskParameters(RiskParameters memory params) external pure;\n}\n","urls":[]},"src/strategies/ArbitrumOneAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {IInbox} from \"nitro-contracts/bridge/IInbox.sol\";\nimport {IDepositVault} from \"../interfaces/IDepositVault.sol\";\nimport {IAdminUpdateStrategy} from \"../interfaces/IAdminUpdateStrategy.sol\";\n\ncontract ArbitrumOneAdminUpdateStrategy is IAdminUpdateStrategy {\n address public constant INBOX = 0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f;\n\n uint256 constant MAX_SUBMISSION_COST = 0.02 ether;\n uint256 constant GAS_LIMIT = 3_000_000;\n uint256 constant MAX_FEE_PER_GAS = 5 gwei;\n\n /// @notice Reverts if not enough value was sent to the update method.\n error InsufficientMsgValue(uint256 actual, uint256 expected);\n\n /**\n * @notice Updates the administrator set and withdrawal quorum on a vault via a retryable ticket.\n * @dev This function forwards a cross-chain call to the target `vault` using Arbitrum's\n * retryable ticket mechanism. The credential manager must supply sufficient `msg.value` to cover\n * the maximum submission cost and gas fees for execution on the destination chain.\n *\n * @param vault The address of the vault contract whose administrators will be updated.\n * @param newAdministrators The complete list of administrator addresses to set on the vault.\n * @param newWithdrawalQuorum The new quorum required for withdrawals.\n *\n * @dev Reverts with {InsufficientMsgValue} if `msg.value` is less than\n * `MAX_SUBMISSION_COST + GAS_LIMIT * MAX_FEE_PER_GAS`.\n */\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable override {\n uint256 expectedValue =\n MAX_SUBMISSION_COST + GAS_LIMIT * MAX_FEE_PER_GAS;\n uint256 actualValue = msg.value;\n\n if (actualValue < expectedValue) {\n revert InsufficientMsgValue(actualValue, expectedValue);\n }\n\n bytes memory callData = abi.encodeWithSelector(\n IDepositVault.setAdministrators.selector, newAdministrators, newWithdrawalQuorum\n );\n\n IInbox inbox = IInbox(address(INBOX));\n inbox.createRetryableTicket{value: msg.value}(\n vault,\n 0,\n MAX_SUBMISSION_COST,\n msg.sender,\n msg.sender,\n GAS_LIMIT,\n MAX_FEE_PER_GAS,\n callData\n );\n }\n}\n","urls":[]},"src/strategies/IntraChainAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {IAdminUpdateStrategy} from \"../interfaces/IAdminUpdateStrategy.sol\";\nimport {IDepositVault} from \"../interfaces/IDepositVault.sol\";\n\n/// Use this strategy when updating the vault on the same chain as the credential manager.\ncontract IntraChainAdminUpdateStrategy is IAdminUpdateStrategy {\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable {\n IDepositVault(vault).setAdministrators(newAdministrators, newWithdrawalQuorum);\n }\n}\n","urls":[]},"src/strategies/OPStackAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {IDepositVault} from \"../interfaces/IDepositVault.sol\";\nimport {IAdminUpdateStrategy} from \"../interfaces/IAdminUpdateStrategy.sol\";\n\ninterface IL1CrossDomainMessenger {\n function sendMessage(address _target, bytes calldata _message, uint32 _minGasLimit)\n external\n payable;\n}\n\n/// @notice Admin update strategy for OP Stack chains (Optimism, Base, Unichain, etc)\ncontract OPStackAdminUpdateStrategy is IAdminUpdateStrategy {\n /// @notice L1 CrossDomainMessenger.\n address public immutable L1_CROSS_DOMAIN_MESSENGER;\n\n /// @notice Conservative gas limit for L2 execution.\n uint32 public constant L2_GAS_LIMIT = 3_000_000;\n\n /// @notice Reverts if messenger address is zero.\n error ZeroMessengerAddress();\n\n constructor(address l1CrossDomainMessenger) {\n if (l1CrossDomainMessenger == address(0)) revert ZeroMessengerAddress();\n L1_CROSS_DOMAIN_MESSENGER = l1CrossDomainMessenger;\n }\n\n /**\n * @notice Updates the administrator set and withdrawal quorum on an OP Stack L2 vault\n * @dev Sends a cross-domain message from L1 \u2192 L2 using the OP Stack messenger\n * @dev Forwards msg.value directly to the L1 messenger\n *\n * @param vault The L2 vault address\n * @param newAdministrators The full administrator set\n * @param newWithdrawalQuorum The withdrawal quorum\n */\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable override {\n bytes memory callData = abi.encodeWithSelector(\n IDepositVault.setAdministrators.selector, newAdministrators, newWithdrawalQuorum\n );\n\n IL1CrossDomainMessenger(L1_CROSS_DOMAIN_MESSENGER).sendMessage{value: msg.value}(\n vault, callData, L2_GAS_LIMIT\n );\n }\n}\n","urls":[]}}} \ No newline at end of file +{"compilers":[{"contractTypes":["SigTest","MockTarget"],"name":"solidity","settings":{"optimizer":{"enabled":true,"runs":200},"outputSelection":{"src/.cache/solady/main/src/utils/ECDSA.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/EfficientHashLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/SafeTransferLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]}},"remappings":["solady=src/.cache/solady/main/src"],"viaIR":true},"version":"0.8.28+commit.7893614a"},{"contractTypes":["IAtomicSettlementCallback","IDepositVault","DepositVault","IAutomataDcapAttestation","IRegistry","Settler","IAdminUpdateStrategy","OPStackAdminUpdateStrategy","ICredentialManager","SignatureTest","IntraChainAdminUpdateStrategy","Registry","IL1CrossDomainMessenger","ICheckpointer","ArbitrumOneAdminUpdateStrategy","Checkpointer","CredentialManager"],"name":"solidity","settings":{"optimizer":{"enabled":true,"runs":200},"outputSelection":{"src/.cache/nitro-contracts/main/src/bridge/DelayBufferTypes.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IBridge.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IDelayedMessageProvider.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IInbox.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IInboxBase.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IOwnable.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/ISequencerInbox.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/Messages.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/libraries/IGasRefunder.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/ECDSA.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/EfficientHashLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/SafeTransferLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/SignatureCheckerLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/Checkpointer.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/CredentialManager.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/DepositVault.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/Registry.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IAdminUpdateStrategy.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IAtomicSettlementCallback.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IAutomataDcapAttestation.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/ICheckpointer.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/ICredentialManager.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IDepositVault.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IRegistry.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/strategies/ArbitrumOneAdminUpdateStrategy.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/strategies/IntraChainAdminUpdateStrategy.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/strategies/OPStackAdminUpdateStrategy.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]}},"remappings":["nitro-contracts=src/.cache/nitro-contracts/main/src","solady=src/.cache/solady/main/src"],"viaIR":true},"version":"0.8.30+commit.73712a01"}],"contractTypes":{"ArbitrumOneAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"InsufficientMsgValue","type":"error"},{"inputs":[],"name":"INBOX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"ArbitrumOneAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x608080604052346015576102a4908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c8063075034ae146100615763b70106971461002f575f80fd5b3461005d575f36600319011261005d576020604051734dbd4fc535ac27206064b68ffcf827b0a60bab3f8152f35b5f80fd5b606036600319011261005d576004356001600160a01b0381169081900361005d5760243567ffffffffffffffff811161005d573660238201121561005d5780600401359167ffffffffffffffff831161005d573660248460051b8401011161005d57667c585087238000341061021a576040519160208301936323c5673160e01b8552806064850160406024870152526024608485019201905f905b8082106101f0578660208761012488610127838a604435604483015203601f198101855284610238565b604051948593849263679b6ded60e01b845260048401525f602484015266470de4df8200006044840152336064840152336084840152622dc6c060a484015264012a05f20060c484015261010060e4840152518091816101048501528484015e5f828201840152601f01601f1916810103018134734dbd4fc535ac27206064b68ffcf827b0a60bab3f5af180156101e5576101be57005b602090813d83116101de575b6101d48183610238565b8101031261005d57005b503d6101ca565b6040513d5f823e3d90fd5b90919283359060018060a01b03821680920361005d576020816001938293520194019201906100fd565b631f2dda7760e21b5f5234600452667c58508723800060245260445ffd5b90601f8019910116810190811067ffffffffffffffff82111761025a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a0cf18539bc390feb28cfdf16a27fe0da61073e697506455cb8f013889eda9fa64736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{"setAdministrators(address,address[],uint256)":{"details":"This function forwards a cross-chain call to the target `vault` using Arbitrum's retryable ticket mechanism. The credential manager must supply sufficient `msg.value` to cover the maximum submission cost and gas fees for execution on the destination chain.Reverts with {InsufficientMsgValue} if `msg.value` is less than `MAX_SUBMISSION_COST + GAS_LIMIT * MAX_FEE_PER_GAS`.","params":{"newAdministrators":"The complete list of administrator addresses to set on the vault.","newWithdrawalQuorum":"The new quorum required for withdrawals.","vault":"The address of the vault contract whose administrators will be updated."}}},"version":1},"methodIdentifiers":{"INBOX()":"0xb7010697","setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c8063075034ae146100615763b70106971461002f575f80fd5b3461005d575f36600319011261005d576020604051734dbd4fc535ac27206064b68ffcf827b0a60bab3f8152f35b5f80fd5b606036600319011261005d576004356001600160a01b0381169081900361005d5760243567ffffffffffffffff811161005d573660238201121561005d5780600401359167ffffffffffffffff831161005d573660248460051b8401011161005d57667c585087238000341061021a576040519160208301936323c5673160e01b8552806064850160406024870152526024608485019201905f905b8082106101f0578660208761012488610127838a604435604483015203601f198101855284610238565b604051948593849263679b6ded60e01b845260048401525f602484015266470de4df8200006044840152336064840152336084840152622dc6c060a484015264012a05f20060c484015261010060e4840152518091816101048501528484015e5f828201840152601f01601f1916810103018134734dbd4fc535ac27206064b68ffcf827b0a60bab3f5af180156101e5576101be57005b602090813d83116101de575b6101d48183610238565b8101031261005d57005b503d6101ca565b6040513d5f823e3d90fd5b90919283359060018060a01b03821680920361005d576020816001938293520194019201906100fd565b631f2dda7760e21b5f5234600452667c58508723800060245260445ffd5b90601f8019910116810190811067ffffffffffffffff82111761025a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a0cf18539bc390feb28cfdf16a27fe0da61073e697506455cb8f013889eda9fa64736f6c634300081e0033"},"sourceId":"src/strategies/ArbitrumOneAdminUpdateStrategy.sol","sourcemap":"257:2167:24:-:0;;;;;;;;;;;;;;;;;","userdoc":{"errors":{"InsufficientMsgValue(uint256,uint256)":[{"notice":"Reverts if not enough value was sent to the update method."}]},"kind":"user","methods":{"setAdministrators(address,address[],uint256)":{"notice":"Updates the administrator set and withdrawal quorum on a vault via a retryable ticket."}},"version":1}},"Checkpointer":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadySet","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCouncilMultisig","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"name":"Withdrawals","type":"event"},{"inputs":[],"name":"CHECKPOINT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sharedSignature","type":"bytes"},{"internalType":"bytes","name":"leaderSignature","type":"bytes"},{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8[]","name":"stateRoot","type":"uint8[]"},{"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"internalType":"struct Checkpointer.Checkpoint","name":"_checkpoint","type":"tuple"}],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"councilMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setInitialCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"}],"name":"setLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setNewCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stateRoot","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateRootNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"Checkpointer","deploymentBytecode":{"bytecode":"0x608080604052346026575f80546001600160a01b03191633179055610b3e908161002b8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816307ddaf53146108be575080633ea987d31461086657806340eedabb1461083e5780634331e8dd146107ea5780635fa993b214610792578063704b6c02146107455780637438b937146106f657806374ebc7a0146106d95780638bbb26a314610150578063cc2fc84514610105578063e1193e4c146100cb5763f851a440146100a0575f80fd5b346100c7575f3660031901126100c7575f546040516001600160a01b039091168152602090f35b5f80fd5b346100c7575f3660031901126100c75760206040517ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d88152f35b346100c75760203660031901126100c7576004356005548110156100c75760209060055f5260ff8160051c5f516020610ae95f395f51905f52015460f86040519360031b161c168152f35b346100c75760603660031901126100c75760043567ffffffffffffffff81116100c7576101819036906004016108e1565b60243567ffffffffffffffff81116100c7576101a19036906004016108e1565b906044359267ffffffffffffffff84116100c7578360040191606060031986360301126100c757823593600354918286036100c75760248701916101e5838761090f565b906040519060208201928391905f905b8082106106b45750505090610216816044949303601f198101835282610945565b519020980194610226868861090f565b610232819c929c610967565b9b6102406040519d8e610945565b818d5260208d019160051b8101903682116100c75780925b82841061067757505050508a51986102886102728b610967565b9a6102806040519c8d610945565b808c52610967565b60208b019b90601f1901368d375f5b8d518110156102c857808c8f826102b36001956102c1936109d3565b5160208151910120926109d3565b5201610297565b506040518b5160208201919082908f905f5b81811061066157505050918161030361039f97959361039999979503601f198101835282610945565b5190206040519160208301937ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d885526040840152606083015260808201526080815261035060a082610945565b5190206004549060405190602082019261190160f01b84526022830152604282015260428152610381606282610945565b51902093849160018060a01b035f541693369161097f565b916109fb565b15610652576103996103be9360018060a01b036001541693369161097f565b15610652575f19821461063e5760016103db92016003558361090f565b929067ffffffffffffffff841161062a5768010000000000000000841161062a57600554846005558085106105a0575b509260055f528060051c5f5b81811061055e5750601f1982169091039081610500575b505061043a925061090f565b906040519082602083016020845252604082019060408460051b84010193815f90601e19813603015b838310610492577fef889901cd5d865c829bdf171647f02f76efbce3c0cba77197094981f41a727c87890388a1005b909192939496603f198782030188528535828112156100c7578301906020823592019167ffffffffffffffff81116100c75780360383136100c7576020828280600196849695859652848401375f828201840152601f01601f19160101999190910196019493019190610463565b5f9485925b80871061052a57505061043a94505f516020610ae95f395f51905f520155838061042e565b909260206105536001928961053e886109c5565b919060ff809160031b9316831b921b19161790565b940196019590610505565b5f5f5b6020811061058357505f516020610ae95f395f51905f52820155600101610417565b969060206105976001928a61053e866109c5565b92019701610561565b601f80860160051c910160051c5f516020610ae95f395f51905f520190601f8616806105f0575b505f516020610ae95f395f51905f52015b8181106105e5575061040b565b5f81556001016105d8565b7f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3daf8201908154905f199060200360031b1c169055866105c7565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b638baa579f60e01b5f5260045ffd5b82518452602093840193909201916001016102da565b833567ffffffffffffffff81116100c757820136601f820112156100c7576020916106a983923690848135910161097f565b815201930192610258565b90919283359060ff82168092036100c7576020816001938293520194019201906101f5565b346100c7575f3660031901126100c7576020600354604051908152f35b346100c75760203660031901126100c7575f546001600160a01b031633036107365760045461072757600480359055005b63a741a04560e01b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03811633036107365781156100c7576001600160a01b031916175f55005b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b03811633036107db576001600160a01b03191617600255005b638d62b6d960e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b031633036107db576bffffffffffffffffffffffff60a01b60015416176001555f80f35b346100c7575f3660031901126100c7576001546040516001600160a01b039091168152602090f35b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03163303610736576002546001600160a01b038116610727576001600160a01b03191617600255005b346100c7575f3660031901126100c7576002546001600160a01b03168152602090f35b9181601f840112156100c75782359167ffffffffffffffff83116100c757602083818601950101116100c757565b903590601e19813603018212156100c7570180359067ffffffffffffffff82116100c757602001918160051b360383136100c757565b90601f8019910116810190811067ffffffffffffffff82111761062a57604052565b67ffffffffffffffff811161062a5760051b60200190565b92919267ffffffffffffffff821161062a57604051916109a9601f8201601f191660200184610945565b8294818452818301116100c7578281602093845f960137010152565b3560ff811681036100c75790565b80518210156109e75760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b90915f91906001600160a01b03821615610ae05760405192600484019460248501956044860192853b15610a6457509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b979650509050815180604014610abb57604114610a815750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052610a99565b505050505f9056fe036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0a26469706673582212208508d5e21daf774af722d307fef557b7ea7450df289e6a598466b060935405c764736f6c634300081e0033"},"devdoc":{"details":"Designed for use in DStack-like distributed settlement systems.","events":{"Withdrawals(string[])":{"params":{"approvedWithdrawals":"List of withdrawal IDs approved in the checkpoint."}}},"kind":"dev","methods":{"checkpoint(bytes,bytes,(uint256,uint8[],string[]))":{"details":"Requires valid EIP-712 signatures from both admin and leader.","params":{"_checkpoint":"The checkpoint payload to commit.","leaderSignature":"Signature by the leader.","sharedSignature":"Signature by the admin."}},"constructor":{"details":"Sets the deployer as the initial admin."},"setAdmin(address)":{"params":{"newAdmin":"The new admin address."}},"setDomainSeparator(bytes32)":{"params":{"domainSeparator":"The domain separator to store."}},"setInitialCouncilMultisig(address)":{"params":{"newCouncilMultisig":"The council's Gnosis Safe address."}},"setLeader(address)":{"details":"This should be reviewed depending on the leader rotation mechanism.","params":{"newLeader":"The address of the new leader node."}},"setNewCouncilMultisig(address)":{"params":{"newCouncilMultisig":"The new multisig address."}}},"stateVariables":{"admin":{"details":"Should be set to the DStack app shared secret public key."},"councilMultisig":{"details":"Can rotate the leader and self."},"leader":{"details":"Leader is responsible for signing and submitting new checkpoints."},"stateRoot":{"details":"Serialized as `(user, eth_balance, usdc_balance, deposit_nonce, is_mm)` tuples. In production, this may store multiple roots and rotate."},"stateRootNonce":{"details":"Used to prevent replay attacks and enforce checkpoint ordering."}},"title":"Checkpointer","version":1},"methodIdentifiers":{"CHECKPOINT_TYPEHASH()":"0xe1193e4c","admin()":"0xf851a440","checkpoint(bytes,bytes,(uint256,uint8[],string[]))":"0x8bbb26a3","councilMultisig()":"0x07ddaf53","leader()":"0x40eedabb","setAdmin(address)":"0x704b6c02","setDomainSeparator(bytes32)":"0x7438b937","setInitialCouncilMultisig(address)":"0x3ea987d3","setLeader(address)":"0x4331e8dd","setNewCouncilMultisig(address)":"0x5fa993b2","stateRoot(uint256)":"0xcc2fc845","stateRootNonce()":"0x74ebc7a0"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816307ddaf53146108be575080633ea987d31461086657806340eedabb1461083e5780634331e8dd146107ea5780635fa993b214610792578063704b6c02146107455780637438b937146106f657806374ebc7a0146106d95780638bbb26a314610150578063cc2fc84514610105578063e1193e4c146100cb5763f851a440146100a0575f80fd5b346100c7575f3660031901126100c7575f546040516001600160a01b039091168152602090f35b5f80fd5b346100c7575f3660031901126100c75760206040517ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d88152f35b346100c75760203660031901126100c7576004356005548110156100c75760209060055f5260ff8160051c5f516020610ae95f395f51905f52015460f86040519360031b161c168152f35b346100c75760603660031901126100c75760043567ffffffffffffffff81116100c7576101819036906004016108e1565b60243567ffffffffffffffff81116100c7576101a19036906004016108e1565b906044359267ffffffffffffffff84116100c7578360040191606060031986360301126100c757823593600354918286036100c75760248701916101e5838761090f565b906040519060208201928391905f905b8082106106b45750505090610216816044949303601f198101835282610945565b519020980194610226868861090f565b610232819c929c610967565b9b6102406040519d8e610945565b818d5260208d019160051b8101903682116100c75780925b82841061067757505050508a51986102886102728b610967565b9a6102806040519c8d610945565b808c52610967565b60208b019b90601f1901368d375f5b8d518110156102c857808c8f826102b36001956102c1936109d3565b5160208151910120926109d3565b5201610297565b506040518b5160208201919082908f905f5b81811061066157505050918161030361039f97959361039999979503601f198101835282610945565b5190206040519160208301937ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d885526040840152606083015260808201526080815261035060a082610945565b5190206004549060405190602082019261190160f01b84526022830152604282015260428152610381606282610945565b51902093849160018060a01b035f541693369161097f565b916109fb565b15610652576103996103be9360018060a01b036001541693369161097f565b15610652575f19821461063e5760016103db92016003558361090f565b929067ffffffffffffffff841161062a5768010000000000000000841161062a57600554846005558085106105a0575b509260055f528060051c5f5b81811061055e5750601f1982169091039081610500575b505061043a925061090f565b906040519082602083016020845252604082019060408460051b84010193815f90601e19813603015b838310610492577fef889901cd5d865c829bdf171647f02f76efbce3c0cba77197094981f41a727c87890388a1005b909192939496603f198782030188528535828112156100c7578301906020823592019167ffffffffffffffff81116100c75780360383136100c7576020828280600196849695859652848401375f828201840152601f01601f19160101999190910196019493019190610463565b5f9485925b80871061052a57505061043a94505f516020610ae95f395f51905f520155838061042e565b909260206105536001928961053e886109c5565b919060ff809160031b9316831b921b19161790565b940196019590610505565b5f5f5b6020811061058357505f516020610ae95f395f51905f52820155600101610417565b969060206105976001928a61053e866109c5565b92019701610561565b601f80860160051c910160051c5f516020610ae95f395f51905f520190601f8616806105f0575b505f516020610ae95f395f51905f52015b8181106105e5575061040b565b5f81556001016105d8565b7f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3daf8201908154905f199060200360031b1c169055866105c7565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b638baa579f60e01b5f5260045ffd5b82518452602093840193909201916001016102da565b833567ffffffffffffffff81116100c757820136601f820112156100c7576020916106a983923690848135910161097f565b815201930192610258565b90919283359060ff82168092036100c7576020816001938293520194019201906101f5565b346100c7575f3660031901126100c7576020600354604051908152f35b346100c75760203660031901126100c7575f546001600160a01b031633036107365760045461072757600480359055005b63a741a04560e01b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03811633036107365781156100c7576001600160a01b031916175f55005b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b03811633036107db576001600160a01b03191617600255005b638d62b6d960e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b031633036107db576bffffffffffffffffffffffff60a01b60015416176001555f80f35b346100c7575f3660031901126100c7576001546040516001600160a01b039091168152602090f35b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03163303610736576002546001600160a01b038116610727576001600160a01b03191617600255005b346100c7575f3660031901126100c7576002546001600160a01b03168152602090f35b9181601f840112156100c75782359167ffffffffffffffff83116100c757602083818601950101116100c757565b903590601e19813603018212156100c7570180359067ffffffffffffffff82116100c757602001918160051b360383136100c757565b90601f8019910116810190811067ffffffffffffffff82111761062a57604052565b67ffffffffffffffff811161062a5760051b60200190565b92919267ffffffffffffffff821161062a57604051916109a9601f8201601f191660200184610945565b8294818452818301116100c7578281602093845f960137010152565b3560ff811681036100c75790565b80518210156109e75760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b90915f91906001600160a01b03821615610ae05760405192600484019460248501956044860192853b15610a6457509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b979650509050815180604014610abb57604114610a815750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052610a99565b505050505f9056fe036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0a26469706673582212208508d5e21daf774af722d307fef557b7ea7450df289e6a598466b060935405c764736f6c634300081e0033"},"sourceId":"src/Checkpointer.sol","sourcemap":"413:6397:13:-:0;;;;;;;2546:18;413:6397;;-1:-1:-1;;;;;;413:6397:13;2554:10;413:6397;;;;;;;;;;;;;","userdoc":{"errors":{"AlreadySet()":[{"notice":"Reverts if a value has already been set."}],"InvalidSignature()":[{"notice":"Reverts if a signature does not match the expected signer or payload."}],"NotAdmin()":[{"notice":"Reverts if caller is not the admin."}],"NotCouncilMultisig()":[{"notice":"Reverts if caller is not the current council multisig."}]},"events":{"Withdrawals(string[])":{"notice":"Emitted when a new list of approved withdrawals is recorded in a checkpoint."}},"kind":"user","methods":{"CHECKPOINT_TYPEHASH()":{"notice":"Typehash used for EIP-712 encoding of the Checkpoint struct."},"admin()":{"notice":"Address with the authority to set initial parameters."},"checkpoint(bytes,bytes,(uint256,uint8[],string[]))":{"notice":"Checkpoint submitted by a node to update the system state."},"constructor":{"notice":"Contract constructor."},"councilMultisig()":{"notice":"Gnosis Safe address used as the council multisig."},"leader()":{"notice":"Public key of the current designated leader node."},"setAdmin(address)":{"notice":"Transfers admin control to a new address."},"setDomainSeparator(bytes32)":{"notice":"Sets the EIP-712 domain separator used for verifying signatures."},"setInitialCouncilMultisig(address)":{"notice":"Sets the initial council multisig address."},"setLeader(address)":{"notice":"Sets the leader node address."},"setNewCouncilMultisig(address)":{"notice":"Allows the current council to rotate itself to a new address."},"stateRoot(uint256)":{"notice":"The current state root, encoded as a serialized vector."},"stateRootNonce()":{"notice":"Monotonically increasing nonce for checkpoint submissions."}},"notice":"Tracks and validates state root checkpoints using EIP-712 signatures from admin and leader nodes.","version":1}},"CredentialManager":{"abi":[{"inputs":[{"internalType":"address[]","name":"initialOperators","type":"address[]"},{"internalType":"uint256","name":"initialCommitteeThreshold","type":"uint256"},{"internalType":"address","name":"initialRiskManager","type":"address"},{"internalType":"address","name":"initialRegistryContract","type":"address"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct CredentialManager.MeasurementProfile[]","name":"initialMeasurements","type":"tuple[]"},{"internalType":"address","name":"initialAutomataVerifier","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmbiguousState","type":"error"},{"inputs":[],"name":"CannotCancel","type":"error"},{"inputs":[],"name":"GatheringActive","type":"error"},{"inputs":[],"name":"GatheringNotActive","type":"error"},{"inputs":[],"name":"GatheringNotExpired","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientSignatures","type":"error"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"},{"internalType":"uint256","name":"operatorCount","type":"uint256"}],"name":"InvalidCommitteeThreshold","type":"error"},{"inputs":[{"internalType":"uint256","name":"delay","type":"uint256"}],"name":"InvalidDelay","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InvalidEpoch","type":"error"},{"inputs":[],"name":"InvalidProfileConfig","type":"error"},{"inputs":[],"name":"InvalidProfileId","type":"error"},{"inputs":[],"name":"InvalidQuoteLength","type":"error"},{"inputs":[],"name":"InvalidReportData","type":"error"},{"inputs":[],"name":"InvalidVaultAddr","type":"error"},{"inputs":[],"name":"InvalidVerifier","type":"error"},{"inputs":[],"name":"InvalidZkProof","type":"error"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"},{"internalType":"string","name":"field","type":"string"}],"name":"MeasurementMismatch","type":"error"},{"inputs":[],"name":"NoCandidate","type":"error"},{"inputs":[],"name":"NoStrategy","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"NotOperator","type":"error"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"}],"name":"ProfileInactive","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"proposed","type":"uint256"}],"name":"ProposedEpochTooLow","type":"error"},{"inputs":[],"name":"SignersNotSortedOrUnique","type":"error"},{"inputs":[],"name":"StrategyAlreadyExists","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyCanceled","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyExecuted","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"uint256","name":"readyAt","type":"uint256"},{"internalType":"uint256","name":"nowTs","type":"uint256"}],"name":"TimelockNotReady","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockUnknown","type":"error"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"}],"name":"VaultNotFound","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"}],"name":"AdminUpdateStrategyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"AttestedKeyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldVerifier","type":"address"},{"indexed":true,"internalType":"address","name":"newVerifier","type":"address"}],"name":"AutomataVerifierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"CommitteeThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newEpoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newCheckpointHash","type":"bytes32"}],"name":"EpochIncremented","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"LeaderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"profileId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"MeasurementProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"newMrtd","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newRtmr0","type":"bytes32"}],"name":"MeasurementsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"OperationScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRegistry","type":"address"},{"indexed":true,"internalType":"address","name":"newRegistry","type":"address"}],"name":"RegistryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash1","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash2","type":"bytes32"}],"name":"RestartAmbiguityDetected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"leader","type":"address"},{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"RestartCandidateSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"RestartExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"RestartGatheringStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRiskManager","type":"address"},{"indexed":true,"internalType":"address","name":"newRiskManager","type":"address"}],"name":"RiskManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"targetOpType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"oldDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"TimelockDelayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"indexed":false,"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"}],"name":"VaultAdded","type":"event"},{"inputs":[],"name":"GATHERING_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_ADD_VAULT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_APPOINT_LEADER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_CANCEL_TIMELOCK","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_MANAGE_PROFILE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_REGISTER_STRATEGY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_RESTART","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_AUTOMATA_VERIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_COMMITTEE_THRESHOLD","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_DELAY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_MEASUREMENTS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_REGISTRY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_RISK_MANAGER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_VAULT_ADMINS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_WITHDRAW","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"addVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"adminUpdateStrategies","outputs":[{"internalType":"contract IAdminUpdateStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"appointLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"automataVerifier","outputs":[{"internalType":"contract IAutomataDcapAttestation","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bestCandidate","outputs":[{"internalType":"address","name":"leader","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"cancelTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"committeeThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct CredentialManager.MeasurementProfile","name":"profile","type":"tuple"}],"name":"executeManageProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"}],"name":"executeRegistryContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"}],"name":"executeRiskManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"}],"name":"executeUpdateAutomataVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCommitteeConfig","outputs":[{"internalType":"address[]","name":"members","type":"address[]"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeader","outputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"attestedKey","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getVaults","outputs":[{"components":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"}],"internalType":"struct CredentialManager.Vault[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initiateRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRestartAmbiguous","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestCheckpointHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"measurementProfiles","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProfileId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operatorToAttestedKey","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"operators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"contract IAdminUpdateStrategy","name":"strategy","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"registerAdminUpdateStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"registerAttestedKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registryContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resolveRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restartGatheringDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct CredentialManager.MeasurementProfile","name":"profile","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleManageProfile","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRegistryContract","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRiskManager","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleUpdateAutomataVerifier","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setDepositVaultAdministrators","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"internalType":"bytes","name":"tdxReportBody","type":"bytes"},{"internalType":"bytes","name":"zkProof","type":"bytes"},{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"submitRestartProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockDelayFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockOps","outputs":[{"internalType":"uint64","name":"eta","type":"uint64"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"bytes32","name":"opType","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"updateCommitteeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaults","outputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"contractName":"CredentialManager","deploymentBytecode":{"bytecode":"0x6080604052346105515761479d803803806100198161056d565b92833981019060c0818303126105515780516001600160401b0381116105515781019082601f830112156105515781519161005b61005684610592565b61056d565b9260208085838152019160051b8301019185831161055157602001905b828210610555575050506020810151610093604083016105a9565b926100a0606084016105a9565b60808401519093906001600160401b03811161055157810186601f82011215610551578051906100d261005683610592565b97602060c0818b8681520194028301019181831161055157602001925b8284106104db575050505060a061010691016105a9565b6001600e555f80546001600160a01b03191633179055936001600160a01b0316928315610495576001600160a01b031693841561049557601180546001600160a01b0319166001600160a01b039290921691909117905580519081156104c457821580156104bb575b6104a4575f5b82811061038f575050506040817f7015cf739f6bedf8447b0723aac5b7e28cc2e5551b144f8bb715b9c29768237f926003558151905f82526020820152a160018060a01b0319600954161760095560018060a01b0319600a541617600a556001600e555f5b81518110156102c2576101ed81836105bd565b519081511515806102b6575b6102a757602091600e545f52600d835260405f20600560a0835115159360ff1984541660ff861617845586810151600185015560408101516002850155606081015160038501556080810151600485015501519101557faa1bacadd202709f2df9c31faf4babdbb21a245021c22298bfcdf22861ca12c6600e54938492604051908152a25f198214610293576001809201600e55016101da565b634e487b7160e01b5f52601160045260245ffd5b637262f58f60e01b5f5260045ffd5b506020820151156101f9565b600b6020526202a3007ffc320c8b7cd913048d0600d8f8fbdd9fd65e3dee2c1f3796e3abba8cc47fa047556203f4807f5248b41ce7bdc12ebe0248f44130be972d690f78fe7dbe1a76d984641d9dcfc25562093a807f9b6d9405e2a268edd94615fe7f07c0d5d9dda2152c2e48f4e74379972af1c6188190557fa24d58aaa8deed8b2ff0e63d867e6fe155de046522ed61849f5647e59d04b6ba5f527f8de415b97204654c888cc41215aeac0a76fba4f899a3e239bdee8aedbbab23ef556040516141cb90816105d28239f35b6001600160a01b036103a182846105bd565b511690811561049557815f52600260205260ff60405f20541661048657815f52600260205260405f20600160ff19825416179055600154916801000000000000000083101561047257600183018060015583101561045e5760015f8181527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690940180546001600160a01b03191683179055927fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d9080a201610175565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b630da1c57360e41b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b50906311dcbf3760e31b5f5260045260245260445ffd5b5081831161016f565b826311dcbf3760e31b5f526004525f60245260445ffd5b60c084830312610551576040519060c082016001600160401b03811183821017610472576040528451908115158203610551578260209260c09452828701518382015260408701516040820152606087015160608201526080870151608082015260a087015160a08201528152019301926100ef565b5f80fd5b60208091610562846105a9565b815201910190610078565b6040519190601f01601f191682016001600160401b0381118382101761047257604052565b6001600160401b0381116104725760051b60200190565b51906001600160a01b038216820361055157565b805182101561045e5760209160051b01019056fe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80631276bcc5146103c9578063127f49ad146103c45780631ac4d079146103bf5780631bc12e07146103ba57806324242e77146103b557806326ddc1ba146103b05780632808e92f146103ab578063280cd09d146103a6578063281cbdd4146103a157806328c1f99b1461039c5780632d4ab28d1461039757806331709520146103925780633174b7271461038d578063333bef221461038857806335cfd9eb1461038357806340eedabb1461037e57806347842663146103795780634c051f14146103745780634dd0a0c91461036f5780634e970c8c1461036a57806359d63bcc146103655780635c1ff1f2146103605780635cc791441461035b5780635d3ae390146103565780635f250f69146103515780636583c37a1461034c578063669f6f35146103475780636d70f7ae146103425780636dfb32aa1461033d5780637f0152a81461033857806381392328146103335780638c64ea4a1461032e5780639005474214610329578063900cf0cf1461032457806395c825591461031f5780639d3e015a1461031a5780639ebc068e146103155780639fd7285c14610310578063a6aac5131461030b578063acfacc8614610306578063ae5c8bfb14610301578063b34eb182146102fc578063b5ed8b12146102f7578063b7635fb8146102f2578063be223838146102ed578063c7d06b54146102e8578063cd1d81ff146102e3578063ce0b1302146102de578063d8a0bebf146102d9578063d9be832c146102d4578063e0913aff146102cf578063e28d4906146102ca578063f5b68c67146102c5578063f698da25146102c0578063f851a440146102bb578063fb834493146102b6578063fc0e2ba7146102b1578063fdeabe1f146102ac5763fe5e82400361000e57611f8e565b611e8b565b611e51565b611e27565b611e00565b611dde565b611db7565b611d5d565b611d23565b611d06565b611ccc565b611c5d565b611c13565b611b39565b611ac3565b611a9c565b6119b3565b611996565b6118b4565b6117de565b6117b1565b6116dc565b611591565b611458565b6113f2565b6113d5565b61139b565b6112f9565b611164565b6110eb565b611028565b610fe8565b610fa5565b610f6b565b610f31565b610d89565b610ce1565b610ca7565b610bb6565b610b7c565b610b5f565b610b2a565b610b02565b610ada565b6109a5565b61096b565b61092b565b6108d2565b6108ab565b610883565b61079a565b610772565b610619565b610551565b61047f565b610458565b61041d565b6103ef565b346103eb575f3660031901126103eb57602060ff601754166040519015158152f35b5f80fd5b346103eb575f3660031901126103eb576020601254604051908152f35b6001600160a01b038116036103eb57565b346103eb5760203660031901126103eb5760043561043a8161040c565b60018060a01b03165f526005602052602060405f2054604051908152f35b346103eb575f3660031901126103eb5760206040515f5160206141765f395f51905f528152f35b346103eb5760203660031901126103eb5760043561049c8161040c565b6001600160a01b038116908115610542575f5160206141765f395f51905f526104e06040516020810190858252602081526104d860408261127b565b519020612d59565b6104e981612e65565b600a80546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141365f395f51905f525f80a37f482b97c53e48ffa324a976e2738053e9aff6eee04d8aac63b10e19411d869b825f80a3005b63d92e233d60e01b5f5260045ffd5b346103eb575f3660031901126103eb5760206040517f3f98d537f24f3ae50e4a30e12fbf3e5c35cf6f40f4ce125c82c1b88e3e7cf3df8152f35b9181601f840112156103eb578235916001600160401b0383116103eb576020808501948460051b0101116103eb57565b9060606003198301126103eb576004356105d48161040c565b916024356001600160401b0381116103eb57816105f39160040161058b565b92909291604435906001600160401b0382116103eb576106159160040161058b565b9091565b346103eb57610627366105bb565b91936001600160a01b031691908215610542576106789461066593604051602081019182526020815261065b60408261127b565b5190209485612f93565b5f5160206141165f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141165f395f51905f525f52600b6020527ffc320c8b7cd913048d0600d8f8fbdd9fd65e3dee2c1f3796e3abba8cc47fa0475491821561074c57815f5160206140f65f395f51905f526107415f5160206141165f395f51905f529384600161070e61070260209a42612045565b6001600160401b031690565b835469ffffffffffffffffffff19166001600160401b039190911690811784559201556040519081529081906020820190565b0390a3604051908152f35b6309913ab360e31b5f52600483905260245ffd5b633599e08d60e21b5f5260045260245ffd5b346103eb575f3660031901126103eb576011546040516001600160a01b039091168152602090f35b346103eb576107a8366105bb565b91936001600160a01b031691908215610542576107f9946107e69360405160208101918252602081526107dc60408261127b565b519020948561310c565b5f5160206141565f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141565f395f51905f525f52600b6020527f5585c2bd0ffb4796fa70abc2a0b1f92173aa4b9f7e1b37d256fd2a975c5abcfa5491821561074c57815f5160206140f65f395f51905f526107415f5160206141565f395f51905f529384600161070e61070260209a42612045565b346103eb575f3660031901126103eb57600a546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb5760206040515f5160206141565f395f51905f528152f35b346103eb5760203660031901126103eb576004355f52600c602052608060405f206001815491015460ff604051926001600160401b0381168452818160401c161515602085015260481c16151560408301526060820152f35b346103eb5760403660031901126103eb57600435602435905f52600860205260405f20905f52602052602060018060a01b0360405f205416604051908152f35b346103eb575f3660031901126103eb5760206040517f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd8152f35b346103eb575f3660031901126103eb576012548015610acb57421115610abc576109d86109d460165460ff1690565b1590565b610aad5760175460ff16610a9e57601354610a00906001600160a01b0316613b49565b613b49565b610a0b601554601055565b610a16601454600f55565b610a1f5f601255565b610a345f6013555f6014555f6015555f601655565b600f546010546040805183815260208101929092527f88cac99f10d8167541407023871a1cc0d797dc75e5b23f3f9f54aaf445f5602c91a16006546001600160a01b03167fd7936f419066f72741af39dde15237d9aed55a0d1d9ab0cb3280569b42c3d8f35f80a3005b6363f5b90b60e11b5f5260045ffd5b63dcd4760160e01b5f5260045ffd5b63285f264160e21b5f5260045ffd5b63cbd2c74d60e01b5f5260045ffd5b346103eb575f3660031901126103eb576006546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb576009546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb57604060018060a01b0360065416805f526005602052815f205482519182526020820152f35b346103eb575f3660031901126103eb576020600354604051908152f35b346103eb575f3660031901126103eb5760206040517f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f8152f35b346103eb5760603660031901126103eb576004356024356001600160401b0381116103eb57610be990369060040161058b565b906044356001600160401b0381116103eb57610c0990369060040161058b565b92909184158015610c9c575b610c8257917f7015cf739f6bedf8447b0723aac5b7e28cc2e5551b144f8bb715b9c29768237f949391610c6493604051602081019087825260208152610c5c60408261127b565b51902061320f565b600354610c7082600355565b604080519182526020820192909252a1005b84600154906311dcbf3760e31b5f5260045260245260445ffd5b506001548511610c15565b346103eb575f3660031901126103eb5760206040517fac5d643ec5a18c3c05126c0540540c01e724afd2beab02a045f0f5d791103a158152f35b346103eb575f3660031901126103eb576012544210610d5c57610e104201804211610d5757601255610d1e5f6013555f6014555f6015555f601655565b60ff19601754166017557f3d364c9a6ad0fb8014a11c487ec342f3a0aaf1a55973fc1bb7353ab6824a358f6020601254604051908152a1005b612031565b6301fd8f7b60e41b5f5260045ffd5b6004359060ff821682036103eb57565b359060ff821682036103eb57565b346103eb5760a03660031901126103eb57610da2610d6b565b60243590604435610db28161040c565b6064356001600160401b0381116103eb57610dd190369060040161058b565b9190926084356001600160401b0381116103eb57610df390369060040161058b565b6001600160a01b038416959094919390861561054257610e51610e45610e45610e388b610e2b8960ff165f52600860205260405f2090565b905f5260205260405f2090565b546001600160a01b031690565b6001600160a01b031690565b610f22576040805160ff868116602083019081529282018b90526001600160a01b038a1660608301527f0f05f8598640816bc7963f9e84995cc362736f66a37eaca8293048e25aed4067989097610f0596610ecd959294919390929190610ec581608081015b03601f19810183528261127b565b519020613325565b610ee687610e2b8560ff165f52600860205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b6040516001600160a01b039094168452169180602081015b0390a3005b63c45546f760e01b5f5260045ffd5b346103eb575f3660031901126103eb5760206040517f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d938152f35b346103eb575f3660031901126103eb5760206040517f8b6e6eebcf1e5aa625df96285186591a18b47d82a0e5344612aba13e51bc0e6f8152f35b346103eb575f3660031901126103eb57608060018060a01b036013541660145460155460ff60165416916040519384526020840152604083015215156060820152f35b346103eb5760203660031901126103eb576004356110058161040c565b60018060a01b03165f526002602052602060ff60405f2054166040519015158152f35b346103eb5760203660031901126103eb576004356110458161040c565b6001600160a01b038116908115610542575f5160206141165f395f51905f5261108960405160208101908582526020815261108160408261127b565b519020612d91565b61109281612e65565b600980546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141365f395f51905f525f80a37f62e09f04681da780308095cdff046660f0b1e396888312a767499401693c03e55f80a3005b346103eb5760203660031901126103eb57600435335f52600260205260ff60405f2054161561115157801561054257335f8181526005602052604081208390557fe58dd23bcf790de89fbc05578bcc206ece8cb67dee1cf099fce6ff74d052ff3e9080a3005b633b63649d60e11b5f523360045260245ffd5b346103eb576101403660031901126103eb5761117e610d6b565b6024356044359160a03660631901126103eb57610104356001600160401b0381116103eb576111b190369060040161058b565b9061012435946001600160401b0386116103eb576111d661001896369060040161058b565b959094612254565b634e487b7160e01b5f52603260045260245ffd5b60075481101561120e5760075f5260205f209060021b01905f90565b6111de565b805482101561120e575f5260205f209060021b01905f90565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b0382111761125b57604052565b61122c565b608081019081106001600160401b0382111761125b57604052565b90601f801991011681019081106001600160401b0382111761125b57604052565b604051906112ab60808361127b565b565b906040516112ba81611240565b608060ff808395546001600160401b0381168552818160401c166020860152818160481c166040860152818160501c16606086015260581c1616910152565b346103eb5760203660031901126103eb576004356007548110156103eb57611323610100916111f2565b5061139960ff825416916001810154906113446003600283015492016112ad565b9160405194855260208501526040840152606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565bf35b346103eb575f3660031901126103eb5760206040517fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e628152f35b346103eb575f3660031901126103eb576020600f54604051908152f35b346103eb5760203660031901126103eb576004355f52600d60205260c060405f2060ff81541690600181015490600281015460038201549060056004840154930154936040519515158652602086015260408501526060840152608083015260a0820152f35b346103eb5760603660031901126103eb576004356024356001600160401b0381116103eb5761148b90369060040161058b565b604435916001600160401b0383116103eb576114ae6114d493369060040161058b565b92909160405160208101906114cc81610eb78a859190602083019252565b51902061343b565b6114e6815f52600c60205260405f2090565b80546001600160401b0381161561157d57604081901c60ff166115695760481c60ff1661155557805469ff0000000000000000001916690100000000000000000017815560010154907f4ef6805613a59a1bece0b99a00b945fffadc1bb793c7064706233d30fd438c765f80a3005b632863f91560e21b5f52600482905260245ffd5b633599e08d60e21b5f52600483905260245ffd5b633e426d5160e21b5f52600483905260245ffd5b60803660031901126103eb576024356004356044356001600160401b0381116103eb576115c290369060040161058b565b906064356115e2610e45610e3887610e2b885f52600860205260405f2090565b916001600160a01b038316156116ab575f547fc55043b6a137f66033384e3f6d9b80e72303eab38436f8fdb89899dc87ce53a29490611629906001600160a01b0316610e45565b3303611692575f611640611683938293369161232c565b93945b61164d8989613ca0565b60405161167181610eb78a8a60208401966303a81a5760e11b885260248501612382565b51915af461167d6123c7565b506123f6565b610f1d60405192839283612442565b50505061169d613bec565b6116835f8060035494611643565b635c7f4b4760e11b5f5260045ffd5b6004359061ffff821682036103eb57565b6024359061ffff821682036103eb57565b346103eb5760403660031901126103eb576117066116f86116ba565b6117006116cb565b906125d1565b6040518091602082016020835281518091526020604084019201905f5b818110611731575050500390f35b9193509160206101006001926117a36060885160ff81511684528581015186850152604081015160408501520151606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565b019401910191849392611723565b346103eb575f3660031901126103eb576020604051610e108152f35b60c09060231901126103eb57602490565b346103eb576101203660031901126103eb576004356117fc366117cd565b9060e4356001600160401b0381116103eb5761181c90369060040161058b565b92610104356001600160401b0381116103eb5761183d90369060040161058b565b90823561184981612689565b806118a8575b611899576118959561188595610eb76118766118809660405192839160208301958661269d565b5190209485613551565b613a99565b6040519081529081906020820190565b0390f35b63137ec6d760e11b5f5260045ffd5b5060208301351561184f565b346103eb5760e03660031901126103eb576004356118d1366117cd565b6118f360405160208101906118eb81610eb786888661269d565b519020612dc9565b906118fd82612e65565b821561197c575b7faa1bacadd202709f2df9c31faf4babdbb21a245021c22298bfcdf22861ca12c69161197761196c5f5160206140d65f395f51905f5293865f52600d6020526119508160405f206126ec565b6040519485945f5160206141365f395f51905f525f80a3612693565b151582526020820190565b0390a2005b9150600e545f198114610d575760018101600e5591611904565b346103eb575f3660031901126103eb576020601054604051908152f35b346103eb576119c1366105bb565b91936001600160a01b03169190821561054257611a12946119ff9360405160208101918252602081526119f560408261127b565b5190209485613654565b5f5160206141765f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141765f395f51905f525f52600b6020527f5248b41ce7bdc12ebe0248f44130be972d690f78fe7dbe1a76d984641d9dcfc25491821561074c57815f5160206140f65f395f51905f526107415f5160206141765f395f51905f529384600161070e61070260209a42612045565b346103eb575f3660031901126103eb5760206040515f5160206140d65f395f51905f528152f35b346103eb57611ad1366105bb565b92939091906001600160a01b03168015610542575f80808093611b198888888c476040516020810191888352604082015260408152611b1160608261127b565b519020613757565b4790828215611b30575bf115611b2b57005b61273a565b506108fc611b23565b346103eb5760203660031901126103eb57600435611b568161040c565b6001600160a01b0316801561054257611b8a604051602081019083825260208152611b8260408261127b565b519020612e01565b611b9381612e65565b6011545f5160206141565f395f51905f5290611bb7906001600160a01b0316610e45565b601180546001600160a01b0319166001600160a01b038616179055915f5160206141365f395f51905f525f80a36001600160a01b03167ff6879817b383066906e8355b81d5157ffe8bff151dd1946b33863aeede50ff985f80a3005b346103eb575f3660031901126103eb576020600e54604051908152f35b9181601f840112156103eb578235916001600160401b0383116103eb57602083818601950101116103eb57565b346103eb5760a03660031901126103eb576004356024356001600160401b0381116103eb57611c90903690600401611c30565b9190604435926001600160401b0384116103eb57611cb5610018943690600401611c30565b9160643593611cc38561040c565b6084359561292e565b346103eb575f3660031901126103eb5760206040517ffdc5f96508969628a00bce64abbf1ea989f16e791b70592a3122d67a7792e48c8152f35b346103eb575f3660031901126103eb576020600454604051908152f35b346103eb575f3660031901126103eb5760206040517fa24d58aaa8deed8b2ff0e63d867e6fe155de046522ed61849f5647e59d04b6ba8152f35b346103eb5760203660031901126103eb576004356001548110156103eb5760015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb5760206040515f5160206141165f395f51905f528152f35b346103eb575f3660031901126103eb576020611df8612cc1565b604051908152f35b346103eb575f3660031901126103eb575f546040516001600160a01b039091168152602090f35b346103eb5760203660031901126103eb576004355f52600b602052602060405f2054604051908152f35b346103eb575f3660031901126103eb5760206040517fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a813058152f35b346103eb57611e99366105bb565b6001600160a01b0385165f908152600260205260409020549294939290919060ff1615611f14576001600160a01b0384165f908152600560205260409020541561054257604080516001600160a01b03861660208201908152610018976109fb969093909290611f0c9082908101610eb7565b51902061386d565b633b63649d60e11b5f526001600160a01b03841660045260245ffd5b90602080835192838152019201905f5b818110611f4d5750505090565b82516001600160a01b0316845260209384019390920191600101611f40565b611f8460409295949395606083526060830190611f30565b9460208201520152565b346103eb575f3660031901126103eb5760035460015460405190602082828152019060015f52827fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65f5b838110611ffc575050611ff09061189593038461127b565b60405193849384611f6c565b81546001600160a01b0316855260209094019385925060019182019101611fd8565b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b91908201809211610d5757565b35906001600160401b03821682036103eb57565b60ff6120c2608080936001600160401b0361208082612052565b1686528361209060208301610d7b565b166020870152836120a360408301610d7b565b166040870152836120b660608301610d7b565b16606087015201610d7b565b16910152565b91908260a09103126103eb576040516120e081611240565b608061212c8183956120f181612052565b85526120ff60208201610d7b565b602086015261211060408201610d7b565b604086015261212160608201610d7b565b606086015201610d7b565b910152565b600754600160401b81101561125b5780600161215292016007556007611213565b9190916122395761221f6080606060036112ab9560ff86511660ff198254161781556020860151600182015560408601516002820155019301516121b66001600160401b0382511685906001600160401b03166001600160401b0319825416179055565b602081015184546121fa9160ff60401b1990911660409190911b68ff0000000000000000161760ff60408401511660ff60481b9060481b169060ff60481b19161790565b606082015160ff60501b1990911660509190911b60ff60501b16178455015160ff1690565b815460ff60581b191660589190911b60ff60581b16179055565b61201e565b90815260c0810192916112ab9160200190612066565b95929490958215611899576122cd606494612301937fdcd264bd7d6d022cfcd2ef488637c26dba3344acfaad38a093f1755fe21085f5976040519960208b0160ff87169b8c82528d60408201528960608201526122b4608082018c612066565b61010081526122c56101208261127b565b519020613983565b6122e16122d861129c565b60ff9092168252565b8660208201528260408201526122f736856120c8565b6060820152612131565b6123106040519283928361223e565b0390a3565b6001600160401b03811161125b5760051b60200190565b92919061233881612315565b93612346604051958661127b565b602085838152019160051b81019283116103eb57905b82821061236857505050565b6020809183356123778161040c565b81520191019061235c565b9392916123a79060409260018060a01b03168652606060208701526060860190611f30565b930152565b6001600160401b03811161125b57601f01601f191660200190565b3d156123f1573d906123d8826123ac565b916123e6604051938461127b565b82523d5f602084013e565b606090565b156123fd57565b60405162461bcd60e51b815260206004820152601c60248201527f53747261746567792064656c656761746563616c6c206661696c6564000000006044820152606490fd5b9291906123a7602091604086526040860190611f30565b6124625f612315565b90612470604051928361127b565b5f825281601f196124805f612315565b01905f5b82811061249057505050565b60209060405161249f81611260565b5f81525f838201525f60408201526040516124b981611240565b5f81525f848201525f60408201525f60608201525f6080820152606082015282828501015201612484565b906124ee82612315565b6124fb604051918261127b565b828152809261250c601f1991612315565b01905f5b82811061251c57505050565b60209060405161252b81611260565b5f81525f838201525f604082015260405161254581611240565b5f81525f848201525f60408201525f60608201525f6080820152606082015282828501015201612510565b9061ffff8091169116039061ffff8211610d5757565b805182101561120e5760209160051b010190565b906040516125a781611260565b606061212c6003839560ff81541685526001810154602086015260028101546040860152016112ad565b6007549161ffff8216928084101561267d578061ffff831611612671575b508261ffff82161115612663576126109161260991612570565b61ffff1690565b612619816124e4565b915f5b8281106126295750505090565b8061264761264161263c60019486612045565b6111f2565b5061259a565b6126518287612586565b5261265c8186612586565b500161261c565b50505061266e612459565b90565b61ffff9150165f6125ef565b5050505061266e612459565b801515036103eb57565b3561266e81612689565b90929160a060c09160e0840195845280356126b781612689565b151560208501526020810135604085015260408101356060850152606081013560808501526080810135828501520135910152565b9060a060059180356126fd81612689565b60ff801986541691151516178455602081013560018501556040810135600285015560608101356003850155608081013560048501550135910155565b6040513d5f823e3d90fd5b91906040838203126103eb57825161275c81612689565b926020810151906001600160401b0382116103eb570181601f820112156103eb57805190612789826123ac565b92612797604051948561127b565b828452602083830101116103eb57815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b92906127f19061266e95936060865260608601916127b8565b926001602082015260408185039101526127b8565b9060a8116103eb5760880190602090565b90610168116103eb576101480190602090565b90610198116103eb576101780190602090565b906101c8116103eb576101a80190602090565b906101f8116103eb576101d80190602090565b9061021c116103eb576102080190601490565b9061023c116103eb5761021c0190602090565b90610244116103eb5761023c0190600890565b3590602081106128aa575090565b5f199060200360031b1b1690565b356bffffffffffffffffffffffff198116929190601482106128d8575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b356001600160c01b0319811692919060088210612913575050565b6001600160c01b031960089290920360031b82901b16169150565b9091929495936012548015908115612cb7575b50610acb576001600160a01b0387169586156105425760115461296c906001600160a01b0316610e45565b916001600160a01b03831615612ca8576129a1925f92836040518096819582946302bc2ce760e51b84528c8c600486016127d8565b03925af1908115611b2b575f905f92612c83575b5015612c6557506102488310612c5657612a18906129dc6129d68585612806565b9061289c565b6129e96129d68686612817565b6129f66129d6878761282a565b90612a046129d6888861283d565b92612a126129d68989612850565b94613d62565b83612a5e612a58612a52612a3e612a38612a328888612863565b906128b8565b60601c90565b95612a4c6129d68288612876565b95612889565b906128f8565b60c01c90565b926001600160a01b031603612c47578203612c4757600f54936001600160401b0382169480861115612c285750612a9a6109d460165460ff1690565b612bf65760145480861115612b785750612b4c907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612aeb612adc61129c565b6001600160a01b039093168352565b6020820152836040820152612b036060820160019052565b60609060018060a01b038151166bffffffffffffffffffffffff60a01b6013541617601355602081015160145560408101516015550151151560ff801960165416911617601655565b612b5b60ff1960175416601755565b604080516001600160401b039290921682526020820192909252a2565b929350509214612b87575b5050565b6015548114612b83577fa3f0eabe92ef7bacb81dba904189dc163924ee16379f429441a4117441609fff91612bc4600160ff196017541617601755565b612bf160155492604051938493846040919493926001600160401b03606083019616825260208201520152565b0390a1565b612b5b907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612aeb612adc61129c565b636762eb4960e01b5f526004526001600160401b03821660245260445ffd5b63319c9a2160e21b5f5260045ffd5b632ffd02b360e11b5f5260045ffd5b805115612c7457805190602001fd5b63e1ac453160e01b5f5260045ffd5b9050612ca191503d805f833e612c99818361127b565b810190612745565b905f6129b5565b63baa3de5f60e01b5f5260045ffd5b905042115f612941565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f3d4a1189ec311cad4499197cf097eefb10346f2894cdd7cbbcb2d2a48001c91860408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152612d5360c08261127b565b51902090565b60405160208101915f5160206141765f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206141165f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206140d65f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206141565f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b906040519060208201928352604082015230606082015246608082015260808152612d5360a08261127b565b805f52600c60205260405f209081546001600160401b038116906001600160401b03821615612eef57604081901c60ff166115695760481c60ff16611555576001600160401b0381164210612ec9575050805460ff60401b1916600160401b179055565b63c504f34d60e01b5f526004919091526001600160401b0316602452504260445260645ffd5b82633e426d5160e21b5f5260045260245ffd5b919081101561120e5760051b0190565b3561266e8161040c565b919081101561120e5760051b81013590601e19813603018212156103eb5701908135916001600160401b0383116103eb5760200182360381136103eb579190565b929192612f69826123ac565b91612f77604051938461127b565b8294818452818301116103eb578281602093845f960137010152565b5f54909491929190612fad906001600160a01b0316610e45565b331480613104575b806130fc575b6130e857600354938183036130b75784831080156130df575b6130c657612ff360045480975f5160206141165f395f51905f52613f67565b925f945f5b8781106130195750505050505050506130146112ab9160010190565b600455565b61302c613027828585612f02565b612f12565b966001600160a01b0390811690881611156130b757866130696109d46130628360018060a01b03165f52600260205260405f2090565b5460ff1690565b61309c5761308f6109d4613088613081858a8a612f1c565b3691612f5d565b8984613fe8565b61309c5750600101612ff8565b633b63649d60e11b5f526001600160a01b031660045260245ffd5b630da1c57360e41b5f5260045ffd5b6378f4355360e11b5f526004839052602485905260445ffd5b50848210612fd4565b50505050506112ab61301460045460010190565b508015612fbb565b508115612fb5565b5f54909491929190613126906001600160a01b0316610e45565b331480613207575b806131ff575b6130e857600354938183036130b75784831080156131f6575b6130c65761316c60045480975f5160206141565f395f51905f52613f67565b925f945f5b87811061318d5750505050505050506130146112ab9160010190565b61319b613027828585612f02565b966001600160a01b0390811690881611156130b757866131d16109d46130628360018060a01b03165f52600260205260405f2090565b61309c576131e96109d4613088613081858a8a612f1c565b61309c5750600101613171565b5084821061314d565b508015613134565b50811561312e565b5f54909491929190613229906001600160a01b0316610e45565b33148061331d575b80613315575b6130e857600354938183036130b757848310801561330c575b6130c65761328260045480977fac5d643ec5a18c3c05126c0540540c01e724afd2beab02a045f0f5d791103a15613f67565b925f945f5b8781106132a35750505050505050506130146112ab9160010190565b6132b1613027828585612f02565b966001600160a01b0390811690881611156130b757866132e76109d46130628360018060a01b03165f52600260205260405f2090565b61309c576132ff6109d4613088613081858a8a612f1c565b61309c5750600101613287565b50848210613250565b508015613237565b508115613231565b5f5490949192919061333f906001600160a01b0316610e45565b331480613433575b8061342b575b6130e857600354938183036130b7578483108015613422575b6130c65761339860045480977f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd613f67565b925f945f5b8781106133b95750505050505050506130146112ab9160010190565b6133c7613027828585612f02565b966001600160a01b0390811690881611156130b757866133fd6109d46130628360018060a01b03165f52600260205260405f2090565b61309c576134156109d4613088613081858a8a612f1c565b61309c575060010161339d565b50848210613366565b50801561334d565b508115613347565b5f54909491929190613455906001600160a01b0316610e45565b331480613549575b80613541575b6130e857600354938183036130b7578483108015613538575b6130c6576134ae60045480977fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a81305613f67565b925f945f5b8781106134cf5750505050505050506130146112ab9160010190565b6134dd613027828585612f02565b966001600160a01b0390811690881611156130b757866135136109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761352b6109d4613088613081858a8a612f1c565b61309c57506001016134b3565b5084821061347c565b508015613463565b50811561345d565b5f5490949192919061356b906001600160a01b0316610e45565b33148061364c575b80613644575b6130e857600354938183036130b757848310801561363b575b6130c6576135b160045480975f5160206140d65f395f51905f52613f67565b925f945f5b8781106135d25750505050505050506130146112ab9160010190565b6135e0613027828585612f02565b966001600160a01b0390811690881611156130b757866136166109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761362e6109d4613088613081858a8a612f1c565b61309c57506001016135b6565b50848210613592565b508015613579565b508115613573565b5f5490949192919061366e906001600160a01b0316610e45565b33148061374f575b80613747575b6130e857600354938183036130b757848310801561373e575b6130c6576136b460045480975f5160206141765f395f51905f52613f67565b925f945f5b8781106136d55750505050505050506130146112ab9160010190565b6136e3613027828585612f02565b966001600160a01b0390811690881611156130b757866137196109d46130628360018060a01b03165f52600260205260405f2090565b61309c576137316109d4613088613081858a8a612f1c565b61309c57506001016136b9565b50848210613695565b50801561367c565b508115613676565b5f54909491929190613771906001600160a01b0316610e45565b331480613865575b8061385d575b6130e857600354938183036130b7578483108015613854575b6130c6576137ca60045480977f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d93613f67565b925f945f5b8781106137eb5750505050505050506130146112ab9160010190565b6137f9613027828585612f02565b966001600160a01b0390811690881611156130b7578661382f6109d46130628360018060a01b03165f52600260205260405f2090565b61309c576138476109d4613088613081858a8a612f1c565b61309c57506001016137cf565b50848210613798565b50801561377f565b508115613779565b5f54909491929190613887906001600160a01b0316610e45565b33148061397b575b80613973575b6130e857600354938183036130b757848310801561396a575b6130c6576138e060045480977f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f613f67565b925f945f5b8781106139015750505050505050506130146112ab9160010190565b61390f613027828585612f02565b966001600160a01b0390811690881611156130b757866139456109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761395d6109d4613088613081858a8a612f1c565b61309c57506001016138e5565b508482106138ae565b508015613895565b50811561388f565b5f5490949192919061399d906001600160a01b0316610e45565b331480613a91575b80613a89575b6130e857600354938183036130b7578483108015613a80575b6130c6576139f660045480977fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e62613f67565b925f945f5b878110613a175750505050505050506130146112ab9160010190565b613a25613027828585612f02565b966001600160a01b0390811690881611156130b75786613a5b6109d46130628360018060a01b03165f52600260205260405f2090565b61309c57613a736109d4613088613081858a8a612f1c565b61309c57506001016139fb565b508482106139c4565b5080156139ab565b5081156139a5565b613ab0905f5160206140d65f395f51905f52612e39565b90815f52600c60205260405f2060ff815460401c16611569575f5160206140d65f395f51905f525f52600b6020527f9b6d9405e2a268edd94615fe7f07c0d5d9dda2152c2e48f4e74379972af1c618548015613b37575f5160206140f65f395f51905f526123105f5160206140d65f395f51905f529384600161070e6107028a9742612045565b6309913ab360e31b5f5260045260245ffd5b6001600160a01b0381165f8181526002602052604090205490919060ff1615613bd9576001600160a01b0381165f908152600560205260409020541561054257600680546001600160a01b031916831790556001600160a01b03165f90815260056020526040902054907f2c8c895ef6e3978e12490ffd8cd3b92d4717b223562f851382f5daf74f587b515f80a3565b50633b63649d60e11b5f5260045260245ffd5b600154613bf881612315565b91613c06604051938461127b565b818352601f19613c1583612315565b0136602085013782905f5b83811015613c99577fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68101546001600160a01b03165f9081526005602052604090205490811561054257600191613c93906001600160a01b0316613c848389612586565b6001600160a01b039091169052565b01613c20565b5091509150565b6007545f5b818110613cc55763dfffe2f960e01b5f526004839052602484905260445ffd5b613cd1612641826111f2565b8360ff8251161480613cfa575b613ceb5750600101613ca5565b6040015160601c949350505050565b5084602082015114613cde565b9060405160c081018181106001600160401b0382111761125b5760405260a06005829460ff81541615158452600181015460208501526002810154604085015260038101546060850152600481015460808501520154910152565b93929190613d80613d7b865f52600d60205260405f2090565b613d07565b94613d8e6109d48751151590565b613f555750602085018051156105425751808203613f19575050604084015180151580613f0f575b613ed1575050606083015180151580613ec7575b613e89575050608082015180151580613e7f575b613e4157505060a0015180151580613e37575b613df9575050565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523360d81b608482015260a490fd5b5080821415613df1565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264292a26a91960d91b608482015260a490fd5b5080821415613dde565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523160d81b608482015260a490fd5b5080821415613dca565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264052544d52360dc1b608482015260a490fd5b5080821415613db6565b60405163fef6c5cf60e01b81526004808201929092526024810192909252606060448301526064820152631354951160e21b608482015260a490fd5b6350dfe91360e01b5f5260045260245ffd5b916040519160208301937f4a3d56bf3b5708e5b633d12931f9923b37fde6895d6bd92957bbfa92cd003039855260408401526060830152608082015260808152613fb260a08261127b565b519020613fbd612cc1565b9060405190602082019261190160f01b84526022830152604282015260428152612d5360628261127b565b90915f91906001600160a01b038216156140cd5760405192600484019460248501956044860192853b1561405157509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b9796505090508151806040146140a85760411461406e5750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052614086565b505050505f9056feea4a6847c3f47fe0f98dcfe2e2c074e6cb42f6d74c367b33ae8516f537e775829cc91136b2c7668ecd202c7008f17e818e108b5448a7b7fd48bd2ca6b4aab51fb40912900bb80b6bc5e38d8489266de7299eedb40b03490214410117ef53ff9279883188dbf80e171cf94b3b44b6437b838158b1d3a5df6ccc709eeb7c5217296acb9fef2a4a1ecaa044f4c8979d9f48b0d5be623c860275be31c4cbd34c169cb2d153886d95f8f2d4836fb16c9fac869e1ce9cfc93d919a0f7dfe38439b9771a2646970667358221220d9a3575e6aa98198ed460c72687df8b305209a32fda153cf7302dc50f249d44a64736f6c634300081e0033"},"devdoc":{"details":"This contract acts as the governance layer and the vault registry. It manages the set of authorized operators, enforces quorum consensus for critical updates, and maintains the registry of deposit vaults across different chains. It combines immediate multi-sig actions for operational tasks with timelocked actions for high-risk configuration changes.","errors":{"InsufficientSignatures(uint256,uint256)":[{"params":{"provided":"The number of signatures provided.","required":"The current `committeeThreshold` required."}}],"InvalidCommitteeThreshold(uint256,uint256)":[{"params":{"newThreshold":"The proposed threshold.","operatorCount":"The total number of registered operators."}}],"InvalidDelay(uint256)":[{"params":{"delay":"The provided delay in seconds."}}],"NotOperator(address)":[{"params":{"signer":"The address recovered from the signature."}}],"SignersNotSortedOrUnique()":[{"details":"Signatures must be sorted strictly ascending (A < B) to prevent duplicate counting in O(N)."}],"TimelockAlreadyCanceled(bytes32)":[{"params":{"opId":"The operation hash."}}],"TimelockAlreadyExecuted(bytes32)":[{"params":{"opId":"The operation hash."}}],"TimelockNotReady(bytes32,uint256,uint256)":[{"params":{"nowTs":"The current block timestamp.","opId":"The unique hash of the operation.","readyAt":"The timestamp when the operation becomes executable."}}],"TimelockUnknown(bytes32)":[{"params":{"opId":"The operation hash."}}],"VaultNotFound(uint256,uint256)":[{"params":{"routingId":"The routing ID of the vault.","vmId":"The Chain ID for EVM chains requested."}}]},"kind":"dev","methods":{"addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":{"details":"This list is append-only. New vaults can be added, but existing ones cannot be removed.","params":{"routingId":"The routing ID of the vault.","signatures":"Corresponding signatures.","signers":"Sorted array of signers.","vaultAddr":"The address of the vault (as bytes32).","vmId":"The Chain ID for EVM chains requested."}},"cancelTimelock(bytes32,address[],bytes[])":{"details":"Can be called at any time before execution to prevent a malicious or erroneous update.","params":{"opId":"The hash of the operation to cancel."}},"constructor":{"params":{"initialCommitteeThreshold":"The number of signatures required for valid governance actions.","initialOperators":"The list of addresses that will form the initial governance council.","initialRegistryContract":"The initial Registry Contract address.","initialRiskManager":"The initial Risk Manager address."}},"domainSeparator()":{"returns":{"_0":"The domain separator hash."}},"executeRegistryContract(address)":{"params":{"newRegistry":"The address that was previously scheduled."}},"executeRiskManager(address)":{"params":{"newRiskManager":"The address that was previously scheduled."}},"getCommitteeConfig()":{"details":"Let's operators query for 'k (the committee threshold), n' thresholds and the current committee member list\"."},"getLeader()":{"details":"When querying current leader, then the contract returns the active operator_pubkey and attested_pubkey."},"getVaults(uint16,uint16)":{"details":"The input types are intentionally `uint16` to preserve the function selector `0x9fd7285c` for backward compatibility with existing Rust clients.","params":{"end":"The end index (exclusive).","start":"The start index."},"returns":{"_0":"An array of Vault structs."}},"registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":{"details":"Used to define how the Credential Manager talks to L2s (e.g., via bridges). Only one strategy can be registered per chain.","params":{"routingId":"The routing ID of the vault.","signatures":"Corresponding signatures.","signers":"Sorted array of signers.","strategy":"The address of the strategy contract.","vmId":"The Chain ID for EVM chains requested."}},"registerAttestedKey(bytes32)":{"details":"Maps the attested_pubkey of a new CE joining the quorum.","params":{"newAttestedKey":"The address derived from the TEE's public key."}},"scheduleRegistryContract(address,address[],bytes[])":{"params":{"newRegistry":"The proposed new Registry address."},"returns":{"opId":"The unique hash of the scheduled operation."}},"scheduleRiskManager(address,address[],bytes[])":{"details":"The operation cannot be executed until `TIMELOCK_DELAY` has passed.","params":{"newRiskManager":"The proposed new Risk Manager address."},"returns":{"opId":"The unique hash of the scheduled operation."}},"scheduleUpdateAutomataVerifier(address,address[],bytes[])":{"details":"Operators vote to update the verifier and the update is proposed with a timelocked delay."},"setDepositVaultAdministrators(uint256,uint256,address[],uint256)":{"details":"Admin can set arbitrary administrators/quorum using the debug path. Non-admin calls ignore the provided administrators/quorum and instead sync administrators from operator-attested keys, using the current committee threshold as the quorum.","params":{"newAdministrators":"The list of new admin addresses for that vault.","newWithdrawalQuorum":"The new quorum requirement for that vault.","routingId":"The routing ID of the vault.","vmId":"The Chain ID for EVM chains requested."}},"submitRestartProof(uint256,bytes,bytes,address,bytes32)":{"details":"We compare Epochs. The highest epoch wins.","params":{"checkpointHash":"The state hash being served.","newLeader":"The address claiming leadership.","tdxReportBody":"The 'Public Output' of the ZK Circuit (The TEE Quote Body).","zkProof":"The Groth16 proof bytes."}},"updateCommitteeThreshold(uint256,address[],bytes[])":{"details":"Requires a quorum of the *current* operators to approve.","params":{"newThreshold":"The new minimum number of signatures.","signatures":"Corresponding signatures.","signers":"Sorted array of signers."}}},"stateVariables":{"OP_APPOINT_LEADER":{"details":"Used for appointing a leader in the absence of a leader - for bootstrap or emergency recovery."},"_ACTION_TYPEHASH":{"details":"Generic Action typehash used for all governance signatures. Structure: Action(bytes32 opType, bytes32 paramsHash, uint256 nonce)"},"_EIP712_DOMAIN_TYPEHASH":{"details":"EIP-712 Domain Separator typehash."},"_NAME_HASH":{"details":"EIP-712 name hash for this contract."},"_VERSION_HASH":{"details":"EIP-712 version hash."},"adminUpdateStrategies":{"details":"Used to abstract cross-chain messaging logic (e.g., LayerZero, Optimism Messenger)."},"epoch":{"details":"Incremented on every successful restart."},"governanceNonce":{"details":"Included in every signed hash to strictly order operations and prevent replay attacks."},"latestCheckpointHash":{"details":"New nodes verify this hash against the leader's data to ensure they are on the correct fork."},"leader":{"details":"The leader is responsible for coordinating the clearing engine."},"operatorToAttestedKey":{"details":"Used to verify that a TEE signature belongs to a specific operator."},"operators":{"details":"These keys form the root of trust for the system."},"timelockDelayFor":{"details":"e.g., OP_SET_REGISTRY -> 72 hours."},"vaults":{"details":"This list is strictly append-only; vaults cannot be removed to prevent history modification."}},"title":"CredentialManager","version":1},"methodIdentifiers":{"GATHERING_DURATION()":"0xa6aac513","OP_ADD_VAULT()":"0x90054742","OP_APPOINT_LEADER()":"0x4e970c8c","OP_CANCEL_TIMELOCK()":"0xfc0e2ba7","OP_MANAGE_PROFILE()":"0xb7635fb8","OP_REGISTER_STRATEGY()":"0x333bef22","OP_RESTART()":"0xd8a0bebf","OP_SET_AUTOMATA_VERIFIER()":"0x2d4ab28d","OP_SET_COMMITTEE_THRESHOLD()":"0x5c1ff1f2","OP_SET_DELAY()":"0xe0913aff","OP_SET_MEASUREMENTS()":"0x6583c37a","OP_SET_REGISTRY()":"0x1bc12e07","OP_SET_RISK_MANAGER()":"0xf5b68c67","OP_SET_VAULT_ADMINS()":"0x26ddc1ba","OP_WITHDRAW()":"0x5f250f69","addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":"0x81392328","admin()":"0xf851a440","adminUpdateStrategies(uint256,uint256)":"0x3174b727","appointLeader(address,address[],bytes[])":"0xfdeabe1f","automataVerifier()":"0x280cd09d","bestCandidate()":"0x669f6f35","cancelTimelock(bytes32,address[],bytes[])":"0x9d3e015a","committeeThreshold()":"0x4dd0a0c9","domainSeparator()":"0xf698da25","epoch()":"0x900cf0cf","executeManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32))":"0xae5c8bfb","executeRegistryContract(address)":"0x24242e77","executeRiskManager(address)":"0x6dfb32aa","executeUpdateAutomataVerifier(address)":"0xc7d06b54","getCommitteeConfig()":"0xfe5e8240","getLeader()":"0x4c051f14","getVaults(uint16,uint16)":"0x9fd7285c","governanceNonce()":"0xd9be832c","initiateRestart()":"0x5cc79144","isOperator(address)":"0x6d70f7ae","isRestartAmbiguous()":"0x1276bcc5","latestCheckpointHash()":"0xb34eb182","leader()":"0x40eedabb","measurementProfiles(uint256)":"0x95c82559","nextProfileId()":"0xcd1d81ff","operatorToAttestedKey(address)":"0x1ac4d079","operators(uint256)":"0xe28d4906","registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":"0x5d3ae390","registerAttestedKey(bytes32)":"0x7f0152a8","registryContract()":"0x28c1f99b","resolveRestart()":"0x35cfd9eb","restartGatheringDeadline()":"0x127f49ad","riskManager()":"0x47842663","scheduleManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32),address[],bytes[])":"0xacfacc86","scheduleRegistryContract(address,address[],bytes[])":"0xb5ed8b12","scheduleRiskManager(address,address[],bytes[])":"0x2808e92f","scheduleUpdateAutomataVerifier(address,address[],bytes[])":"0x281cbdd4","setDepositVaultAdministrators(uint256,uint256,address[],uint256)":"0x9ebc068e","submitRestartProof(uint256,bytes,bytes,address,bytes32)":"0xce0b1302","timelockDelayFor(bytes32)":"0xfb834493","timelockOps(bytes32)":"0x31709520","updateCommitteeThreshold(uint256,address[],bytes[])":"0x59d63bcc","vaults(uint256)":"0x8c64ea4a","withdraw(address,address[],bytes[])":"0xbe223838"},"runtimeBytecode":{"bytecode":"0x6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80631276bcc5146103c9578063127f49ad146103c45780631ac4d079146103bf5780631bc12e07146103ba57806324242e77146103b557806326ddc1ba146103b05780632808e92f146103ab578063280cd09d146103a6578063281cbdd4146103a157806328c1f99b1461039c5780632d4ab28d1461039757806331709520146103925780633174b7271461038d578063333bef221461038857806335cfd9eb1461038357806340eedabb1461037e57806347842663146103795780634c051f14146103745780634dd0a0c91461036f5780634e970c8c1461036a57806359d63bcc146103655780635c1ff1f2146103605780635cc791441461035b5780635d3ae390146103565780635f250f69146103515780636583c37a1461034c578063669f6f35146103475780636d70f7ae146103425780636dfb32aa1461033d5780637f0152a81461033857806381392328146103335780638c64ea4a1461032e5780639005474214610329578063900cf0cf1461032457806395c825591461031f5780639d3e015a1461031a5780639ebc068e146103155780639fd7285c14610310578063a6aac5131461030b578063acfacc8614610306578063ae5c8bfb14610301578063b34eb182146102fc578063b5ed8b12146102f7578063b7635fb8146102f2578063be223838146102ed578063c7d06b54146102e8578063cd1d81ff146102e3578063ce0b1302146102de578063d8a0bebf146102d9578063d9be832c146102d4578063e0913aff146102cf578063e28d4906146102ca578063f5b68c67146102c5578063f698da25146102c0578063f851a440146102bb578063fb834493146102b6578063fc0e2ba7146102b1578063fdeabe1f146102ac5763fe5e82400361000e57611f8e565b611e8b565b611e51565b611e27565b611e00565b611dde565b611db7565b611d5d565b611d23565b611d06565b611ccc565b611c5d565b611c13565b611b39565b611ac3565b611a9c565b6119b3565b611996565b6118b4565b6117de565b6117b1565b6116dc565b611591565b611458565b6113f2565b6113d5565b61139b565b6112f9565b611164565b6110eb565b611028565b610fe8565b610fa5565b610f6b565b610f31565b610d89565b610ce1565b610ca7565b610bb6565b610b7c565b610b5f565b610b2a565b610b02565b610ada565b6109a5565b61096b565b61092b565b6108d2565b6108ab565b610883565b61079a565b610772565b610619565b610551565b61047f565b610458565b61041d565b6103ef565b346103eb575f3660031901126103eb57602060ff601754166040519015158152f35b5f80fd5b346103eb575f3660031901126103eb576020601254604051908152f35b6001600160a01b038116036103eb57565b346103eb5760203660031901126103eb5760043561043a8161040c565b60018060a01b03165f526005602052602060405f2054604051908152f35b346103eb575f3660031901126103eb5760206040515f5160206141765f395f51905f528152f35b346103eb5760203660031901126103eb5760043561049c8161040c565b6001600160a01b038116908115610542575f5160206141765f395f51905f526104e06040516020810190858252602081526104d860408261127b565b519020612d59565b6104e981612e65565b600a80546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141365f395f51905f525f80a37f482b97c53e48ffa324a976e2738053e9aff6eee04d8aac63b10e19411d869b825f80a3005b63d92e233d60e01b5f5260045ffd5b346103eb575f3660031901126103eb5760206040517f3f98d537f24f3ae50e4a30e12fbf3e5c35cf6f40f4ce125c82c1b88e3e7cf3df8152f35b9181601f840112156103eb578235916001600160401b0383116103eb576020808501948460051b0101116103eb57565b9060606003198301126103eb576004356105d48161040c565b916024356001600160401b0381116103eb57816105f39160040161058b565b92909291604435906001600160401b0382116103eb576106159160040161058b565b9091565b346103eb57610627366105bb565b91936001600160a01b031691908215610542576106789461066593604051602081019182526020815261065b60408261127b565b5190209485612f93565b5f5160206141165f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141165f395f51905f525f52600b6020527ffc320c8b7cd913048d0600d8f8fbdd9fd65e3dee2c1f3796e3abba8cc47fa0475491821561074c57815f5160206140f65f395f51905f526107415f5160206141165f395f51905f529384600161070e61070260209a42612045565b6001600160401b031690565b835469ffffffffffffffffffff19166001600160401b039190911690811784559201556040519081529081906020820190565b0390a3604051908152f35b6309913ab360e31b5f52600483905260245ffd5b633599e08d60e21b5f5260045260245ffd5b346103eb575f3660031901126103eb576011546040516001600160a01b039091168152602090f35b346103eb576107a8366105bb565b91936001600160a01b031691908215610542576107f9946107e69360405160208101918252602081526107dc60408261127b565b519020948561310c565b5f5160206141565f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141565f395f51905f525f52600b6020527f5585c2bd0ffb4796fa70abc2a0b1f92173aa4b9f7e1b37d256fd2a975c5abcfa5491821561074c57815f5160206140f65f395f51905f526107415f5160206141565f395f51905f529384600161070e61070260209a42612045565b346103eb575f3660031901126103eb57600a546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb5760206040515f5160206141565f395f51905f528152f35b346103eb5760203660031901126103eb576004355f52600c602052608060405f206001815491015460ff604051926001600160401b0381168452818160401c161515602085015260481c16151560408301526060820152f35b346103eb5760403660031901126103eb57600435602435905f52600860205260405f20905f52602052602060018060a01b0360405f205416604051908152f35b346103eb575f3660031901126103eb5760206040517f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd8152f35b346103eb575f3660031901126103eb576012548015610acb57421115610abc576109d86109d460165460ff1690565b1590565b610aad5760175460ff16610a9e57601354610a00906001600160a01b0316613b49565b613b49565b610a0b601554601055565b610a16601454600f55565b610a1f5f601255565b610a345f6013555f6014555f6015555f601655565b600f546010546040805183815260208101929092527f88cac99f10d8167541407023871a1cc0d797dc75e5b23f3f9f54aaf445f5602c91a16006546001600160a01b03167fd7936f419066f72741af39dde15237d9aed55a0d1d9ab0cb3280569b42c3d8f35f80a3005b6363f5b90b60e11b5f5260045ffd5b63dcd4760160e01b5f5260045ffd5b63285f264160e21b5f5260045ffd5b63cbd2c74d60e01b5f5260045ffd5b346103eb575f3660031901126103eb576006546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb576009546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb57604060018060a01b0360065416805f526005602052815f205482519182526020820152f35b346103eb575f3660031901126103eb576020600354604051908152f35b346103eb575f3660031901126103eb5760206040517f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f8152f35b346103eb5760603660031901126103eb576004356024356001600160401b0381116103eb57610be990369060040161058b565b906044356001600160401b0381116103eb57610c0990369060040161058b565b92909184158015610c9c575b610c8257917f7015cf739f6bedf8447b0723aac5b7e28cc2e5551b144f8bb715b9c29768237f949391610c6493604051602081019087825260208152610c5c60408261127b565b51902061320f565b600354610c7082600355565b604080519182526020820192909252a1005b84600154906311dcbf3760e31b5f5260045260245260445ffd5b506001548511610c15565b346103eb575f3660031901126103eb5760206040517fac5d643ec5a18c3c05126c0540540c01e724afd2beab02a045f0f5d791103a158152f35b346103eb575f3660031901126103eb576012544210610d5c57610e104201804211610d5757601255610d1e5f6013555f6014555f6015555f601655565b60ff19601754166017557f3d364c9a6ad0fb8014a11c487ec342f3a0aaf1a55973fc1bb7353ab6824a358f6020601254604051908152a1005b612031565b6301fd8f7b60e41b5f5260045ffd5b6004359060ff821682036103eb57565b359060ff821682036103eb57565b346103eb5760a03660031901126103eb57610da2610d6b565b60243590604435610db28161040c565b6064356001600160401b0381116103eb57610dd190369060040161058b565b9190926084356001600160401b0381116103eb57610df390369060040161058b565b6001600160a01b038416959094919390861561054257610e51610e45610e45610e388b610e2b8960ff165f52600860205260405f2090565b905f5260205260405f2090565b546001600160a01b031690565b6001600160a01b031690565b610f22576040805160ff868116602083019081529282018b90526001600160a01b038a1660608301527f0f05f8598640816bc7963f9e84995cc362736f66a37eaca8293048e25aed4067989097610f0596610ecd959294919390929190610ec581608081015b03601f19810183528261127b565b519020613325565b610ee687610e2b8560ff165f52600860205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b6040516001600160a01b039094168452169180602081015b0390a3005b63c45546f760e01b5f5260045ffd5b346103eb575f3660031901126103eb5760206040517f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d938152f35b346103eb575f3660031901126103eb5760206040517f8b6e6eebcf1e5aa625df96285186591a18b47d82a0e5344612aba13e51bc0e6f8152f35b346103eb575f3660031901126103eb57608060018060a01b036013541660145460155460ff60165416916040519384526020840152604083015215156060820152f35b346103eb5760203660031901126103eb576004356110058161040c565b60018060a01b03165f526002602052602060ff60405f2054166040519015158152f35b346103eb5760203660031901126103eb576004356110458161040c565b6001600160a01b038116908115610542575f5160206141165f395f51905f5261108960405160208101908582526020815261108160408261127b565b519020612d91565b61109281612e65565b600980546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141365f395f51905f525f80a37f62e09f04681da780308095cdff046660f0b1e396888312a767499401693c03e55f80a3005b346103eb5760203660031901126103eb57600435335f52600260205260ff60405f2054161561115157801561054257335f8181526005602052604081208390557fe58dd23bcf790de89fbc05578bcc206ece8cb67dee1cf099fce6ff74d052ff3e9080a3005b633b63649d60e11b5f523360045260245ffd5b346103eb576101403660031901126103eb5761117e610d6b565b6024356044359160a03660631901126103eb57610104356001600160401b0381116103eb576111b190369060040161058b565b9061012435946001600160401b0386116103eb576111d661001896369060040161058b565b959094612254565b634e487b7160e01b5f52603260045260245ffd5b60075481101561120e5760075f5260205f209060021b01905f90565b6111de565b805482101561120e575f5260205f209060021b01905f90565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b0382111761125b57604052565b61122c565b608081019081106001600160401b0382111761125b57604052565b90601f801991011681019081106001600160401b0382111761125b57604052565b604051906112ab60808361127b565b565b906040516112ba81611240565b608060ff808395546001600160401b0381168552818160401c166020860152818160481c166040860152818160501c16606086015260581c1616910152565b346103eb5760203660031901126103eb576004356007548110156103eb57611323610100916111f2565b5061139960ff825416916001810154906113446003600283015492016112ad565b9160405194855260208501526040840152606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565bf35b346103eb575f3660031901126103eb5760206040517fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e628152f35b346103eb575f3660031901126103eb576020600f54604051908152f35b346103eb5760203660031901126103eb576004355f52600d60205260c060405f2060ff81541690600181015490600281015460038201549060056004840154930154936040519515158652602086015260408501526060840152608083015260a0820152f35b346103eb5760603660031901126103eb576004356024356001600160401b0381116103eb5761148b90369060040161058b565b604435916001600160401b0383116103eb576114ae6114d493369060040161058b565b92909160405160208101906114cc81610eb78a859190602083019252565b51902061343b565b6114e6815f52600c60205260405f2090565b80546001600160401b0381161561157d57604081901c60ff166115695760481c60ff1661155557805469ff0000000000000000001916690100000000000000000017815560010154907f4ef6805613a59a1bece0b99a00b945fffadc1bb793c7064706233d30fd438c765f80a3005b632863f91560e21b5f52600482905260245ffd5b633599e08d60e21b5f52600483905260245ffd5b633e426d5160e21b5f52600483905260245ffd5b60803660031901126103eb576024356004356044356001600160401b0381116103eb576115c290369060040161058b565b906064356115e2610e45610e3887610e2b885f52600860205260405f2090565b916001600160a01b038316156116ab575f547fc55043b6a137f66033384e3f6d9b80e72303eab38436f8fdb89899dc87ce53a29490611629906001600160a01b0316610e45565b3303611692575f611640611683938293369161232c565b93945b61164d8989613ca0565b60405161167181610eb78a8a60208401966303a81a5760e11b885260248501612382565b51915af461167d6123c7565b506123f6565b610f1d60405192839283612442565b50505061169d613bec565b6116835f8060035494611643565b635c7f4b4760e11b5f5260045ffd5b6004359061ffff821682036103eb57565b6024359061ffff821682036103eb57565b346103eb5760403660031901126103eb576117066116f86116ba565b6117006116cb565b906125d1565b6040518091602082016020835281518091526020604084019201905f5b818110611731575050500390f35b9193509160206101006001926117a36060885160ff81511684528581015186850152604081015160408501520151606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565b019401910191849392611723565b346103eb575f3660031901126103eb576020604051610e108152f35b60c09060231901126103eb57602490565b346103eb576101203660031901126103eb576004356117fc366117cd565b9060e4356001600160401b0381116103eb5761181c90369060040161058b565b92610104356001600160401b0381116103eb5761183d90369060040161058b565b90823561184981612689565b806118a8575b611899576118959561188595610eb76118766118809660405192839160208301958661269d565b5190209485613551565b613a99565b6040519081529081906020820190565b0390f35b63137ec6d760e11b5f5260045ffd5b5060208301351561184f565b346103eb5760e03660031901126103eb576004356118d1366117cd565b6118f360405160208101906118eb81610eb786888661269d565b519020612dc9565b906118fd82612e65565b821561197c575b7faa1bacadd202709f2df9c31faf4babdbb21a245021c22298bfcdf22861ca12c69161197761196c5f5160206140d65f395f51905f5293865f52600d6020526119508160405f206126ec565b6040519485945f5160206141365f395f51905f525f80a3612693565b151582526020820190565b0390a2005b9150600e545f198114610d575760018101600e5591611904565b346103eb575f3660031901126103eb576020601054604051908152f35b346103eb576119c1366105bb565b91936001600160a01b03169190821561054257611a12946119ff9360405160208101918252602081526119f560408261127b565b5190209485613654565b5f5160206141765f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141765f395f51905f525f52600b6020527f5248b41ce7bdc12ebe0248f44130be972d690f78fe7dbe1a76d984641d9dcfc25491821561074c57815f5160206140f65f395f51905f526107415f5160206141765f395f51905f529384600161070e61070260209a42612045565b346103eb575f3660031901126103eb5760206040515f5160206140d65f395f51905f528152f35b346103eb57611ad1366105bb565b92939091906001600160a01b03168015610542575f80808093611b198888888c476040516020810191888352604082015260408152611b1160608261127b565b519020613757565b4790828215611b30575bf115611b2b57005b61273a565b506108fc611b23565b346103eb5760203660031901126103eb57600435611b568161040c565b6001600160a01b0316801561054257611b8a604051602081019083825260208152611b8260408261127b565b519020612e01565b611b9381612e65565b6011545f5160206141565f395f51905f5290611bb7906001600160a01b0316610e45565b601180546001600160a01b0319166001600160a01b038616179055915f5160206141365f395f51905f525f80a36001600160a01b03167ff6879817b383066906e8355b81d5157ffe8bff151dd1946b33863aeede50ff985f80a3005b346103eb575f3660031901126103eb576020600e54604051908152f35b9181601f840112156103eb578235916001600160401b0383116103eb57602083818601950101116103eb57565b346103eb5760a03660031901126103eb576004356024356001600160401b0381116103eb57611c90903690600401611c30565b9190604435926001600160401b0384116103eb57611cb5610018943690600401611c30565b9160643593611cc38561040c565b6084359561292e565b346103eb575f3660031901126103eb5760206040517ffdc5f96508969628a00bce64abbf1ea989f16e791b70592a3122d67a7792e48c8152f35b346103eb575f3660031901126103eb576020600454604051908152f35b346103eb575f3660031901126103eb5760206040517fa24d58aaa8deed8b2ff0e63d867e6fe155de046522ed61849f5647e59d04b6ba8152f35b346103eb5760203660031901126103eb576004356001548110156103eb5760015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb5760206040515f5160206141165f395f51905f528152f35b346103eb575f3660031901126103eb576020611df8612cc1565b604051908152f35b346103eb575f3660031901126103eb575f546040516001600160a01b039091168152602090f35b346103eb5760203660031901126103eb576004355f52600b602052602060405f2054604051908152f35b346103eb575f3660031901126103eb5760206040517fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a813058152f35b346103eb57611e99366105bb565b6001600160a01b0385165f908152600260205260409020549294939290919060ff1615611f14576001600160a01b0384165f908152600560205260409020541561054257604080516001600160a01b03861660208201908152610018976109fb969093909290611f0c9082908101610eb7565b51902061386d565b633b63649d60e11b5f526001600160a01b03841660045260245ffd5b90602080835192838152019201905f5b818110611f4d5750505090565b82516001600160a01b0316845260209384019390920191600101611f40565b611f8460409295949395606083526060830190611f30565b9460208201520152565b346103eb575f3660031901126103eb5760035460015460405190602082828152019060015f52827fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65f5b838110611ffc575050611ff09061189593038461127b565b60405193849384611f6c565b81546001600160a01b0316855260209094019385925060019182019101611fd8565b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b91908201809211610d5757565b35906001600160401b03821682036103eb57565b60ff6120c2608080936001600160401b0361208082612052565b1686528361209060208301610d7b565b166020870152836120a360408301610d7b565b166040870152836120b660608301610d7b565b16606087015201610d7b565b16910152565b91908260a09103126103eb576040516120e081611240565b608061212c8183956120f181612052565b85526120ff60208201610d7b565b602086015261211060408201610d7b565b604086015261212160608201610d7b565b606086015201610d7b565b910152565b600754600160401b81101561125b5780600161215292016007556007611213565b9190916122395761221f6080606060036112ab9560ff86511660ff198254161781556020860151600182015560408601516002820155019301516121b66001600160401b0382511685906001600160401b03166001600160401b0319825416179055565b602081015184546121fa9160ff60401b1990911660409190911b68ff0000000000000000161760ff60408401511660ff60481b9060481b169060ff60481b19161790565b606082015160ff60501b1990911660509190911b60ff60501b16178455015160ff1690565b815460ff60581b191660589190911b60ff60581b16179055565b61201e565b90815260c0810192916112ab9160200190612066565b95929490958215611899576122cd606494612301937fdcd264bd7d6d022cfcd2ef488637c26dba3344acfaad38a093f1755fe21085f5976040519960208b0160ff87169b8c82528d60408201528960608201526122b4608082018c612066565b61010081526122c56101208261127b565b519020613983565b6122e16122d861129c565b60ff9092168252565b8660208201528260408201526122f736856120c8565b6060820152612131565b6123106040519283928361223e565b0390a3565b6001600160401b03811161125b5760051b60200190565b92919061233881612315565b93612346604051958661127b565b602085838152019160051b81019283116103eb57905b82821061236857505050565b6020809183356123778161040c565b81520191019061235c565b9392916123a79060409260018060a01b03168652606060208701526060860190611f30565b930152565b6001600160401b03811161125b57601f01601f191660200190565b3d156123f1573d906123d8826123ac565b916123e6604051938461127b565b82523d5f602084013e565b606090565b156123fd57565b60405162461bcd60e51b815260206004820152601c60248201527f53747261746567792064656c656761746563616c6c206661696c6564000000006044820152606490fd5b9291906123a7602091604086526040860190611f30565b6124625f612315565b90612470604051928361127b565b5f825281601f196124805f612315565b01905f5b82811061249057505050565b60209060405161249f81611260565b5f81525f838201525f60408201526040516124b981611240565b5f81525f848201525f60408201525f60608201525f6080820152606082015282828501015201612484565b906124ee82612315565b6124fb604051918261127b565b828152809261250c601f1991612315565b01905f5b82811061251c57505050565b60209060405161252b81611260565b5f81525f838201525f604082015260405161254581611240565b5f81525f848201525f60408201525f60608201525f6080820152606082015282828501015201612510565b9061ffff8091169116039061ffff8211610d5757565b805182101561120e5760209160051b010190565b906040516125a781611260565b606061212c6003839560ff81541685526001810154602086015260028101546040860152016112ad565b6007549161ffff8216928084101561267d578061ffff831611612671575b508261ffff82161115612663576126109161260991612570565b61ffff1690565b612619816124e4565b915f5b8281106126295750505090565b8061264761264161263c60019486612045565b6111f2565b5061259a565b6126518287612586565b5261265c8186612586565b500161261c565b50505061266e612459565b90565b61ffff9150165f6125ef565b5050505061266e612459565b801515036103eb57565b3561266e81612689565b90929160a060c09160e0840195845280356126b781612689565b151560208501526020810135604085015260408101356060850152606081013560808501526080810135828501520135910152565b9060a060059180356126fd81612689565b60ff801986541691151516178455602081013560018501556040810135600285015560608101356003850155608081013560048501550135910155565b6040513d5f823e3d90fd5b91906040838203126103eb57825161275c81612689565b926020810151906001600160401b0382116103eb570181601f820112156103eb57805190612789826123ac565b92612797604051948561127b565b828452602083830101116103eb57815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b92906127f19061266e95936060865260608601916127b8565b926001602082015260408185039101526127b8565b9060a8116103eb5760880190602090565b90610168116103eb576101480190602090565b90610198116103eb576101780190602090565b906101c8116103eb576101a80190602090565b906101f8116103eb576101d80190602090565b9061021c116103eb576102080190601490565b9061023c116103eb5761021c0190602090565b90610244116103eb5761023c0190600890565b3590602081106128aa575090565b5f199060200360031b1b1690565b356bffffffffffffffffffffffff198116929190601482106128d8575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b356001600160c01b0319811692919060088210612913575050565b6001600160c01b031960089290920360031b82901b16169150565b9091929495936012548015908115612cb7575b50610acb576001600160a01b0387169586156105425760115461296c906001600160a01b0316610e45565b916001600160a01b03831615612ca8576129a1925f92836040518096819582946302bc2ce760e51b84528c8c600486016127d8565b03925af1908115611b2b575f905f92612c83575b5015612c6557506102488310612c5657612a18906129dc6129d68585612806565b9061289c565b6129e96129d68686612817565b6129f66129d6878761282a565b90612a046129d6888861283d565b92612a126129d68989612850565b94613d62565b83612a5e612a58612a52612a3e612a38612a328888612863565b906128b8565b60601c90565b95612a4c6129d68288612876565b95612889565b906128f8565b60c01c90565b926001600160a01b031603612c47578203612c4757600f54936001600160401b0382169480861115612c285750612a9a6109d460165460ff1690565b612bf65760145480861115612b785750612b4c907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612aeb612adc61129c565b6001600160a01b039093168352565b6020820152836040820152612b036060820160019052565b60609060018060a01b038151166bffffffffffffffffffffffff60a01b6013541617601355602081015160145560408101516015550151151560ff801960165416911617601655565b612b5b60ff1960175416601755565b604080516001600160401b039290921682526020820192909252a2565b929350509214612b87575b5050565b6015548114612b83577fa3f0eabe92ef7bacb81dba904189dc163924ee16379f429441a4117441609fff91612bc4600160ff196017541617601755565b612bf160155492604051938493846040919493926001600160401b03606083019616825260208201520152565b0390a1565b612b5b907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612aeb612adc61129c565b636762eb4960e01b5f526004526001600160401b03821660245260445ffd5b63319c9a2160e21b5f5260045ffd5b632ffd02b360e11b5f5260045ffd5b805115612c7457805190602001fd5b63e1ac453160e01b5f5260045ffd5b9050612ca191503d805f833e612c99818361127b565b810190612745565b905f6129b5565b63baa3de5f60e01b5f5260045ffd5b905042115f612941565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f3d4a1189ec311cad4499197cf097eefb10346f2894cdd7cbbcb2d2a48001c91860408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152612d5360c08261127b565b51902090565b60405160208101915f5160206141765f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206141165f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206140d65f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206141565f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b906040519060208201928352604082015230606082015246608082015260808152612d5360a08261127b565b805f52600c60205260405f209081546001600160401b038116906001600160401b03821615612eef57604081901c60ff166115695760481c60ff16611555576001600160401b0381164210612ec9575050805460ff60401b1916600160401b179055565b63c504f34d60e01b5f526004919091526001600160401b0316602452504260445260645ffd5b82633e426d5160e21b5f5260045260245ffd5b919081101561120e5760051b0190565b3561266e8161040c565b919081101561120e5760051b81013590601e19813603018212156103eb5701908135916001600160401b0383116103eb5760200182360381136103eb579190565b929192612f69826123ac565b91612f77604051938461127b565b8294818452818301116103eb578281602093845f960137010152565b5f54909491929190612fad906001600160a01b0316610e45565b331480613104575b806130fc575b6130e857600354938183036130b75784831080156130df575b6130c657612ff360045480975f5160206141165f395f51905f52613f67565b925f945f5b8781106130195750505050505050506130146112ab9160010190565b600455565b61302c613027828585612f02565b612f12565b966001600160a01b0390811690881611156130b757866130696109d46130628360018060a01b03165f52600260205260405f2090565b5460ff1690565b61309c5761308f6109d4613088613081858a8a612f1c565b3691612f5d565b8984613fe8565b61309c5750600101612ff8565b633b63649d60e11b5f526001600160a01b031660045260245ffd5b630da1c57360e41b5f5260045ffd5b6378f4355360e11b5f526004839052602485905260445ffd5b50848210612fd4565b50505050506112ab61301460045460010190565b508015612fbb565b508115612fb5565b5f54909491929190613126906001600160a01b0316610e45565b331480613207575b806131ff575b6130e857600354938183036130b75784831080156131f6575b6130c65761316c60045480975f5160206141565f395f51905f52613f67565b925f945f5b87811061318d5750505050505050506130146112ab9160010190565b61319b613027828585612f02565b966001600160a01b0390811690881611156130b757866131d16109d46130628360018060a01b03165f52600260205260405f2090565b61309c576131e96109d4613088613081858a8a612f1c565b61309c5750600101613171565b5084821061314d565b508015613134565b50811561312e565b5f54909491929190613229906001600160a01b0316610e45565b33148061331d575b80613315575b6130e857600354938183036130b757848310801561330c575b6130c65761328260045480977fac5d643ec5a18c3c05126c0540540c01e724afd2beab02a045f0f5d791103a15613f67565b925f945f5b8781106132a35750505050505050506130146112ab9160010190565b6132b1613027828585612f02565b966001600160a01b0390811690881611156130b757866132e76109d46130628360018060a01b03165f52600260205260405f2090565b61309c576132ff6109d4613088613081858a8a612f1c565b61309c5750600101613287565b50848210613250565b508015613237565b508115613231565b5f5490949192919061333f906001600160a01b0316610e45565b331480613433575b8061342b575b6130e857600354938183036130b7578483108015613422575b6130c65761339860045480977f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd613f67565b925f945f5b8781106133b95750505050505050506130146112ab9160010190565b6133c7613027828585612f02565b966001600160a01b0390811690881611156130b757866133fd6109d46130628360018060a01b03165f52600260205260405f2090565b61309c576134156109d4613088613081858a8a612f1c565b61309c575060010161339d565b50848210613366565b50801561334d565b508115613347565b5f54909491929190613455906001600160a01b0316610e45565b331480613549575b80613541575b6130e857600354938183036130b7578483108015613538575b6130c6576134ae60045480977fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a81305613f67565b925f945f5b8781106134cf5750505050505050506130146112ab9160010190565b6134dd613027828585612f02565b966001600160a01b0390811690881611156130b757866135136109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761352b6109d4613088613081858a8a612f1c565b61309c57506001016134b3565b5084821061347c565b508015613463565b50811561345d565b5f5490949192919061356b906001600160a01b0316610e45565b33148061364c575b80613644575b6130e857600354938183036130b757848310801561363b575b6130c6576135b160045480975f5160206140d65f395f51905f52613f67565b925f945f5b8781106135d25750505050505050506130146112ab9160010190565b6135e0613027828585612f02565b966001600160a01b0390811690881611156130b757866136166109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761362e6109d4613088613081858a8a612f1c565b61309c57506001016135b6565b50848210613592565b508015613579565b508115613573565b5f5490949192919061366e906001600160a01b0316610e45565b33148061374f575b80613747575b6130e857600354938183036130b757848310801561373e575b6130c6576136b460045480975f5160206141765f395f51905f52613f67565b925f945f5b8781106136d55750505050505050506130146112ab9160010190565b6136e3613027828585612f02565b966001600160a01b0390811690881611156130b757866137196109d46130628360018060a01b03165f52600260205260405f2090565b61309c576137316109d4613088613081858a8a612f1c565b61309c57506001016136b9565b50848210613695565b50801561367c565b508115613676565b5f54909491929190613771906001600160a01b0316610e45565b331480613865575b8061385d575b6130e857600354938183036130b7578483108015613854575b6130c6576137ca60045480977f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d93613f67565b925f945f5b8781106137eb5750505050505050506130146112ab9160010190565b6137f9613027828585612f02565b966001600160a01b0390811690881611156130b7578661382f6109d46130628360018060a01b03165f52600260205260405f2090565b61309c576138476109d4613088613081858a8a612f1c565b61309c57506001016137cf565b50848210613798565b50801561377f565b508115613779565b5f54909491929190613887906001600160a01b0316610e45565b33148061397b575b80613973575b6130e857600354938183036130b757848310801561396a575b6130c6576138e060045480977f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f613f67565b925f945f5b8781106139015750505050505050506130146112ab9160010190565b61390f613027828585612f02565b966001600160a01b0390811690881611156130b757866139456109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761395d6109d4613088613081858a8a612f1c565b61309c57506001016138e5565b508482106138ae565b508015613895565b50811561388f565b5f5490949192919061399d906001600160a01b0316610e45565b331480613a91575b80613a89575b6130e857600354938183036130b7578483108015613a80575b6130c6576139f660045480977fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e62613f67565b925f945f5b878110613a175750505050505050506130146112ab9160010190565b613a25613027828585612f02565b966001600160a01b0390811690881611156130b75786613a5b6109d46130628360018060a01b03165f52600260205260405f2090565b61309c57613a736109d4613088613081858a8a612f1c565b61309c57506001016139fb565b508482106139c4565b5080156139ab565b5081156139a5565b613ab0905f5160206140d65f395f51905f52612e39565b90815f52600c60205260405f2060ff815460401c16611569575f5160206140d65f395f51905f525f52600b6020527f9b6d9405e2a268edd94615fe7f07c0d5d9dda2152c2e48f4e74379972af1c618548015613b37575f5160206140f65f395f51905f526123105f5160206140d65f395f51905f529384600161070e6107028a9742612045565b6309913ab360e31b5f5260045260245ffd5b6001600160a01b0381165f8181526002602052604090205490919060ff1615613bd9576001600160a01b0381165f908152600560205260409020541561054257600680546001600160a01b031916831790556001600160a01b03165f90815260056020526040902054907f2c8c895ef6e3978e12490ffd8cd3b92d4717b223562f851382f5daf74f587b515f80a3565b50633b63649d60e11b5f5260045260245ffd5b600154613bf881612315565b91613c06604051938461127b565b818352601f19613c1583612315565b0136602085013782905f5b83811015613c99577fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68101546001600160a01b03165f9081526005602052604090205490811561054257600191613c93906001600160a01b0316613c848389612586565b6001600160a01b039091169052565b01613c20565b5091509150565b6007545f5b818110613cc55763dfffe2f960e01b5f526004839052602484905260445ffd5b613cd1612641826111f2565b8360ff8251161480613cfa575b613ceb5750600101613ca5565b6040015160601c949350505050565b5084602082015114613cde565b9060405160c081018181106001600160401b0382111761125b5760405260a06005829460ff81541615158452600181015460208501526002810154604085015260038101546060850152600481015460808501520154910152565b93929190613d80613d7b865f52600d60205260405f2090565b613d07565b94613d8e6109d48751151590565b613f555750602085018051156105425751808203613f19575050604084015180151580613f0f575b613ed1575050606083015180151580613ec7575b613e89575050608082015180151580613e7f575b613e4157505060a0015180151580613e37575b613df9575050565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523360d81b608482015260a490fd5b5080821415613df1565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264292a26a91960d91b608482015260a490fd5b5080821415613dde565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523160d81b608482015260a490fd5b5080821415613dca565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264052544d52360dc1b608482015260a490fd5b5080821415613db6565b60405163fef6c5cf60e01b81526004808201929092526024810192909252606060448301526064820152631354951160e21b608482015260a490fd5b6350dfe91360e01b5f5260045260245ffd5b916040519160208301937f4a3d56bf3b5708e5b633d12931f9923b37fde6895d6bd92957bbfa92cd003039855260408401526060830152608082015260808152613fb260a08261127b565b519020613fbd612cc1565b9060405190602082019261190160f01b84526022830152604282015260428152612d5360628261127b565b90915f91906001600160a01b038216156140cd5760405192600484019460248501956044860192853b1561405157509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b9796505090508151806040146140a85760411461406e5750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052614086565b505050505f9056feea4a6847c3f47fe0f98dcfe2e2c074e6cb42f6d74c367b33ae8516f537e775829cc91136b2c7668ecd202c7008f17e818e108b5448a7b7fd48bd2ca6b4aab51fb40912900bb80b6bc5e38d8489266de7299eedb40b03490214410117ef53ff9279883188dbf80e171cf94b3b44b6437b838158b1d3a5df6ccc709eeb7c5217296acb9fef2a4a1ecaa044f4c8979d9f48b0d5be623c860275be31c4cbd34c169cb2d153886d95f8f2d4836fb16c9fac869e1ce9cfc93d919a0f7dfe38439b9771a2646970667358221220d9a3575e6aa98198ed460c72687df8b305209a32fda153cf7302dc50f249d44a64736f6c634300081e0033"},"sourceId":"src/CredentialManager.sol","sourcemap":"858:48457:14:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12563:1;858:48457;-1:-1:-1;858:48457:14;;-1:-1:-1;;;;;;858:48457:14;17144:10;858:48457;;;;-1:-1:-1;;;;;858:48457:14;;17169:32;;17165:58;;-1:-1:-1;;;;;858:48457:14;;17237:37;;17233:63;;17306:68;858:48457;;-1:-1:-1;;;;;;858:48457:14;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;;;;18587:6;;18583:74;;18671:30;;:63;;;;858:48457;18667:156;;-1:-1:-1;18853:5:14;;;;;;858:48457;;;;;19218:55;858:48457;;;;;;-1:-1:-1;858:48457:14;;;;;;19218:55;858:48457;;;;;;17455:32;858:48457;;;17455:32;858:48457;;;;;;;17497:42;858:48457;;;17497:42;858:48457;;12563:1;858:48457;-1:-1:-1;17697:3:14;858:48457;;17665:30;;;;;17746:22;;;;:::i;:::-;;858:48457;;;;;17850:32;;;17697:3;17846:67;;858:48457;;12563:1;858:48457;-1:-1:-1;858:48457:14;17928:19;858:48457;;;-1:-1:-1;858:48457:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18985:10;858:48457;;;;;;;;;;;;;;;;;;;;;;;;17985:50;12563:1;858:48457;;;;;;;;;17985:50;-1:-1:-1;;858:48457:14;;;;;;;;12563:1;858:48457;;17650:13;;858:48457;;;;-1:-1:-1;858:48457:14;17306:68;858:48457;;;-1:-1:-1;858:48457:14;17846:67;17891:22;;;-1:-1:-1;17891:22:14;858:48457;-1:-1:-1;17891:22:14;17850:32;17862:6;858:48457;17862:6;;858:48457;17862:20;17850:32;;17665:30;18114:16;858:48457;;18154:8;858:48457;;18208:8;858:48457;;18264:6;858:48457;;;;9426:25;-1:-1:-1;858:48457:14;;;;;;;;;;;;18860:3;-1:-1:-1;;;;;18892:19:14;;;;:::i;:::-;858:48457;;18929:16;;;18925:42;;858:48457;-1:-1:-1;858:48457:14;18985:10;858:48457;;;;-1:-1:-1;858:48457:14;;;18981:53;;858:48457;-1:-1:-1;858:48457:14;18985:10;858:48457;;;-1:-1:-1;858:48457:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;858:48457:14;;;;;;;;;-1:-1:-1;;;;;;858:48457:14;;;;;;19120:17;;-1:-1:-1;19120:17:14;858:48457;18838:13;;858:48457;;;;-1:-1:-1;858:48457:14;;;;;-1:-1:-1;858:48457:14;;;;;-1:-1:-1;858:48457:14;;;;;-1:-1:-1;858:48457:14;18981:53;19008:26;;;-1:-1:-1;19008:26:14;;-1:-1:-1;19008:26:14;18925:42;17210:13;;;-1:-1:-1;18954:13:14;;-1:-1:-1;18954:13:14;18667:156;18602:55;;;;;-1:-1:-1;18757:55:14;;858:48457;;;;-1:-1:-1;18757:55:14;18671:63;18705:29;;;;18671:63;;18583:74;18602:55;;;;-1:-1:-1;18602:55:14;;858:48457;-1:-1:-1;858:48457:14;;;-1:-1:-1;18602:55:14;858:48457;;;;;;;;;;;;;;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;858:48457:14;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;858:48457:14;;;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;858:48457:14;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;858:48457:14;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o","userdoc":{"errors":{"CannotCancel()":[{"notice":"Thrown when attempting to cancel an operation that cannot be canceled (e.g., already executed)."}],"InsufficientSignatures(uint256,uint256)":[{"notice":"Thrown when the number of valid signatures provided is less than the required threshold."}],"InvalidCommitteeThreshold(uint256,uint256)":[{"notice":"Thrown when attempting to set a quorum threshold that is 0 or greater than the total operators."}],"InvalidDelay(uint256)":[{"notice":"Thrown when a timelock delay is set to 0 (invalid safety margin)."}],"InvalidEpoch(uint256,uint256)":[{"notice":"Thrown when the supplied epoch is invalid"}],"InvalidProfileConfig()":[{"notice":"Thrown when the used profile is configured incorrectly."}],"InvalidProfileId()":[{"notice":"Thrown when the used profile does not exist."}],"InvalidQuoteLength()":[{"notice":"Thrown when a Quote length is invalid."}],"InvalidReportData()":[{"notice":"Thrown when a Quote ReportData does not match params."}],"InvalidVaultAddr()":[{"notice":"Thrown when a Vault address is empty (bytes32(0))."}],"InvalidVerifier()":[{"notice":"Thrown when a Quote verifier is invalid."}],"InvalidZkProof()":[{"notice":"Thrown when the ZK Proof attesting measurements is invalid."}],"MeasurementMismatch(bytes32,bytes32,string)":[{"notice":"Thrown when the measured TEE state does not match the expected state."}],"NoStrategy()":[{"notice":"Thrown when attempting to update vault admins on a chain that has no registered strategy."}],"NotOperator(address)":[{"notice":"Thrown when a signature belongs to an address that is not a registered operator."}],"ProfileInactive(uint256)":[{"notice":"Thrown when the used profile is not active."}],"SignersNotSortedOrUnique()":[{"notice":"Thrown when the provided signatures are not sorted by signer address or contain duplicates."}],"StrategyAlreadyExists()":[{"notice":"Thrown when attempting to register a strategy for a chain that already has one."}],"TimelockAlreadyCanceled(bytes32)":[{"notice":"Thrown when attempting to execute or cancel an operation that has already been canceled."}],"TimelockAlreadyExecuted(bytes32)":[{"notice":"Thrown when attempting to execute or schedule an operation that has already been executed."}],"TimelockNotReady(bytes32,uint256,uint256)":[{"notice":"Thrown when attempting to execute a timelock before the delay has elapsed."}],"TimelockUnknown(bytes32)":[{"notice":"Thrown when attempting to act on a timelock ID that does not exist or was never scheduled."}],"VaultNotFound(uint256,uint256)":[{"notice":"Thrown when a requested vault cannot be found for the specified chain."}],"ZeroAddress()":[{"notice":"Thrown when a critical configuration address (e.g., Risk Manager) is set to address(0)."}]},"events":{"AdminUpdateStrategyRegistered(uint256,uint256,address)":{"notice":"Emitted when a new cross-chain strategy is registered."},"AttestedKeyRegistered(address,bytes32)":{"notice":"Emitted when a new attested key for an operator is registered."},"CommitteeThresholdUpdated(uint256,uint256)":{"notice":"Emitted when the signature threshold is updated."},"DepositVaultAdministratorsUpdated(uint256,address[],uint256)":{"notice":"Emitted when the admin set of a remote vault is updated."},"DepositVaultAdministratorsUpdated(uint256,uint256,address[],uint256)":{"notice":"Emitted when a new cross-chain strategy is registered."},"LeaderUpdated(address,bytes32)":{"notice":"Emitted when the quorum leader is updated."},"MeasurementsUpdated(bytes32,bytes32)":{"notice":"Emitted when the measurements are updated."},"OperatorAdded(address)":{"notice":"Emitted when a new operator is added during initialization."},"VaultAdded(uint256,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8))":{"notice":"Emitted when a new vault is added to the registry."}},"kind":"user","methods":{"addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":{"notice":"Registers a new deposit vault to the system."},"admin()":{"notice":"TEMP Admin path, to be revised later."},"adminUpdateStrategies(uint256,uint256)":{"notice":"Maps a RoutingID to the VMID to the Strategy Contract responsible for sending messages to it."},"appointLeader(address,address[],bytes[])":{"notice":"Manually appoints a leader. Used for bootstrapping or emergency recovery."},"cancelTimelock(bytes32,address[],bytes[])":{"notice":"Cancels a pending timelocked operation."},"committeeThreshold()":{"notice":"The minimum number of signatures required to execute a governance action."},"constructor":{"notice":"Initializes the Credential Manager with the initial operator set and configuration."},"domainSeparator()":{"notice":"Returns the EIP-712 domain separator used for verifying governance signatures."},"epoch()":{"notice":"Tracks the logical era of the TEE state to prevent replay attacks."},"executeRegistryContract(address)":{"notice":"Executes a pending Registry Contract update if the timelock has expired."},"executeRiskManager(address)":{"notice":"Executes a pending Risk Manager update if the timelock has expired."},"executeUpdateAutomataVerifier(address)":{"notice":"Sxecudes a timelocked update for the Automata Verifier address."},"getCommitteeConfig()":{"notice":"Returns the full Committee configuration."},"getLeader()":{"notice":"Returns the current Leader's Operator Address and Attested Key."},"getVaults(uint16,uint16)":{"notice":"Returns a paginated list of registered vaults."},"governanceNonce()":{"notice":"A monotonically increasing nonce for governance actions."},"initiateRestart()":{"notice":"Step 1: Initiates the gathering window if the system is down."},"isOperator(address)":{"notice":"Lookup to check if an address is an operator."},"latestCheckpointHash()":{"notice":"The hash of the system state (inventory) associated with the current epoch."},"leader()":{"notice":"The current active leader (Operator Address)."},"measurementProfiles(uint256)":{"notice":"The current \"Gold Image\" measurements required for valid Quotes. Matches based on profile."},"operatorToAttestedKey(address)":{"notice":"Maps Operator (EOA) -> Attested Key (TEE Address)."},"operators(uint256)":{"notice":"The list of authorized Clearing Engine operator addresses (EOAs)."},"registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":{"notice":"Registers a strategy contract to handle updates for a specific chain."},"registerAttestedKey(bytes32)":{"notice":"Allows an operator to register their TEE's attested key."},"registryContract()":{"notice":"The address of the global Registry Contract used for asset/settler configurations."},"resolveRestart()":{"notice":"Step 3: Finalizes the restart after the window closes."},"riskManager()":{"notice":"The address of the Risk Manager (or multisig) authorized to adjust risk parameters."},"scheduleManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32),address[],bytes[])":{"notice":"Governance proposes adding or updating a measurement profile (e.g., for Phala or GCP)."},"scheduleRegistryContract(address,address[],bytes[])":{"notice":"Schedules a timelocked update for the Registry Contract address."},"scheduleRiskManager(address,address[],bytes[])":{"notice":"Schedules a timelocked update for the Risk Manager address."},"scheduleUpdateAutomataVerifier(address,address[],bytes[])":{"notice":"Schedules a timelocked update for the Automata Verifier."},"setDepositVaultAdministrators(uint256,uint256,address[],uint256)":{"notice":"Updates the administrators or withdrawal quorum for a vault on a remote chain."},"submitRestartProof(uint256,bytes,bytes,address,bytes32)":{"notice":"Restarts the system using a Trustless ZK Proof (Automata / SP1). The contract stores the \"Best\" candidate."},"timelockDelayFor(bytes32)":{"notice":"Configuration mapping for how long specific operations must be delayed."},"timelockOps(bytes32)":{"notice":"Stores the status of individual scheduled operations by their hash ID."},"updateCommitteeThreshold(uint256,address[],bytes[])":{"notice":"Updates the number of signatures required for valid governance actions."},"vaults(uint256)":{"notice":"The registry of all authorized Deposit Vaults."},"withdraw(address,address[],bytes[])":{"notice":"Withdraw funds held by this contract."}},"notice":"The centralized Root of Trust for the TEE Clearing Engine.","version":1}},"DepositVault":{"abi":[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_credentialManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EmptyOrders","type":"error"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAdministrators","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAmountFromExecutor","type":"error"},{"inputs":[{"internalType":"uint256","name":"settlementIndex","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientCallbackReturnForSettlement","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"given","type":"uint256"}],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"MissedQuorum","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCredentialManager","type":"error"},{"inputs":[],"name":"NotExecutor","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"PayloadMismatch","type":"error"},{"inputs":[],"name":"SettlerNotApproved","type":"error"},{"inputs":[],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroWithdrawalQuorum","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"numAdminsAfter","type":"uint256"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[],"name":"AdministratorSetReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldCredentialManager","type":"address"},{"indexed":false,"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"CredentialManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"account","type":"uint64"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"Settled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"WithdrawalQuorumChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[],"name":"SETTLEMENT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"},{"internalType":"address","name":"executor","type":"address"}],"name":"addSettlerExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"administrators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedSettlers","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManagerChangeDelayBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"depositCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct DepositVault.Settlement","name":"order","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"executeAtomicSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct DepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"clearingEngineSignature","type":"bytes"}],"internalType":"struct DepositVault.SignedSettlement[]","name":"requests","type":"tuple[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"executeSquashingSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getApprovedSettlers","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAdministrator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSignatureUse","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingSettlements","outputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct DepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"address","name":"target","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct DepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"clearingEngineSignature","type":"bytes"}],"internalType":"struct DepositVault.SignedSettlement[]","name":"orders","type":"tuple[]"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"name":"pullBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"}],"name":"pushBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"removeSettler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"setCredentialManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setDepositorStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"settlementCaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"settlementCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct DepositVault.Withdrawal","name":"withdrawal","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes32","name":"epochHash","type":"bytes32"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"withdrawalCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"DepositVault","deploymentBytecode":{"bytecode":"0x60803460ad57601f6126e038819003918201601f19168301916001600160401b0383118484101760b157808492604094855283398101031260ad57604b602060458360c5565b920160c5565b6138406006556001600160a01b03909116908115609e576001600160a01b0316908115609e5760018060a01b03195f5416175f5560018060a01b0319600154161760015560405161260790816100d98239f35b63d92e233d60e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820360ad5756fe60806040526004361015610011575f80fd5b5f3560e01c80630a2eb30114611fbd5780630b9b17a614611df657806313af403514611dab57806317aa2e2514611abd57806321e6652c14611a10578063224b93e1146119b457806323c56731146117525780632b0c1a1e1461172a5780633684f4ac146116505780633a87fe4d146116185780633d63ea93146115ee57806341774bfe1461149b5780634bf0d3311461145e5780637438b9371461142d57806382ff8b1e146114035780638da5cb5b146113dc5780638dff23051461139757806392698ac6146112e157806393ea8a7d146112c4578063952df83214610ff557806398af977214610fbd578063a33c9d0014610fa0578063ad9fa8bc14610e7b578063b1fb79c014610e41578063b24e085a14610600578063d7a99d7a14610353578063d89d151014610311578063d8c8785d146102f4578063d954863c146101c95763f585b64f14610163575f80fd5b346101b65760603660031901126101b65761017c611fea565b610184612000565b5f549091906001600160a01b031633036101ba576001600160a01b038216156101b6576101b4916044359161250a565b005b5f80fd5b6330cd747160e01b5f5260045ffd5b346101b65760603660031901126101b6576004356101e5612000565b604435335f52600e60205260ff60405f205416156102c2578015610297577f9d677c46e10ba33882144473956fae8d2c52353dcde5aab8230d1bd280cfc3b4816102328593303387612482565b825f52600b60205260405f2054936102646040519283928360209093929193604081019460018060a01b031681520152565b0390a35f52600b60205260405f20805490600182018092116102835755005b634e487b7160e01b5f52601160045260245ffd5b606460405162461bcd60e51b81526020600482015260046024820152635a65726f60e01b6044820152fd5b60405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b6044820152606490fd5b346101b6575f3660031901126101b6576020600f54604051908152f35b346101b65760203660031901126101b657600435600d548110156101b65761033a60209161217f565b905460405160039290921b1c6001600160a01b03168152f35b346101b657366003190161014081126101b657610100136101b657610104356001600160401b0381116101b65761038e9036906004016121c4565b90610124356001600160401b0381116101b6576103af9036906004016121c4565b92906084359160a435936001600160401b0385168095036101b65760e435918242116105f1575f85815260036020908152604080832033845260010190915290205460ff16156105e257845f52600a60205260405f20865f5260205260405f20549660c435978089036105cb575061047290600254956104666001600160601b031961043961225d565b60601b16968b8b8b6024359b6001600160601b0319610456612273565b60601b168d6064359d8e9361229d565b602081519101206124e0565b43600f55845f52600a60205260405f20865f5260205260405f2080549160018301809311610283576020928692556104c76104ab61225d565b604051631f8eac2760e11b815295869485949260048601612448565b03815f335af19081156105c0575f9161058e575b50818110610579579061051b7ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c9392610512612273565b30903390612482565b61052d823361052861225d565b61250a565b61057461053861225d565b91610541612273565b604080516001600160a01b0395861681526020810196909652931692840192909252606083019190915281906080820190565b0390a4005b63d44c3d9d60e01b5f5260045260245260445ffd5b90506020813d6020116105b8575b816105a9602093836120ef565b810103126101b65751866104db565b3d915061059c565b6040513d5f823e3d90fd5b88906306427aeb60e01b5f5260045260245260445ffd5b6361968ebb60e11b5f5260045ffd5b630407b05b60e31b5f5260045ffd5b346101b65760603660031901126101b6576004356001600160401b0381116101b657610630903690600401612040565b6024356001600160401b0381116101b65761064f903690600401612040565b90604435828403610e3257805f52600760205260ff60405f20541615610e23575f90815260036020908152604080832033845260010190915290205460ff16156105e2578260011b83810460021484151715610283576106ae816123e4565b906106bc60405192836120ef565b8082526106cb601f19916123e4565b015f5b818110610df45750505f915f5b858110610ad257505f5b838110610a1057505f5b8381106109b75750610700856123e4565b9361070e60405195866120ef565b858552601f1961071d876123e4565b013660208701375f5b8681106108d3575050505f5b8281106107f85785855f5b81811061074657005b60019061075d3661075883868861223a565b612352565b60808101516001600160401b0360a083015116907ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c60c084015193868060a01b038151166107ef60208301519260608a8060a01b03604083015116910151906040519485948590949392606092608083019660018060a01b03168352602083015260018060a01b031660408201520152565b0390a40161073d565b5f60606108058385612416565b51015113610816575b600101610732565b6001600160a01b036108288284612416565b51511660606108378385612416565b510151905f5f5b828a8a808410610883575050505082811061086c5750600192916108659130903390612482565b905061080e565b905063d44c3d9d60e01b5f5260045260245260445ffd5b6001600160a01b03916108a49160409161089e91879161223a565b01612289565b16146108b3575b60010161083e565b906108cb6001916108c4848b612416565b5190612345565b9190506108ab565b6108e236610758838a8c61223a565b8051602082810151610920926001600160a01b031661090286888a6123fb565b604051631f8eac2760e11b8152958694859491939160048601612448565b03815f335af19081156105c0575f91610986575b5061093f8389612416565b52606061094c8389612416565b519101908151116109605750600101610726565b61096a8288612416565b519051916359a771d160e01b5f5260045260245260445260645ffd5b90506020813d82116109af575b816109a0602093836120ef565b810103126101b657518a610934565b3d9150610993565b805f60606109c760019487612416565b510151126109d6575b016106ef565b610a0b828060a01b036109e98387612416565b515116610a0360606109fb8589612416565b510151612438565b90339061250a565b6109d0565b806020610a1f60019386612416565b5101516040610a2e8387612416565b5101511015610a7457610a5e6020610a468387612416565b5101516040610a558488612416565b510151906123d7565b6060610a6a8387612416565b5101525b016106e5565b6040610a808286612416565b5101516020610a8f8387612416565b5101511015610a6e57610abe610ab96040610aaa8488612416565b5101516020610a558589612416565b612438565b6060610aca8387612416565b510152610a6e565b610add81878961223a565b610120813603126101b65760405190610af58261209d565b610aff3682612352565b8252610100810135906001600160401b0382116101b6570136601f820112156101b65780356001600160401b038111610de05760405191610b4a601f8301601f1916602001846120ef565b81835236602083830101116101b657815f926020809301838601378301015260208201525160808101516001600160401b0360a0830151169160c08101519260e08201519060408301519360018060a01b0385169284519660206060870151960151968242116105f157835f52600a60205260405f206001600160401b0386165f5260205260405f2054808310610dc957508f918f8b90610c1f610c3d96610c2c948a8f8f8f90918d92610c379b600254906001600160601b03199060601b16926001600160601b03199060601b169061229d565b602081519101209461223a565b610100810190612313565b916124e0565b43600f555f52600a6020526001600160401b0360405f2091165f5260205260405f208054906001820180921161028357555f9182805b8a8110610d81575b5015610d3d575b50505f5b878110610cf2575b5015610c9f575b50506001016106db565b94610cea916001939660405191610cb5836120b8565b858060a01b031682525f602083015260408201525f6060820152610cd98287612416565b52610ce48186612416565b5061242a565b939088610c95565b6001600160a01b0384811690610d08838a612416565b51511614610d1857600101610c86565b60409150610d269087612416565b5101610d33828251612345565b905260018a610c8e565b90610d7992989160405191610d51836120b8565b825260208201525f60408201525f6060820152610d6e8289612416565b52610ce48188612416565b958a80610c82565b836001600160a01b03610d94838d612416565b51511614610da457600101610c73565b60209150610db2908a612416565b5101610dbf828251612345565b905260018d610c7b565b90506306427aeb60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52604160045260245ffd5b602090604051610e03816120b8565b5f81525f838201525f60408201525f6060820152828286010152016106ce565b63be4ab3c760e01b5f5260045ffd5b631d6e22b960e01b5f5260045ffd5b346101b6575f3660031901126101b65760206040517fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb8152f35b346101b65760403660031901126101b657600435610e97612000565b5f549091906001600160a01b031633036101ba57805f52600760205260ff60405f20541615610f49575b5f52600360205260405f2090600182019160018060a01b0382165f528260205260ff60405f20541615610ef057005b8054600160401b811015610de057610f0d916001820181556121af565b81546001600160a01b0393841660039290921b82811b94901b19169290921790555f90815260209190915260409020805460ff19166001179055005b600454600160401b811015610de057610f82610f6c826001859401600455612197565b819391549060031b91821b915f19901b19161790565b9055805f52600760205260405f20600160ff19825416179055610ec1565b346101b6575f3660031901126101b6576020600654604051908152f35b346101b65760203660031901126101b6576001600160a01b03610fde611fea565b165f526008602052602060405f2054604051908152f35b346101b657366003190161010081126101b6576060136101b6576064356084356001600160a01b03811681036101b65760a4359160e4356001600160401b0381116101b657611048903690600401612040565b9290936005548142116105f1578085106112ae57835f52600c60205260405f20549560443596808803611297575061107f866123e4565b9061108d60405192836120ef565b868252601f1961109c886123e4565b013660208401375f916002546001600160601b03196110b961225d565b60601b16602435966040519160208301937f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba8552604084015260608301528760808301528960a08301528b60c083015260e082015260c4356101008201526001600160601b03198860601b16610120820152610120815261113c610140826120ef565b5190205f5b8981106111e5575b505050509080929394955081106111d0575050825f52600c60205260405f2080549060018201809211610283577fc4f5735f1abe60807c07c06560e4a6d7eb655a37442b6a47e3ab1998c9611e2f936111ab9284925543600f5561052861225d565b6111b361225d565b604080516001600160a01b039290921682526020820192909252a3005b6326a15da760e01b5f5260045260245260445ffd5b6111fa6111f3828c876123fb565b908461255b565b6001600160a01b03811690811561128857611214906121f1565b156112885760015f5b87811061125d575b50611240575b5085851461123b57600101611141565b611149565b9461125691956112508286612416565b5261242a565b938b61122b565b826001600160a01b036112708389612416565b51161461127f5760010161121d565b50505f8d611225565b638baa579f60e01b5f5260045ffd5b87906306427aeb60e01b5f5260045260245260445ffd5b846326a15da760e01b5f5260045260245260445ffd5b346101b6575f3660031901126101b6576020600554604051908152f35b346101b6575f3660031901126101b6576040518060206004549283815201809260045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b905f5b818110611381575050508161133f9103826120ef565b604051918291602083019060208452518091526040830191905f5b818110611368575050500390f35b825184528594506020938401939092019160010161135a565b8254845260209093019260019283019201611329565b346101b65760403660031901126101b6576113b061202a565b6004355f52600a6020526001600160401b0360405f2091165f52602052602060405f2054604051908152f35b346101b6575f3660031901126101b6575f546040516001600160a01b039091168152602090f35b346101b65760203660031901126101b6576004355f52600c602052602060405f2054604051908152f35b346101b65760203660031901126101b6575f546001600160a01b031633036101ba576002546101b657600435600255005b346101b65760203660031901126101b6576001600160a01b0361147f611fea565b165f52600e602052602060ff60405f2054166040519015158152f35b346101b65760203660031901126101b6575f54600435906001600160a01b031633036101ba576004545f828152600760205260408120805460ff191690555b818110611565575b50505f52600360205260405f205f60018201905b8254811015611539578061150c600192856121af565b838060a01b0391549060031b1c16828060a01b03165f528260205260405f2060ff198154169055016114f6565b82545f8455838161154657005b5f5260205f20908101905b81811061155a57005b5f8155600101611551565b8261156f82612197565b90549060031b1c14611583576001016114da565b905f19810190811161028357610f6c61159e6115ab92612197565b90549060031b1c92612197565b905560045480156115da575f19016115c281612197565b8154905f199060031b1b1916905560045581806114e2565b634e487b7160e01b5f52603160045260245ffd5b346101b65760203660031901126101b6576004355f52600b602052602060405f2054604051908152f35b346101b65760203660031901126101b6576004356004548110156101b657611641602091612197565b90549060031b1c604051908152f35b346101b65760603660031901126101b65761166961202a565b604435906004355f5260096020526001600160401b0360405f2091165f5260205260405f2080548210156101b657610120916116a491612070565b506116ae81612110565b90600860018060a01b039101541660e06040519260018060a01b0381511684526020810151602085015260018060a01b03604082015116604085015260608101516060850152608081015160808501526001600160401b0360a08201511660a085015260c081015160c0850152015160e0830152610100820152f35b346101b6575f3660031901126101b6576001546040516001600160a01b039091168152602090f35b346101b65760403660031901126101b6576004356001600160401b0381116101b657611782903690600401612040565b600154909190602435906001600160a01b031633036119a5576001811061199657808310611980575f5b838110156117e8576001600160a01b036117cb600583901b8501612289565b16156117d9576001016117ac565b63d92e233d60e01b5f5260045ffd5b5091906001600160401b038211610de057600160401b8211610de057600d5482600d5580831061193c575b50600d5f525f5b82811061190157837f74e3f7a222a002bb0346144c8442604f86b79a5319301c8b2393dbe33ba3f1ec5f80a1600d545f5b8181106118965782600554908060055580820361186457005b7f71847092dda23e5394806b377214ca90449cdd1413463150e7f577ccefea54d89160409182519182526020820152a1005b61189f8161217f565b905460018301929160031b1c6001600160a01b031682821161028357604080516001600160a01b0392909216825260208201939093526001927f723c2b747529ca7f5eb53a74808f4a8b9bf264f0fc450fd904900151da74548a91a10161184b565b600190602061190f84612289565b930192817fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501550161181a565b600d5f527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb59081019083015b8181106119755750611813565b5f8155600101611968565b82633e1a6b7d60e21b5f5260045260245260445ffd5b6345f8facb60e11b5f5260045ffd5b6326b672e560e01b5f5260045ffd5b346101b65760403660031901126101b6576119cd611fea565b602435908115158092036101b6575f546001600160a01b031633036101ba5760018060a01b03165f52600e60205260405f209060ff801983541691161790555f80f35b346101b65760203660031901126101b657611a29611fea565b5f546001600160a01b031633036101ba576001600160a01b031680156117d957611a58600f5460065490612345565b431015611aae5760407feb63fb900cbf0301de00619a02ae3f5996820dabc03207c0e0d97046e521d7b99160015490806001600160601b0360a01b83161760015582519160018060a01b031682526020820152a1005b636fed7d8560e01b5f5260045ffd5b346101b65760a03660031901126101b6576004356001600160401b0381116101b657611aed903690600401612040565b90602435604435916001600160401b0383168093036101b657606435906001600160a01b038216908183036101b657608435918242116105f157845f52600960205260405f20865f5260205260405f20546101b657611b4b336121f1565b15611d9c57845f52600a60205260405f20865f5260205260405f205493600254948815611d8d575f5b898110611ba2578989895f52600a60205260405f20905f52602052611b9e60405f20918254612345565b9055005b611bad818b8761223a565b9160c083013590808203611d78575088929190818c8a8a848f6bffffffffffffffffffffffff19611bdd8a612289565b60601b169960208a01359a6001600160601b031960408c01611bfe90612289565b60601b168c60608d013592611c129861229d565b8051906020012091611c24918a61223a565b6101008101611c3291612313565b90611c3c926124e0565b600181018091116102835792895f52600960205260405f208b5f5260205260405f2090604051611c6b8161209d565b611c753686612352565b815260208101928884528054600160401b811015610de057611c9c91600182018155612070565b939093611d65579051805184546001600160a01b03199081166001600160a01b03928316178655602083015160018781019190915560408401516002880180548416918516919091179055606084015160038801556080840151600488015560a084015160058801805467ffffffffffffffff19166001600160401b039290921691909117905560c0840151600688015560e09390930151600787015592516008909501805490931694169390931790559092611d5f9190869061052890612289565b01611b74565b634e487b7160e01b5f525f60045260245ffd5b6306427aeb60e01b5f5260045260245260445ffd5b63164bb4b560e11b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346101b65760203660031901126101b657611dc4611fea565b5f54906001600160a01b03821633036101ba576001600160a01b03169081156117d9576001600160a01b031916175f55005b346101b65760403660031901126101b657600435611e1261202a565b611e1b336121f1565b15611d9c576001600160401b0316905f5b815f52600960205260405f20835f5260205260405f205463ffffffff82161015611f3c5763ffffffff90825f52600960205260405f20845f52602052611e758160405f20612070565b50611ebe60405191611e868361209d565b611e8f81612110565b8084526008909101546001600160a01b0390811660208501819052604083015160609093015192309216612482565b5160c0810151815160208084015160408086015160609687015182516001600160a01b0396871681529485019390935293909316928201929092529283015290859085907ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c90608090a41663ffffffff811461028357600101611e2c565b505f52600960205260405f20905f5260205260405f208054905f815581611f5f57005b81600902916009830403610283575f5260205f20908101905b818110611f8157005b805f600992555f60018201555f60028201555f60038201555f60048201555f60058201555f60068201555f60078201555f600882015501611f78565b346101b65760203660031901126101b6576020611fe0611fdb611fea565b6121f1565b6040519015158152f35b600435906001600160a01b03821682036101b657565b602435906001600160a01b03821682036101b657565b35906001600160a01b03821682036101b657565b602435906001600160401b03821682036101b657565b9181601f840112156101b6578235916001600160401b0383116101b6576020808501948460051b0101116101b657565b8054821015612089575f52600960205f20910201905f90565b634e487b7160e01b5f52603260045260245ffd5b604081019081106001600160401b03821117610de057604052565b608081019081106001600160401b03821117610de057604052565b61010081019081106001600160401b03821117610de057604052565b90601f801991011681019081106001600160401b03821117610de057604052565b9060405161211d816120d3565b82546001600160a01b039081168252600184015460208301526002840154166040820152600383015460608201526004830154608082015260058301546001600160401b031660a0820152600683015460c082015260079092015460e0830152565b600d5481101561208957600d5f5260205f2001905f90565b6004548110156120895760045f5260205f2001905f90565b8054821015612089575f5260205f2001905f90565b9181601f840112156101b6578235916001600160401b0383116101b657602083818601950101116101b657565b600d54905f5b828110612205575050505f90565b61220e8161217f565b905460039190911b1c6001600160a01b0390811690831614612232576001016121f7565b505050600190565b91908110156120895760051b8101359061011e19813603018212156101b6570190565b6004356001600160a01b03811681036101b65790565b6044356001600160a01b03811681036101b65790565b356001600160a01b03811681036101b65790565b989796959493929190604051997fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208c015260408b015260608a0152608089015260a088015260c087015260e08601526101008501526101208401526101408301526101408252612311610160836120ef565b565b903590601e19813603018212156101b657018035906001600160401b0382116101b6576020019181360383136101b657565b9190820180921161028357565b9190826101009103126101b65760405161236b816120d3565b809261237681612016565b82526020810135602083015261238e60408201612016565b6040830152606081013560608301526080810135608083015260a08101356001600160401b03811681036101b65760e091829160a085015260c081013560c08501520135910152565b9190820391821161028357565b6001600160401b038111610de05760051b60200190565b90821015612089576124129160051b810190612313565b9091565b80518210156120895760209160051b010190565b5f1981146102835760010190565b600160ff1b8114610283575f0390565b9284926080959260018060a01b03168552602085015260606040850152816060850152848401375f828201840152601f01601f1916010190565b916040519360605260405260601b602c526323b872dd60601b600c5260205f6064601c82855af1908160015f511416156124c2575b50505f606052604052565b3b153d1710156124d3575f806124b7565b637939f4245f526004601cfd5b906124eb929161255b565b6001600160a01b0381161561128857612503906121f1565b1561128857565b919060145260345263a9059cbb60601b5f5260205f6044601082855af1908160015f5114161561253d575b50505f603452565b3b153d17101561254e575f80612535565b6390b8ec185f526004601cfd5b604080515f959490939181146125a65760411461257757505050565b604080929395508101355f1a60205281375b5f526020604060805f60015afa505f6060523d6060185191604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b031660605290925061258956fea26469706673582212203fdca5d1551af74b875d1f0e4b8878b123412bb78ae4783affa417e9c133ff7964736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{"addSettlerExecutor(bytes32,address)":{"details":"Reverts with `NotOwner`; Only the admin can set the settler executor.","params":{"executor":": The settler's assigned executor address.","settler":": The settler's tplus account key."}},"constructor":{"details":"Reverts with `ZeroAddress()` if `_owner` is null.Reverts with `ZeroAddress()` if `_credentialManager` is null.","params":{"_credentialManager":"The address of the credential manager.","_owner":"The address to set as the owner."}},"deposit(bytes32,address,uint256)":{"details":"Reverts if the amount is 0.","params":{"amount":": The amount of the token to deposit.","tokenAddress":": The address of the token to deposit.","user":": The user whose account will be credited with the deposit."}},"executeAtomicSettlement((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes,bytes)":{"details":"Reverts with `Expired` if the block timestamp is greater than `validUntil`.Reverts with `NotExecutor`; Only the executor can settle.Reverts with `InvalidNonce` if the nonce has already been used.Reverts with `SignatureError` if the signer is not an admin.Reverts with `InsufficientAmountFromExecutor` if the `order.amountIn` is less than what the executor reports","params":{"data":": The data to execute as part of settlement callback.","order":": The settlement order.","signature":": The signature from the t+ clearing engine."}},"executeSquashingSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes[],bytes32)":{"params":{"requests":"List of settlement requests"}},"getApprovedSettlers()":{"returns":{"_0":"An array of addresses (as bytes32) that are currently approved settlers."}},"pullBatchSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":{"details":"Reverts with `Expired` if the block timestamp is greater than `validUntil`.Reverts if a batch settlement has already started.Reverts with `NotAdmin`; Only an admin can execute the settlement.Reverts with `InvalidNonce` if the nonce has already been used.Reverts with `SignatureError` if the signer is not an admin.","params":{"orders":": The settlement orders.","target":": The target address to send the token to, pull tokens from, and execute callback on.","user":": The t+ user who is executing the settlement.","validUntil":": The timestamp when the settlement signature expires."}},"pushBatchSettlements(bytes32,uint64)":{"details":"Reverts with `NotAdmin`; Only an admin can execute the settlement.","params":{"account":": The account of the t+ user to execute settlement against","user":": The t+ user who is executing the settlement."}},"removeSettler(bytes32)":{"details":"Reverts with `NotOwner`; Only the admin can remove a settler.","params":{"settler":": The settler's tplus account key."}},"setDomainSeparator(bytes32)":{"details":"Reverts with `NotOwner`; Only the admin can set the domain separator.","params":{"domainSeparator":": The value to set."}},"setOwner(address)":{"details":"Reverts with `NotOwner`; Only the owner can set a new owner."},"withdraw((address,uint256,uint256),bytes32,address,uint256,bytes32,bytes[])":{"details":"Reverts with `Expired` if the block timestamp is greater than `validUntil`.Reverts with `InvalidNonce` if the nonce has already been used.Reverts with `SignatureError` if the signer is not an admin.","params":{"signatures":": t+ clearing engine signatures.","target":": The target address to send the token to.","user":": The user whose account will be debited by the withdrawal.","validUntil":": The timestamp when the withdrawal signature expires.","withdrawal":": The withdrawal token and amount."}}},"stateVariables":{"credentialManager":{"details":"In production, this will be an upgradeable proxy"},"owner":{"details":"Should be set to the DStack container shared secret address."},"settlementCaps":{"details":"Currently unused \u2014 implementation pending design finalization."}},"version":1},"methodIdentifiers":{"SETTLEMENT_TYPEHASH()":"0xb1fb79c0","addSettlerExecutor(bytes32,address)":"0xad9fa8bc","administrators(uint256)":"0xd89d1510","approvedSettlers(uint256)":"0x3a87fe4d","canDeposit(address)":"0x4bf0d331","credentialManager()":"0x2b0c1a1e","credentialManagerChangeDelayBlocks()":"0xa33c9d00","deposit(bytes32,address,uint256)":"0xd954863c","depositCounts(bytes32)":"0x3d63ea93","executeAtomicSettlement((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes,bytes)":"0xd7a99d7a","executeSquashingSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes[],bytes32)":"0xb24e085a","getApprovedSettlers()":"0x92698ac6","isAdministrator(address)":"0x0a2eb301","lastSignatureUse()":"0xd8c8785d","owner()":"0x8da5cb5b","ownerWithdrawToken(address,address,uint256)":"0xf585b64f","pendingSettlements(bytes32,uint64,uint256)":"0x3684f4ac","pullBatchSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":"0x17aa2e25","pushBatchSettlements(bytes32,uint64)":"0x0b9b17a6","removeSettler(bytes32)":"0x41774bfe","setAdministrators(address[],uint256)":"0x23c56731","setCredentialManager(address)":"0x21e6652c","setDepositorStatus(address,bool)":"0x224b93e1","setDomainSeparator(bytes32)":"0x7438b937","setOwner(address)":"0x13af4035","settlementCaps(address)":"0x98af9772","settlementCounts(bytes32,uint64)":"0x8dff2305","withdraw((address,uint256,uint256),bytes32,address,uint256,bytes32,bytes[])":"0x952df832","withdrawalCounts(bytes32)":"0x82ff8b1e","withdrawalQuorum()":"0x93ea8a7d"},"runtimeBytecode":{"bytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c80630a2eb30114611fbd5780630b9b17a614611df657806313af403514611dab57806317aa2e2514611abd57806321e6652c14611a10578063224b93e1146119b457806323c56731146117525780632b0c1a1e1461172a5780633684f4ac146116505780633a87fe4d146116185780633d63ea93146115ee57806341774bfe1461149b5780634bf0d3311461145e5780637438b9371461142d57806382ff8b1e146114035780638da5cb5b146113dc5780638dff23051461139757806392698ac6146112e157806393ea8a7d146112c4578063952df83214610ff557806398af977214610fbd578063a33c9d0014610fa0578063ad9fa8bc14610e7b578063b1fb79c014610e41578063b24e085a14610600578063d7a99d7a14610353578063d89d151014610311578063d8c8785d146102f4578063d954863c146101c95763f585b64f14610163575f80fd5b346101b65760603660031901126101b65761017c611fea565b610184612000565b5f549091906001600160a01b031633036101ba576001600160a01b038216156101b6576101b4916044359161250a565b005b5f80fd5b6330cd747160e01b5f5260045ffd5b346101b65760603660031901126101b6576004356101e5612000565b604435335f52600e60205260ff60405f205416156102c2578015610297577f9d677c46e10ba33882144473956fae8d2c52353dcde5aab8230d1bd280cfc3b4816102328593303387612482565b825f52600b60205260405f2054936102646040519283928360209093929193604081019460018060a01b031681520152565b0390a35f52600b60205260405f20805490600182018092116102835755005b634e487b7160e01b5f52601160045260245ffd5b606460405162461bcd60e51b81526020600482015260046024820152635a65726f60e01b6044820152fd5b60405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b6044820152606490fd5b346101b6575f3660031901126101b6576020600f54604051908152f35b346101b65760203660031901126101b657600435600d548110156101b65761033a60209161217f565b905460405160039290921b1c6001600160a01b03168152f35b346101b657366003190161014081126101b657610100136101b657610104356001600160401b0381116101b65761038e9036906004016121c4565b90610124356001600160401b0381116101b6576103af9036906004016121c4565b92906084359160a435936001600160401b0385168095036101b65760e435918242116105f1575f85815260036020908152604080832033845260010190915290205460ff16156105e257845f52600a60205260405f20865f5260205260405f20549660c435978089036105cb575061047290600254956104666001600160601b031961043961225d565b60601b16968b8b8b6024359b6001600160601b0319610456612273565b60601b168d6064359d8e9361229d565b602081519101206124e0565b43600f55845f52600a60205260405f20865f5260205260405f2080549160018301809311610283576020928692556104c76104ab61225d565b604051631f8eac2760e11b815295869485949260048601612448565b03815f335af19081156105c0575f9161058e575b50818110610579579061051b7ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c9392610512612273565b30903390612482565b61052d823361052861225d565b61250a565b61057461053861225d565b91610541612273565b604080516001600160a01b0395861681526020810196909652931692840192909252606083019190915281906080820190565b0390a4005b63d44c3d9d60e01b5f5260045260245260445ffd5b90506020813d6020116105b8575b816105a9602093836120ef565b810103126101b65751866104db565b3d915061059c565b6040513d5f823e3d90fd5b88906306427aeb60e01b5f5260045260245260445ffd5b6361968ebb60e11b5f5260045ffd5b630407b05b60e31b5f5260045ffd5b346101b65760603660031901126101b6576004356001600160401b0381116101b657610630903690600401612040565b6024356001600160401b0381116101b65761064f903690600401612040565b90604435828403610e3257805f52600760205260ff60405f20541615610e23575f90815260036020908152604080832033845260010190915290205460ff16156105e2578260011b83810460021484151715610283576106ae816123e4565b906106bc60405192836120ef565b8082526106cb601f19916123e4565b015f5b818110610df45750505f915f5b858110610ad257505f5b838110610a1057505f5b8381106109b75750610700856123e4565b9361070e60405195866120ef565b858552601f1961071d876123e4565b013660208701375f5b8681106108d3575050505f5b8281106107f85785855f5b81811061074657005b60019061075d3661075883868861223a565b612352565b60808101516001600160401b0360a083015116907ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c60c084015193868060a01b038151166107ef60208301519260608a8060a01b03604083015116910151906040519485948590949392606092608083019660018060a01b03168352602083015260018060a01b031660408201520152565b0390a40161073d565b5f60606108058385612416565b51015113610816575b600101610732565b6001600160a01b036108288284612416565b51511660606108378385612416565b510151905f5f5b828a8a808410610883575050505082811061086c5750600192916108659130903390612482565b905061080e565b905063d44c3d9d60e01b5f5260045260245260445ffd5b6001600160a01b03916108a49160409161089e91879161223a565b01612289565b16146108b3575b60010161083e565b906108cb6001916108c4848b612416565b5190612345565b9190506108ab565b6108e236610758838a8c61223a565b8051602082810151610920926001600160a01b031661090286888a6123fb565b604051631f8eac2760e11b8152958694859491939160048601612448565b03815f335af19081156105c0575f91610986575b5061093f8389612416565b52606061094c8389612416565b519101908151116109605750600101610726565b61096a8288612416565b519051916359a771d160e01b5f5260045260245260445260645ffd5b90506020813d82116109af575b816109a0602093836120ef565b810103126101b657518a610934565b3d9150610993565b805f60606109c760019487612416565b510151126109d6575b016106ef565b610a0b828060a01b036109e98387612416565b515116610a0360606109fb8589612416565b510151612438565b90339061250a565b6109d0565b806020610a1f60019386612416565b5101516040610a2e8387612416565b5101511015610a7457610a5e6020610a468387612416565b5101516040610a558488612416565b510151906123d7565b6060610a6a8387612416565b5101525b016106e5565b6040610a808286612416565b5101516020610a8f8387612416565b5101511015610a6e57610abe610ab96040610aaa8488612416565b5101516020610a558589612416565b612438565b6060610aca8387612416565b510152610a6e565b610add81878961223a565b610120813603126101b65760405190610af58261209d565b610aff3682612352565b8252610100810135906001600160401b0382116101b6570136601f820112156101b65780356001600160401b038111610de05760405191610b4a601f8301601f1916602001846120ef565b81835236602083830101116101b657815f926020809301838601378301015260208201525160808101516001600160401b0360a0830151169160c08101519260e08201519060408301519360018060a01b0385169284519660206060870151960151968242116105f157835f52600a60205260405f206001600160401b0386165f5260205260405f2054808310610dc957508f918f8b90610c1f610c3d96610c2c948a8f8f8f90918d92610c379b600254906001600160601b03199060601b16926001600160601b03199060601b169061229d565b602081519101209461223a565b610100810190612313565b916124e0565b43600f555f52600a6020526001600160401b0360405f2091165f5260205260405f208054906001820180921161028357555f9182805b8a8110610d81575b5015610d3d575b50505f5b878110610cf2575b5015610c9f575b50506001016106db565b94610cea916001939660405191610cb5836120b8565b858060a01b031682525f602083015260408201525f6060820152610cd98287612416565b52610ce48186612416565b5061242a565b939088610c95565b6001600160a01b0384811690610d08838a612416565b51511614610d1857600101610c86565b60409150610d269087612416565b5101610d33828251612345565b905260018a610c8e565b90610d7992989160405191610d51836120b8565b825260208201525f60408201525f6060820152610d6e8289612416565b52610ce48188612416565b958a80610c82565b836001600160a01b03610d94838d612416565b51511614610da457600101610c73565b60209150610db2908a612416565b5101610dbf828251612345565b905260018d610c7b565b90506306427aeb60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52604160045260245ffd5b602090604051610e03816120b8565b5f81525f838201525f60408201525f6060820152828286010152016106ce565b63be4ab3c760e01b5f5260045ffd5b631d6e22b960e01b5f5260045ffd5b346101b6575f3660031901126101b65760206040517fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb8152f35b346101b65760403660031901126101b657600435610e97612000565b5f549091906001600160a01b031633036101ba57805f52600760205260ff60405f20541615610f49575b5f52600360205260405f2090600182019160018060a01b0382165f528260205260ff60405f20541615610ef057005b8054600160401b811015610de057610f0d916001820181556121af565b81546001600160a01b0393841660039290921b82811b94901b19169290921790555f90815260209190915260409020805460ff19166001179055005b600454600160401b811015610de057610f82610f6c826001859401600455612197565b819391549060031b91821b915f19901b19161790565b9055805f52600760205260405f20600160ff19825416179055610ec1565b346101b6575f3660031901126101b6576020600654604051908152f35b346101b65760203660031901126101b6576001600160a01b03610fde611fea565b165f526008602052602060405f2054604051908152f35b346101b657366003190161010081126101b6576060136101b6576064356084356001600160a01b03811681036101b65760a4359160e4356001600160401b0381116101b657611048903690600401612040565b9290936005548142116105f1578085106112ae57835f52600c60205260405f20549560443596808803611297575061107f866123e4565b9061108d60405192836120ef565b868252601f1961109c886123e4565b013660208401375f916002546001600160601b03196110b961225d565b60601b16602435966040519160208301937f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba8552604084015260608301528760808301528960a08301528b60c083015260e082015260c4356101008201526001600160601b03198860601b16610120820152610120815261113c610140826120ef565b5190205f5b8981106111e5575b505050509080929394955081106111d0575050825f52600c60205260405f2080549060018201809211610283577fc4f5735f1abe60807c07c06560e4a6d7eb655a37442b6a47e3ab1998c9611e2f936111ab9284925543600f5561052861225d565b6111b361225d565b604080516001600160a01b039290921682526020820192909252a3005b6326a15da760e01b5f5260045260245260445ffd5b6111fa6111f3828c876123fb565b908461255b565b6001600160a01b03811690811561128857611214906121f1565b156112885760015f5b87811061125d575b50611240575b5085851461123b57600101611141565b611149565b9461125691956112508286612416565b5261242a565b938b61122b565b826001600160a01b036112708389612416565b51161461127f5760010161121d565b50505f8d611225565b638baa579f60e01b5f5260045ffd5b87906306427aeb60e01b5f5260045260245260445ffd5b846326a15da760e01b5f5260045260245260445ffd5b346101b6575f3660031901126101b6576020600554604051908152f35b346101b6575f3660031901126101b6576040518060206004549283815201809260045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b905f5b818110611381575050508161133f9103826120ef565b604051918291602083019060208452518091526040830191905f5b818110611368575050500390f35b825184528594506020938401939092019160010161135a565b8254845260209093019260019283019201611329565b346101b65760403660031901126101b6576113b061202a565b6004355f52600a6020526001600160401b0360405f2091165f52602052602060405f2054604051908152f35b346101b6575f3660031901126101b6575f546040516001600160a01b039091168152602090f35b346101b65760203660031901126101b6576004355f52600c602052602060405f2054604051908152f35b346101b65760203660031901126101b6575f546001600160a01b031633036101ba576002546101b657600435600255005b346101b65760203660031901126101b6576001600160a01b0361147f611fea565b165f52600e602052602060ff60405f2054166040519015158152f35b346101b65760203660031901126101b6575f54600435906001600160a01b031633036101ba576004545f828152600760205260408120805460ff191690555b818110611565575b50505f52600360205260405f205f60018201905b8254811015611539578061150c600192856121af565b838060a01b0391549060031b1c16828060a01b03165f528260205260405f2060ff198154169055016114f6565b82545f8455838161154657005b5f5260205f20908101905b81811061155a57005b5f8155600101611551565b8261156f82612197565b90549060031b1c14611583576001016114da565b905f19810190811161028357610f6c61159e6115ab92612197565b90549060031b1c92612197565b905560045480156115da575f19016115c281612197565b8154905f199060031b1b1916905560045581806114e2565b634e487b7160e01b5f52603160045260245ffd5b346101b65760203660031901126101b6576004355f52600b602052602060405f2054604051908152f35b346101b65760203660031901126101b6576004356004548110156101b657611641602091612197565b90549060031b1c604051908152f35b346101b65760603660031901126101b65761166961202a565b604435906004355f5260096020526001600160401b0360405f2091165f5260205260405f2080548210156101b657610120916116a491612070565b506116ae81612110565b90600860018060a01b039101541660e06040519260018060a01b0381511684526020810151602085015260018060a01b03604082015116604085015260608101516060850152608081015160808501526001600160401b0360a08201511660a085015260c081015160c0850152015160e0830152610100820152f35b346101b6575f3660031901126101b6576001546040516001600160a01b039091168152602090f35b346101b65760403660031901126101b6576004356001600160401b0381116101b657611782903690600401612040565b600154909190602435906001600160a01b031633036119a5576001811061199657808310611980575f5b838110156117e8576001600160a01b036117cb600583901b8501612289565b16156117d9576001016117ac565b63d92e233d60e01b5f5260045ffd5b5091906001600160401b038211610de057600160401b8211610de057600d5482600d5580831061193c575b50600d5f525f5b82811061190157837f74e3f7a222a002bb0346144c8442604f86b79a5319301c8b2393dbe33ba3f1ec5f80a1600d545f5b8181106118965782600554908060055580820361186457005b7f71847092dda23e5394806b377214ca90449cdd1413463150e7f577ccefea54d89160409182519182526020820152a1005b61189f8161217f565b905460018301929160031b1c6001600160a01b031682821161028357604080516001600160a01b0392909216825260208201939093526001927f723c2b747529ca7f5eb53a74808f4a8b9bf264f0fc450fd904900151da74548a91a10161184b565b600190602061190f84612289565b930192817fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501550161181a565b600d5f527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb59081019083015b8181106119755750611813565b5f8155600101611968565b82633e1a6b7d60e21b5f5260045260245260445ffd5b6345f8facb60e11b5f5260045ffd5b6326b672e560e01b5f5260045ffd5b346101b65760403660031901126101b6576119cd611fea565b602435908115158092036101b6575f546001600160a01b031633036101ba5760018060a01b03165f52600e60205260405f209060ff801983541691161790555f80f35b346101b65760203660031901126101b657611a29611fea565b5f546001600160a01b031633036101ba576001600160a01b031680156117d957611a58600f5460065490612345565b431015611aae5760407feb63fb900cbf0301de00619a02ae3f5996820dabc03207c0e0d97046e521d7b99160015490806001600160601b0360a01b83161760015582519160018060a01b031682526020820152a1005b636fed7d8560e01b5f5260045ffd5b346101b65760a03660031901126101b6576004356001600160401b0381116101b657611aed903690600401612040565b90602435604435916001600160401b0383168093036101b657606435906001600160a01b038216908183036101b657608435918242116105f157845f52600960205260405f20865f5260205260405f20546101b657611b4b336121f1565b15611d9c57845f52600a60205260405f20865f5260205260405f205493600254948815611d8d575f5b898110611ba2578989895f52600a60205260405f20905f52602052611b9e60405f20918254612345565b9055005b611bad818b8761223a565b9160c083013590808203611d78575088929190818c8a8a848f6bffffffffffffffffffffffff19611bdd8a612289565b60601b169960208a01359a6001600160601b031960408c01611bfe90612289565b60601b168c60608d013592611c129861229d565b8051906020012091611c24918a61223a565b6101008101611c3291612313565b90611c3c926124e0565b600181018091116102835792895f52600960205260405f208b5f5260205260405f2090604051611c6b8161209d565b611c753686612352565b815260208101928884528054600160401b811015610de057611c9c91600182018155612070565b939093611d65579051805184546001600160a01b03199081166001600160a01b03928316178655602083015160018781019190915560408401516002880180548416918516919091179055606084015160038801556080840151600488015560a084015160058801805467ffffffffffffffff19166001600160401b039290921691909117905560c0840151600688015560e09390930151600787015592516008909501805490931694169390931790559092611d5f9190869061052890612289565b01611b74565b634e487b7160e01b5f525f60045260245ffd5b6306427aeb60e01b5f5260045260245260445ffd5b63164bb4b560e11b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346101b65760203660031901126101b657611dc4611fea565b5f54906001600160a01b03821633036101ba576001600160a01b03169081156117d9576001600160a01b031916175f55005b346101b65760403660031901126101b657600435611e1261202a565b611e1b336121f1565b15611d9c576001600160401b0316905f5b815f52600960205260405f20835f5260205260405f205463ffffffff82161015611f3c5763ffffffff90825f52600960205260405f20845f52602052611e758160405f20612070565b50611ebe60405191611e868361209d565b611e8f81612110565b8084526008909101546001600160a01b0390811660208501819052604083015160609093015192309216612482565b5160c0810151815160208084015160408086015160609687015182516001600160a01b0396871681529485019390935293909316928201929092529283015290859085907ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c90608090a41663ffffffff811461028357600101611e2c565b505f52600960205260405f20905f5260205260405f208054905f815581611f5f57005b81600902916009830403610283575f5260205f20908101905b818110611f8157005b805f600992555f60018201555f60028201555f60038201555f60048201555f60058201555f60068201555f60078201555f600882015501611f78565b346101b65760203660031901126101b6576020611fe0611fdb611fea565b6121f1565b6040519015158152f35b600435906001600160a01b03821682036101b657565b602435906001600160a01b03821682036101b657565b35906001600160a01b03821682036101b657565b602435906001600160401b03821682036101b657565b9181601f840112156101b6578235916001600160401b0383116101b6576020808501948460051b0101116101b657565b8054821015612089575f52600960205f20910201905f90565b634e487b7160e01b5f52603260045260245ffd5b604081019081106001600160401b03821117610de057604052565b608081019081106001600160401b03821117610de057604052565b61010081019081106001600160401b03821117610de057604052565b90601f801991011681019081106001600160401b03821117610de057604052565b9060405161211d816120d3565b82546001600160a01b039081168252600184015460208301526002840154166040820152600383015460608201526004830154608082015260058301546001600160401b031660a0820152600683015460c082015260079092015460e0830152565b600d5481101561208957600d5f5260205f2001905f90565b6004548110156120895760045f5260205f2001905f90565b8054821015612089575f5260205f2001905f90565b9181601f840112156101b6578235916001600160401b0383116101b657602083818601950101116101b657565b600d54905f5b828110612205575050505f90565b61220e8161217f565b905460039190911b1c6001600160a01b0390811690831614612232576001016121f7565b505050600190565b91908110156120895760051b8101359061011e19813603018212156101b6570190565b6004356001600160a01b03811681036101b65790565b6044356001600160a01b03811681036101b65790565b356001600160a01b03811681036101b65790565b989796959493929190604051997fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208c015260408b015260608a0152608089015260a088015260c087015260e08601526101008501526101208401526101408301526101408252612311610160836120ef565b565b903590601e19813603018212156101b657018035906001600160401b0382116101b6576020019181360383136101b657565b9190820180921161028357565b9190826101009103126101b65760405161236b816120d3565b809261237681612016565b82526020810135602083015261238e60408201612016565b6040830152606081013560608301526080810135608083015260a08101356001600160401b03811681036101b65760e091829160a085015260c081013560c08501520135910152565b9190820391821161028357565b6001600160401b038111610de05760051b60200190565b90821015612089576124129160051b810190612313565b9091565b80518210156120895760209160051b010190565b5f1981146102835760010190565b600160ff1b8114610283575f0390565b9284926080959260018060a01b03168552602085015260606040850152816060850152848401375f828201840152601f01601f1916010190565b916040519360605260405260601b602c526323b872dd60601b600c5260205f6064601c82855af1908160015f511416156124c2575b50505f606052604052565b3b153d1710156124d3575f806124b7565b637939f4245f526004601cfd5b906124eb929161255b565b6001600160a01b0381161561128857612503906121f1565b1561128857565b919060145260345263a9059cbb60601b5f5260205f6044601082855af1908160015f5114161561253d575b50505f603452565b3b153d17101561254e575f80612535565b6390b8ec185f526004601cfd5b604080515f959490939181146125a65760411461257757505050565b604080929395508101355f1a60205281375b5f526020604060805f60015afa505f6060523d6060185191604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b031660605290925061258956fea26469706673582212203fdca5d1551af74b875d1f0e4b8878b123412bb78ae4783affa417e9c133ff7964736f6c634300081e0033"},"sourceId":"src/DepositVault.sol","sourcemap":"325:35225:15:-:0;;;;;;;;;;;;;-1:-1:-1;;325:35225:15;;;;-1:-1:-1;;;;;325:35225:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;1329:5;;325:35225;-1:-1:-1;;;;;325:35225:15;;;;9015:20;;9011:46;;-1:-1:-1;;;;;325:35225:15;;9071:32;;9067:58;;325:35225;;;;;;-1:-1:-1;325:35225:15;;;-1:-1:-1;325:35225:15;;;;;;;9159:38;325:35225;;;9159:38;325:35225;;;;;;;;;;9067:58;9044:13;;;-1:-1:-1;9112:13:15;;-1:-1:-1;9112:13:15;325:35225;-1:-1:-1;325:35225:15;;;;;;-1:-1:-1;325:35225:15;;;;;-1:-1:-1;325:35225:15;;;;-1:-1:-1;;;;;325:35225:15;;;;;;:::o","userdoc":{"errors":{"EmptyOrders()":[{"notice":"Reverts if an order array is empty."}],"Expired()":[{"notice":"Reverts if a signed operation is past its deadline."}],"InsufficientAdministrators(uint256,uint256)":[{"notice":"Reverts if insufficient administrators are provided when setting the administrators"}],"InsufficientAmountFromExecutor(uint256,uint256)":[{"notice":"Reverts if a settlement callback returns an insufficient input token amount"}],"InsufficientCallbackReturnForSettlement(uint256,uint256,uint256)":[{"notice":"Reverts if a settlement callback returns insufficient amount for a specific settlement"}],"InvalidNonce(uint256,uint256)":[{"notice":"Reverts if the nonce used in a transaction is incorrect."}],"InvalidSignature()":[{"notice":"Reverts if the signature provided is invalid."}],"MissedQuorum(uint256,uint256)":[{"notice":"Reverts when an insufficient number of signatures are provided for a withdrawal request"}],"NotAdmin()":[{"notice":"Reverts if the caller is not an admin."}],"NotCredentialManager()":[{"notice":"Reverts if the caller is not the credential manager"}],"NotExecutor()":[{"notice":"Reverts if the caller is not the authorized executor."}],"NotOwner()":[{"notice":"Reverts if the caller is not the owner."}],"PayloadMismatch()":[{"notice":"Reverts if the number of callback data payloads does not match the number of settlement requests"}],"SettlerNotApproved()":[{"notice":"Reverts if the specified settler is not an approved settler on this vault"}],"TooSoon()":[{"notice":"Reverts if an insufficient number of blocks have elapsed since the last signature use"}],"ZeroAddress()":[{"notice":"Reverts when given the zero address."}],"ZeroWithdrawalQuorum()":[{"notice":"Reverts if a new withdrawal quorum value is equal to zero"}]},"events":{"AdminAdded(address,uint256)":{"notice":"Signals that a new administrator has been added to the vault"},"AdministratorSetReset()":{"notice":"Indicates that the set of administrators has been cleared and is now empty"},"CredentialManagerChanged(address,address)":{"notice":"Signals that the credential manager address has changed"},"Deposited(bytes32,uint256,address,uint256)":{"notice":"Signals a deposit."},"Settled(bytes32,uint64,uint256,address,uint256,address,uint256)":{"notice":"Signals a settlement."},"WithdrawalQuorumChanged(uint256,uint256)":{"notice":"Signals that the withdrawal quorum has changed"},"Withdrew(bytes32,uint256,address,uint256)":{"notice":"Signals a withdrawal."}},"kind":"user","methods":{"SETTLEMENT_TYPEHASH()":{"notice":"Makes the signature unambiguous that it is for settlements."},"addSettlerExecutor(bytes32,address)":{"notice":"Sets the settle executor."},"administrators(uint256)":{"notice":"Set of administrators"},"approvedSettlers(uint256)":{"notice":"List of all approved settler IDs."},"constructor":{"notice":"Initializes the contract and sets the owner."},"credentialManager()":{"notice":"The address responsible for adding or removing administrators"},"deposit(bytes32,address,uint256)":{"notice":"Deposits a token into the vault."},"depositCounts(bytes32)":{"notice":"Maps user ID pairs to their deposit count (nonce)."},"executeAtomicSettlement((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes,bytes)":{"notice":"Executes an atomic settlement."},"executeSquashingSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes[],bytes32)":{"notice":"Execute a sequence of settlement requests in a squashing fashion"},"getApprovedSettlers()":{"notice":"Get the array of approved settlers."},"lastSignatureUse()":{"notice":"Block number of latest signature use"},"owner()":{"notice":"The admin approves settlements and withdrawals."},"pendingSettlements(bytes32,uint64,uint256)":{"notice":"Maps (settler ID, account_index) pairs to their queue of pending batch settlements."},"pullBatchSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":{"notice":"Pulls funds for execution during a settlement batch."},"pushBatchSettlements(bytes32,uint64)":{"notice":"Pushes expected funds from a batch settlement to the deposit vault."},"removeSettler(bytes32)":{"notice":"Removes a settler."},"setDomainSeparator(bytes32)":{"notice":"Sets the domain separators for EIP-712 signatures."},"setOwner(address)":{"notice":"Sets the owner of the vault."},"settlementCaps(address)":{"notice":"Maximum total tokens that can be settled in a single block for each token."},"settlementCounts(bytes32,uint64)":{"notice":"Maps (settler ID, account_index) pairs to their settlement count (nonce)."},"withdraw((address,uint256,uint256),bytes32,address,uint256,bytes32,bytes[])":{"notice":"Withdraws a token from the vault."},"withdrawalCounts(bytes32)":{"notice":"Maps user ID to their withdrawal count (nonce)."},"withdrawalQuorum()":{"notice":"Minimum number of administrator signatures to approve a withdrawal request"}},"version":1}},"IAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"IAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IAdminUpdateStrategy.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IAtomicSettlementCallback":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onAtomicSettlement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"contractName":"IAtomicSettlementCallback","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"onAtomicSettlement(address,uint256,bytes)":"0x3f1d584e"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IAtomicSettlementCallback.sol","sourcemap":"","userdoc":{"kind":"user","methods":{"onAtomicSettlement(address,uint256,bytes)":{"notice":"Computes the minimum expected quantity of `token` that will be received by the deposit vault upon execution of an atomic settlement request"}},"version":1}},"IAutomataDcapAttestation":{"abi":[{"inputs":[{"internalType":"bytes","name":"output","type":"bytes"},{"internalType":"enum IAutomataDcapAttestation.ZkCoProcessorType","name":"zkvm","type":"uint8"},{"internalType":"bytes","name":"proofBytes","type":"bytes"}],"name":"verifyAndAttestWithZKProof","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"errorData","type":"bytes"}],"stateMutability":"nonpayable","type":"function"}],"contractName":"IAutomataDcapAttestation","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"details":"Bindings for the 'AutomataDcapAttestation' contract. Compatible with Automata V3 ZK Coprocessor logic.","kind":"dev","methods":{"verifyAndAttestWithZKProof(bytes,uint8,bytes)":{"params":{"output":"The Public Values (Journal) - effectively the Quote Body.","proofBytes":"The actual (Groth16) proof.","zkvm":"The type of ZKVM used."},"returns":{"errorData":"Error message if failed, or empty if success.","success":"True if valid."}}},"version":1},"methodIdentifiers":{"verifyAndAttestWithZKProof(bytes,uint8,bytes)":"0x57859ce0"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IAutomataDcapAttestation.sol","sourcemap":"","userdoc":{"kind":"user","methods":{"verifyAndAttestWithZKProof(bytes,uint8,bytes)":{"notice":"Verifies a SNARK proof (Groth16) for a TEE Quote."}},"notice":"Interface for Automata's DCAP Attestation Verifier (V3)","version":1}},"ICheckpointer":{"abi":[{"inputs":[],"name":"AlreadySet","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCouncilMultisig","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"name":"Withdrawals","type":"event"},{"inputs":[],"name":"CHECKPOINT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sharedSignature","type":"bytes"},{"internalType":"bytes","name":"leaderSignature","type":"bytes"},{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8[]","name":"stateRoot","type":"uint8[]"},{"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"internalType":"struct ICheckpointer.Checkpoint","name":"_checkpoint","type":"tuple"}],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"councilMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setInitialCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"}],"name":"setLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setNewCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stateRoot","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateRootNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"ICheckpointer","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"CHECKPOINT_TYPEHASH()":"0xe1193e4c","admin()":"0xf851a440","checkpoint(bytes,bytes,(uint256,uint8[],string[]))":"0x8bbb26a3","councilMultisig()":"0x07ddaf53","leader()":"0x40eedabb","setAdmin(address)":"0x704b6c02","setDomainSeparator(bytes32)":"0x7438b937","setInitialCouncilMultisig(address)":"0x3ea987d3","setLeader(address)":"0x4331e8dd","setNewCouncilMultisig(address)":"0x5fa993b2","stateRoot(uint256)":"0xcc2fc845","stateRootNonce()":"0x74ebc7a0"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/ICheckpointer.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"ICredentialManager":{"abi":[{"inputs":[],"name":"AmbiguousState","type":"error"},{"inputs":[],"name":"CannotCancel","type":"error"},{"inputs":[],"name":"GatheringActive","type":"error"},{"inputs":[],"name":"GatheringNotActive","type":"error"},{"inputs":[],"name":"GatheringNotExpired","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientSignatures","type":"error"},{"inputs":[{"internalType":"uint256","name":"newCommittee","type":"uint256"},{"internalType":"uint256","name":"operatorCount","type":"uint256"}],"name":"InvalidCommittee","type":"error"},{"inputs":[{"internalType":"uint256","name":"delay","type":"uint256"}],"name":"InvalidDelay","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InvalidEpoch","type":"error"},{"inputs":[],"name":"InvalidProfileConfig","type":"error"},{"inputs":[],"name":"InvalidProfileId","type":"error"},{"inputs":[],"name":"InvalidQuoteLength","type":"error"},{"inputs":[],"name":"InvalidReportData","type":"error"},{"inputs":[],"name":"InvalidVaultAddr","type":"error"},{"inputs":[],"name":"InvalidVerifier","type":"error"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"},{"internalType":"string","name":"field","type":"string"}],"name":"MeasurementMismatch","type":"error"},{"inputs":[],"name":"NoCandidate","type":"error"},{"inputs":[],"name":"NoStrategy","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"NotOperator","type":"error"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"}],"name":"ProfileInactive","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"proposed","type":"uint256"}],"name":"ProposedEpochTooLow","type":"error"},{"inputs":[],"name":"SignersNotSortedOrUnique","type":"error"},{"inputs":[],"name":"StrategyAlreadyExists","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyCanceled","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyExecuted","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"uint256","name":"readyAt","type":"uint256"},{"internalType":"uint256","name":"nowTs","type":"uint256"}],"name":"TimelockNotReady","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockUnknown","type":"error"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"}],"name":"VaultNotFound","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"}],"name":"AdminUpdateStrategyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"AttestedKeyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldVerifier","type":"address"},{"indexed":true,"internalType":"address","name":"newVerifier","type":"address"}],"name":"AutomataVerifierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"CommitteeThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newEpoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newCheckpointHash","type":"bytes32"}],"name":"EpochIncremented","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"LeaderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"profileId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"MeasurementProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"newMrtd","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newRtmr0","type":"bytes32"}],"name":"MeasurementsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"OperationScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRegistry","type":"address"},{"indexed":true,"internalType":"address","name":"newRegistry","type":"address"}],"name":"RegistryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash1","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash2","type":"bytes32"}],"name":"RestartAmbiguityDetected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"leader","type":"address"},{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"RestartCandidateSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"RestartExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"RestartGatheringStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRiskManager","type":"address"},{"indexed":true,"internalType":"address","name":"newRiskManager","type":"address"}],"name":"RiskManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"targetOpType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"oldDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"TimelockDelayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"indexed":false,"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"}],"name":"VaultAdded","type":"event"},{"inputs":[],"name":"GATHERING_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_ADD_VAULT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_APPOINT_LEADER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_CANCEL_TIMELOCK","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_MANAGE_PROFILE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_REGISTER_STRATEGY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_RESTART","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_AUTOMATA_VERIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_COMMITTEE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_DELAY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_MEASUREMENTS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_REGISTRY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_RISK_MANAGER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_VAULT_ADMINS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_WITHDRAW","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"addVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"adminUpdateStrategies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"appointLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"automataVerifier","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bestCandidate","outputs":[{"internalType":"address","name":"leader","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"cancelTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"committeeThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct ICredentialManager.MeasurementProfile","name":"profile","type":"tuple"}],"name":"executeManageProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"}],"name":"executeRegistryContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"}],"name":"executeRiskManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"}],"name":"executeUpdateAutomataVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCouncilConfig","outputs":[{"internalType":"address[]","name":"members","type":"address[]"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeader","outputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"attestedKey","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getVaults","outputs":[{"components":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"}],"internalType":"struct ICredentialManager.Vault[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initiateRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRestartAmbiguous","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestCheckpointHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"measurementProfiles","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProfileId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operatorToAttestedKey","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"operators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"address","name":"strategy","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"registerAdminUpdateStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"registerAttestedKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registryContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resolveRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restartGatheringDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct ICredentialManager.MeasurementProfile","name":"profile","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleManageProfile","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRegistryContract","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRiskManager","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleUpdateAutomataVerifier","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setDepositVaultAdministrators","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"internalType":"bytes","name":"tdxReportBody","type":"bytes"},{"internalType":"bytes","name":"zkProof","type":"bytes"},{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"submitRestartProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockDelayFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockOps","outputs":[{"internalType":"uint64","name":"eta","type":"uint64"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"bytes32","name":"opType","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"updateCommitteeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaults","outputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"internalType":"bytes32","name":"checkMrtd","type":"bytes32"},{"internalType":"bytes32","name":"checkRtmr0","type":"bytes32"},{"internalType":"bytes32","name":"checkRtmr1","type":"bytes32"},{"internalType":"bytes32","name":"checkRtmr2","type":"bytes32"},{"internalType":"bytes32","name":"checkRtmr3","type":"bytes32"}],"name":"verifyMeasurements","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"contractName":"ICredentialManager","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"GATHERING_DURATION()":"0xa6aac513","OP_ADD_VAULT()":"0x90054742","OP_APPOINT_LEADER()":"0x4e970c8c","OP_CANCEL_TIMELOCK()":"0xfc0e2ba7","OP_MANAGE_PROFILE()":"0xb7635fb8","OP_REGISTER_STRATEGY()":"0x333bef22","OP_RESTART()":"0xd8a0bebf","OP_SET_AUTOMATA_VERIFIER()":"0x2d4ab28d","OP_SET_COMMITTEE()":"0x76be6315","OP_SET_DELAY()":"0xe0913aff","OP_SET_MEASUREMENTS()":"0x6583c37a","OP_SET_REGISTRY()":"0x1bc12e07","OP_SET_RISK_MANAGER()":"0xf5b68c67","OP_SET_VAULT_ADMINS()":"0x26ddc1ba","OP_WITHDRAW()":"0x5f250f69","addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":"0x81392328","admin()":"0xf851a440","adminUpdateStrategies(uint256,uint256)":"0x3174b727","appointLeader(address,address[],bytes[])":"0xfdeabe1f","automataVerifier()":"0x280cd09d","bestCandidate()":"0x669f6f35","cancelTimelock(bytes32,address[],bytes[])":"0x9d3e015a","committeeThreshold()":"0x4dd0a0c9","domainSeparator()":"0xf698da25","epoch()":"0x900cf0cf","executeManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32))":"0xae5c8bfb","executeRegistryContract(address)":"0x24242e77","executeRiskManager(address)":"0x6dfb32aa","executeUpdateAutomataVerifier(address)":"0xc7d06b54","getCouncilConfig()":"0x04235842","getLeader()":"0x4c051f14","getVaults(uint16,uint16)":"0x9fd7285c","governanceNonce()":"0xd9be832c","initiateRestart()":"0x5cc79144","isOperator(address)":"0x6d70f7ae","isRestartAmbiguous()":"0x1276bcc5","latestCheckpointHash()":"0xb34eb182","leader()":"0x40eedabb","measurementProfiles(uint256)":"0x95c82559","nextProfileId()":"0xcd1d81ff","operatorToAttestedKey(address)":"0x1ac4d079","operators(uint256)":"0xe28d4906","registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":"0x5d3ae390","registerAttestedKey(bytes32)":"0x7f0152a8","registryContract()":"0x28c1f99b","resolveRestart()":"0x35cfd9eb","restartGatheringDeadline()":"0x127f49ad","riskManager()":"0x47842663","scheduleManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32),address[],bytes[])":"0xacfacc86","scheduleRegistryContract(address,address[],bytes[])":"0xb5ed8b12","scheduleRiskManager(address,address[],bytes[])":"0x2808e92f","scheduleUpdateAutomataVerifier(address,address[],bytes[])":"0x281cbdd4","setDepositVaultAdministrators(uint256,uint256,address[],uint256)":"0x9ebc068e","submitRestartProof(uint256,bytes,bytes,address,bytes32)":"0xce0b1302","timelockDelayFor(bytes32)":"0xfb834493","timelockOps(bytes32)":"0x31709520","updateCommitteeThreshold(uint256,address[],bytes[])":"0x59d63bcc","vaults(uint256)":"0x8c64ea4a","verifyMeasurements(uint256,bytes32,bytes32,bytes32,bytes32,bytes32)":"0x80446e4a","withdraw(address,address[],bytes[])":"0xbe223838"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/ICredentialManager.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IDepositVault":{"abi":[{"inputs":[],"name":"EmptyOrders","type":"error"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAdministrators","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAmountFromExecutor","type":"error"},{"inputs":[{"internalType":"uint256","name":"settlementIndex","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientCallbackReturnForSettlement","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"given","type":"uint256"}],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"MissedQuorum","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCredentialManager","type":"error"},{"inputs":[],"name":"NotExecutor","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"PayloadMismatch","type":"error"},{"inputs":[],"name":"SettlerNotApproved","type":"error"},{"inputs":[],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroWithdrawalQuorum","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"numAdminsAfter","type":"uint256"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[],"name":"AdministratorSetReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldCredentialManager","type":"address"},{"indexed":false,"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"CredentialManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"account","type":"uint64"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"Settled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"WithdrawalQuorumChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[],"name":"SETTLEMENT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"},{"internalType":"address","name":"executor","type":"address"}],"name":"addSettlerExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"administrators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedSettlers","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManagerChangeDelayBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"depositCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct IDepositVault.Settlement","name":"order","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"executeAtomicSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct IDepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"clearingEngineSignature","type":"bytes"}],"internalType":"struct IDepositVault.SignedSettlement[]","name":"requests","type":"tuple[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"executeSquashingSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getApprovedSettlers","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAdministrator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSignatureUse","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingSettlements","outputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct IDepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"address","name":"target","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct IDepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"clearingEngineSignature","type":"bytes"}],"internalType":"struct IDepositVault.SignedSettlement[]","name":"orders","type":"tuple[]"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"name":"pullBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"}],"name":"pushBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"removeSettler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"setCredentialManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setDepositorStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"settlementCaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"settlementCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct IDepositVault.Withdrawal","name":"withdrawal","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes32","name":"epochHash","type":"bytes32"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"withdrawalCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"IDepositVault","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"SETTLEMENT_TYPEHASH()":"0xb1fb79c0","addSettlerExecutor(bytes32,address)":"0xad9fa8bc","administrators(uint256)":"0xd89d1510","approvedSettlers(uint256)":"0x3a87fe4d","canDeposit(address)":"0x4bf0d331","credentialManager()":"0x2b0c1a1e","credentialManagerChangeDelayBlocks()":"0xa33c9d00","deposit(bytes32,address,uint256)":"0xd954863c","depositCounts(bytes32)":"0x3d63ea93","executeAtomicSettlement((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes,bytes)":"0xd7a99d7a","executeSquashingSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes[],bytes32)":"0xb24e085a","getApprovedSettlers()":"0x92698ac6","isAdministrator(address)":"0x0a2eb301","lastSignatureUse()":"0xd8c8785d","owner()":"0x8da5cb5b","ownerWithdrawToken(address,address,uint256)":"0xf585b64f","pendingSettlements(bytes32,uint64,uint256)":"0x3684f4ac","pullBatchSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":"0x17aa2e25","pushBatchSettlements(bytes32,uint64)":"0x0b9b17a6","removeSettler(bytes32)":"0x41774bfe","setAdministrators(address[],uint256)":"0x23c56731","setCredentialManager(address)":"0x21e6652c","setDepositorStatus(address,bool)":"0x224b93e1","setDomainSeparator(bytes32)":"0x7438b937","setOwner(address)":"0x13af4035","settlementCaps(address)":"0x98af9772","settlementCounts(bytes32,uint64)":"0x8dff2305","withdraw((address,uint256,uint256),bytes32,address,uint256,bytes32,bytes[])":"0x952df832","withdrawalCounts(bytes32)":"0x82ff8b1e","withdrawalQuorum()":"0x93ea8a7d"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IDepositVault.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IL1CrossDomainMessenger":{"abi":[{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"}],"name":"sendMessage","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"IL1CrossDomainMessenger","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"sendMessage(address,bytes,uint32)":"0x3dbb202b"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/strategies/OPStackAdminUpdateStrategy.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IRegistry":{"abi":[{"inputs":[],"name":"ChainAlreadyExists","type":"error"},{"inputs":[],"name":"IndexOutOfBounds","type":"error"},{"inputs":[],"name":"InvalidBufferMultiple","type":"error"},{"inputs":[],"name":"InvalidCollateralFactor","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsClamps","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsConfiguration","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsFactors","type":"error"},{"inputs":[],"name":"InvalidInterestKinks","type":"error"},{"inputs":[],"name":"InvalidLiabilityFactor","type":"error"},{"inputs":[],"name":"InvalidMaxFundingRate","type":"error"},{"inputs":[],"name":"InvalidMaxUtilizationRate","type":"error"},{"inputs":[],"name":"InvalidRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUtilizationCap","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"}],"name":"NoPendingRiskParameters","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotRiskManager","type":"error"},{"inputs":[],"name":"RiskManagerNotSet","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"},{"internalType":"uint256","name":"eligibleAt","type":"uint256"}],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chain","type":"uint64"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"Max1HrDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chain","type":"uint64"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MaxDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chain","type":"uint64"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MinWeightChanged","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"}],"name":"applyPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAccount","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint16","name":"index","type":"uint16"}],"name":"getAssetData","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct IRegistry.AssetData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"}],"name":"getAssetIndex","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getAssets","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct IRegistry.AssetData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"pendingRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters","name":"parameters","type":"tuple"},{"internalType":"uint256","name":"validAfter","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManagerMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskParameterChangeDelaySeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"riskParameters","outputs":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct IRegistry.AssetData","name":"data","type":"tuple"}],"name":"setAssetData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"account","type":"bytes32"}],"name":"setFeeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"chain","type":"uint16"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMax1HrDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"chain","type":"uint16"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMaxDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"chain","type":"uint16"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMinWeight","type":"uint256"}],"name":"setMinWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"},{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters","name":"parameters","type":"tuple"}],"name":"setPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"multisig","type":"address"}],"name":"setRiskManagerMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters","name":"params","type":"tuple"}],"name":"validateRiskParameters","outputs":[],"stateMutability":"pure","type":"function"}],"contractName":"IRegistry","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"admin()":"0xf851a440","applyPendingRiskParameters(uint16)":"0x6cbb0b54","feeAccount()":"0x65e17c9d","getAssetData(uint64,uint16)":"0xf247ceb9","getAssetIndex(uint64,bytes32)":"0x39006126","getAssets(uint16,uint16)":"0x0cb661c7","getRiskParameters(uint16,uint16)":"0xf0fef575","pendingRiskParameters(uint16)":"0xa812e224","riskManagerMultisig()":"0x525ea8b7","riskParameterChangeDelaySeconds()":"0x04cd46f9","riskParameters(uint16)":"0x114bb9c5","setAdmin(address)":"0x704b6c02","setAssetData((uint16,bytes32,uint64,uint256,uint256,uint256))":"0xe4380c93","setFeeAccount(bytes32)":"0xe2a0a600","setMax1HrDeposits(uint16,uint16,uint256)":"0x3c0f2a2f","setMaxDeposits(uint16,uint16,uint256)":"0xe492729d","setMinWeight(uint16,uint16,uint256)":"0xc515c8c6","setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0xb4bb0646","setRiskManagerMultisig(address)":"0x4ffcbdfb","validateRiskParameters((uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0x57990261"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IRegistry.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IntraChainAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"IntraChainAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x6080806040523460155761017e908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c63075034ae14610027575f80fd5b6060366003190112610144576004356001600160a01b038116908190036101445760243567ffffffffffffffff8111610144573660238201121561014457806004013567ffffffffffffffff8111610144573660248260051b8401011161014457823b15610144579083916323c5673160e01b8352806044840160406004860152526024606484019201905f905b8082106101145750505091815f818195604435602483015203925af18015610109576100df575080f35b905067ffffffffffffffff81116100f557604052005b634e487b7160e01b5f52604160045260245ffd5b6040513d5f823e3d90fd5b9193509183356001600160a01b0381169190829003610144576020816001938293520194019201859392916100b5565b5f80fdfea2646970667358221220c69d8dbf734e631495fa06bb43414b35a41e05f7dee0f399706c5e4bedd6c1f064736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f905f3560e01c63075034ae14610027575f80fd5b6060366003190112610144576004356001600160a01b038116908190036101445760243567ffffffffffffffff8111610144573660238201121561014457806004013567ffffffffffffffff8111610144573660248260051b8401011161014457823b15610144579083916323c5673160e01b8352806044840160406004860152526024606484019201905f905b8082106101145750505091815f818195604435602483015203925af18015610109576100df575080f35b905067ffffffffffffffff81116100f557604052005b634e487b7160e01b5f52604160045260245ffd5b6040513d5f823e3d90fd5b9193509183356001600160a01b0381169190829003610144576020816001938293520194019201859392916100b5565b5f80fdfea2646970667358221220c69d8dbf734e631495fa06bb43414b35a41e05f7dee0f399706c5e4bedd6c1f064736f6c634300081e0033"},"sourceId":"src/strategies/IntraChainAdminUpdateStrategy.sol","sourcemap":"290:322:25:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"notice":"Use this strategy when updating the vault on the same chain as the credential manager.","version":1}},"MockTarget":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onAtomicSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"}],"contractName":"MockTarget","deploymentBytecode":{"bytecode":"0x6080806040523460135760b1908160188239f35b5f80fdfe6004361015600b575f80fd5b5f3560e01c633f1d584e14601d575f80fd5b3460775760603660031901126077576004356001600160a01b0381160360775760443567ffffffffffffffff811160775736602382011215607757806004013567ffffffffffffffff811160775736910160240111607757005b5f80fdfea26469706673582212206cf91bafe3a0f54d58f9735d82a4757234fa3d217135826792ecef05e5d5837c64736f6c634300081c0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"onAtomicSettlement(address,uint256,bytes)":"0x3f1d584e"},"runtimeBytecode":{"bytecode":"0x6004361015600b575f80fd5b5f3560e01c633f1d584e14601d575f80fd5b3460775760603660031901126077576004356001600160a01b0381160360775760443567ffffffffffffffff811160775736602382011215607757806004013567ffffffffffffffff811160775736910160240111607757005b5f80fdfea26469706673582212206cf91bafe3a0f54d58f9735d82a4757234fa3d217135826792ecef05e5d5837c64736f6c634300081c0033"},"sourceId":"src/MockTarget.sol","sourcemap":"149:148:4:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}},"OPStackAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"address","name":"l1CrossDomainMessenger","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ZeroMessengerAddress","type":"error"},{"inputs":[],"name":"L1_CROSS_DOMAIN_MESSENGER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"L2_GAS_LIMIT","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"OPStackAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x60a034608057601f61033938819003918201601f19168301916001600160401b03831184841017608457808492602094604052833981010312608057516001600160a01b038116808203608057156071576080526040516102a090816100998239608051818181605401526101590152f35b637dc8404d60e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c908163075034ae146100a4575080635e743ef7146100865763f904facb1461003f575f80fd5b346100835780600319360112610083576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346100835780600319360112610083576020604051622dc6c08152f35b90506060366003190112610200576004356001600160a01b03811690819003610200576024359167ffffffffffffffff831161020057366023840112156102005782600401359267ffffffffffffffff8411610200573660248560051b8301011161020057928160208101946323c5673160e01b8652826064830160406024850152526024608483019101925f905b8082106102045750506101579250604435604483015203601f198101835282610234565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610200575f926084604051809681958294633dbb202b60e01b84526004840152606060248401525180918160648501528484015e8181018301879052622dc6c06044830152601f01601f1916810103019134905af180156101f5576101e7575080f35b6101f391505f90610234565b005b6040513d5f823e3d90fd5b5f80fd5b9092509083356001600160a01b038116919082900361020057602081600193829352019401920184929391610133565b90601f8019910116810190811067ffffffffffffffff82111761025657604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220fdcfda93542236fa6c6acb7164967d4dac5ba9d6a97702bf0e69b659712a22e864736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{"setAdministrators(address,address[],uint256)":{"details":"Sends a cross-domain message from L1 \u2192 L2 using the OP Stack messengerForwards msg.value directly to the L1 messenger","params":{"newAdministrators":"The full administrator set","newWithdrawalQuorum":"The withdrawal quorum","vault":"The L2 vault address"}}},"version":1},"methodIdentifiers":{"L1_CROSS_DOMAIN_MESSENGER()":"0xf904facb","L2_GAS_LIMIT()":"0x5e743ef7","setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f905f3560e01c908163075034ae146100a4575080635e743ef7146100865763f904facb1461003f575f80fd5b346100835780600319360112610083576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346100835780600319360112610083576020604051622dc6c08152f35b90506060366003190112610200576004356001600160a01b03811690819003610200576024359167ffffffffffffffff831161020057366023840112156102005782600401359267ffffffffffffffff8411610200573660248560051b8301011161020057928160208101946323c5673160e01b8652826064830160406024850152526024608483019101925f905b8082106102045750506101579250604435604483015203601f198101835282610234565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610200575f926084604051809681958294633dbb202b60e01b84526004840152606060248401525180918160648501528484015e8181018301879052622dc6c06044830152601f01601f1916810103019134905af180156101f5576101e7575080f35b6101f391505f90610234565b005b6040513d5f823e3d90fd5b5f80fd5b9092509083356001600160a01b038116919082900361020057602081600193829352019401920184929391610133565b90601f8019910116810190811067ffffffffffffffff82111761025657604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220fdcfda93542236fa6c6acb7164967d4dac5ba9d6a97702bf0e69b659712a22e864736f6c634300081e0033"},"sourceId":"src/strategies/OPStackAdminUpdateStrategy.sol","sourcemap":"446:1455:26:-:0;;;;;;;;;;;;;-1:-1:-1;;446:1455:26;;;;-1:-1:-1;;;;;446:1455:26;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;446:1455:26;;;;;;;868:36;864:71;;945:50;;446:1455;;;;;;;;945:50;446:1455;;;;;;;;;;;864:71;913:22;;;-1:-1:-1;913:22:26;;-1:-1:-1;913:22:26;446:1455;-1:-1:-1;446:1455:26;;;;;;-1:-1:-1;446:1455:26;;;;;-1:-1:-1;446:1455:26","userdoc":{"errors":{"ZeroMessengerAddress()":[{"notice":"Reverts if messenger address is zero."}]},"kind":"user","methods":{"L1_CROSS_DOMAIN_MESSENGER()":{"notice":"L1 CrossDomainMessenger."},"L2_GAS_LIMIT()":{"notice":"Conservative gas limit for L2 execution."},"setAdministrators(address,address[],uint256)":{"notice":"Updates the administrator set and withdrawal quorum on an OP Stack L2 vault"}},"notice":"Admin update strategy for OP Stack chains (Optimism, Base, Unichain, etc)","version":1}},"Registry":{"abi":[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ChainAlreadyExists","type":"error"},{"inputs":[],"name":"IndexOutOfBounds","type":"error"},{"inputs":[],"name":"InvalidBufferMultiple","type":"error"},{"inputs":[],"name":"InvalidCollateralFactor","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsClamps","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsConfiguration","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsFactors","type":"error"},{"inputs":[],"name":"InvalidInterestKinks","type":"error"},{"inputs":[],"name":"InvalidLiabilityFactor","type":"error"},{"inputs":[],"name":"InvalidMaxFundingRate","type":"error"},{"inputs":[],"name":"InvalidMaxUtilizationRate","type":"error"},{"inputs":[],"name":"InvalidRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUtilizationCap","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"}],"name":"NoPendingRiskParameters","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotRiskManager","type":"error"},{"inputs":[],"name":"RiskManagerNotSet","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"},{"internalType":"uint256","name":"eligibleAt","type":"uint256"}],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"Max1HrDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MaxDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MinWeightChanged","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"}],"name":"applyPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAccount","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"}],"name":"getAssetData","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct Registry.AssetData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"}],"name":"getAssetIndex","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getAssets","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct Registry.AssetData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"pendingRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters","name":"parameters","type":"tuple"},{"internalType":"uint256","name":"validAfter","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManagerMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskParameterChangeDelaySeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"riskParameters","outputs":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct Registry.AssetData","name":"data","type":"tuple"}],"name":"setAssetData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"account","type":"bytes32"}],"name":"setFeeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMax1HrDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMaxDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMinWeight","type":"uint256"}],"name":"setMinWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"},{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters","name":"parameters","type":"tuple"}],"name":"setPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"multisig","type":"address"}],"name":"setRiskManagerMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters","name":"params","type":"tuple"}],"name":"validateRiskParameters","outputs":[],"stateMutability":"pure","type":"function"}],"contractName":"Registry","deploymentBytecode":{"bytecode":"0x608034607657601f6122e038819003918201601f19168301916001600160401b03831184841017607a57808492602094604052833981010312607657516001600160a01b03811690819003607657620151806002555f80546001600160a01b031916919091179055604051612251908161008f8239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816304cd46f91461115d575080630cb661c7146110e4578063114bb9c5146110165780632491905014610f655780633a076ddd14610ec05780634ffcbdfb14610e6d578063525ea8b714610e455780635799026114610e0b57806365e17c9d14610dee578063698670e314610dba5780636cbb0b54146109d5578063704b6c0214610951578063a7b7b47014610858578063a812e22414610801578063af8c83381461074b578063b4bb064614610418578063bc67a603146101ec578063e2a0a600146101b3578063f0fef575146101235763f851a440146100f8575f80fd5b3461011f575f36600319011261011f575f546040516001600160a01b039091168152602090f35b5f80fd5b3461011f57604036600319011261011f5761014d61013f611177565b610147611188565b90611f7c565b6040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061018457505050500390f35b919360019193955060206101a38192603f198a82030186528851611643565b9601920192018594939192610175565b3461011f57602036600319011261011f576001546001600160a01b031633036101de57600435600755005b6206732360e51b5f5260045ffd5b3461011f5760e036600319011261011f5760405161020981611230565b610211611177565b815260208101906024358252604060431936011261011f576040519161023683611215565b6044356001600160401b038116810361011f5783526064356001600160401b038116810361011f5760208401526040820192835260608201916084358352608081019160a435835260a0820160c435815260018060a01b036001541633036101de5761ffff83511660055410610409578151156103fa5761ffff8351165f52600660205260405f20938651966001600160401b036020818a511699015116936001600160401b0389165f528660205260405f206001600160401b0386165f52602052600160405f2001546103eb5760059460018801976001600160401b038954159b165f526020526001600160401b0360405f2091165f5260205261ffff60405f2096511661ffff19875416178655516001860155519561035a8760028701611e68565b516003850155516004840155519101558054600160401b8110156103d75761038791600182018155611844565b9190916103c45761039791611e68565b61039d57005b600554600181018091116103b057600555005b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b6329409fff60e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b634e23d03560e01b5f5260045ffd5b3461011f57604036600319011261011f57610431611177565b6024356001600160401b03811161011f5761045090369060040161130a565b6001549091906001600160a01b031633036101de5761047861ffff6005549216918210611b00565b61048182611b8d565b61048d60025442611796565b906040519261049b84611215565b8352602083019182525f52600360205260405f20915160ff81511683549061ff00602084015160081b169161ffff19161717835560408101516001840155606081015160028401556080810151600384015560a081015160048401556005830160c0820151151560ff801983541691161790556006830160e0820151908151916001600160401b0383116103d7576020906105368484611e28565b01905f5260205f205f5b838110610737575050505060078301610100820151908151916001600160401b0383116103d7576020906105748484611e28565b01905f5260205f205f5b838110610723575050505060088301610120820151908151916001600160401b0383116103d7576020906105b28484611e28565b01905f5260205f205f5b83811061070f575050505060098301610140820151908151916001600160401b0383116103d7576020906105f08484611e28565b01905f5260205f205f5b8381106106fb5750505050610160810151600a840155610180810151600b8401556101a0810151600c8401556101c0810151600d840155600e83016101e0820151908151916001600160401b0383116103d75760209061065a8484611e28565b01905f5260205f205f5b8381106106e75750505050600f8301610200820151908151916001600160401b0383116103d7576020906106988484611e28565b01905f5260205f205f5b8381106106d35761022085015160108801556102408501516011880155610260850151601288015585516013880155005b6001906020845194019381840155016106a2565b600190602084519401938184015501610664565b6001906020845194019381840155016105fa565b6001906020845194019381840155016105bc565b60019060208451940193818401550161057e565b600190602084519401938184015501610540565b3461011f57610759366111ea565b6001549092906001600160a01b031633036101de576107fc7f9b0a62bc173ccdd4228691d9af5cbe894061fb605491498f20216dc69fdcee1e936005546107a661ffff8616918210611b00565b6107af84611b35565b6107bb60208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600401805490839055905194859485611b49565b0390a1005b3461011f57602036600319011261011f5761ffff61081d611177565b165f52600360205261084e60405f206013610837826114ff565b910154604051928392604084526040840190611643565b9060208301520390f35b3461011f57610866366111ea565b6001549092906001600160a01b031633036101de576107fc7f61add8ab6aedaf5e8c15fd0f3b5dc7239de9517bae157dc6f09438d619959a5b936005546108b361ffff8616918210611b00565b805f52600660205260405f206001600160401b036108d086611b35565b165f5260205260405f2060208501906001600160401b036108f083611b35565b165f52602052600560405f200154915f52600660205260405f206001600160401b0361091b87611b35565b165f526020526001600160401b0361093660405f2092611b35565b165f5260205281600560405f20015560405194859485611b49565b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b03811633036109c6578115806109b3575b6109a4576001600160a01b031916175f55005b632b47857560e01b5f5260045ffd5b506001546001600160a01b031615610991565b637bfa4b9f60e01b5f5260045ffd5b3461011f57602036600319011261011f576109ee611177565b610a0161ffff6005549216918210611b00565b805f52600360205260405f20601360405191610a1c83611215565b610a25816114ff565b83520154602082019080825215610da7575142811015610d91575051610a4a81611b8d565b815f52600460205260405f209060ff81511682549061ff00602084015160081b169161ffff19161717825560408101516001830155606081015160028301556080810151600383015560a081015160048301556005820160c0820151151560ff801983541691161790556006820160e0820151908151916001600160401b0383116103d757602090610adc8484611e28565b01905f5260205f205f5b838110610d7d575050505060078201610100820151908151916001600160401b0383116103d757602090610b1a8484611e28565b01905f5260205f205f5b838110610d69575050505060088201610120820151908151916001600160401b0383116103d757602090610b588484611e28565b01905f5260205f205f5b838110610d55575050505060098201610140820151908151916001600160401b0383116103d757602090610b968484611e28565b01905f5260205f205f5b838110610d415750505050610160810151600a830155610180810151600b8301556101a0810151600c8301556101c0810151600d830155600e82016101e0820151908151916001600160401b0383116103d757602090610c008484611e28565b01905f5260205f205f5b838110610d2d5750505050600f8201610200820151908151916001600160401b0383116103d757602090610c3e8484611e28565b01905f5260205f205f5b838110610d195786866012610260886102208101516010850155610240810151601185015501519101555f5260036020525f601360408220828155826001820155826002820155826003820155826004820155826005820155610cad60068201611df8565b610cb960078201611df8565b610cc560088201611df8565b610cd160098201611df8565b82600a82015582600b82015582600c82015582600d820155610cf5600e8201611df8565b610d01600f8201611df8565b82601082015582601182015582601282015501555f80f35b600190602084519401938184015501610c48565b600190602084519401938184015501610c0a565b600190602084519401938184015501610ba0565b600190602084519401938184015501610b62565b600190602084519401938184015501610b24565b600190602084519401938184015501610ae6565b82636bfedefd60e11b5f5260045260245260445ffd5b8263193e674760e21b5f5260045260245ffd5b3461011f5736600319016060811261011f5760401361011f576020610de0604435611d61565b63ffffffff60405191168152f35b3461011f575f36600319011261011f576020600754604051908152f35b3461011f57602036600319011261011f576004356001600160401b03811161011f57610e3e610e4391369060040161130a565b611b8d565b005b3461011f575f36600319011261011f576001546040516001600160a01b039091168152602090f35b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b031633036109c6576bffffffffffffffffffffffff60a01b60015416176001555f80f35b3461011f5736600319016060811261011f5760401361011f5760443561ffff811680910361011f57610ef06117a3565b505f52600660205260405f206004356001600160401b038116810361011f57806001600160401b039150165f5260205260405f206024356001600160401b038116810361011f57806001600160401b039150165f5260205260e0610f5660405f20611881565b610f636040518092611199565bf35b3461011f57610f73366111ea565b6001549092906001600160a01b031633036101de576107fc7f35095f4ef942f9cb4170d9a93adc7fe9ebc8faf2df4a91b87b0dced92784718f93600554610fc061ffff8616918210611b00565b610fc984611b35565b610fd560208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600301805490839055905194859485611b49565b3461011f57602036600319011261011f5761ffff611032611177565b165f5260046020526101c060ff60405f20805490600181015460028201546003830154600484015486600586015416600a86015490600b87015492600c88015494600d8901549660108a015498601260118c01549b01549b60206040519e8f92818116845260081c1691015260408d015260608c015260808b015260a08a0152151560c089015260e08801526101008701526101208601526101408501526101608401526101808301526101a0820152f35b3461011f57604036600319011261011f5761110e611100611177565b611108611188565b906118ed565b6040518091602082016020835281518091526020604084019201905f5b818110611139575050500390f35b91935091602060e08261114f6001948851611199565b01940191019184939261112b565b3461011f575f36600319011261011f576020906002548152f35b6004359061ffff8216820361011f57565b6024359061ffff8216820361011f57565b60a060c09161ffff8151168452602081015160208501526001600160401b03602060408301518281511660408801520151166060850152606081015160808501526080810151828501520151910152565b600319016080811261011f5760401361011f5760049060443561ffff8116810361011f579060643590565b604081019081106001600160401b038211176103d757604052565b60c081019081106001600160401b038211176103d757604052565b61028081019081106001600160401b038211176103d757604052565b90601f801991011681019081106001600160401b038211176103d757604052565b359060ff8216820361011f57565b6001600160401b0381116103d75760051b60200190565b9080601f8301121561011f5781356112c481611296565b926112d26040519485611267565b81845260208085019260051b82010192831161011f57602001905b8282106112fa5750505090565b81358152602091820191016112ed565b9190916102808184031261011f57604051906113258261124b565b819361133082611288565b835261133e60208301611288565b602084015260408201356040840152606082013560608401526080820135608084015260a082013560a084015260c0820135801515810361011f5760c084015260e08201356001600160401b03811161011f578161139d9184016112ad565b60e08401526101008201356001600160401b03811161011f57816113c29184016112ad565b6101008401526101208201356001600160401b03811161011f57816113e89184016112ad565b6101208401526101408201356001600160401b03811161011f578161140e9184016112ad565b6101408401526101608201356101608401526101808201356101808401526101a08201356101a08401526101c08201356101c08401526101e08201356001600160401b03811161011f57816114649184016112ad565b6101e0840152610200820135916001600160401b03831161011f576114906102609392849383016112ad565b6102008501526102208101356102208501526102408101356102408501520135910152565b90604051918281549182825260208201905f5260205f20925f5b8181106114e65750506114e492500383611267565b565b84548352600194850194879450602090930192016114cf565b9060405161150c8161124b565b6102606012829460ff8154818116865260081c166020850152600181015460408501526002810154606085015260038101546080850152600481015460a085015260ff600582015416151560c0850152611568600682016114b5565b60e0850152611579600782016114b5565b61010085015261158b600882016114b5565b61012085015261159d600982016114b5565b610140850152600a810154610160850152600b810154610180850152600c8101546101a0850152600d8101546101c08501526115db600e82016114b5565b6101e08501526115ed600f82016114b5565b610200850152601081015461022085015260118101546102408501520154910152565b90602080835192838152019201905f5b81811061162d5750505090565b8251845260209384019390920191600101611620565b9060ff825116815260ff602083015116602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c0820151151560c08201526102608061174e61173a6116f66116e26116ce6116ba60e08a015161028060e08b01526102808a0190611610565b6101008a01518982036101008b0152611610565b6101208901518882036101208a0152611610565b610140880151878203610140890152611610565b6101608701516101608701526101808701516101808701526101a08701516101a08701526101c08701516101c08701526101e08701518682036101e0880152611610565b610200860151858203610200870152611610565b93610220810151610220850152610240810151610240850152015191015290565b35906001600160401b038216820361011f57565b61ffff1661ffff81146103b05760010190565b919082018092116103b057565b604051906117b082611230565b5f60a0838281528260208201526040516117c981611215565b83815283602082015260408201528260608201528260808201520152565b604051906117f6602083611267565b5f80835282815b82811061180957505050565b6020906118146117a3565b828285010152016117fd565b9061ffff8091169116039061ffff82116103b057565b5f1981146103b05760010190565b8054821015611859575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b80518210156118595760209160051b010190565b9060405161188e81611230565b60a06005829461ffff8154168452600181015460208501526040516118b281611215565b6001600160401b036002830154818116835260401c166020820152604085015260038101546060850152600481015460808501520154910152565b6005545f9290835b61ffff85168281101561192b576119259161191f915f526006602052600160405f20015490611796565b94611783565b936118f5565b5093509193909361ffff81169380851015611ae3578061ffff871611611af4575b5061ffff851694848610611ae35761ffff9161196c919693959496611820565b1661197681611296565b916119846040519384611267565b818352601f1961199383611296565b015f5b818110611ac05750505f905f945f5b61ffff811689811080611ab7575b15611aab575f52600660205260405f209460018601948554995f915b8b831080611aa2575b15611a85578581101580611a7c575b611a04575b6119f86119fe91611836565b92611836565b916119cf565b611a0e8389611844565b50546001600160401b0381166001600160401b03165f528960205260405f209060401c6001600160401b03166001600160401b03165f5260205260405f209a80611a5790611836565b9b611a6190611881565b611a6b828d61186d565b52611a76908b61186d565b506119ec565b508681106119e7565b9b9497509550509750611a9790611783565b9792969390976119a5565b50838b106119d8565b50949750505050505050565b508588106119b3565b602090611ad19896949793986117a3565b82828801015201969195929496611996565b505092505050611af16117e7565b90565b61ffff1694505f61194c565b15611b0757565b60405162461bcd60e51b815260206004820152600660248201526508585cdcd95d60d21b6044820152606490fd5b356001600160401b038116810361011f5790565b9094939261ffff6080936001600160401b03611b78602060a087019a83611b6f8261176f565b1688520161176f565b16602085015216604083015260608201520152565b606460ff82511611611d5257606460ff60208301511611611d4357670de0b6b3a764000060a082015111611d345761047661022082015111611d255761047661024082015111611d1657610260810151620f42408110908115611d09575b50611cfa5760e08101611bfe8151612108565b15611ceb57611c0d9051612180565b15611ceb576101208101611c218151612108565b15611cdc57611c309051612180565b15611cdc57611c436101008201516121b0565b15611ccd57611c566101408201516121b0565b15611cbe576101e0810161020081515192019182515103611caf57611c7b9051612108565b15611ca057611c8a90516121e4565b15611c9157565b637015a03b60e01b5f5260045ffd5b6329f7281b60e21b5f5260045ffd5b63bfa51ee360e01b5f5260045ffd5b635646ba3b60e11b5f5260045ffd5b630adc448560e21b5f5260045ffd5b630376a9ef60e31b5f5260045ffd5b6365c991a560e01b5f5260045ffd5b63adb838cd60e01b5f5260045ffd5b621e84809150115f611beb565b6328be116d60e21b5f5260045ffd5b63076eb25360e11b5f5260045ffd5b63cc15654960e01b5f5260045ffd5b632a7f863d60e21b5f5260045ffd5b6302f22cad60e61b5f5260045ffd5b6004356001600160401b038116810361011f57602435916001600160401b038316830361011f575f6001600160401b038060055494169416905b61ffff811684811015611dea57805f52600660205260405f20865f5260205260405f20835f52602052600160405f2001548414611de15750611ddc90611783565b611d9b565b94505050505090565b50505050505063ffffffff90565b8054905f815581611e07575050565b5f5260205f20908101905b818110611e1d575050565b5f8155600101611e12565b90600160401b81116103d757815491818155828210611e4657505050565b5f5260205f2091820191015b818110611e5d575050565b5f8155600101611e52565b906001600160401b038151166fffffffffffffffff00000000000000006020845493836001600160401b03198616178655015160401b16916fffffffffffffffffffffffffffffffff191617179055565b60405190611ec8602083611267565b5f80835282815b828110611edb57505050565b602090604051611eea8161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828501015201611ecf565b60055461ffff80831694939116808510156120fb578061ffff8316116120f3575b508361ffff8216106120e75761ffff91611fb691611820565b16611fc081611296565b92611fce6040519485611267565b818452601f19611fdd83611296565b015f5b8181106120465750505f5b61ffff811690838210156120405781830161ffff81116103b05761203b9261ffff61203592165f52600460205261202460405f206114ff565b61202e828a61186d565b528761186d565b50611783565b611feb565b50505050565b6020906040516120558161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828901015201611fe0565b50509050611af1611eb9565b90505f611f9d565b5050509050611af1611eb9565b8051905f908215801561216c575b612165575f915b83831061212d5750505050600190565b612137838361186d565b5190620f4240821161215c5781106121545760019092019161211d565b505050505f90565b50505050505f90565b5050505f90565b508051156118595760208101511515612116565b8051801515918261219057505090565b5f19820192509082116103b057620f4240916121ab9161186d565b511490565b8051905f90815b8383106121c75750505050600190565b6121d1838361186d565b51908110612154576001909201916121b7565b8051905f90620f423f5b8383106121fe5750505050600190565b612208838361186d565b51908111612154576001909201916121ee56fea26469706673582212201a0e5b061dbc5669db9937ab714356062c9af05eea7b1d4bb9eeaf0073ef81fe64736f6c634300081e0033"},"devdoc":{"details":"Uses admin and multisig roles to control sensitive operations like asset registration and risk configuration.","kind":"dev","methods":{"applyPendingRiskParameters(uint16)":{"details":"Reverts with `\"!asset\"` if index >= assets.count.Reverts with `NoPendingRiskParameters` if there are no pending risk parameters for the specified assetReverts with `TooSoon` if the pending risk parameters are not yet eligible","params":{"index":"The asset index."}},"constructor":{"details":"Sets the deployer as the initial admin.","params":{"_admin":"The admin controller of the vault."}},"getAssetData((uint64,uint64),uint16)":{"params":{"chainId":"the chain ID to query.","index":"The asset index to query."},"returns":{"_0":"The corresponding AssetData struct."}},"getAssetIndex((uint64,uint64),bytes32)":{"params":{"assetAddress":"The asset address (as bytes32).","chainId":"The chain ID to search."},"returns":{"_0":"The index of the asset, or `type(uint32).max` if not found."}},"getAssets(uint16,uint16)":{"params":{"end":"The end index (not-inclusive).","start":"The start index (inclusive)."},"returns":{"_0":"An array of AssetData structs."}},"getRiskParameters(uint16,uint16)":{"params":{"end":"The end index (not inclusive).","start":"The start index (inclusive)."},"returns":{"_0":"An array of RiskParameters."}},"setAdmin(address)":{"details":"Reverts with `NotAdmin`; Only the admin can set a new admin.The new administrator address is allowed to be the null address. Setting the administrator to this address disables administration of the registry contract.","params":{"newAdmin":"The new admin address."}},"setAssetData((uint16,bytes32,(uint64,uint64),uint256,uint256,uint256))":{"details":"Automatically adds new assets or chain instances if not already present.Reverts with `NotRiskManager`; Only the risk manager can set asset data.","params":{"data":"The chain-specific asset data."}},"setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":{"details":"Reverts with `NotRiskManager`; Only the risk manager can set risk parameters.Reverts with `\"!asset\"` if index >= assets.count.","params":{"index":"The asset index.","parameters":"The risk parameters to set"}},"setRiskManagerMultisig(address)":{"details":"Reverts with `NotAdmin`; Only the admin can set a risk manager.","params":{"multisig":"The new address to set."}}},"title":"Registry","version":1},"methodIdentifiers":{"admin()":"0xf851a440","applyPendingRiskParameters(uint16)":"0x6cbb0b54","feeAccount()":"0x65e17c9d","getAssetData((uint64,uint64),uint16)":"0x3a076ddd","getAssetIndex((uint64,uint64),bytes32)":"0x698670e3","getAssets(uint16,uint16)":"0x0cb661c7","getRiskParameters(uint16,uint16)":"0xf0fef575","pendingRiskParameters(uint16)":"0xa812e224","riskManagerMultisig()":"0x525ea8b7","riskParameterChangeDelaySeconds()":"0x04cd46f9","riskParameters(uint16)":"0x114bb9c5","setAdmin(address)":"0x704b6c02","setAssetData((uint16,bytes32,(uint64,uint64),uint256,uint256,uint256))":"0xbc67a603","setFeeAccount(bytes32)":"0xe2a0a600","setMax1HrDeposits((uint64,uint64),uint16,uint256)":"0xaf8c8338","setMaxDeposits((uint64,uint64),uint16,uint256)":"0x24919050","setMinWeight((uint64,uint64),uint16,uint256)":"0xa7b7b470","setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0xb4bb0646","setRiskManagerMultisig(address)":"0x4ffcbdfb","validateRiskParameters((uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0x57990261"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816304cd46f91461115d575080630cb661c7146110e4578063114bb9c5146110165780632491905014610f655780633a076ddd14610ec05780634ffcbdfb14610e6d578063525ea8b714610e455780635799026114610e0b57806365e17c9d14610dee578063698670e314610dba5780636cbb0b54146109d5578063704b6c0214610951578063a7b7b47014610858578063a812e22414610801578063af8c83381461074b578063b4bb064614610418578063bc67a603146101ec578063e2a0a600146101b3578063f0fef575146101235763f851a440146100f8575f80fd5b3461011f575f36600319011261011f575f546040516001600160a01b039091168152602090f35b5f80fd5b3461011f57604036600319011261011f5761014d61013f611177565b610147611188565b90611f7c565b6040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061018457505050500390f35b919360019193955060206101a38192603f198a82030186528851611643565b9601920192018594939192610175565b3461011f57602036600319011261011f576001546001600160a01b031633036101de57600435600755005b6206732360e51b5f5260045ffd5b3461011f5760e036600319011261011f5760405161020981611230565b610211611177565b815260208101906024358252604060431936011261011f576040519161023683611215565b6044356001600160401b038116810361011f5783526064356001600160401b038116810361011f5760208401526040820192835260608201916084358352608081019160a435835260a0820160c435815260018060a01b036001541633036101de5761ffff83511660055410610409578151156103fa5761ffff8351165f52600660205260405f20938651966001600160401b036020818a511699015116936001600160401b0389165f528660205260405f206001600160401b0386165f52602052600160405f2001546103eb5760059460018801976001600160401b038954159b165f526020526001600160401b0360405f2091165f5260205261ffff60405f2096511661ffff19875416178655516001860155519561035a8760028701611e68565b516003850155516004840155519101558054600160401b8110156103d75761038791600182018155611844565b9190916103c45761039791611e68565b61039d57005b600554600181018091116103b057600555005b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b6329409fff60e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b634e23d03560e01b5f5260045ffd5b3461011f57604036600319011261011f57610431611177565b6024356001600160401b03811161011f5761045090369060040161130a565b6001549091906001600160a01b031633036101de5761047861ffff6005549216918210611b00565b61048182611b8d565b61048d60025442611796565b906040519261049b84611215565b8352602083019182525f52600360205260405f20915160ff81511683549061ff00602084015160081b169161ffff19161717835560408101516001840155606081015160028401556080810151600384015560a081015160048401556005830160c0820151151560ff801983541691161790556006830160e0820151908151916001600160401b0383116103d7576020906105368484611e28565b01905f5260205f205f5b838110610737575050505060078301610100820151908151916001600160401b0383116103d7576020906105748484611e28565b01905f5260205f205f5b838110610723575050505060088301610120820151908151916001600160401b0383116103d7576020906105b28484611e28565b01905f5260205f205f5b83811061070f575050505060098301610140820151908151916001600160401b0383116103d7576020906105f08484611e28565b01905f5260205f205f5b8381106106fb5750505050610160810151600a840155610180810151600b8401556101a0810151600c8401556101c0810151600d840155600e83016101e0820151908151916001600160401b0383116103d75760209061065a8484611e28565b01905f5260205f205f5b8381106106e75750505050600f8301610200820151908151916001600160401b0383116103d7576020906106988484611e28565b01905f5260205f205f5b8381106106d35761022085015160108801556102408501516011880155610260850151601288015585516013880155005b6001906020845194019381840155016106a2565b600190602084519401938184015501610664565b6001906020845194019381840155016105fa565b6001906020845194019381840155016105bc565b60019060208451940193818401550161057e565b600190602084519401938184015501610540565b3461011f57610759366111ea565b6001549092906001600160a01b031633036101de576107fc7f9b0a62bc173ccdd4228691d9af5cbe894061fb605491498f20216dc69fdcee1e936005546107a661ffff8616918210611b00565b6107af84611b35565b6107bb60208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600401805490839055905194859485611b49565b0390a1005b3461011f57602036600319011261011f5761ffff61081d611177565b165f52600360205261084e60405f206013610837826114ff565b910154604051928392604084526040840190611643565b9060208301520390f35b3461011f57610866366111ea565b6001549092906001600160a01b031633036101de576107fc7f61add8ab6aedaf5e8c15fd0f3b5dc7239de9517bae157dc6f09438d619959a5b936005546108b361ffff8616918210611b00565b805f52600660205260405f206001600160401b036108d086611b35565b165f5260205260405f2060208501906001600160401b036108f083611b35565b165f52602052600560405f200154915f52600660205260405f206001600160401b0361091b87611b35565b165f526020526001600160401b0361093660405f2092611b35565b165f5260205281600560405f20015560405194859485611b49565b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b03811633036109c6578115806109b3575b6109a4576001600160a01b031916175f55005b632b47857560e01b5f5260045ffd5b506001546001600160a01b031615610991565b637bfa4b9f60e01b5f5260045ffd5b3461011f57602036600319011261011f576109ee611177565b610a0161ffff6005549216918210611b00565b805f52600360205260405f20601360405191610a1c83611215565b610a25816114ff565b83520154602082019080825215610da7575142811015610d91575051610a4a81611b8d565b815f52600460205260405f209060ff81511682549061ff00602084015160081b169161ffff19161717825560408101516001830155606081015160028301556080810151600383015560a081015160048301556005820160c0820151151560ff801983541691161790556006820160e0820151908151916001600160401b0383116103d757602090610adc8484611e28565b01905f5260205f205f5b838110610d7d575050505060078201610100820151908151916001600160401b0383116103d757602090610b1a8484611e28565b01905f5260205f205f5b838110610d69575050505060088201610120820151908151916001600160401b0383116103d757602090610b588484611e28565b01905f5260205f205f5b838110610d55575050505060098201610140820151908151916001600160401b0383116103d757602090610b968484611e28565b01905f5260205f205f5b838110610d415750505050610160810151600a830155610180810151600b8301556101a0810151600c8301556101c0810151600d830155600e82016101e0820151908151916001600160401b0383116103d757602090610c008484611e28565b01905f5260205f205f5b838110610d2d5750505050600f8201610200820151908151916001600160401b0383116103d757602090610c3e8484611e28565b01905f5260205f205f5b838110610d195786866012610260886102208101516010850155610240810151601185015501519101555f5260036020525f601360408220828155826001820155826002820155826003820155826004820155826005820155610cad60068201611df8565b610cb960078201611df8565b610cc560088201611df8565b610cd160098201611df8565b82600a82015582600b82015582600c82015582600d820155610cf5600e8201611df8565b610d01600f8201611df8565b82601082015582601182015582601282015501555f80f35b600190602084519401938184015501610c48565b600190602084519401938184015501610c0a565b600190602084519401938184015501610ba0565b600190602084519401938184015501610b62565b600190602084519401938184015501610b24565b600190602084519401938184015501610ae6565b82636bfedefd60e11b5f5260045260245260445ffd5b8263193e674760e21b5f5260045260245ffd5b3461011f5736600319016060811261011f5760401361011f576020610de0604435611d61565b63ffffffff60405191168152f35b3461011f575f36600319011261011f576020600754604051908152f35b3461011f57602036600319011261011f576004356001600160401b03811161011f57610e3e610e4391369060040161130a565b611b8d565b005b3461011f575f36600319011261011f576001546040516001600160a01b039091168152602090f35b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b031633036109c6576bffffffffffffffffffffffff60a01b60015416176001555f80f35b3461011f5736600319016060811261011f5760401361011f5760443561ffff811680910361011f57610ef06117a3565b505f52600660205260405f206004356001600160401b038116810361011f57806001600160401b039150165f5260205260405f206024356001600160401b038116810361011f57806001600160401b039150165f5260205260e0610f5660405f20611881565b610f636040518092611199565bf35b3461011f57610f73366111ea565b6001549092906001600160a01b031633036101de576107fc7f35095f4ef942f9cb4170d9a93adc7fe9ebc8faf2df4a91b87b0dced92784718f93600554610fc061ffff8616918210611b00565b610fc984611b35565b610fd560208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600301805490839055905194859485611b49565b3461011f57602036600319011261011f5761ffff611032611177565b165f5260046020526101c060ff60405f20805490600181015460028201546003830154600484015486600586015416600a86015490600b87015492600c88015494600d8901549660108a015498601260118c01549b01549b60206040519e8f92818116845260081c1691015260408d015260608c015260808b015260a08a0152151560c089015260e08801526101008701526101208601526101408501526101608401526101808301526101a0820152f35b3461011f57604036600319011261011f5761110e611100611177565b611108611188565b906118ed565b6040518091602082016020835281518091526020604084019201905f5b818110611139575050500390f35b91935091602060e08261114f6001948851611199565b01940191019184939261112b565b3461011f575f36600319011261011f576020906002548152f35b6004359061ffff8216820361011f57565b6024359061ffff8216820361011f57565b60a060c09161ffff8151168452602081015160208501526001600160401b03602060408301518281511660408801520151166060850152606081015160808501526080810151828501520151910152565b600319016080811261011f5760401361011f5760049060443561ffff8116810361011f579060643590565b604081019081106001600160401b038211176103d757604052565b60c081019081106001600160401b038211176103d757604052565b61028081019081106001600160401b038211176103d757604052565b90601f801991011681019081106001600160401b038211176103d757604052565b359060ff8216820361011f57565b6001600160401b0381116103d75760051b60200190565b9080601f8301121561011f5781356112c481611296565b926112d26040519485611267565b81845260208085019260051b82010192831161011f57602001905b8282106112fa5750505090565b81358152602091820191016112ed565b9190916102808184031261011f57604051906113258261124b565b819361133082611288565b835261133e60208301611288565b602084015260408201356040840152606082013560608401526080820135608084015260a082013560a084015260c0820135801515810361011f5760c084015260e08201356001600160401b03811161011f578161139d9184016112ad565b60e08401526101008201356001600160401b03811161011f57816113c29184016112ad565b6101008401526101208201356001600160401b03811161011f57816113e89184016112ad565b6101208401526101408201356001600160401b03811161011f578161140e9184016112ad565b6101408401526101608201356101608401526101808201356101808401526101a08201356101a08401526101c08201356101c08401526101e08201356001600160401b03811161011f57816114649184016112ad565b6101e0840152610200820135916001600160401b03831161011f576114906102609392849383016112ad565b6102008501526102208101356102208501526102408101356102408501520135910152565b90604051918281549182825260208201905f5260205f20925f5b8181106114e65750506114e492500383611267565b565b84548352600194850194879450602090930192016114cf565b9060405161150c8161124b565b6102606012829460ff8154818116865260081c166020850152600181015460408501526002810154606085015260038101546080850152600481015460a085015260ff600582015416151560c0850152611568600682016114b5565b60e0850152611579600782016114b5565b61010085015261158b600882016114b5565b61012085015261159d600982016114b5565b610140850152600a810154610160850152600b810154610180850152600c8101546101a0850152600d8101546101c08501526115db600e82016114b5565b6101e08501526115ed600f82016114b5565b610200850152601081015461022085015260118101546102408501520154910152565b90602080835192838152019201905f5b81811061162d5750505090565b8251845260209384019390920191600101611620565b9060ff825116815260ff602083015116602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c0820151151560c08201526102608061174e61173a6116f66116e26116ce6116ba60e08a015161028060e08b01526102808a0190611610565b6101008a01518982036101008b0152611610565b6101208901518882036101208a0152611610565b610140880151878203610140890152611610565b6101608701516101608701526101808701516101808701526101a08701516101a08701526101c08701516101c08701526101e08701518682036101e0880152611610565b610200860151858203610200870152611610565b93610220810151610220850152610240810151610240850152015191015290565b35906001600160401b038216820361011f57565b61ffff1661ffff81146103b05760010190565b919082018092116103b057565b604051906117b082611230565b5f60a0838281528260208201526040516117c981611215565b83815283602082015260408201528260608201528260808201520152565b604051906117f6602083611267565b5f80835282815b82811061180957505050565b6020906118146117a3565b828285010152016117fd565b9061ffff8091169116039061ffff82116103b057565b5f1981146103b05760010190565b8054821015611859575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b80518210156118595760209160051b010190565b9060405161188e81611230565b60a06005829461ffff8154168452600181015460208501526040516118b281611215565b6001600160401b036002830154818116835260401c166020820152604085015260038101546060850152600481015460808501520154910152565b6005545f9290835b61ffff85168281101561192b576119259161191f915f526006602052600160405f20015490611796565b94611783565b936118f5565b5093509193909361ffff81169380851015611ae3578061ffff871611611af4575b5061ffff851694848610611ae35761ffff9161196c919693959496611820565b1661197681611296565b916119846040519384611267565b818352601f1961199383611296565b015f5b818110611ac05750505f905f945f5b61ffff811689811080611ab7575b15611aab575f52600660205260405f209460018601948554995f915b8b831080611aa2575b15611a85578581101580611a7c575b611a04575b6119f86119fe91611836565b92611836565b916119cf565b611a0e8389611844565b50546001600160401b0381166001600160401b03165f528960205260405f209060401c6001600160401b03166001600160401b03165f5260205260405f209a80611a5790611836565b9b611a6190611881565b611a6b828d61186d565b52611a76908b61186d565b506119ec565b508681106119e7565b9b9497509550509750611a9790611783565b9792969390976119a5565b50838b106119d8565b50949750505050505050565b508588106119b3565b602090611ad19896949793986117a3565b82828801015201969195929496611996565b505092505050611af16117e7565b90565b61ffff1694505f61194c565b15611b0757565b60405162461bcd60e51b815260206004820152600660248201526508585cdcd95d60d21b6044820152606490fd5b356001600160401b038116810361011f5790565b9094939261ffff6080936001600160401b03611b78602060a087019a83611b6f8261176f565b1688520161176f565b16602085015216604083015260608201520152565b606460ff82511611611d5257606460ff60208301511611611d4357670de0b6b3a764000060a082015111611d345761047661022082015111611d255761047661024082015111611d1657610260810151620f42408110908115611d09575b50611cfa5760e08101611bfe8151612108565b15611ceb57611c0d9051612180565b15611ceb576101208101611c218151612108565b15611cdc57611c309051612180565b15611cdc57611c436101008201516121b0565b15611ccd57611c566101408201516121b0565b15611cbe576101e0810161020081515192019182515103611caf57611c7b9051612108565b15611ca057611c8a90516121e4565b15611c9157565b637015a03b60e01b5f5260045ffd5b6329f7281b60e21b5f5260045ffd5b63bfa51ee360e01b5f5260045ffd5b635646ba3b60e11b5f5260045ffd5b630adc448560e21b5f5260045ffd5b630376a9ef60e31b5f5260045ffd5b6365c991a560e01b5f5260045ffd5b63adb838cd60e01b5f5260045ffd5b621e84809150115f611beb565b6328be116d60e21b5f5260045ffd5b63076eb25360e11b5f5260045ffd5b63cc15654960e01b5f5260045ffd5b632a7f863d60e21b5f5260045ffd5b6302f22cad60e61b5f5260045ffd5b6004356001600160401b038116810361011f57602435916001600160401b038316830361011f575f6001600160401b038060055494169416905b61ffff811684811015611dea57805f52600660205260405f20865f5260205260405f20835f52602052600160405f2001548414611de15750611ddc90611783565b611d9b565b94505050505090565b50505050505063ffffffff90565b8054905f815581611e07575050565b5f5260205f20908101905b818110611e1d575050565b5f8155600101611e12565b90600160401b81116103d757815491818155828210611e4657505050565b5f5260205f2091820191015b818110611e5d575050565b5f8155600101611e52565b906001600160401b038151166fffffffffffffffff00000000000000006020845493836001600160401b03198616178655015160401b16916fffffffffffffffffffffffffffffffff191617179055565b60405190611ec8602083611267565b5f80835282815b828110611edb57505050565b602090604051611eea8161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828501015201611ecf565b60055461ffff80831694939116808510156120fb578061ffff8316116120f3575b508361ffff8216106120e75761ffff91611fb691611820565b16611fc081611296565b92611fce6040519485611267565b818452601f19611fdd83611296565b015f5b8181106120465750505f5b61ffff811690838210156120405781830161ffff81116103b05761203b9261ffff61203592165f52600460205261202460405f206114ff565b61202e828a61186d565b528761186d565b50611783565b611feb565b50505050565b6020906040516120558161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828901015201611fe0565b50509050611af1611eb9565b90505f611f9d565b5050509050611af1611eb9565b8051905f908215801561216c575b612165575f915b83831061212d5750505050600190565b612137838361186d565b5190620f4240821161215c5781106121545760019092019161211d565b505050505f90565b50505050505f90565b5050505f90565b508051156118595760208101511515612116565b8051801515918261219057505090565b5f19820192509082116103b057620f4240916121ab9161186d565b511490565b8051905f90815b8383106121c75750505050600190565b6121d1838361186d565b51908110612154576001909201916121b7565b8051905f90620f423f5b8383106121fe5750505050600190565b612208838361186d565b51908111612154576001909201916121ee56fea26469706673582212201a0e5b061dbc5669db9937ab714356062c9af05eea7b1d4bb9eeaf0073ef81fe64736f6c634300081e0033"},"sourceId":"src/Registry.sol","sourcemap":"306:22119:16:-:0;;;;;;;;;;;;;-1:-1:-1;;306:22119:16;;;;-1:-1:-1;;;;;306:22119:16;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;306:22119:16;;;;;;;;699:6;;306:22119;-1:-1:-1;306:22119:16;;-1:-1:-1;;;;;;306:22119:16;;;;;;;;;;;;;;;;;-1:-1:-1;306:22119:16;;;;;;-1:-1:-1;306:22119:16;;;;;-1:-1:-1;306:22119:16","userdoc":{"errors":{"ChainAlreadyExists()":[{"notice":"Reverts if adding a chain to an asset that already exists."}],"IndexOutOfBounds()":[{"notice":"Reverts if the asset index is out of bounds."}],"InvalidBufferMultiple()":[{"notice":"Reverts if the buffer multiple value is less than 1% or greater than 2%."}],"InvalidCollateralFactor()":[{"notice":"Reverts if the collateral factor (CF) specified as part of risk parameters is greater than one"}],"InvalidInitialMarginsClamps()":[{"notice":"Reverts if the initial margin clamps specified as part of risk parameters are not increasing or are above 100"}],"InvalidInitialMarginsConfiguration()":[{"notice":"Reverts if the size of the initial margin clamps does not match the size of the initial margin factors (specified as part of risk parameters)"}],"InvalidInitialMarginsFactors()":[{"notice":"Reverts if the initial margin clamps specified as part of risk parameters are not decreasing or are above 100"}],"InvalidInterestKinks()":[{"notice":"Reverts if the interest kinks specified as part of risk parameters are not increasing from 0 to 1"}],"InvalidLiabilityFactor()":[{"notice":"Reverts if the liability factor (LF) specified as part of risk parameters is greater than one"}],"InvalidMaxFundingRate()":[{"notice":"Reverts if the funding rate cap specified as part of risk parameters is greater than ~1000% APR"}],"InvalidMaxUtilizationRate()":[{"notice":"Reverts if the utilization rate cap specified as part of risk parameters is greater than ~1000% APR"}],"InvalidRateInterestKinks()":[{"notice":"Reverts if the interest rates specified as part of risk parameters are not increasing"}],"InvalidUSDInterestKinks()":[{"notice":"Reverts if the USD-denominated interest kinks specified as part of risk parameters are not increasing from 0 to 1"}],"InvalidUSDRateInterestKinks()":[{"notice":"Reverts if the USD-denominated interest rates specified as part of risk parameters are not increasing"}],"InvalidUtilizationCap()":[{"notice":"Reverts if the utilization cap specified as part of risk parameters is greater than one"}],"NoPendingRiskParameters(uint16)":[{"notice":"Reverts if there is are no risk parameters queued for the specified asset"}],"NotAdmin()":[{"notice":"Reverts if caller is not the admin."}],"NotRiskManager()":[{"notice":"Reverts if caller is not the risk manager multisig."}],"RiskManagerNotSet()":[{"notice":"Reverts if the risk manager is not set."}],"TooSoon(uint16,uint256)":[{"notice":"Reverts if the pending risk parameters are not yet eligible for application"}],"ZeroAddress()":[{"notice":"Reverts if an address is zero."}]},"events":{"Max1HrDepositChanged((uint64,uint64),uint16,uint256,uint256)":{"notice":"Signals that the maximum hourly deposit has changed for a given asset"},"MaxDepositChanged((uint64,uint64),uint16,uint256,uint256)":{"notice":"Signals that the maximum deposit has changed for a given asset"},"MinWeightChanged((uint64,uint64),uint16,uint256,uint256)":{"notice":"Signals that the minimum weight has changed for a given asset"}},"kind":"user","methods":{"admin()":{"notice":"Address of the admin; primarily used for initial setup."},"applyPendingRiskParameters(uint16)":{"notice":"Applies the pending risk parameters for the specified asset if they exist."},"constructor":{"notice":"Contract constructor."},"feeAccount()":{"notice":"Account for receiving fees and paying rewards."},"getAssetData((uint64,uint64),uint16)":{"notice":"Retrieves asset data for a specific asset and chain."},"getAssetIndex((uint64,uint64),bytes32)":{"notice":"Returns the asset index for a given chain and address."},"getAssets(uint16,uint16)":{"notice":"Returns all registered asset data across all chains."},"getRiskParameters(uint16,uint16)":{"notice":"Returns the full list of risk parameters for all registered assets."},"pendingRiskParameters(uint16)":{"notice":"Mapping of asset index to new risk parameters to be applied to the registry, but only after they become eligible"},"riskManagerMultisig()":{"notice":"Multisig wallet address responsible for managing risk-related configurations."},"riskParameterChangeDelaySeconds()":{"notice":"Number of seconds to wait before new risk parameters become effective"},"riskParameters(uint16)":{"notice":"Mapping of asset index to associated risk parameters."},"setAdmin(address)":{"notice":"Updates the admin address."},"setAssetData((uint16,bytes32,(uint64,uint64),uint256,uint256,uint256))":{"notice":"Sets or updates asset data for a specific asset index and chain."},"setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":{"notice":"Sets pending risk parameters for a specific asset index."},"setRiskManagerMultisig(address)":{"notice":"Updates the risk manager multisig address."}},"notice":"Central registry for managing assets and associated risk parameters across multiple chains.","version":1}},"Settler":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onAtomicSettlement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"contractName":"Settler","deploymentBytecode":{"bytecode":"0x6080806040523460135760c0908160188239f35b5f80fdfe60808060405260043610156011575f80fd5b5f3560e01c633f1d584e146023575f80fd5b3460865760603660031901126086576004356001600160a01b0381160360865760443567ffffffffffffffff811160865736602382011215608657806004013567ffffffffffffffff81116086573691016024011160865780620f424060209252f35b5f80fdfea2646970667358221220a8714c703f33fadc15c70b5e85fe4339baf5c2eadde619da4d23e7a4d23416e264736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"onAtomicSettlement(address,uint256,bytes)":"0x3f1d584e"},"runtimeBytecode":{"bytecode":"0x60808060405260043610156011575f80fd5b5f3560e01c633f1d584e146023575f80fd5b3460865760603660031901126086576004356001600160a01b0381160360865760443567ffffffffffffffff811160865736602382011215608657806004013567ffffffffffffffff81116086573691016024011160865780620f424060209252f35b5f80fdfea2646970667358221220a8714c703f33fadc15c70b5e85fe4339baf5c2eadde619da4d23e7a4d23416e264736f6c634300081e0033"},"sourceId":"src/Settler.sol","sourcemap":"59:173:0:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}},"SigTest":{"abi":[{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"check","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"contractName":"SigTest","deploymentBytecode":{"bytecode":"0x608080604052346015576101c9908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c63197ff59b14610024575f80fd5b346100a35760603660031901126100a3576004356001600160a01b03811681036100a35760443567ffffffffffffffff81116100a357366023820112156100a357806004013567ffffffffffffffff81116100a35736602482840101116100a3576020926024610099930190602435906100a7565b6040519015158152f35b5f80fd5b92939290915f906001600160a01b0383161561018a576040519160048301602484019560448501916064860193873b156101115750936064938a80948a9b9c9460209b9a9998630b135d3f60e11b8a525260408a52523701915afa9051630b135d3f60e11b141690565b99935050939550508060401461015e5760411461012e5750505050565b60408092939496508101355f1a60205281375b5f526020600160805f825afa511860601b3d11915f606052604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b031660605291935090610141565b505f945050505056fea26469706673582212208a106949f349498c2239c8e95c70bad1b3b3e62a5294423000b592793b14c09564736f6c634300081c0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"check(address,bytes32,bytes)":"0x197ff59b"},"runtimeBytecode":{"bytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c63197ff59b14610024575f80fd5b346100a35760603660031901126100a3576004356001600160a01b03811681036100a35760443567ffffffffffffffff81116100a357366023820112156100a357806004013567ffffffffffffffff81116100a35736602482840101116100a3576020926024610099930190602435906100a7565b6040519015158152f35b5f80fd5b92939290915f906001600160a01b0383161561018a576040519160048301602484019560448501916064860193873b156101115750936064938a80948a9b9c9460209b9a9998630b135d3f60e11b8a525260408a52523701915afa9051630b135d3f60e11b141690565b99935050939550508060401461015e5760411461012e5750505050565b60408092939496508101355f1a60205281375b5f526020600160805f825afa511860601b3d11915f606052604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b031660605291935090610141565b505f945050505056fea26469706673582212208a106949f349498c2239c8e95c70bad1b3b3e62a5294423000b592793b14c09564736f6c634300081c0033"},"sourceId":"src/SigTest.sol","sourcemap":"140:221:1:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}},"SignatureTest":{"abi":[{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct SignatureTest.Settlement","name":"order","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"name":"getSettlementPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getSigningAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct SignatureTest.Withdrawal","name":"withdrawal","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes32","name":"epochHash","type":"bytes32"}],"name":"getWithdrawalPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"}],"contractName":"SignatureTest","deploymentBytecode":{"bytecode":"0x608080604052346015576103e4908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c908163035563461461025e5750806336116c161461018b5780637438b937146101735780639e5c3980146100735763f698da2514610053575f80fd5b3461006f575f36600319011261006f5760205f54604051908152f35b5f80fd5b3461006f573660031901610100811261006f5760a01361006f5760c43567ffffffffffffffff811680910361006f575f546bffffffffffffffffffffffff196100ba610362565b60601b16916044356001600160a01b038116810361006f5761016f93604051937fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208601526040850152606084015260243560808401526bffffffffffffffffffffffff199060601b1660a083015260643560c083015260a43560e083015261010082015260843561012082015260e435610140820152610140815261016361016082610378565b60405191829182610338565b0390f35b3461006f57602036600319011261006f576004355f55005b3461006f57366003190160e0811261006f5760601361006f576084356001600160a01b038116810361006f575f5461016f916bffffffffffffffffffffffff196101d3610362565b60601b16604051927f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba602085015260408401526060830152602435608083015260643560a083015260443560c083015260a43560e083015260c4356101008301526bffffffffffffffffffffffff199060601b16610120820152610120815261016361014082610378565b3461006f57604036600319011261006f576004356024359167ffffffffffffffff831161006f573660238401121561006f5782600401359167ffffffffffffffff831161006f5760248401366024858701011161006f576020945f9480604014610310576041146102e057505050505b6040516001600160a01b039091168152f35b604092939450606401355f1a855281375b5f5281604060805f60015afa505f6060523d60601851906040526102ce565b506044013560ff81901c601b01865290356040526001600160ff1b03166060529091506102f1565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b6004356001600160a01b038116810361006f5790565b90601f8019910116810190811067ffffffffffffffff82111761039a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a2f355b36c760bb58250919fd43010925bdca95acc99830f86f5bc7e95898c4064736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"domainSeparator()":"0xf698da25","getSettlementPayload((address,uint256,address,uint256,uint256),bytes32,uint64,uint256)":"0x9e5c3980","getSigningAddress(bytes32,bytes)":"0x03556346","getWithdrawalPayload((address,uint256,uint256),bytes32,address,uint256,bytes32)":"0x36116c16","setDomainSeparator(bytes32)":"0x7438b937"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f3560e01c908163035563461461025e5750806336116c161461018b5780637438b937146101735780639e5c3980146100735763f698da2514610053575f80fd5b3461006f575f36600319011261006f5760205f54604051908152f35b5f80fd5b3461006f573660031901610100811261006f5760a01361006f5760c43567ffffffffffffffff811680910361006f575f546bffffffffffffffffffffffff196100ba610362565b60601b16916044356001600160a01b038116810361006f5761016f93604051937fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208601526040850152606084015260243560808401526bffffffffffffffffffffffff199060601b1660a083015260643560c083015260a43560e083015261010082015260843561012082015260e435610140820152610140815261016361016082610378565b60405191829182610338565b0390f35b3461006f57602036600319011261006f576004355f55005b3461006f57366003190160e0811261006f5760601361006f576084356001600160a01b038116810361006f575f5461016f916bffffffffffffffffffffffff196101d3610362565b60601b16604051927f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba602085015260408401526060830152602435608083015260643560a083015260443560c083015260a43560e083015260c4356101008301526bffffffffffffffffffffffff199060601b16610120820152610120815261016361014082610378565b3461006f57604036600319011261006f576004356024359167ffffffffffffffff831161006f573660238401121561006f5782600401359167ffffffffffffffff831161006f5760248401366024858701011161006f576020945f9480604014610310576041146102e057505050505b6040516001600160a01b039091168152f35b604092939450606401355f1a855281375b5f5281604060805f60015afa505f6060523d60601851906040526102ce565b506044013560ff81901c601b01865290356040526001600160ff1b03166060529091506102f1565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b6004356001600160a01b038116810361006f5790565b90601f8019910116810190811067ffffffffffffffff82111761039a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a2f355b36c760bb58250919fd43010925bdca95acc99830f86f5bc7e95898c4064736f6c634300081e0033"},"sourceId":"src/SignatureTest.sol","sourcemap":"112:2016:17:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}}},"manifest":"ethpm/3","sources":{"src/Checkpointer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {EfficientHashLib} from \"solady/utils/EfficientHashLib.sol\";\nimport {SignatureCheckerLib} from \"solady/utils/SignatureCheckerLib.sol\";\n\n/**\n * @title Checkpointer\n * @notice Tracks and validates state root checkpoints using EIP-712 signatures from admin and leader nodes.\n * @dev Designed for use in DStack-like distributed settlement systems.\n */\ncontract Checkpointer {\n /**\n * @notice Address with the authority to set initial parameters.\n * @dev Should be set to the DStack app shared secret public key.\n */\n address public admin;\n\n /**\n * @notice Public key of the current designated leader node.\n * @dev Leader is responsible for signing and submitting new checkpoints.\n */\n address public leader;\n\n /**\n * @notice Gnosis Safe address used as the council multisig.\n * @dev Can rotate the leader and self.\n */\n address public councilMultisig;\n\n /**\n * @notice Monotonically increasing nonce for checkpoint submissions.\n * @dev Used to prevent replay attacks and enforce checkpoint ordering.\n */\n uint256 public stateRootNonce;\n\n /// @notice Typehash used for EIP-712 encoding of the Checkpoint struct.\n bytes32 public constant CHECKPOINT_TYPEHASH =\n keccak256(\"Checkpoint(uint256 nonce,uint8[] stateRoot,string[] approvedWithdrawals)\");\n\n /**\n * @notice Emitted when a new list of approved withdrawals is recorded in a checkpoint.\n * @param approvedWithdrawals List of withdrawal IDs approved in the checkpoint.\n */\n event Withdrawals(string[] approvedWithdrawals);\n\n /// @notice Cached domain separator for EIP-712 signature verification.\n bytes32 internal _domainSeparator;\n\n /**\n * @notice The current state root, encoded as a serialized vector.\n * @dev Serialized as `(user, eth_balance, usdc_balance, deposit_nonce, is_mm)` tuples.\n * In production, this may store multiple roots and rotate.\n */\n uint8[] public stateRoot;\n\n /// @notice Reverts if caller is not the admin.\n error NotAdmin();\n\n /// @notice Reverts if a value has already been set.\n error AlreadySet();\n\n /// @notice Reverts if caller is not the current council multisig.\n error NotCouncilMultisig();\n\n /// @notice Reverts if a signature does not match the expected signer or payload.\n error InvalidSignature();\n\n /**\n * @notice Contract constructor.\n * @dev Sets the deployer as the initial admin.\n */\n constructor() {\n admin = msg.sender;\n }\n\n /**\n * @notice Sets the EIP-712 domain separator used for verifying signatures.\n * @param domainSeparator The domain separator to store.\n */\n function setDomainSeparator(bytes32 domainSeparator) external {\n if (msg.sender != admin) revert NotAdmin();\n if (_domainSeparator != 0) revert AlreadySet();\n _domainSeparator = domainSeparator;\n }\n\n /**\n * @notice Transfers admin control to a new address.\n * @param newAdmin The new admin address.\n */\n function setAdmin(address newAdmin) external {\n if (msg.sender != admin) revert NotAdmin();\n require(newAdmin != address(0));\n admin = newAdmin;\n }\n\n /**\n * @notice Sets the initial council multisig address.\n * @param newCouncilMultisig The council's Gnosis Safe address.\n */\n function setInitialCouncilMultisig(address newCouncilMultisig) external {\n if (msg.sender != admin) revert NotAdmin();\n if (councilMultisig != address(0)) revert AlreadySet();\n councilMultisig = newCouncilMultisig;\n }\n\n /**\n * @notice Allows the current council to rotate itself to a new address.\n * @param newCouncilMultisig The new multisig address.\n */\n function setNewCouncilMultisig(address newCouncilMultisig) external {\n if (msg.sender != councilMultisig) revert NotCouncilMultisig();\n councilMultisig = newCouncilMultisig;\n }\n\n /**\n * @notice Sets the leader node address.\n * @dev This should be reviewed depending on the leader rotation mechanism.\n * @param newLeader The address of the new leader node.\n */\n function setLeader(address newLeader) external {\n if (msg.sender != councilMultisig) revert NotCouncilMultisig();\n leader = newLeader;\n }\n\n /**\n * @notice Checkpoint submitted by a node to update the system state.\n * @dev Requires valid EIP-712 signatures from both admin and leader.\n * @param sharedSignature Signature by the admin.\n * @param leaderSignature Signature by the leader.\n * @param _checkpoint The checkpoint payload to commit.\n */\n function checkpoint(\n bytes calldata sharedSignature,\n bytes calldata leaderSignature,\n Checkpoint calldata _checkpoint\n ) external {\n require(_checkpoint.nonce == stateRootNonce); // dev: Nonce mismatch\n\n // Compute the EIP-712 struct hash.\n bytes32 structHash = EfficientHashLib.hash(\n abi.encode(\n CHECKPOINT_TYPEHASH,\n _checkpoint.nonce,\n EfficientHashLib.hash(abi.encodePacked(_checkpoint.stateRoot)),\n hashStringArray(_checkpoint.approvedWithdrawals)\n )\n );\n\n // Check both admin and leader signatures.\n bytes32 digest =\n EfficientHashLib.hash(abi.encodePacked(\"\\x19\\x01\", _domainSeparator, structHash));\n\n if (!SignatureCheckerLib.isValidSignatureNow(admin, digest, sharedSignature)) {\n revert InvalidSignature();\n }\n\n if (!SignatureCheckerLib.isValidSignatureNow(leader, digest, leaderSignature)) {\n revert InvalidSignature();\n }\n\n stateRootNonce++;\n stateRoot = _checkpoint.stateRoot;\n\n emit Withdrawals(_checkpoint.approvedWithdrawals);\n }\n\n /**\n * @notice Internal helper for hashing an array of strings.\n * @dev Each string is hashed individually and packed before final hashing.\n * @param arr The array of strings to hash.\n * @return A single keccak256 hash of the packed array of hashed strings.\n */\n function hashStringArray(string[] memory arr) internal pure returns (bytes32) {\n bytes32[] memory hashedStrings = new bytes32[](arr.length);\n for (uint256 i = 0; i < arr.length; i++) {\n hashedStrings[i] = EfficientHashLib.hash(bytes(arr[i]));\n }\n return EfficientHashLib.hash(abi.encodePacked(hashedStrings));\n }\n\n /**\n * @notice Struct defining a checkpoint message.\n * @dev Checkpoints include the current state root, a nonce, and a list of approved withdrawals.\n */\n struct Checkpoint {\n uint256 nonce;\n uint8[] stateRoot;\n string[] approvedWithdrawals;\n }\n}\n","urls":[]},"src/CredentialManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {SignatureCheckerLib} from \"solady/utils/SignatureCheckerLib.sol\";\nimport {EfficientHashLib} from \"solady/utils/EfficientHashLib.sol\";\nimport {IAdminUpdateStrategy} from \"./interfaces/IAdminUpdateStrategy.sol\";\nimport {IAutomataDcapAttestation} from \"./interfaces/IAutomataDcapAttestation.sol\";\n\n/// @title CredentialManager\n/// @notice The centralized Root of Trust for the TEE Clearing Engine.\n/// @dev This contract acts as the governance layer and the vault registry. It manages the\n/// set of authorized operators, enforces quorum consensus for critical updates, and\n/// maintains the registry of deposit vaults across different chains.\n/// It combines immediate multi-sig actions for operational tasks with timelocked\n/// actions for high-risk configuration changes.\ncontract CredentialManager {\n using SignatureCheckerLib for address;\n\n // =============================================================\n // STRUCTS\n // =============================================================\n\n /// @notice Configuration for a specific chain/vault.\n struct ChainConfig {\n uint64 blockTimeMs;\n // Confs\n uint8 defaultConfirmations;\n uint8 depositIngestConfirmations;\n uint8 withdrawalIngestConfirmations;\n uint8 settlementIngestConfirmations;\n }\n\n /// @notice Represents a deposit vault deployed on a specific chain.\n /// @dev Addresses are stored as bytes32 to support non-EVM chains (e.g., Solana, SVM).\n struct Vault {\n uint8 routingId;\n uint256 vmId; // ChainId for EVM chains.\n /// @notice The address of the vault on that chain (left-aligned or native format).\n bytes32 vaultAddress;\n ChainConfig config;\n }\n\n /// @notice Tracks the lifecycle state of a timelocked operation.\n struct TimelockOp {\n /// @notice The timestamp (seconds since unix epoch) after which the operation can be executed.\n uint64 eta;\n /// @notice True if the operation has already been executed.\n bool executed;\n /// @notice True if the operation was explicitly canceled by the operators.\n bool canceled;\n /// @notice The type hash of the operation (e.g., OP_SET_RISK_MANAGER) for verification.\n bytes32 opType;\n }\n\n /// @notice Defines the expected state of the TEE software.\n struct MeasurementProfile {\n bool active; // Is this profile currently allowed?\n bytes32 mrtd; // Mandatory (Code Identity)\n bytes32 rtmr0; // Optional (Set to 0 to skip check)\n bytes32 rtmr1; // Optional\n bytes32 rtmr2; // Optional\n bytes32 rtmr3; // Optional\n }\n\n struct RestartCandidate {\n address leader;\n uint256 epoch;\n bytes32 checkpointHash;\n bool exists;\n }\n\n // =============================================================\n // ERRORS\n // =============================================================\n\n /// @notice Thrown when a signature belongs to an address that is not a registered operator.\n /// @param signer The address recovered from the signature.\n error NotOperator(address signer);\n\n /// @notice Thrown when the provided signatures are not sorted by signer address or contain duplicates.\n /// @dev Signatures must be sorted strictly ascending (A < B) to prevent duplicate counting in O(N).\n error SignersNotSortedOrUnique();\n\n /// @notice Thrown when the number of valid signatures provided is less than the required threshold.\n /// @param provided The number of signatures provided.\n /// @param required The current `committeeThreshold` required.\n error InsufficientSignatures(uint256 provided, uint256 required);\n\n /// @notice Thrown when attempting to set a quorum threshold that is 0 or greater than the total operators.\n /// @param newThreshold The proposed threshold.\n /// @param operatorCount The total number of registered operators.\n error InvalidCommitteeThreshold(uint256 newThreshold, uint256 operatorCount);\n\n /// @notice Thrown when attempting to execute a timelock before the delay has elapsed.\n /// @param opId The unique hash of the operation.\n /// @param readyAt The timestamp when the operation becomes executable.\n /// @param nowTs The current block timestamp.\n error TimelockNotReady(bytes32 opId, uint256 readyAt, uint256 nowTs);\n\n /// @notice Thrown when attempting to act on a timelock ID that does not exist or was never scheduled.\n /// @param opId The operation hash.\n error TimelockUnknown(bytes32 opId);\n\n /// @notice Thrown when attempting to execute or schedule an operation that has already been executed.\n /// @param opId The operation hash.\n error TimelockAlreadyExecuted(bytes32 opId);\n\n /// @notice Thrown when attempting to execute or cancel an operation that has already been canceled.\n /// @param opId The operation hash.\n error TimelockAlreadyCanceled(bytes32 opId);\n\n /// @notice Thrown when a timelock delay is set to 0 (invalid safety margin).\n /// @param delay The provided delay in seconds.\n error InvalidDelay(uint256 delay);\n\n /// @notice Thrown when attempting to cancel an operation that cannot be canceled (e.g., already executed).\n error CannotCancel();\n\n /// @notice Thrown when a critical configuration address (e.g., Risk Manager) is set to address(0).\n error ZeroAddress();\n\n /// @notice Thrown when a Vault address is empty (bytes32(0)).\n error InvalidVaultAddr();\n\n /// @notice Thrown when attempting to register a strategy for a chain that already has one.\n error StrategyAlreadyExists();\n\n /// @notice Thrown when attempting to update vault admins on a chain that has no registered strategy.\n error NoStrategy();\n\n /// @notice Thrown when a requested vault cannot be found for the specified chain.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n error VaultNotFound(uint256 routingId, uint256 vmId);\n\n /// @notice Thrown when the measured TEE state does not match the expected state.\n error MeasurementMismatch(bytes32 expected, bytes32 actual, string field);\n\n /// @notice Thrown when the ZK Proof attesting measurements is invalid.\n error InvalidZkProof();\n\n /// @notice Thrown when the supplied epoch is invalid\n error InvalidEpoch(uint256 expected, uint256 actual);\n /// @notice Thrown when a Quote ReportData does not match params.\n error InvalidReportData();\n /// @notice Thrown when a Quote length is invalid.\n error InvalidQuoteLength();\n /// @notice Thrown when a Quote verifier is invalid.\n error InvalidVerifier();\n /// @notice Thrown when the used profile is not active.\n error ProfileInactive(uint256 profileId);\n /// @notice Thrown when the used profile does not exist.\n error InvalidProfileId();\n /// @notice Thrown when the used profile is configured incorrectly.\n error InvalidProfileConfig();\n\n // Certificate gathering errors\n error GatheringActive();\n error GatheringNotActive();\n error GatheringNotExpired();\n error AmbiguousState();\n error NoCandidate();\n error ProposedEpochTooLow(uint256 current, uint256 proposed);\n\n // =============================================================\n // CONSTANTS & TYPEHASHES\n // =============================================================\n\n /// @dev EIP-712 Domain Separator typehash.\n bytes32 private constant _EIP712_DOMAIN_TYPEHASH = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n\n /// @dev EIP-712 name hash for this contract.\n bytes32 private constant _NAME_HASH = keccak256(\"CredentialManager\");\n\n /// @dev EIP-712 version hash.\n bytes32 private constant _VERSION_HASH = keccak256(\"1\");\n\n /// @dev Generic Action typehash used for all governance signatures.\n /// Structure: Action(bytes32 opType, bytes32 paramsHash, uint256 nonce)\n bytes32 private constant _ACTION_TYPEHASH =\n keccak256(\"Action(bytes32 opType,bytes32 paramsHash,uint256 nonce)\");\n\n /// @dev Used for appointing a leader in the absence of a leader - for bootstrap or emergency recovery.\n bytes32 public constant OP_APPOINT_LEADER = keccak256(\"OP_APPOINT_LEADER\");\n\n // --- Operation Types (for Signature Verification) ---\n\n // Immediate Actions (Executed immediately upon valid quorum)\n bytes32 public constant OP_SET_COMMITTEE_THRESHOLD = keccak256(\"OP_SET_COMMITTEE_THRESHOLD\");\n bytes32 public constant OP_ADD_VAULT = keccak256(\"OP_ADD_VAULT\");\n bytes32 public constant OP_REGISTER_STRATEGY = keccak256(\"OP_REGISTER_ADMIN_UPDATE_STRATEGY\");\n bytes32 public constant OP_SET_VAULT_ADMINS = keccak256(\"OP_SET_DEPOSIT_VAULT_ADMINS\");\n bytes32 public constant OP_CANCEL_TIMELOCK = keccak256(\"OP_CANCEL_TIMELOCK\");\n bytes32 public constant OP_WITHDRAW = keccak256(\"OP_WITHDRAW\");\n\n // Timelocked Actions (Scheduled first, executed later)\n bytes32 public constant OP_SET_RISK_MANAGER = keccak256(\"OP_SET_RISK_MANAGER\");\n bytes32 public constant OP_SET_REGISTRY = keccak256(\"OP_SET_REGISTRY\");\n bytes32 public constant OP_SET_MEASUREMENTS = keccak256(\"OP_SET_MEASUREMENTS\");\n bytes32 public constant OP_SET_DELAY = keccak256(\"OP_SET_DELAY\");\n bytes32 public constant OP_MANAGE_PROFILE = keccak256(\"OP_MANAGE_PROFILE\");\n\n // Restarts\n bytes32 public constant OP_RESTART = keccak256(\"OP_RESTART\");\n bytes32 public constant OP_SET_AUTOMATA_VERIFIER = keccak256(\"OP_SET_AUTOMATA_VERIFIER\");\n\n // Certificate gathering\n uint256 public constant GATHERING_DURATION = 1 hours;\n\n // =============================================================\n // STORAGE\n // =============================================================\n\n // --- Governance State ---\n\n /// @notice TEMP Admin path, to be revised later.\n address public admin;\n\n /// @notice The list of authorized Clearing Engine operator addresses (EOAs).\n /// @dev These keys form the root of trust for the system.\n address[] public operators;\n\n /// @notice Lookup to check if an address is an operator.\n mapping(address => bool) public isOperator;\n\n /// @notice The minimum number of signatures required to execute a governance action.\n uint256 public committeeThreshold;\n\n /// @notice A monotonically increasing nonce for governance actions.\n /// @dev Included in every signed hash to strictly order operations and prevent replay attacks.\n uint256 public governanceNonce;\n\n /// @notice Maps Operator (EOA) -> Attested Key (TEE Address).\n /// @dev Used to verify that a TEE signature belongs to a specific operator.\n mapping(address => bytes32) public operatorToAttestedKey;\n\n /// @notice The current active leader (Operator Address).\n /// @dev The leader is responsible for coordinating the clearing engine.\n address public leader;\n\n // --- Execution State (Vault Registry) ---\n\n /// @notice The registry of all authorized Deposit Vaults.\n /// @dev This list is strictly append-only; vaults cannot be removed to prevent history modification.\n Vault[] public vaults;\n\n /// @notice Maps a RoutingID to the VMID to the Strategy Contract responsible for sending messages to it.\n /// @dev Used to abstract cross-chain messaging logic (e.g., LayerZero, Optimism Messenger).\n mapping(uint256 => mapping(uint256 => IAdminUpdateStrategy)) public adminUpdateStrategies;\n\n // --- Configuration ---\n\n /// @notice The address of the Risk Manager (or multisig) authorized to adjust risk parameters.\n address public riskManager;\n\n /// @notice The address of the global Registry Contract used for asset/settler configurations.\n address public registryContract;\n\n // --- Timelock State ---\n\n /// @notice Configuration mapping for how long specific operations must be delayed.\n /// @dev e.g., OP_SET_REGISTRY -> 72 hours.\n mapping(bytes32 => uint256) public timelockDelayFor;\n\n /// @notice Stores the status of individual scheduled operations by their hash ID.\n mapping(bytes32 => TimelockOp) public timelockOps;\n\n // --- TDX measurements ---\n\n /// @notice The current \"Gold Image\" measurements required for valid Quotes. Matches based on profile.\n mapping(uint256 => MeasurementProfile) public measurementProfiles;\n uint256 public nextProfileId = 1;\n\n // --- Restarts ---\n\n /// @notice Tracks the logical era of the TEE state to prevent replay attacks.\n /// @dev Incremented on every successful restart.\n uint256 public epoch;\n\n /// @notice The hash of the system state (inventory) associated with the current epoch.\n /// @dev New nodes verify this hash against the leader's data to ensure they are on the correct fork.\n bytes32 public latestCheckpointHash;\n\n // ZK Verifier Contract (Automata)\n IAutomataDcapAttestation public automataVerifier;\n\n // --- Certificate gathering ---\n uint256 public restartGatheringDeadline; // 0 = Inactive, >0 = Active\n RestartCandidate public bestCandidate;\n bool public isRestartAmbiguous;\n\n // =============================================================\n // EVENTS\n // =============================================================\n\n /// @notice Emitted when a new operator is added during initialization.\n event OperatorAdded(address indexed operator);\n\n /// @notice Emitted when the signature threshold is updated.\n event CommitteeThresholdUpdated(uint256 oldThreshold, uint256 newThreshold);\n\n /// @notice Emitted when a new vault is added to the registry.\n event VaultAdded(\n uint256 indexed routingId, uint256 indexed vmId, bytes32 vaultAddr, ChainConfig config\n );\n\n /// @notice Emitted when a new cross-chain strategy is registered.\n event DepositVaultAdministratorsUpdated(\n uint256 indexed routingId,\n uint256 indexed vmId,\n address[] newAdministrators,\n uint256 newWithdrawalQuorum\n );\n\n /// @notice Emitted when the admin set of a remote vault is updated.\n event DepositVaultAdministratorsUpdated(\n uint256 indexed chainId, address[] newAdministrators, uint256 newWithdrawalQuorum\n );\n\n /// @notice Emitted when a new cross-chain strategy is registered.\n event AdminUpdateStrategyRegistered(\n uint256 indexed routingId, uint256 indexed vmId, address strategy\n );\n\n /// @notice Emitted when a new attested key for an operator is registered.\n event AttestedKeyRegistered(address indexed operator, bytes32 indexed newAttestedKey);\n\n /// @notice Emitted when the quorum leader is updated.\n event LeaderUpdated(address indexed newLeader, bytes32 indexed newAttestedKey);\n\n // Timelock Events\n event OperationScheduled(bytes32 indexed opId, bytes32 indexed opType, uint256 eta);\n event OperationExecuted(bytes32 indexed opId, bytes32 indexed opType);\n event OperationCanceled(bytes32 indexed opId, bytes32 indexed opType);\n\n event RiskManagerUpdated(address indexed oldRiskManager, address indexed newRiskManager);\n event RegistryUpdated(address indexed oldRegistry, address indexed newRegistry);\n event TimelockDelayUpdated(bytes32 indexed targetOpType, uint256 oldDelay, uint256 newDelay);\n\n // Measurement & Restart Events\n /// @notice Emitted when the measurements are updated.\n event MeasurementsUpdated(bytes32 newMrtd, bytes32 newRtmr0);\n event MeasurementProfileUpdated(uint256 indexed profileId, bool active);\n event EpochIncremented(uint256 newEpoch, bytes32 newCheckpointHash);\n event RestartExecuted(address indexed newLeader, uint256 indexed epoch);\n event AutomataVerifierUpdated(address indexed oldVerifier, address indexed newVerifier);\n\n // Certificate gathering events\n event RestartGatheringStarted(uint256 deadline);\n event RestartCandidateSubmitted(address indexed leader, uint256 epoch, bytes32 checkpointHash);\n event RestartAmbiguityDetected(uint256 epoch, bytes32 hash1, bytes32 hash2);\n\n // =============================================================\n // INITIALIZATION\n // =============================================================\n\n /// @notice Initializes the Credential Manager with the initial operator set and configuration.\n /// @param initialOperators The list of addresses that will form the initial governance council.\n /// @param initialCommitteeThreshold The number of signatures required for valid governance actions.\n /// @param initialRiskManager The initial Risk Manager address.\n /// @param initialRegistryContract The initial Registry Contract address.\n constructor(\n address[] memory initialOperators,\n uint256 initialCommitteeThreshold,\n address initialRiskManager,\n address initialRegistryContract,\n MeasurementProfile[] memory initialMeasurements,\n address initialAutomataVerifier\n ) {\n admin = msg.sender;\n\n if (initialRiskManager == address(0)) revert ZeroAddress();\n if (initialRegistryContract == address(0)) revert ZeroAddress();\n automataVerifier = IAutomataDcapAttestation(initialAutomataVerifier);\n\n _initOperators(initialOperators, initialCommitteeThreshold);\n\n riskManager = initialRiskManager;\n registryContract = initialRegistryContract;\n // Start IDs at 1 so 0 can be used as a null/sentinel value\n nextProfileId = 1;\n\n for (uint256 i = 0; i < initialMeasurements.length; i++) {\n MeasurementProfile memory p = initialMeasurements[i];\n\n // Safety Check: Active profiles must have an MRTD\n if (p.active && p.mrtd == bytes32(0)) revert InvalidProfileConfig();\n\n measurementProfiles[nextProfileId] = p;\n emit MeasurementProfileUpdated(nextProfileId, p.active);\n nextProfileId++;\n }\n\n // Default Timelocks\n timelockDelayFor[OP_SET_RISK_MANAGER] = 48 hours;\n timelockDelayFor[OP_SET_REGISTRY] = 72 hours;\n timelockDelayFor[OP_MANAGE_PROFILE] = 7 days;\n timelockDelayFor[OP_SET_DELAY] = 7 days;\n }\n\n /// @dev Internal helper to process the operator list and set the threshold.\n function _initOperators(address[] memory initialOperators, uint256 initialCommitteeThreshold)\n internal\n {\n uint256 n = initialOperators.length;\n if (n == 0) revert InvalidCommitteeThreshold(initialCommitteeThreshold, 0);\n if (initialCommitteeThreshold == 0 || initialCommitteeThreshold > n) {\n revert InvalidCommitteeThreshold(initialCommitteeThreshold, n);\n }\n\n for (uint256 i = 0; i < n; i++) {\n address op = initialOperators[i];\n if (op == address(0)) revert ZeroAddress();\n if (isOperator[op]) revert SignersNotSortedOrUnique();\n isOperator[op] = true;\n operators.push(op);\n emit OperatorAdded(op);\n }\n committeeThreshold = initialCommitteeThreshold;\n emit CommitteeThresholdUpdated(0, initialCommitteeThreshold);\n }\n\n // =============================================================\n // QUORUM & KEYS\n // =============================================================\n\n /// @notice Allows an operator to register their TEE's attested key.\n /// @dev Maps the attested_pubkey of a new CE joining the quorum.\n /// @param newAttestedKey The address derived from the TEE's public key.\n function registerAttestedKey(bytes32 newAttestedKey) external {\n if (!isOperator[msg.sender]) revert NotOperator(msg.sender);\n if (newAttestedKey == bytes32(0)) revert ZeroAddress();\n\n operatorToAttestedKey[msg.sender] = newAttestedKey;\n emit AttestedKeyRegistered(msg.sender, newAttestedKey);\n }\n\n /// @notice Returns the full Committee configuration.\n /// @dev Let's operators query for 'k (the committee threshold), n' thresholds and the current committee member list\".\n function getCommitteeConfig()\n external\n view\n returns (address[] memory members, uint256 k, uint256 n)\n {\n return (operators, committeeThreshold, operators.length);\n }\n\n /// @notice Returns the current Leader's Operator Address and Attested Key.\n /// @dev When querying current leader, then the contract returns the active operator_pubkey and attested_pubkey.\n function getLeader() external view returns (address operator, bytes32 attestedKey) {\n return (leader, operatorToAttestedKey[leader]);\n }\n\n /// @dev Internal helper to update mappings.\n function _setAttestedKey(address op, bytes32 attKey) internal {\n operatorToAttestedKey[op] = attKey;\n emit AttestedKeyRegistered(op, attKey);\n }\n\n /// @dev Builds the administrator list from operator-attested keys.\n function _getAttestedAdministrators() internal view returns (address[] memory admins) {\n uint256 len = operators.length;\n admins = new address[](len);\n for (uint256 i = 0; i < len; i++) {\n bytes32 attKey = operatorToAttestedKey[operators[i]];\n if (attKey == bytes32(0)) revert ZeroAddress();\n admins[i] = address(uint160(uint256(attKey)));\n }\n }\n\n /// @dev Internal helper to rotate the leader for use in restarts.\n function _updateLeader(address newLeader) internal {\n if (!isOperator[newLeader]) revert NotOperator(newLeader);\n // Check bytes32 zero\n if (operatorToAttestedKey[newLeader] == bytes32(0)) revert ZeroAddress();\n leader = newLeader;\n\n emit LeaderUpdated(newLeader, operatorToAttestedKey[newLeader]);\n }\n\n /// @notice Manually appoints a leader. Used for bootstrapping or emergency recovery.\n function appointLeader(\n address newLeader,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (!isOperator[newLeader]) revert NotOperator(newLeader);\n\n // Leader MUST have a registered key, or they cannot sign Attestations/Checkpoints\n if (operatorToAttestedKey[newLeader] == bytes32(0)) revert ZeroAddress();\n\n bytes32 paramsHash = keccak256(abi.encode(newLeader));\n _requireCommitteeApproval(OP_APPOINT_LEADER, paramsHash, signers, signatures);\n\n _updateLeader(newLeader);\n }\n\n // =============================================================\n // RESTART CERTIFICATION & CERTIFICATE GATHERING\n // =============================================================\n\n /// @notice Step 1: Initiates the gathering window if the system is down.\n function initiateRestart() external {\n if (restartGatheringDeadline > block.timestamp) revert GatheringActive();\n\n // Start 1 hour window\n restartGatheringDeadline = block.timestamp + GATHERING_DURATION;\n\n // Clear previous state\n delete bestCandidate;\n isRestartAmbiguous = false;\n\n emit RestartGatheringStarted(restartGatheringDeadline);\n }\n\n /// @notice Restarts the system using a Trustless ZK Proof (Automata / SP1). The contract stores the \"Best\" candidate.\n /// @dev We compare Epochs. The highest epoch wins.\n /// @param tdxReportBody The 'Public Output' of the ZK Circuit (The TEE Quote Body).\n /// @param zkProof The Groth16 proof bytes.\n /// @param newLeader The address claiming leadership.\n /// @param checkpointHash The state hash being served.\n function submitRestartProof(\n uint256 profileId,\n bytes calldata tdxReportBody,\n bytes calldata zkProof,\n address newLeader,\n bytes32 checkpointHash\n ) external {\n if (restartGatheringDeadline == 0 || block.timestamp > restartGatheringDeadline) {\n revert GatheringNotActive();\n }\n if (newLeader == address(0)) revert ZeroAddress();\n if (address(automataVerifier) == address(0)) revert InvalidVerifier();\n\n // 1. ZK Verification\n // Assert that the 'tdxReportBody' was indeed generated by a genuine Intel TDX hardware\n // running the code logic proved by the ZK circuit.\n (bool success, bytes memory errorData) = automataVerifier.verifyAndAttestWithZKProof(\n tdxReportBody,\n IAutomataDcapAttestation.ZkCoProcessorType.Succinct, // Opinionated: Use SP1\n zkProof\n );\n\n // Handle failure explicitly\n if (!success) {\n // Forward the error from Automata if possible, or generic revert\n if (errorData.length > 0) {\n assembly {\n let retLen := mload(errorData)\n revert(add(32, errorData), retLen)\n }\n } else {\n revert InvalidZkProof();\n }\n }\n\n // 2. Policy Check (The \"Gold Image\")\n // Verify that the Code Hash (MRTD) inside the verified body matches our governance.\n // MRTD is at offset 136. We take the first 32 bytes of the SHA384.\n if (tdxReportBody.length < 584) revert InvalidQuoteLength();\n bytes32 qMrtd = bytes32(tdxReportBody[136:168]);\n\n // RTMRs start at 328. Stride is 48 bytes.\n bytes32 qRtmr0 = bytes32(tdxReportBody[328:360]);\n bytes32 qRtmr1 = bytes32(tdxReportBody[376:408]);\n bytes32 qRtmr2 = bytes32(tdxReportBody[424:456]);\n bytes32 qRtmr3 = bytes32(tdxReportBody[472:504]);\n\n verifyMeasurements(profileId, qMrtd, qRtmr0, qRtmr1, qRtmr2, qRtmr3);\n\n // 3. Identity Binding\n // Verify that the TEE explicitly committed to this Leader and Checkpoint in ReportData.\n // [Leader (20) | Checkpoint (32) | Epoch (8) | ProcessedCount (4)]\n // Total 64 bytes at Offset 520\n // A. Extract Leader (Bytes 520..540)\n address recoveredLeader = address(bytes20(tdxReportBody[520:540]));\n\n // B. Extract Checkpoint (Bytes 540..572)\n bytes32 recoveredCheckpoint = bytes32(tdxReportBody[540:572]);\n\n // C. Extract Epoch (Bytes 572..580)\n // We read 8 bytes, cast to uint64.\n uint64 recoveredEpoch = uint64(bytes8(tdxReportBody[572:580]));\n\n if (recoveredLeader != newLeader) revert InvalidReportData();\n if (recoveredCheckpoint != checkpointHash) revert InvalidReportData();\n\n // 5. Monotonicity Check\n if (recoveredEpoch <= epoch) {\n revert ProposedEpochTooLow(epoch, recoveredEpoch);\n }\n\n // If this is the first valid candidate\n if (!bestCandidate.exists) {\n bestCandidate = RestartCandidate({\n leader: newLeader,\n epoch: recoveredEpoch,\n checkpointHash: checkpointHash,\n exists: true\n });\n emit RestartCandidateSubmitted(newLeader, recoveredEpoch, checkpointHash);\n return;\n }\n\n // If we already have a candidate, COMPARE.\n\n // Case 1: Proposed Epoch is HIGHER -> Replace Best\n if (recoveredEpoch > bestCandidate.epoch) {\n // Strictly better epoch -> Replace\n bestCandidate = RestartCandidate({\n leader: newLeader,\n epoch: recoveredEpoch,\n checkpointHash: checkpointHash,\n exists: true\n });\n isRestartAmbiguous = false;\n emit RestartCandidateSubmitted(newLeader, recoveredEpoch, checkpointHash);\n }\n // Case 2: Proposed Epoch is EQUAL\n else if (recoveredEpoch == bestCandidate.epoch) {\n // If Hash is DIFFERENT -> SPLIT BRAIN\n if (checkpointHash != bestCandidate.checkpointHash) {\n isRestartAmbiguous = true;\n emit RestartAmbiguityDetected(\n recoveredEpoch, bestCandidate.checkpointHash, checkpointHash\n );\n }\n // If Hash is SAME, ignore (duplicate proposal)\n }\n // Case 3: Proposed Epoch is LOWER -> Ignore\n }\n\n /// @notice Step 3: Finalizes the restart after the window closes.\n function resolveRestart() external {\n if (restartGatheringDeadline == 0) revert GatheringNotActive();\n if (block.timestamp <= restartGatheringDeadline) revert GatheringNotExpired();\n\n if (!bestCandidate.exists) revert NoCandidate();\n if (isRestartAmbiguous) revert AmbiguousState();\n\n // Apply State\n _updateLeader(bestCandidate.leader);\n latestCheckpointHash = bestCandidate.checkpointHash;\n epoch = bestCandidate.epoch;\n\n // Reset Gathering\n restartGatheringDeadline = 0;\n delete bestCandidate;\n\n emit EpochIncremented(epoch, latestCheckpointHash);\n emit RestartExecuted(leader, epoch);\n }\n\n // =============================================================\n // GOVERNANCE VERIFICATION\n // =============================================================\n\n /// @notice Returns the EIP-712 domain separator used for verifying governance signatures.\n /// @return The domain separator hash.\n function domainSeparator() public view returns (bytes32) {\n return keccak256(\n abi.encode(\n _EIP712_DOMAIN_TYPEHASH, _NAME_HASH, _VERSION_HASH, block.chainid, address(this)\n )\n );\n }\n\n /// @dev Reconstructs the signed EIP-712 digest for a specific action.\n function _hashAction(bytes32 opType, bytes32 paramsHash, uint256 nonce)\n internal\n view\n returns (bytes32)\n {\n bytes32 structHash = keccak256(abi.encode(_ACTION_TYPEHASH, opType, paramsHash, nonce));\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator(), structHash));\n }\n\n /// @notice Verifies that a payload has been signed by a valid quorum of operators.\n /// @dev This is the core access control modifier. It verifies:\n /// 1. Sufficient signatures (k of n).\n /// 2. Signers are valid operators.\n /// 3. Signatures are unique and sorted (to prevent duplicates).\n /// 4. The payload matches the expected operation type and parameters.\n /// 5. Increments the nonce to prevent replay attacks.\n /// @param opType The operation identifier (e.g., OP_ADD_VAULT).\n /// @param paramsHash The keccak256 hash of the abi-encoded parameters.\n /// @param signers An array of operator addresses who signed the payload. Must be sorted ascending.\n /// @param signatures An array of signatures corresponding to the signers.\n function _requireCommitteeApproval(\n bytes32 opType,\n bytes32 paramsHash,\n address[] calldata signers,\n bytes[] calldata signatures\n ) internal {\n // If sender is admin and no signatures provided, skip verification.\n if (msg.sender == admin && signers.length == 0 && signatures.length == 0) {\n // Increment nonce anyway to simulate state change/prevent strict replays\n unchecked {\n governanceNonce++;\n }\n return;\n }\n uint256 q = committeeThreshold;\n if (signers.length != signatures.length) revert SignersNotSortedOrUnique();\n if (signers.length < q || signatures.length < q) {\n revert InsufficientSignatures(signers.length, q);\n }\n\n bytes32 digest = _hashAction(opType, paramsHash, governanceNonce);\n\n address prev = address(0);\n for (uint256 i = 0; i < q; i++) {\n address signer = signers[i];\n // Enforce sorted order to check for duplicates (O(N) vs O(N^2))\n if (signer <= prev) revert SignersNotSortedOrUnique();\n prev = signer;\n\n if (!isOperator[signer]) revert NotOperator(signer);\n\n // Handles EIP-1271 and EOA signatures.\n if (!signer.isValidSignatureNow(digest, signatures[i])) revert NotOperator(signer);\n }\n\n // Increment nonce to invalidate this hash for future use\n unchecked {\n governanceNonce++;\n }\n }\n\n // =============================================================\n // IMMEDIATE ACTIONS\n // =============================================================\n\n /// @notice Updates the number of signatures required for valid governance actions.\n /// @dev Requires a quorum of the *current* operators to approve.\n /// @param newThreshold The new minimum number of signatures.\n /// @param signers Sorted array of signers.\n /// @param signatures Corresponding signatures.\n function updateCommitteeThreshold(\n uint256 newThreshold,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (newThreshold == 0 || newThreshold > operators.length) {\n revert InvalidCommitteeThreshold(newThreshold, operators.length);\n }\n\n bytes32 paramsHash = keccak256(abi.encode(newThreshold));\n _requireCommitteeApproval(OP_SET_COMMITTEE_THRESHOLD, paramsHash, signers, signatures);\n\n uint256 oldThreshold = committeeThreshold;\n committeeThreshold = newThreshold;\n\n emit CommitteeThresholdUpdated(oldThreshold, newThreshold);\n }\n\n /// @notice Registers a new deposit vault to the system.\n /// @dev This list is append-only. New vaults can be added, but existing ones cannot be removed.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n /// @param vaultAddr The address of the vault (as bytes32).\n /// @param signers Sorted array of signers.\n /// @param signatures Corresponding signatures.\n function addVault(\n uint8 routingId,\n uint256 vmId,\n bytes32 vaultAddr,\n ChainConfig calldata config,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (vaultAddr == bytes32(0)) revert InvalidVaultAddr();\n\n bytes32 paramsHash = keccak256(abi.encode(routingId, vmId, vaultAddr, config));\n _requireCommitteeApproval(OP_ADD_VAULT, paramsHash, signers, signatures);\n\n vaults.push(\n Vault({routingId: routingId, vmId: vmId, vaultAddress: vaultAddr, config: config})\n );\n emit VaultAdded(routingId, vmId, vaultAddr, config);\n }\n\n /// @notice Registers a strategy contract to handle updates for a specific chain.\n /// @dev Used to define how the Credential Manager talks to L2s (e.g., via bridges).\n /// Only one strategy can be registered per chain.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n /// @param strategy The address of the strategy contract.\n /// @param signers Sorted array of signers.\n /// @param signatures Corresponding signatures.\n function registerAdminUpdateStrategy(\n uint8 routingId,\n uint256 vmId,\n IAdminUpdateStrategy strategy,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (address(strategy) == address(0)) revert ZeroAddress();\n if (address(adminUpdateStrategies[routingId][vmId]) != address(0)) {\n revert StrategyAlreadyExists();\n }\n\n bytes32 paramsHash = keccak256(abi.encode(routingId, vmId, address(strategy)));\n _requireCommitteeApproval(OP_REGISTER_STRATEGY, paramsHash, signers, signatures);\n\n adminUpdateStrategies[routingId][vmId] = strategy;\n emit AdminUpdateStrategyRegistered(routingId, vmId, address(strategy));\n }\n\n /// @notice Updates the administrators or withdrawal quorum for a vault on a remote chain.\n /// @dev Admin can set arbitrary administrators/quorum using the debug path.\n /// Non-admin calls ignore the provided administrators/quorum and instead sync administrators\n /// from operator-attested keys, using the current committee threshold as the quorum.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n /// @param newAdministrators The list of new admin addresses for that vault.\n /// @param newWithdrawalQuorum The new quorum requirement for that vault.\n function setDepositVaultAdministrators(\n uint256 routingId,\n uint256 vmId,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable {\n IAdminUpdateStrategy strategy = adminUpdateStrategies[routingId][vmId];\n if (address(strategy) == address(0)) revert NoStrategy();\n\n address[] memory admins;\n uint256 withdrawalQuorum;\n if (msg.sender == admin) {\n admins = newAdministrators;\n withdrawalQuorum = newWithdrawalQuorum;\n } else {\n admins = _getAttestedAdministrators();\n withdrawalQuorum = committeeThreshold;\n }\n\n // Delegatecall allows this contract to retain its identity (msg.sender) when calling the bridge.\n (bool ok,) = address(strategy)\n .delegatecall(\n abi.encodeWithSelector(\n strategy.setAdministrators.selector,\n _getVaultAddress(routingId, vmId),\n admins,\n withdrawalQuorum\n )\n );\n require(ok, \"Strategy delegatecall failed\");\n emit DepositVaultAdministratorsUpdated(routingId, vmId, admins, withdrawalQuorum);\n }\n\n /// @notice Withdraw funds held by this contract.\n function withdraw(address account, address[] calldata signers, bytes[] calldata signatures)\n external\n {\n if (account == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(account, address(this).balance));\n _requireCommitteeApproval(OP_WITHDRAW, paramsHash, signers, signatures);\n payable(account).transfer(address(this).balance);\n }\n\n // =============================================================\n // VIEW HELPERS\n // =============================================================\n\n /// @notice Returns a paginated list of registered vaults.\n /// @dev The input types are intentionally `uint16` to preserve the function selector\n /// `0x9fd7285c` for backward compatibility with existing Rust clients.\n /// @param start The start index.\n /// @param end The end index (exclusive).\n /// @return An array of Vault structs.\n function getVaults(uint16 start, uint16 end) external view returns (Vault[] memory) {\n uint256 count = vaults.length;\n if (start >= count) return new Vault[](0);\n if (end > count) end = uint16(count);\n if (end <= start) return new Vault[](0);\n\n uint256 len = uint256(end - start);\n Vault[] memory out = new Vault[](len);\n for (uint256 i = 0; i < len; i++) {\n out[i] = vaults[uint256(start) + i];\n }\n return out;\n }\n\n function _getVaultAddress(uint256 routingId, uint256 vmId) internal view returns (address) {\n uint256 len = vaults.length;\n for (uint256 i; i < len; ++i) {\n Vault memory vault = vaults[i];\n if (vault.routingId == routingId && vault.vmId == vmId) {\n // Convert bytes32 to address (assuming left-aligned or standard encoding).\n // Shifts right 96 bits to recover the 160-bit address if it was stored left-aligned.\n return address(uint160(uint256(vault.vaultAddress >> 96)));\n }\n }\n revert VaultNotFound(routingId, vmId);\n }\n\n // =============================================================\n // TIMELOCKED ACTIONS\n // =============================================================\n\n /// @notice Schedules a timelocked update for the Risk Manager address.\n /// @dev The operation cannot be executed until `TIMELOCK_DELAY` has passed.\n /// @param newRiskManager The proposed new Risk Manager address.\n /// @return opId The unique hash of the scheduled operation.\n function scheduleRiskManager(\n address newRiskManager,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n if (newRiskManager == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRiskManager));\n _requireCommitteeApproval(OP_SET_RISK_MANAGER, paramsHash, signers, signatures);\n opId = _schedule(OP_SET_RISK_MANAGER, paramsHash);\n }\n\n /// @notice Executes a pending Risk Manager update if the timelock has expired.\n /// @param newRiskManager The address that was previously scheduled.\n function executeRiskManager(address newRiskManager) external {\n if (newRiskManager == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRiskManager));\n bytes32 opId = _opId(OP_SET_RISK_MANAGER, paramsHash);\n\n _executeTimelock(opId);\n\n address old = riskManager;\n riskManager = newRiskManager;\n emit OperationExecuted(opId, OP_SET_RISK_MANAGER);\n emit RiskManagerUpdated(old, newRiskManager);\n }\n\n /// @notice Schedules a timelocked update for the Registry Contract address.\n /// @param newRegistry The proposed new Registry address.\n /// @return opId The unique hash of the scheduled operation.\n function scheduleRegistryContract(\n address newRegistry,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n if (newRegistry == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRegistry));\n _requireCommitteeApproval(OP_SET_REGISTRY, paramsHash, signers, signatures);\n opId = _schedule(OP_SET_REGISTRY, paramsHash);\n }\n\n /// @notice Executes a pending Registry Contract update if the timelock has expired.\n /// @param newRegistry The address that was previously scheduled.\n function executeRegistryContract(address newRegistry) external {\n if (newRegistry == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRegistry));\n bytes32 opId = _opId(OP_SET_REGISTRY, paramsHash);\n\n _executeTimelock(opId);\n\n address old = registryContract;\n registryContract = newRegistry;\n emit OperationExecuted(opId, OP_SET_REGISTRY);\n emit RegistryUpdated(old, newRegistry);\n }\n\n // Timelocked measurement actions\n\n /// @notice Validates measurements against a specific approved Profile.\n /// @dev Supports \"Partial Matching\": If the Profile has bytes32(0) for an RTMR,\n /// skips checking that specific register (accommodating different provider patterns).\n function verifyMeasurements(\n uint256 profileId,\n bytes32 checkMrtd,\n bytes32 checkRtmr0,\n bytes32 checkRtmr1,\n bytes32 checkRtmr2,\n bytes32 checkRtmr3\n ) internal view {\n MeasurementProfile memory profile = measurementProfiles[profileId];\n\n if (!profile.active) revert ProfileInactive(profileId);\n if (profile.mrtd == bytes32(0)) revert ZeroAddress();\n\n // MRTD is always mandatory\n if (checkMrtd != profile.mrtd) revert MeasurementMismatch(profile.mrtd, checkMrtd, \"MRTD\");\n\n // RTMRs are conditional based on the Profile configuration\n if (profile.rtmr0 != bytes32(0) && checkRtmr0 != profile.rtmr0) {\n revert MeasurementMismatch(profile.rtmr0, checkRtmr0, \"RTMR0\");\n }\n\n if (profile.rtmr1 != bytes32(0) && checkRtmr1 != profile.rtmr1) {\n revert MeasurementMismatch(profile.rtmr1, checkRtmr1, \"RTMR1\");\n }\n\n if (profile.rtmr2 != bytes32(0) && checkRtmr2 != profile.rtmr2) {\n revert MeasurementMismatch(profile.rtmr2, checkRtmr2, \"RTMR2\");\n }\n\n if (profile.rtmr3 != bytes32(0) && checkRtmr3 != profile.rtmr3) {\n revert MeasurementMismatch(profile.rtmr3, checkRtmr3, \"RTMR3\");\n }\n }\n\n /// @notice Governance proposes adding or updating a measurement profile (e.g., for Phala or GCP).\n function scheduleManageProfile(\n uint256 profileId,\n MeasurementProfile calldata profile,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n // Anti-Bricking: MRTD must never be zero if activating\n if (profile.active && profile.mrtd == bytes32(0)) revert InvalidVaultAddr();\n\n bytes32 paramsHash = keccak256(abi.encode(profileId, profile));\n _requireCommitteeApproval(OP_MANAGE_PROFILE, paramsHash, signers, signatures);\n opId = _schedule(OP_MANAGE_PROFILE, paramsHash);\n }\n\n function executeManageProfile(uint256 profileId, MeasurementProfile calldata profile) external {\n bytes32 paramsHash = keccak256(abi.encode(profileId, profile));\n bytes32 opId = _opId(OP_MANAGE_PROFILE, paramsHash);\n\n _executeTimelock(opId);\n\n // Auto-increment ID if adding a new one with ID 0\n uint256 idToUpdate = profileId;\n if (idToUpdate == 0) {\n idToUpdate = nextProfileId++;\n }\n\n measurementProfiles[idToUpdate] = profile;\n emit OperationExecuted(opId, OP_MANAGE_PROFILE);\n emit MeasurementProfileUpdated(idToUpdate, profile.active);\n }\n\n /// @notice Sxecudes a timelocked update for the Automata Verifier address.\n function executeUpdateAutomataVerifier(address newVerifier) external {\n if (newVerifier == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newVerifier));\n bytes32 opId = _opId(OP_SET_AUTOMATA_VERIFIER, paramsHash);\n _executeTimelock(opId);\n\n address old = address(automataVerifier);\n automataVerifier = IAutomataDcapAttestation(newVerifier);\n\n emit OperationExecuted(opId, OP_SET_AUTOMATA_VERIFIER);\n emit AutomataVerifierUpdated(old, newVerifier);\n }\n\n /// @notice Schedules a timelocked update for the Automata Verifier.\n /// @dev Operators vote to update the verifier and the update is proposed with a timelocked delay.\n function scheduleUpdateAutomataVerifier(\n address newVerifier,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n if (newVerifier == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newVerifier));\n _requireCommitteeApproval(OP_SET_AUTOMATA_VERIFIER, paramsHash, signers, signatures);\n opId = _schedule(OP_SET_AUTOMATA_VERIFIER, paramsHash);\n }\n\n // Timelock cancellation\n\n /// @notice Cancels a pending timelocked operation.\n /// @dev Can be called at any time before execution to prevent a malicious or erroneous update.\n /// @param opId The hash of the operation to cancel.\n function cancelTimelock(bytes32 opId, address[] calldata signers, bytes[] calldata signatures)\n external\n {\n bytes32 paramsHash = keccak256(abi.encode(opId));\n _requireCommitteeApproval(OP_CANCEL_TIMELOCK, paramsHash, signers, signatures);\n\n TimelockOp storage op = timelockOps[opId];\n if (op.eta == 0) revert TimelockUnknown(opId);\n if (op.executed) revert TimelockAlreadyExecuted(opId);\n if (op.canceled) revert TimelockAlreadyCanceled(opId);\n\n op.canceled = true;\n emit OperationCanceled(opId, op.opType);\n }\n\n // =============================================================\n // TIMELOCK INTERNAL LOGIC\n // =============================================================\n\n /// @dev Deterministically generates the operation ID hash.\n function _opId(bytes32 opType, bytes32 paramsHash) internal view returns (bytes32) {\n return keccak256(abi.encode(opType, paramsHash, address(this), block.chainid));\n }\n\n /// @dev Internal helper to schedule an operation.\n function _schedule(bytes32 opType, bytes32 paramsHash) internal returns (bytes32 opId) {\n opId = _opId(opType, paramsHash);\n TimelockOp storage op = timelockOps[opId];\n if (op.executed) revert TimelockAlreadyExecuted(opId);\n\n uint256 delay = timelockDelayFor[opType];\n if (delay == 0) revert InvalidDelay(delay);\n\n uint64 eta = uint64(block.timestamp + delay);\n op.eta = eta;\n op.executed = false;\n op.canceled = false;\n op.opType = opType;\n emit OperationScheduled(opId, opType, eta);\n }\n\n /// @dev Internal helper to validate if an operation is ready for execution.\n function _executeTimelock(bytes32 opId) internal {\n TimelockOp storage op = timelockOps[opId];\n if (op.eta == 0) revert TimelockUnknown(opId);\n if (op.executed) revert TimelockAlreadyExecuted(opId);\n if (op.canceled) revert TimelockAlreadyCanceled(opId);\n if (block.timestamp < op.eta) revert TimelockNotReady(opId, op.eta, block.timestamp);\n op.executed = true;\n }\n\n /// @notice Allows the contract to receive ETH (needed for strategies that require fees).\n receive() external payable {}\n}\n","urls":[]},"src/DepositVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {SafeTransferLib} from \"solady/utils/SafeTransferLib.sol\";\nimport {EfficientHashLib} from \"solady/utils/EfficientHashLib.sol\";\nimport {ECDSA} from \"solady/utils/ECDSA.sol\";\nimport {IAtomicSettlementCallback} from \"./interfaces/IAtomicSettlementCallback.sol\";\n\ncontract DepositVault {\n /**\n * @notice The admin approves settlements and withdrawals.\n * @dev Should be set to the DStack container shared secret address.\n */\n address public owner;\n\n /**\n * @notice The address responsible for adding or removing administrators\n * @dev In production, this will be an upgradeable proxy\n */\n address public credentialManager;\n\n /// @notice Domain separator used for signature verification. It should include the routing ID, the vm ID, this\n /// vault address, and the settlement schema version.\n bytes32 internal _domainSeparator;\n\n /// @notice Maps settler IDs to their executor addresses.\n mapping(bytes32 => SettlerInfo) settlerExecutorMap;\n\n /// @notice List of all approved settler IDs.\n bytes32[] public approvedSettlers;\n\n /// @notice Minimum number of administrator signatures to approve a withdrawal request\n uint256 public withdrawalQuorum;\n\n uint256 public credentialManagerChangeDelayBlocks = 14400;\n\n /// @notice Tracks which settler IDs have been approved.\n mapping(bytes32 => bool) internal settlerIsApproved;\n\n /**\n * @notice Maximum total tokens that can be settled in a single block for each token.\n * @dev Currently unused \u2014 implementation pending design finalization.\n */\n mapping(address => uint256) public settlementCaps;\n\n /// @notice Maps (settler ID, account_index) pairs to their queue of pending batch settlements.\n mapping(bytes32 => mapping(uint64 => PendingSettlement[])) public pendingSettlements;\n\n /// @notice Maps (settler ID, account_index) pairs to their settlement count (nonce).\n mapping(bytes32 => mapping(uint64 => uint256)) public settlementCounts;\n\n /// @notice Maps user ID pairs to their deposit count (nonce).\n mapping(bytes32 => uint256) public depositCounts;\n\n /// @notice Maps user ID to their withdrawal count (nonce).\n mapping(bytes32 => uint256) public withdrawalCounts;\n\n /// @notice Set of administrators\n address[] public administrators;\n\n // TODO: Delete before official production.\n mapping(address => bool) public canDeposit;\n\n /// @notice Block number of latest signature use\n uint256 public lastSignatureUse;\n\n /**\n * Makes the signature unambiguous that it is for settlements.\n */\n bytes32 public constant SETTLEMENT_TYPEHASH = keccak256(\"SettlementApprovalV1\");\n\n /**\n * Makes the signature unambiguous that it is for withdrawals.\n */\n bytes32 constant WITHDRAWAL_TYPEHASH = keccak256(\"WithdrawalApprovalV1\");\n\n /// @notice Request for settlement\n /// @dev Used for all forms of settlement supported by the t+ vault\n struct Settlement {\n /// @notice Address of the token to be sent OUT from the vault\n address tokenOut;\n /// @notice Quantity of the output token to be sent OUT from the vault\n uint256 amountOut;\n /// @notice Address of the token to be sent IN to the vault\n address tokenIn;\n /// @notice Quantity of the input token to be sent IN from the vault\n uint256 amountIn;\n /// @notice Unique identifier of the user being settled\n bytes32 user;\n /// @notice Account index of the user being settled\n uint64 account;\n /// @notice Settlement nonce for this request\n uint256 nonce;\n /// @notice Timestamp at which this request is valid until (i.e.,\n /// immediately after this time this request is considered\n /// expired)\n uint256 validUntil;\n }\n\n /// @notice A settlement request with associated signatures\n struct SignedSettlement {\n /// @notice Settlement request\n Settlement settlement;\n /// @notice Signature from the t+ Clearing Engine (CE)\n bytes clearingEngineSignature;\n }\n\n /**\n * @notice Stores pending settlements for a given (user ID, account_index) pair when batch settlement is used.\n * @dev Target is the address expected to execute the settlement.\n */\n struct PendingSettlement {\n Settlement settlement;\n address target;\n }\n\n /// @notice Records a withdrawal.\n struct Withdrawal {\n address tokenAddress;\n uint256 amount;\n uint256 nonce;\n }\n\n /// @notice Information about a settler account.\n struct SettlerInfo {\n address[] executors;\n mapping(address => bool) isExecutor;\n }\n\n /// @notice Balance of a token for squashing purposes\n struct TokenSquashingBalance {\n /// @notice Address of the token that this balance represents\n address token;\n /// @notice Total quantity of tokens that the vault needs to receive\n uint256 input;\n /// @notice Total quantity of tokens that the vault needs to send\n uint256 output;\n /// @notice Net quantity of tokens that the vault needs to receive\n /// (i.e., negative implies sending more tokens out than the\n /// vault is receiving)\n int256 netAmount;\n }\n\n /// @notice Signals a settlement.\n event Settled(\n bytes32 indexed user,\n uint64 indexed account,\n uint256 indexed nonce,\n address tokenOut,\n uint256 amountOut,\n address tokenIn,\n uint256 amountIn\n );\n\n /// @notice Indicates that the set of administrators has been cleared and is now empty\n event AdministratorSetReset();\n\n /// @notice Signals that the withdrawal quorum has changed\n event WithdrawalQuorumChanged(uint256 previous, uint256 current);\n\n /// @notice Signals that the credential manager address has changed\n event CredentialManagerChanged(address oldCredentialManager, address newCredentialManager);\n\n /// @notice Signals that a new administrator has been added to the vault\n event AdminAdded(address newAdmin, uint256 numAdminsAfter);\n\n /// @notice Signals a deposit.\n event Deposited(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n\n /// @notice Signals a withdrawal.\n event Withdrew(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n\n /// @notice Reverts if the caller is not the owner.\n error NotOwner();\n\n /// @notice Reverts if the specified settler is not an approved settler on\n /// this vault\n error SettlerNotApproved();\n\n /// @notice Reverts if the number of callback data payloads does not match\n /// the number of settlement requests\n error PayloadMismatch();\n\n /// @notice Reverts if a settlement callback returns an insufficient input token amount\n error InsufficientAmountFromExecutor(uint256 actual, uint256 required);\n\n /// @notice Reverts if a settlement callback returns insufficient amount for a specific settlement\n error InsufficientCallbackReturnForSettlement(\n uint256 settlementIndex, uint256 actual, uint256 required\n );\n\n /// @notice Reverts if an insufficient number of blocks have elapsed since the last signature use\n error TooSoon();\n\n /// @notice Reverts if the caller is not the credential manager\n error NotCredentialManager();\n\n /// @notice Reverts if a new withdrawal quorum value is equal to zero\n error ZeroWithdrawalQuorum();\n\n /// @notice Reverts if insufficient administrators are provided when setting the administrators\n error InsufficientAdministrators(uint256 actual, uint256 required);\n\n /// @notice Reverts if the caller is not an admin.\n error NotAdmin();\n\n /// @notice Reverts if the caller is not the authorized executor.\n error NotExecutor();\n\n /// @notice Reverts if a signed operation is past its deadline.\n error Expired();\n\n /// @notice Reverts if the nonce used in a transaction is incorrect.\n error InvalidNonce(uint256 expected, uint256 given);\n\n /// @notice Reverts if the signature provided is invalid.\n error InvalidSignature();\n\n /// @notice Reverts if an order array is empty.\n error EmptyOrders();\n\n /// @notice Reverts when given the zero address.\n error ZeroAddress();\n\n /// @notice Reverts when an insufficient number of signatures are provided for a withdrawal request\n error MissedQuorum(uint256 provided, uint256 required);\n\n /**\n * @notice Initializes the contract and sets the owner.\n * @param _owner The address to set as the owner.\n * @param _credentialManager The address of the credential manager.\n * @dev Reverts with `ZeroAddress()` if `_owner` is null.\n * @dev Reverts with `ZeroAddress()` if `_credentialManager` is null.\n */\n constructor(address _owner, address _credentialManager) {\n if (_owner == address(0)) revert ZeroAddress();\n if (_credentialManager == address(0)) revert ZeroAddress();\n owner = _owner;\n credentialManager = _credentialManager;\n }\n\n function isAdministrator(address account) public view returns (bool) {\n for (uint256 i = 0; i < administrators.length; i++) {\n if (administrators[i] == account) return true;\n }\n\n return false;\n }\n\n /**\n * @notice Sets the owner of the vault.\n * @dev Reverts with `NotOwner`; Only the owner can set a new owner.\n */\n function setOwner(address newOwner) external {\n if (msg.sender != owner) revert NotOwner();\n if (newOwner == address(0)) revert ZeroAddress();\n owner = newOwner;\n }\n\n function setCredentialManager(address newCredentialManager) external {\n if (msg.sender != owner) revert NotOwner();\n if (newCredentialManager == address(0)) revert ZeroAddress();\n /* TODO(jmcph4): check against `latestApproval`! */\n if (block.number >= lastSignatureUse + credentialManagerChangeDelayBlocks) {\n revert TooSoon();\n }\n address oldCredentialManager = credentialManager;\n credentialManager = newCredentialManager;\n emit CredentialManagerChanged(oldCredentialManager, newCredentialManager);\n }\n\n function setAdministrators(address[] calldata newAdministrators, uint256 newWithdrawalQuorum)\n external\n {\n if (msg.sender != credentialManager) revert NotCredentialManager();\n if (newWithdrawalQuorum < 1) revert ZeroWithdrawalQuorum();\n if (newAdministrators.length < newWithdrawalQuorum) {\n revert InsufficientAdministrators(newAdministrators.length, newWithdrawalQuorum);\n }\n\n // It's critical there are no zero-addresses; otherwise, errored signatures may mistakenly pass.\n for (uint256 i = 0; i < newAdministrators.length; i++) {\n if (newAdministrators[i] == address(0)) revert ZeroAddress();\n }\n\n administrators = newAdministrators;\n emit AdministratorSetReset();\n\n for (uint256 i = 0; i < administrators.length; i++) {\n address currAdmin = administrators[i];\n emit AdminAdded(currAdmin, i + 1);\n }\n\n uint256 oldWithdrawalQuorum = withdrawalQuorum;\n withdrawalQuorum = newWithdrawalQuorum;\n if (oldWithdrawalQuorum != newWithdrawalQuorum) {\n emit WithdrawalQuorumChanged(oldWithdrawalQuorum, newWithdrawalQuorum);\n }\n }\n\n /**\n * @notice Sets the domain separators for EIP-712 signatures.\n * @param domainSeparator: The value to set.\n * @dev Reverts with `NotOwner`; Only the admin can set the domain separator.\n */\n function setDomainSeparator(bytes32 domainSeparator) external {\n if (msg.sender != owner) revert NotOwner();\n require(_domainSeparator == 0); // dev: Already set.\n _domainSeparator = domainSeparator;\n }\n\n /**\n * @notice Sets the settle executor.\n * @param settler: The settler's tplus account key.\n * @param executor: The settler's assigned executor address.\n * @dev Reverts with `NotOwner`; Only the admin can set the settler executor.\n */\n function addSettlerExecutor(bytes32 settler, address executor) external {\n if (msg.sender != owner) revert NotOwner();\n\n if (!settlerIsApproved[settler]) {\n approvedSettlers.push(settler);\n settlerIsApproved[settler] = true;\n }\n\n SettlerInfo storage data = settlerExecutorMap[settler];\n if (!data.isExecutor[executor]) {\n data.executors.push(executor);\n data.isExecutor[executor] = true;\n }\n }\n\n /**\n * @notice Removes a settler.\n * @param settler: The settler's tplus account key.\n * @dev Reverts with `NotOwner`; Only the admin can remove a settler.\n */\n function removeSettler(bytes32 settler) external {\n if (msg.sender != owner) revert NotOwner();\n uint256 length = approvedSettlers.length;\n\n settlerIsApproved[settler] = false;\n\n for (uint256 i = 0; i < length; i++) {\n if (approvedSettlers[i] == settler) {\n // Move last element to this spot and pop the last element.\n approvedSettlers[i] = approvedSettlers[length - 1];\n approvedSettlers.pop();\n break;\n }\n }\n\n // Remove all executors.\n SettlerInfo storage info = settlerExecutorMap[settler];\n for (uint256 i = 0; i < info.executors.length; i++) {\n address exec = info.executors[i];\n info.isExecutor[exec] = false;\n }\n delete info.executors;\n }\n\n /**\n * @notice Deposits a token into the vault.\n * @param user: The user whose account will be credited with the deposit.\n * @param tokenAddress: The address of the token to deposit.\n * @param amount: The amount of the token to deposit.\n * @dev Reverts if the amount is 0.\n */\n function deposit(bytes32 user, address tokenAddress, uint256 amount) external {\n require(canDeposit[msg.sender], \"!depositor\");\n require(amount != 0, \"Zero\");\n\n // Move tokens from the target user to this vault.\n SafeTransferLib.safeTransferFrom(tokenAddress, msg.sender, address(this), amount);\n\n emit Deposited(user, depositCounts[user], tokenAddress, amount);\n depositCounts[user] += 1;\n }\n\n // TODO: Delete this method and notion of approved-depositor before official production.\n function setDepositorStatus(address depositor, bool allowed) external {\n if (msg.sender != owner) revert NotOwner();\n canDeposit[depositor] = allowed;\n }\n\n /**\n * @notice Executes an atomic settlement.\n * @param order: The settlement order.\n * @param data: The data to execute as part of settlement callback.\n * @param signature: The signature from the t+ clearing engine.\n * @dev Reverts with `Expired` if the block timestamp is greater than `validUntil`.\n * @dev Reverts with `NotExecutor`; Only the executor can settle.\n * @dev Reverts with `InvalidNonce` if the nonce has already been used.\n * @dev Reverts with `SignatureError` if the signer is not an admin.\n * @dev Reverts with `InsufficientAmountFromExecutor` if the `order.amountIn` is less than what the executor reports\n */\n function executeAtomicSettlement(\n Settlement calldata order,\n bytes calldata data,\n bytes calldata signature\n ) external {\n bytes32 user = order.user;\n uint64 account = order.account;\n uint256 validUntil = order.validUntil;\n\n if (block.timestamp > validUntil) revert Expired();\n if (!settlerExecutorMap[user].isExecutor[msg.sender]) revert NotExecutor();\n\n uint256 expectedNonce = settlementCounts[user][account];\n if (order.nonce != expectedNonce) revert InvalidNonce(expectedNonce, order.nonce);\n\n bytes32 digest = keccak256(\n bytes.concat(\n SETTLEMENT_TYPEHASH,\n _domainSeparator,\n bytes32(uint256(uint160(order.tokenOut)) << 96),\n bytes32(order.amountOut),\n bytes32(uint256(uint160(order.tokenIn)) << 96),\n bytes32(order.amountIn),\n user,\n bytes32(uint256(uint160(account))),\n bytes32(order.nonce),\n bytes32(validUntil)\n )\n );\n\n // Check the signature and record latest signature usage if it's valid\n checkApproval(digest, signature);\n lastSignatureUse = block.number;\n\n // Ensure to bump the nonce _before_ the callback to avoid signature replay.\n settlementCounts[user][account] += 1;\n\n // Invoke callback on the executor\n uint256 expectedAmountIn = IAtomicSettlementCallback(msg.sender)\n .onAtomicSettlement(order.tokenOut, order.amountOut, data);\n if (expectedAmountIn < order.amountIn) {\n revert InsufficientAmountFromExecutor(expectedAmountIn, order.amountIn);\n }\n\n // Transfer tokens IN from the executor\n SafeTransferLib.safeTransferFrom(order.tokenIn, msg.sender, address(this), expectedAmountIn);\n\n // Transfer tokens OUT to the executor\n SafeTransferLib.safeTransfer(order.tokenOut, msg.sender, order.amountOut);\n\n emit Settled(\n user,\n account,\n order.nonce,\n order.tokenOut,\n order.amountOut,\n order.tokenIn,\n order.amountIn\n );\n }\n\n /// @notice Execute a sequence of settlement requests in a squashing fashion\n /// @param requests List of settlement requests\n function executeSquashingSettlements(\n SignedSettlement[] calldata requests,\n bytes[] calldata data,\n bytes32 settler\n ) external {\n address caller = msg.sender;\n uint256 numRequests = requests.length;\n uint256 numDataPayloads = data.length;\n if (numRequests != numDataPayloads) revert PayloadMismatch();\n\n /**\n * SAFETY(jmcph4): Check that settler is approved\n *\n * This prevents unauthorised settlers from executing settlements.\n */\n if (!settlerIsApproved[settler]) revert SettlerNotApproved();\n\n /**\n * SAFETY(jmcph4): Check that the caller is an assigned executor for this settler\n *\n * This prevents unauthorised execution of valid settlement requests.\n */\n if (!settlerExecutorMap[settler].isExecutor[caller]) revert NotExecutor();\n\n // Allocate token balances for netting off\n TokenSquashingBalance[] memory balances = new TokenSquashingBalance[](numRequests * 2);\n uint256 numUniqueTokens = 0;\n\n for (uint256 i = 0; i < numRequests; i++) {\n SignedSettlement memory currRequest = requests[i];\n bytes32 user = currRequest.settlement.user;\n uint64 account = currRequest.settlement.account;\n uint256 actualNonce = currRequest.settlement.nonce;\n uint256 validUntil = currRequest.settlement.validUntil;\n address tokenIn = currRequest.settlement.tokenIn;\n address tokenOut = currRequest.settlement.tokenOut;\n uint256 amountIn = currRequest.settlement.amountIn; /* TODO(jmcph4): callback */\n uint256 amountOut = currRequest.settlement.amountOut;\n\n /**\n * SAFETY(jmcph4): Check expiry\n *\n * This prevents stale settlement requests from being executed.\n */\n if (block.timestamp > validUntil) revert Expired();\n\n /**\n * SAFETY(jmcph4): Check nonce\n *\n * This prevents replay attacks on settlement requests.\n */\n uint256 expectedNonce = settlementCounts[user][account];\n if (actualNonce < expectedNonce) revert InvalidNonce(expectedNonce, actualNonce);\n\n bytes32 digest = keccak256(\n bytes.concat(\n SETTLEMENT_TYPEHASH,\n _domainSeparator,\n bytes32(uint256(uint160(tokenOut)) << 96),\n bytes32(amountOut),\n bytes32(uint256(uint160(tokenIn)) << 96),\n bytes32(amountIn),\n user,\n bytes32(uint256(uint160(account))),\n bytes32(actualNonce),\n bytes32(validUntil)\n )\n );\n\n /**\n * SAFETY(jmcph4): Verify t+ Clearing Engine (CE) signature\n *\n * This prevents unauthorised settlements.\n */\n checkApproval(digest, requests[i].clearingEngineSignature); /* TODO(jmcph4): horrific calldata load */\n lastSignatureUse = block.number;\n\n /**\n * SAFETY(jmcph4): Increment settlement nonce prior to invoking the\n * callback\n *\n * This prevents replay attacks (reentrant or otherwise) on\n * settlement requests.\n */\n settlementCounts[user][account] += 1;\n\n // Apply this request to running net token balances\n bool inputFound = false;\n bool outputFound = false;\n for (uint256 j = 0; j < numUniqueTokens; j++) {\n if (balances[j].token == tokenIn) {\n balances[j].input += amountIn;\n inputFound = true;\n break;\n }\n }\n\n if (!inputFound) {\n balances[numUniqueTokens] = TokenSquashingBalance(tokenIn, amountIn, 0, 0);\n numUniqueTokens++;\n }\n\n for (uint256 j = 0; j < numUniqueTokens; j++) {\n if (balances[j].token == tokenOut) {\n balances[j].output += amountOut;\n outputFound = true;\n break;\n }\n }\n\n if (!outputFound) {\n balances[numUniqueTokens] = TokenSquashingBalance(tokenOut, 0, amountOut, 0);\n numUniqueTokens++;\n }\n }\n\n // Net off each token balance\n for (uint256 i = 0; i < numUniqueTokens; i++) {\n if (balances[i].input > balances[i].output) {\n balances[i].netAmount = int256(balances[i].input - balances[i].output);\n } else if (balances[i].output > balances[i].input) {\n balances[i].netAmount = -int256(balances[i].output - balances[i].input);\n }\n }\n\n // Push funds out from the vault and into the executor\n for (uint256 i = 0; i < numUniqueTokens; i++) {\n // Negative net amount implies that we must push funds out from the vault\n if (balances[i].netAmount < 0) {\n // Transfer tokens OUT to the executor\n SafeTransferLib.safeTransfer(\n balances[i].token, caller, uint256(-balances[i].netAmount)\n );\n }\n }\n\n // Call callbacks and record return values\n uint256[] memory callbackReturns = new uint256[](numRequests);\n\n for (uint256 i = 0; i < numRequests; i++) {\n Settlement memory request = requests[i].settlement;\n\n /**\n * SAFETY(jmcph4): Record callback return value\n *\n * The executor reports how much of tokenIn it will provide for this\n * specific settlement. Pass the per-settlement amountOut, not the net.\n * These values will be validated against requirements before pulling funds.\n */\n callbackReturns[i] = IAtomicSettlementCallback(msg.sender)\n .onAtomicSettlement(request.tokenOut, request.amountOut, data[i]);\n\n /**\n * SAFETY(jmcph4): Validate per-settlement callback return\n *\n * Ensure the executor commits to provide at least the promised amountIn\n * for THIS specific settlement. This prevents cross-settlement subsidization\n * where an executor could shortchange one user while overpaying another.\n */\n if (callbackReturns[i] < request.amountIn) {\n revert InsufficientCallbackReturnForSettlement(\n i, callbackReturns[i], request.amountIn\n );\n }\n }\n\n // Validate callback returns and pull funds\n for (uint256 i = 0; i < numUniqueTokens; i++) {\n // Only process tokens that need to be pulled (positive net amount)\n if (balances[i].netAmount > 0) {\n address token = balances[i].token;\n uint256 requiredAmount = uint256(balances[i].netAmount);\n\n /**\n * SAFETY(jmcph4): Sum callback returns by token\n *\n * Calculate total amount the executor has committed to provide\n * for this token across all settlements.\n */\n uint256 totalCallbackAmount = 0;\n for (uint256 j = 0; j < numRequests; j++) {\n if (requests[j].settlement.tokenIn == token) {\n totalCallbackAmount += callbackReturns[j];\n }\n }\n\n /**\n * SAFETY(jmcph4): Validate executor commitment\n *\n * Ensure the executor has committed to provide at least the\n * required net amount for this token.\n */\n if (totalCallbackAmount < requiredAmount) {\n revert InsufficientAmountFromExecutor(totalCallbackAmount, requiredAmount);\n }\n\n // Transfer tokens IN from the executor\n SafeTransferLib.safeTransferFrom(token, caller, address(this), requiredAmount);\n }\n }\n\n // Emit settlement events\n for (uint256 i = 0; i < numRequests; i++) {\n Settlement memory request = requests[i].settlement;\n\n /**\n * SAFETY(jmcph4): Emit per-settlement amounts\n *\n * Events must reflect the actual per-settlement amounts, not the netted\n * amounts. This ensures proper accounting and allows off-chain systems\n * to correctly track what each user received.\n */\n emit Settled(\n request.user,\n request.account,\n request.nonce,\n request.tokenOut,\n request.amountOut,\n request.tokenIn,\n request.amountIn\n );\n }\n }\n\n /**\n * @notice Pulls funds for execution during a settlement batch.\n * @param orders: The settlement orders.\n * @param user: The t+ user who is executing the settlement.\n * @param target: The target address to send the token to, pull tokens from, and execute callback on.\n * @param validUntil: The timestamp when the settlement signature expires.\n * @dev Reverts with `Expired` if the block timestamp is greater than `validUntil`.\n * @dev Reverts if a batch settlement has already started.\n * @dev Reverts with `NotAdmin`; Only an admin can execute the settlement.\n * @dev Reverts with `InvalidNonce` if the nonce has already been used.\n * @dev Reverts with `SignatureError` if the signer is not an admin.\n */\n function pullBatchSettlements(\n SignedSettlement[] calldata orders,\n bytes32 user,\n uint64 account,\n address target,\n uint256 validUntil\n ) external {\n if (block.timestamp > validUntil) revert Expired();\n require(pendingSettlements[user][account].length == 0);\n if (!isAdministrator(msg.sender)) revert NotAdmin();\n\n uint256 expectedNonce = settlementCounts[user][account];\n bytes32 domainSeparator = _domainSeparator;\n uint256 ordersLength = orders.length;\n if (ordersLength == 0) revert EmptyOrders();\n\n for (uint256 i = 0; i < ordersLength; ++i) {\n Settlement calldata s = orders[i].settlement;\n\n uint256 nonce = s.nonce;\n if (nonce != expectedNonce) revert InvalidNonce(expectedNonce, nonce);\n\n bytes32 digest = keccak256(\n bytes.concat(\n SETTLEMENT_TYPEHASH,\n domainSeparator,\n bytes32(uint256(uint160(s.tokenOut)) << 96),\n bytes32(s.amountOut),\n bytes32(uint256(uint160(s.tokenIn)) << 96),\n bytes32(s.amountIn),\n user,\n bytes32(uint256(uint160(account))),\n bytes32(s.nonce),\n bytes32(validUntil)\n )\n );\n\n checkApproval(digest, orders[i].clearingEngineSignature);\n expectedNonce = nonce + 1;\n\n pendingSettlements[user][account].push(\n PendingSettlement({settlement: s, target: target})\n );\n SafeTransferLib.safeTransfer(s.tokenOut, target, s.amountOut);\n }\n\n settlementCounts[user][account] += ordersLength;\n }\n\n /**\n * @notice Pushes expected funds from a batch settlement to the deposit vault.\n * @param user: The t+ user who is executing the settlement.\n * @param account: The account of the t+ user to execute settlement against\n * @dev Reverts with `NotAdmin`; Only an admin can execute the settlement.\n */\n function pushBatchSettlements(bytes32 user, uint64 account) external {\n if (!isAdministrator(msg.sender)) revert NotAdmin();\n\n for (uint32 i = 0; i < pendingSettlements[user][account].length; i++) {\n PendingSettlement memory pendingSettlement = pendingSettlements[user][account][i];\n\n SafeTransferLib.safeTransferFrom(\n pendingSettlement.settlement.tokenIn,\n pendingSettlement.target,\n address(this),\n pendingSettlement.settlement.amountIn\n );\n emit Settled(\n user,\n account,\n pendingSettlement.settlement.nonce,\n pendingSettlement.settlement.tokenOut,\n pendingSettlement.settlement.amountOut,\n pendingSettlement.settlement.tokenIn,\n pendingSettlement.settlement.amountIn\n );\n }\n delete pendingSettlements[user][account];\n }\n\n /**\n * @notice Withdraws a token from the vault.\n * @param withdrawal: The withdrawal token and amount.\n * @param user: The user whose account will be debited by the withdrawal.\n * @param target: The target address to send the token to.\n * @param validUntil: The timestamp when the withdrawal signature expires.\n * @param signatures: t+ clearing engine signatures.\n * @dev Reverts with `Expired` if the block timestamp is greater than `validUntil`.\n * @dev Reverts with `InvalidNonce` if the nonce has already been used.\n * @dev Reverts with `SignatureError` if the signer is not an admin.\n */\n function withdraw(\n Withdrawal calldata withdrawal,\n bytes32 user,\n address target,\n uint256 validUntil,\n bytes32 epochHash,\n bytes[] calldata signatures\n ) external {\n /* PERF(jmcph4): cache storage variable to the stack */\n uint256 quorum = withdrawalQuorum;\n if (block.timestamp > validUntil) revert Expired();\n if (signatures.length < withdrawalQuorum) {\n revert MissedQuorum(signatures.length, quorum);\n }\n\n uint256 expectedNonce = withdrawalCounts[user];\n if (withdrawal.nonce != expectedNonce) {\n revert InvalidNonce(expectedNonce, withdrawal.nonce);\n }\n\n /**\n * BEGIN SIGNATURE CHECKS *************************\n */\n\n // Set of administrators that have provided signatures for this withdrawal\n address[] memory seenAdmins = new address[](signatures.length);\n uint256 numSeenAdmins = 0;\n\n // PERF(jmcph4): No need to recompute inside the loop body\n bytes32 digest = keccak256(\n bytes.concat(\n WITHDRAWAL_TYPEHASH,\n _domainSeparator,\n bytes32(uint256(uint160((withdrawal.tokenAddress))) << 96),\n bytes32(withdrawal.amount),\n user,\n bytes32(withdrawal.nonce),\n bytes32(validUntil),\n bytes32(epochHash),\n bytes32(uint256(uint160(target)) << 96)\n )\n );\n\n for (uint256 i = 0; i < signatures.length; i++) {\n /* Verify the signature.\n *\n * This determines whether the digest is really signed by the provided\n * signature and computes the signer's address.\n */\n address signer = ECDSA.tryRecoverCalldata(digest, signatures[i]);\n if (signer == address(0)) revert InvalidSignature();\n\n // Check that the recovered signer is in fact an administrator\n if (!isAdministrator(signer)) revert InvalidSignature();\n\n /* Check that this administrator is unique. Without this step, a\n * single admin could provide `k` signatures where `k == withdrawalQuorum`\n * and we'd happily approve the withdrawal.\n */\n bool isCurrentSignerUnique = true;\n for (uint256 j = 0; j < numSeenAdmins; j++) {\n if (seenAdmins[j] == signer) {\n isCurrentSignerUnique = false;\n break;\n }\n }\n if (isCurrentSignerUnique) {\n seenAdmins[numSeenAdmins] = signer;\n numSeenAdmins++;\n }\n if (numSeenAdmins == quorum) break;\n }\n\n if (numSeenAdmins < quorum) revert MissedQuorum(numSeenAdmins, quorum);\n\n /**\n * END SIGNATURE CHECKS *************************\n */\n\n // SAFETY(jmcph4): Purposely bump the nonce as close to signature verification as possible, to alleviate callback concerns.\n withdrawalCounts[user] += 1;\n\n // Record latest signature usage\n lastSignatureUse = block.number;\n\n SafeTransferLib.safeTransfer(withdrawal.tokenAddress, target, withdrawal.amount);\n emit Withdrew(user, withdrawal.nonce, withdrawal.tokenAddress, withdrawal.amount);\n }\n\n /**\n * @notice Get the array of approved settlers.\n * @return An array of addresses (as bytes32) that are currently approved settlers.\n */\n function getApprovedSettlers() external view returns (bytes32[] memory) {\n return approvedSettlers;\n }\n\n // TODO: Delete this method before official production.\n function ownerWithdrawToken(address token, address to, uint256 amount) external {\n if (msg.sender != owner) revert NotOwner();\n require(to != address(0));\n SafeTransferLib.safeTransfer(token, to, amount);\n }\n\n function checkApproval(bytes32 digest, bytes calldata signature) internal view {\n address signer = ECDSA.tryRecoverCalldata(digest, signature);\n if (signer == address(0)) revert InvalidSignature();\n if (!isAdministrator(signer)) revert InvalidSignature();\n }\n}\n","urls":[]},"src/Registry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @title Registry\n * @notice Central registry for managing assets and associated risk parameters across multiple chains.\n * @dev Uses admin and multisig roles to control sensitive operations like asset registration and risk configuration.\n */\ncontract Registry {\n /// @notice Address of the admin; primarily used for initial setup.\n address public admin;\n\n /// @notice Multisig wallet address responsible for managing risk-related configurations.\n address public riskManagerMultisig;\n\n /// @notice Number of seconds to wait before new risk parameters become effective\n uint256 public riskParameterChangeDelaySeconds = 1 days;\n\n /// @notice Mapping of asset index to new risk parameters to be applied to the registry, but only after they become eligible\n mapping(uint16 => PendingRiskParameters) public pendingRiskParameters;\n\n /// @notice Mapping of asset index to associated risk parameters.\n mapping(uint16 => RiskParameters) public riskParameters;\n\n /// @notice Registry of all registered assets and associated chain data.\n AssetRegistry assets;\n\n /// @notice Account for receiving fees and paying rewards.\n bytes32 public feeAccount;\n\n /// @notice Signals that the maximum deposit has changed for a given asset\n event MaxDepositChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n\n /// @notice Signals that the maximum hourly deposit has changed for a given asset\n event Max1HrDepositChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n\n /// @notice Signals that the minimum weight has changed for a given asset\n event MinWeightChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n\n /// @notice Defines risk-related configuration parameters for an asset.\n struct RiskParameters {\n /// @notice Percentage of asset value that can be counted as collateral (e.g., 90 = 90%).\n uint8 collateralFactor;\n\n /// @notice Percentage multiplier applied to liabilities for risk calculations (e.g., 90 = 90%).\n uint8 liabilityFactor;\n\n /// @notice Maximum allowable collateral amount for this asset. May be unenforced on-chain.\n uint256 maxCollateral;\n\n /// @notice Maximum total open interest allowed for derivatives positions.\n uint256 maxOpenInterest;\n\n /// @notice Maximum open interest allowed for spot positions.\n uint256 maxSpotOpenInterest;\n\n /// @notice Maximum allowed utilization ratio of available liquidity.\n uint256 maxUtilization;\n\n /// @notice If true, asset can only be used in isolated margin mode.\n bool isolatedOnly;\n\n /// @notice Utilization points where the interest rate curve slope changes, scaled in 1/100th of a basis point.\n uint256[] interestKinks;\n\n /// @notice Interest rates corresponding to `interestKinks`, scaled in 1/100th of a basis point.\n uint256[] kinkInterestRates;\n\n /// @notice USD-denominated utilization kink points, scaled in 1/100th of a basis point.\n uint256[] usdInterestKinks;\n\n /// @notice USD-denominated interest rates corresponding to `usdInterestKinks`, scaled in 1/100th of a basis point.\n uint256[] usdKinkInterestRates;\n\n /// @notice Multiplier applied to skew-based pricing adjustments, scaled in 1/100th of a basis point.\n uint256 skewModifier;\n\n /// @notice Skew threshold at which maximum skew adjustment applies, scaled in 1/100th of a basis point.\n uint256 skewCliff;\n\n /// @notice Base funding rate applied regardless of skew direction, scaled in 1/100th of a basis point.\n int256 baseFundingRate;\n\n /// @notice Maximum allowed premium adjustment, scaled in 1/100th of a basis point.\n uint256 premiumClamp;\n\n /// @notice Maximum premium impact applied during initial margin calculation, scaled in 1/100th of a basis point.\n uint256[] initialMarginClamps;\n\n /// @notice Multipliers applied to position size when calculating initial margin, scaled in 1/100th of a basis point.\n uint256[] initialMarginFactors;\n\n /// @notice Maximum absolute funding rate allowed, scaled in 1/100th of a basis point.\n uint256 maxFundingRate;\n\n /// @notice Maximum interest rate applied at full utilization, scaled in 1/100th of a basis point.\n uint256 maxUtilizationRate;\n\n /// @notice Additional safety buffer multiplier applied to risk calculations, scaled in 1/100th of a basis point.\n uint256 bufferMultiple;\n }\n\n struct PendingRiskParameters {\n RiskParameters parameters;\n uint256 validAfter;\n }\n\n /**\n * @notice Struct for managing a list of registered assets.\n * @dev Assets are stored by index and can span multiple chains.\n */\n struct AssetRegistry {\n uint256 count; // Total number of assets.\n mapping(uint16 => Asset) registry; // Mapping from index to asset struct.\n }\n\n /**\n * @notice Struct for identifying a chain.\n */\n struct ChainId {\n // The routing ID e.g. 0=EVM style chains.\n uint64 routingId;\n\n // e.g. EVM chainId.\n uint64 vmId;\n }\n\n /**\n * @notice Struct representing an asset across multiple chains.\n */\n struct Asset {\n mapping(uint64 => mapping(uint64 => AssetData)) data; // Routing ID => Chain ID => AssetData.\n ChainId[] chains; // List of all known chain IDs for this asset.\n }\n\n /**\n * @notice Chain-specific metadata for an asset.\n * @dev Uses bytes32 for `assetAddress` to support non-EVM chains like Solana.\n */\n struct AssetData {\n uint16 index;\n bytes32 assetAddress;\n ChainId chainId;\n uint256 maxDeposits; // Cap on deposits (collateral cap).\n uint256 max1hrDeposits; // Cap on fungible deposits over one hour\n uint256 minWeight; // Raw weight value (not percentage)\n }\n\n /// @notice Reverts if caller is not the admin.\n error NotAdmin();\n\n /// @notice Reverts if there is are no risk parameters queued for the specified asset\n error NoPendingRiskParameters(uint16 asset);\n\n /// @notice Reverts if the pending risk parameters are not yet eligible for application\n error TooSoon(uint16 asset, uint256 eligibleAt);\n\n /// @notice Reverts if caller is not the risk manager multisig.\n error NotRiskManager();\n\n /// @notice Reverts if the asset index is out of bounds.\n error IndexOutOfBounds();\n\n /// @notice Reverts if the collateral factor (CF) specified as part of risk parameters is greater than one\n error InvalidCollateralFactor();\n\n /// @notice Reverts if the liability factor (LF) specified as part of risk parameters is greater than one\n error InvalidLiabilityFactor();\n\n /// @notice Reverts if the utilization cap specified as part of risk parameters is greater than one\n error InvalidUtilizationCap();\n\n /// @notice Reverts if the funding rate cap specified as part of risk parameters is greater than ~1000% APR\n error InvalidMaxFundingRate();\n\n /// @notice Reverts if the utilization rate cap specified as part of risk parameters is greater than ~1000% APR\n error InvalidMaxUtilizationRate();\n\n /// @notice Reverts if the buffer multiple value is less than 1% or greater than 2%.\n error InvalidBufferMultiple();\n\n /// @notice Reverts if the interest kinks specified as part of risk parameters are not increasing from 0 to 1\n error InvalidInterestKinks();\n\n /// @notice Reverts if the interest rates specified as part of risk parameters are not increasing\n error InvalidRateInterestKinks();\n\n /// @notice Reverts if the USD-denominated interest kinks specified as part of risk parameters are not increasing from 0 to 1\n error InvalidUSDInterestKinks();\n\n /// @notice Reverts if the USD-denominated interest rates specified as part of risk parameters are not increasing\n error InvalidUSDRateInterestKinks();\n\n /// @notice Reverts if the size of the initial margin clamps does not match the size of the initial margin factors (specified as part of risk parameters)\n error InvalidInitialMarginsConfiguration();\n\n /// @notice Reverts if the initial margin clamps specified as part of risk parameters are not increasing or are above 100\n error InvalidInitialMarginsClamps();\n\n /// @notice Reverts if the initial margin clamps specified as part of risk parameters are not decreasing or are above 100\n error InvalidInitialMarginsFactors();\n\n /// @notice Reverts if adding a chain to an asset that already exists.\n error ChainAlreadyExists();\n\n /// @notice Reverts if an address is zero.\n error ZeroAddress();\n\n /// @notice Reverts if the risk manager is not set.\n error RiskManagerNotSet();\n\n /**\n * @notice Contract constructor.\n * @param _admin The admin controller of the vault.\n * @dev Sets the deployer as the initial admin.\n */\n constructor(address _admin) {\n admin = _admin;\n }\n\n /**\n * @notice Updates the risk manager multisig address.\n * @param multisig The new address to set.\n * @dev Reverts with `NotAdmin`; Only the admin can set a risk manager.\n */\n function setRiskManagerMultisig(address multisig) external {\n if (msg.sender != admin) revert NotAdmin();\n riskManagerMultisig = multisig;\n }\n\n /**\n * @notice Updates the admin address.\n * @param newAdmin The new admin address.\n * @dev Reverts with `NotAdmin`; Only the admin can set a new admin.\n * @dev The new administrator address is allowed to be the null address.\n * Setting the administrator to this address disables administration\n * of the registry contract.\n */\n function setAdmin(address newAdmin) external {\n if (msg.sender != admin) revert NotAdmin();\n if (newAdmin == address(0) && riskManagerMultisig == address(0)) {\n revert RiskManagerNotSet();\n }\n admin = newAdmin;\n }\n\n /**\n * @notice Sets or updates asset data for a specific asset index and chain.\n * @dev Automatically adds new assets or chain instances if not already present.\n * @param data The chain-specific asset data.\n * @dev Reverts with `NotRiskManager`; Only the risk manager can set asset data.\n */\n function setAssetData(AssetData memory data) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n if (data.index > assets.count) revert IndexOutOfBounds();\n\n // Prevent registering asset with zero-address. Zero-address means that asset\n // has not yet been set on a chain, where is this case it has.\n if (data.assetAddress == bytes32(0)) revert ZeroAddress();\n\n Asset storage reg = assets.registry[data.index];\n\n uint64 routingId = data.chainId.routingId;\n uint64 vmId = data.chainId.vmId;\n\n // Cannot edit the chain or address when already set.\n if (reg.data[routingId][vmId].assetAddress != bytes32(0)) {\n revert ChainAlreadyExists();\n }\n\n bool isNewAsset = reg.chains.length == 0;\n reg.data[routingId][vmId] = data;\n reg.chains.push(data.chainId);\n\n if (isNewAsset) {\n assets.count += 1;\n }\n }\n\n function setMaxDeposits(ChainId calldata chainId, uint16 index, uint256 newMaxDeposit)\n external\n {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n\n uint64 routingId = chainId.routingId;\n uint64 vmId = chainId.vmId;\n\n uint256 oldMaxDeposit = assets.registry[index].data[routingId][vmId].maxDeposits;\n assets.registry[index].data[routingId][vmId].maxDeposits = newMaxDeposit;\n emit MaxDepositChanged(chainId, index, oldMaxDeposit, newMaxDeposit);\n }\n\n function setMax1HrDeposits(ChainId calldata chainId, uint16 index, uint256 newMaxDeposit)\n external\n {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n\n uint64 routingId = chainId.routingId;\n uint64 vmId = chainId.vmId;\n\n uint256 oldMaxDeposit = assets.registry[index].data[routingId][vmId].max1hrDeposits;\n assets.registry[index].data[routingId][vmId].max1hrDeposits = newMaxDeposit;\n emit Max1HrDepositChanged(chainId, index, oldMaxDeposit, newMaxDeposit);\n }\n\n function setMinWeight(ChainId calldata chain, uint16 index, uint256 newMinWeight) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n uint256 oldMinWeight = assets.registry[index].data[chain.routingId][chain.vmId].minWeight;\n assets.registry[index].data[chain.routingId][chain.vmId].minWeight = newMinWeight;\n emit MinWeightChanged(chain, index, oldMinWeight, newMinWeight);\n }\n\n /**\n * @notice Retrieves asset data for a specific asset and chain.\n * @param chainId the chain ID to query.\n * @param index The asset index to query.\n * @return The corresponding AssetData struct.\n */\n function getAssetData(ChainId calldata chainId, uint16 index)\n external\n view\n returns (AssetData memory)\n {\n return assets.registry[index].data[chainId.routingId][chainId.vmId];\n }\n\n /**\n * @notice Returns all registered asset data across all chains.\n * @return An array of AssetData structs.\n * @param start The start index (inclusive).\n * @param end The end index (not-inclusive).\n */\n function getAssets(uint16 start, uint16 end) external view returns (AssetData[] memory) {\n // First, compute the total flattened entries\n uint256 totalEntries = 0;\n for (uint16 i = 0; i < assets.count; i++) {\n totalEntries += assets.registry[i].chains.length;\n }\n\n // Return empty array if start >= totalEntries\n if (start >= totalEntries) {\n return new AssetData[](0);\n }\n\n if (end > totalEntries) {\n // casting to 'uint16' is safe because we won't ever that many assets.\n // forge-lint: disable-next-line(unsafe-typecast)\n end = uint16(totalEntries);\n }\n\n if (end < start) {\n return new AssetData[](0);\n }\n\n uint16 length = end - start;\n AssetData[] memory result = new AssetData[](length);\n\n uint256 r = 0;\n uint256 resIdx = 0;\n\n for (uint16 i = 0; i < assets.count && resIdx < length; ++i) {\n Asset storage asset = assets.registry[i];\n uint256 chainsLen = asset.chains.length;\n\n for (uint256 c = 0; c < chainsLen && resIdx < length; ++c) {\n if (r >= start && r < end) {\n ChainId storage chain = asset.chains[c];\n result[resIdx++] = asset.data[chain.routingId][chain.vmId];\n }\n\n ++r;\n }\n }\n\n return result;\n }\n\n /**\n * @notice Returns the asset index for a given chain and address.\n * @param chainId The chain ID to search.\n * @param assetAddress The asset address (as bytes32).\n * @return The index of the asset, or `type(uint32).max` if not found.\n */\n function getAssetIndex(ChainId calldata chainId, bytes32 assetAddress)\n external\n view\n returns (uint32)\n {\n uint64 routingId = chainId.routingId;\n uint64 vmId = chainId.vmId;\n\n for (uint16 i = 0; i < assets.count; i++) {\n if (assetAddress == assets.registry[i].data[routingId][vmId].assetAddress) {\n return i;\n }\n }\n return type(uint32).max;\n }\n\n /**\n * @notice Sets pending risk parameters for a specific asset index.\n * @param index The asset index.\n * @param parameters The risk parameters to set\n * @dev Reverts with `NotRiskManager`; Only the risk manager can set risk parameters.\n * @dev Reverts with `\"!asset\"` if index >= assets.count.\n */\n function setPendingRiskParameters(uint16 index, RiskParameters memory parameters) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n validateRiskParameters(parameters);\n PendingRiskParameters memory pendingParams = PendingRiskParameters({\n parameters: parameters, validAfter: block.timestamp + riskParameterChangeDelaySeconds\n });\n pendingRiskParameters[index] = pendingParams;\n }\n\n /**\n * @notice Applies the pending risk parameters for the specified asset if they exist.\n * @param index The asset index.\n * @dev Reverts with `\"!asset\"` if index >= assets.count.\n * @dev Reverts with `NoPendingRiskParameters` if there are no pending risk parameters for the specified asset\n * @dev Reverts with `TooSoon` if the pending risk parameters are not yet eligible\n */\n function applyPendingRiskParameters(uint16 index) external {\n require(index < assets.count, \"!asset\");\n PendingRiskParameters memory pendingParams = pendingRiskParameters[index];\n if (pendingParams.validAfter == 0) revert NoPendingRiskParameters(index);\n if (pendingParams.validAfter >= block.timestamp) {\n revert TooSoon(index, pendingParams.validAfter);\n }\n RiskParameters memory params = pendingParams.parameters;\n validateRiskParameters(params);\n riskParameters[index] = params;\n delete pendingRiskParameters[index];\n }\n\n function validateRiskParameters(RiskParameters memory params) public pure {\n if (params.collateralFactor > 1e2) revert InvalidCollateralFactor();\n if (params.liabilityFactor > 1e2) revert InvalidLiabilityFactor();\n if (params.maxUtilization > 1e18) revert InvalidUtilizationCap();\n if (params.maxFundingRate > 1142) revert InvalidMaxFundingRate();\n if (params.maxUtilizationRate > 1142) revert InvalidMaxUtilizationRate();\n\n uint256 bufferMultiple = params.bufferMultiple;\n if (bufferMultiple < 1e6 || bufferMultiple > 2e6) revert InvalidBufferMultiple();\n\n if (!validateStartAtZeroIsAlwaysBelowOneAndIncreases(params.interestKinks)) {\n revert InvalidInterestKinks();\n }\n if (!validateLastIsOne(params.interestKinks)) revert InvalidInterestKinks();\n if (!validateStartAtZeroIsAlwaysBelowOneAndIncreases(params.usdInterestKinks)) {\n revert InvalidUSDInterestKinks();\n }\n if (!validateLastIsOne(params.usdInterestKinks)) revert InvalidUSDInterestKinks();\n\n if (!validateIncreases(params.kinkInterestRates)) {\n revert InvalidRateInterestKinks();\n }\n if (!validateIncreases(params.usdKinkInterestRates)) {\n revert InvalidUSDRateInterestKinks();\n }\n\n if (params.initialMarginClamps.length != params.initialMarginFactors.length) {\n revert InvalidInitialMarginsConfiguration();\n }\n if (!validateStartAtZeroIsAlwaysBelowOneAndIncreases(params.initialMarginClamps)) {\n revert InvalidInitialMarginsClamps();\n }\n if (!validateIMFactors(params.initialMarginFactors)) revert InvalidInitialMarginsFactors();\n }\n\n /**\n * @notice Last point should be (1_000_000)\n */\n function validateLastIsOne(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n return len != 0 && xs[len - 1] == 1_000_000;\n }\n\n /**\n * @notice Validate that a series of values is increasing\n */\n function validateIncreases(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n uint256 prev = 0;\n\n for (uint256 i; i < len; ++i) {\n uint256 cur = xs[i];\n if (cur < prev) return false;\n prev = cur;\n }\n\n return true;\n }\n\n /**\n * @notice IM clamps must always increase and be <= 1 (1_000_000), and first point must be 0\n */\n function validateStartAtZeroIsAlwaysBelowOneAndIncreases(uint256[] memory xs)\n internal\n pure\n returns (bool)\n {\n uint256 len = xs.length;\n uint256 prev = 0;\n\n if (len == 0 || xs[0] != 0) {\n return false;\n }\n\n for (uint256 i; i < len; ++i) {\n uint256 cur = xs[i];\n if (cur > 1_000_000) return false;\n if (cur < prev) return false;\n prev = cur;\n }\n\n return true;\n }\n\n /**\n * @notice IM factors must always decreases and be < 1 (1_000_000)\n */\n function validateIMFactors(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n uint256 prev = 999_999;\n\n for (uint256 i; i < len; ++i) {\n uint256 cur = xs[i];\n if (cur > prev) return false;\n prev = cur;\n }\n\n return true;\n }\n\n function sumIsOne(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n uint256 sum;\n\n for (uint256 i; i < len; ++i) {\n sum += xs[i];\n if (sum > 1e6) return false;\n }\n\n return sum == 1e6;\n }\n\n /**\n * @notice Returns the full list of risk parameters for all registered assets.\n * @return An array of RiskParameters.\n * @param start The start index (inclusive).\n * @param end The end index (not inclusive).\n */\n function getRiskParameters(uint16 start, uint16 end)\n external\n view\n returns (RiskParameters[] memory)\n {\n uint16 count = uint16(assets.count);\n\n if (start >= count) {\n return new RiskParameters[](0);\n }\n\n if (end > count) {\n end = count;\n }\n\n if (end < start) {\n return new RiskParameters[](0);\n }\n\n uint256 length = end - start;\n RiskParameters[] memory result = new RiskParameters[](length);\n\n for (uint16 i = 0; i < length; ++i) {\n result[i] = riskParameters[start + i];\n }\n\n return result;\n }\n\n function setFeeAccount(bytes32 account) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n feeAccount = account;\n }\n}\n","urls":[]},"src/interfaces/IAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IAdminUpdateStrategy {\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable;\n}\n","urls":[]},"src/interfaces/IAtomicSettlementCallback.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IAtomicSettlementCallback {\n /// @notice Computes the minimum expected quantity of `token` that will be\n /// received by the deposit vault upon execution of an atomic\n /// settlement request\n function onAtomicSettlement(address token, uint256 amount, bytes calldata data)\n external\n returns (uint256);\n}\n","urls":[]},"src/interfaces/IAutomataDcapAttestation.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @notice Interface for Automata's DCAP Attestation Verifier (V3)\n/// @dev Bindings for the 'AutomataDcapAttestation' contract.\n/// Compatible with Automata V3 ZK Coprocessor logic.\ninterface IAutomataDcapAttestation {\n // Enum definition from Automata's library\n enum ZkCoProcessorType {\n RiscZero,\n Succinct // SP1\n }\n\n /// @notice Verifies a SNARK proof (Groth16) for a TEE Quote.\n /// @param output The Public Values (Journal) - effectively the Quote Body.\n /// @param zkvm The type of ZKVM used.\n /// @param proofBytes The actual (Groth16) proof.\n /// @return success True if valid.\n /// @return errorData Error message if failed, or empty if success.\n function verifyAndAttestWithZKProof(\n bytes calldata output,\n ZkCoProcessorType zkvm,\n bytes calldata proofBytes\n ) external returns (bool success, bytes memory errorData);\n}\n","urls":[]},"src/interfaces/ICheckpointer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface ICheckpointer {\n struct Checkpoint {\n uint256 nonce;\n uint8[] stateRoot;\n string[] approvedWithdrawals;\n }\n\n error AlreadySet();\n error InvalidSignature();\n error NotAdmin();\n error NotCouncilMultisig();\n\n event Withdrawals(string[] approvedWithdrawals);\n\n function CHECKPOINT_TYPEHASH() external view returns (bytes32);\n function admin() external view returns (address);\n function checkpoint(\n bytes memory sharedSignature,\n bytes memory leaderSignature,\n Checkpoint memory _checkpoint\n ) external;\n function councilMultisig() external view returns (address);\n function leader() external view returns (address);\n function setAdmin(address newAdmin) external;\n function setDomainSeparator(bytes32 domainSeparator) external;\n function setInitialCouncilMultisig(address newCouncilMultisig) external;\n function setLeader(address newLeader) external;\n function setNewCouncilMultisig(address newCouncilMultisig) external;\n function stateRoot(uint256) external view returns (uint8);\n function stateRootNonce() external view returns (uint256);\n}\n","urls":[]},"src/interfaces/ICredentialManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface ICredentialManager {\n struct ChainConfig {\n uint64 blockTimeMs;\n uint8 defaultConfirmations;\n uint8 depositIngestConfirmations;\n uint8 withdrawalIngestConfirmations;\n uint8 settlementIngestConfirmations;\n }\n\n struct MeasurementProfile {\n bool active;\n bytes32 mrtd;\n bytes32 rtmr0;\n bytes32 rtmr1;\n bytes32 rtmr2;\n bytes32 rtmr3;\n }\n\n struct Vault {\n uint8 routingId;\n uint256 vmId;\n bytes32 vaultAddress;\n ChainConfig config;\n }\n\n error AmbiguousState();\n error CannotCancel();\n error GatheringActive();\n error GatheringNotActive();\n error GatheringNotExpired();\n error InsufficientSignatures(uint256 provided, uint256 required);\n error InvalidDelay(uint256 delay);\n error InvalidEpoch(uint256 expected, uint256 actual);\n error InvalidProfileConfig();\n error InvalidProfileId();\n error InvalidCommittee(uint256 newCommittee, uint256 operatorCount);\n error InvalidQuoteLength();\n error InvalidReportData();\n error InvalidVaultAddr();\n error InvalidVerifier();\n error MeasurementMismatch(bytes32 expected, bytes32 actual, string field);\n error NoCandidate();\n error NoStrategy();\n error NotOperator(address signer);\n error ProfileInactive(uint256 profileId);\n error ProposedEpochTooLow(uint256 current, uint256 proposed);\n error SignersNotSortedOrUnique();\n error StrategyAlreadyExists();\n error TimelockAlreadyCanceled(bytes32 opId);\n error TimelockAlreadyExecuted(bytes32 opId);\n error TimelockNotReady(bytes32 opId, uint256 readyAt, uint256 nowTs);\n error TimelockUnknown(bytes32 opId);\n error VaultNotFound(uint256 routingId, uint256 vmId);\n error ZeroAddress();\n\n event AdminUpdateStrategyRegistered(\n uint256 indexed routingId, uint256 indexed vmId, address strategy\n );\n event AttestedKeyRegistered(address indexed operator, bytes32 indexed newAttestedKey);\n event AutomataVerifierUpdated(address indexed oldVerifier, address indexed newVerifier);\n event DepositVaultAdministratorsUpdated(\n uint256 indexed routingId,\n uint256 indexed vmId,\n address[] newAdministrators,\n uint256 newWithdrawalQuorum\n );\n event DepositVaultAdministratorsUpdated(\n uint256 indexed chainId, address[] newAdministrators, uint256 newWithdrawalQuorum\n );\n event EpochIncremented(uint256 newEpoch, bytes32 newCheckpointHash);\n event LeaderUpdated(address indexed newLeader, bytes32 indexed newAttestedKey);\n event MeasurementProfileUpdated(uint256 indexed profileId, bool active);\n event MeasurementsUpdated(bytes32 newMrtd, bytes32 newRtmr0);\n event OperationCanceled(bytes32 indexed opId, bytes32 indexed opType);\n event OperationExecuted(bytes32 indexed opId, bytes32 indexed opType);\n event OperationScheduled(bytes32 indexed opId, bytes32 indexed opType, uint256 eta);\n event OperatorAdded(address indexed operator);\n event CommitteeThresholdUpdated(uint256 oldThreshold, uint256 newThreshold);\n event RegistryUpdated(address indexed oldRegistry, address indexed newRegistry);\n event RestartAmbiguityDetected(uint256 epoch, bytes32 hash1, bytes32 hash2);\n event RestartCandidateSubmitted(address indexed leader, uint256 epoch, bytes32 checkpointHash);\n event RestartExecuted(address indexed newLeader, uint256 indexed epoch);\n event RestartGatheringStarted(uint256 deadline);\n event RiskManagerUpdated(address indexed oldRiskManager, address indexed newRiskManager);\n event TimelockDelayUpdated(bytes32 indexed targetOpType, uint256 oldDelay, uint256 newDelay);\n event VaultAdded(\n uint256 indexed routingId, uint256 indexed vmId, bytes32 vaultAddr, ChainConfig config\n );\n\n receive() external payable;\n\n function GATHERING_DURATION() external view returns (uint256);\n function OP_ADD_VAULT() external view returns (bytes32);\n function OP_APPOINT_LEADER() external view returns (bytes32);\n function OP_CANCEL_TIMELOCK() external view returns (bytes32);\n function OP_MANAGE_PROFILE() external view returns (bytes32);\n function OP_REGISTER_STRATEGY() external view returns (bytes32);\n function OP_RESTART() external view returns (bytes32);\n function OP_SET_AUTOMATA_VERIFIER() external view returns (bytes32);\n function OP_SET_DELAY() external view returns (bytes32);\n function OP_SET_MEASUREMENTS() external view returns (bytes32);\n function OP_SET_COMMITTEE() external view returns (bytes32);\n function OP_SET_REGISTRY() external view returns (bytes32);\n function OP_SET_RISK_MANAGER() external view returns (bytes32);\n function OP_SET_VAULT_ADMINS() external view returns (bytes32);\n function OP_WITHDRAW() external view returns (bytes32);\n function addVault(\n uint8 routingId,\n uint256 vmId,\n bytes32 vaultAddr,\n ChainConfig memory config,\n address[] memory signers,\n bytes[] memory signatures\n ) external;\n function admin() external view returns (address);\n function adminUpdateStrategies(uint256, uint256) external view returns (address);\n function appointLeader(address newLeader, address[] memory signers, bytes[] memory signatures)\n external;\n function automataVerifier() external view returns (address);\n function bestCandidate()\n external\n view\n returns (address leader, uint256 epoch, bytes32 checkpointHash, bool exists);\n function cancelTimelock(bytes32 opId, address[] memory signers, bytes[] memory signatures)\n external;\n function domainSeparator() external view returns (bytes32);\n function epoch() external view returns (uint256);\n function executeManageProfile(uint256 profileId, MeasurementProfile memory profile) external;\n function executeRegistryContract(address newRegistry) external;\n function executeRiskManager(address newRiskManager) external;\n function executeUpdateAutomataVerifier(address newVerifier) external;\n function getCouncilConfig()\n external\n view\n returns (address[] memory members, uint256 k, uint256 n);\n function getLeader() external view returns (address operator, bytes32 attestedKey);\n function getVaults(uint16 start, uint16 end) external view returns (Vault[] memory);\n function governanceNonce() external view returns (uint256);\n function initiateRestart() external;\n function isOperator(address) external view returns (bool);\n function isRestartAmbiguous() external view returns (bool);\n function latestCheckpointHash() external view returns (bytes32);\n function leader() external view returns (address);\n function measurementProfiles(uint256)\n external\n view\n returns (\n bool active,\n bytes32 mrtd,\n bytes32 rtmr0,\n bytes32 rtmr1,\n bytes32 rtmr2,\n bytes32 rtmr3\n );\n function nextProfileId() external view returns (uint256);\n function operatorToAttestedKey(address) external view returns (bytes32);\n function operators(uint256) external view returns (address);\n function committeeThreshold() external view returns (uint256);\n function registerAdminUpdateStrategy(\n uint8 routingId,\n uint256 vmId,\n address strategy,\n address[] memory signers,\n bytes[] memory signatures\n ) external;\n function registerAttestedKey(bytes32 newAttestedKey) external;\n function registryContract() external view returns (address);\n function resolveRestart() external;\n function restartGatheringDeadline() external view returns (uint256);\n function riskManager() external view returns (address);\n function scheduleManageProfile(\n uint256 profileId,\n MeasurementProfile memory profile,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function scheduleRegistryContract(\n address newRegistry,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function scheduleRiskManager(\n address newRiskManager,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function scheduleUpdateAutomataVerifier(\n address newVerifier,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function setDepositVaultAdministrators(\n uint256 routingId,\n uint256 vmId,\n address[] memory newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable;\n function submitRestartProof(\n uint256 profileId,\n bytes memory tdxReportBody,\n bytes memory zkProof,\n address newLeader,\n bytes32 checkpointHash\n ) external;\n function timelockDelayFor(bytes32) external view returns (uint256);\n function timelockOps(bytes32)\n external\n view\n returns (uint64 eta, bool executed, bool canceled, bytes32 opType);\n function updateCommitteeThreshold(\n uint256 newThreshold,\n address[] memory signers,\n bytes[] memory signatures\n ) external;\n function vaults(uint256)\n external\n view\n returns (uint8 routingId, uint256 vmId, bytes32 vaultAddress, ChainConfig memory config);\n function verifyMeasurements(\n uint256 profileId,\n bytes32 checkMrtd,\n bytes32 checkRtmr0,\n bytes32 checkRtmr1,\n bytes32 checkRtmr2,\n bytes32 checkRtmr3\n ) external view;\n function withdraw(address account, address[] memory signers, bytes[] memory signatures) external;\n}\n","urls":[]},"src/interfaces/IDepositVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IDepositVault {\n struct Settlement {\n address tokenOut;\n uint256 amountOut;\n address tokenIn;\n uint256 amountIn;\n bytes32 user;\n uint64 account;\n uint256 nonce;\n uint256 validUntil;\n }\n\n struct SignedSettlement {\n Settlement settlement;\n bytes clearingEngineSignature;\n }\n\n struct Withdrawal {\n address tokenAddress;\n uint256 amount;\n uint256 nonce;\n }\n\n error EmptyOrders();\n error Expired();\n error InsufficientAdministrators(uint256 actual, uint256 required);\n error InsufficientAmountFromExecutor(uint256 actual, uint256 required);\n error InsufficientCallbackReturnForSettlement(\n uint256 settlementIndex, uint256 actual, uint256 required\n );\n error InvalidNonce(uint256 expected, uint256 given);\n error InvalidSignature();\n error MissedQuorum(uint256 provided, uint256 required);\n error NotAdmin();\n error NotCredentialManager();\n error NotExecutor();\n error NotOwner();\n error PayloadMismatch();\n error SettlerNotApproved();\n error TooSoon();\n error ZeroAddress();\n error ZeroWithdrawalQuorum();\n\n event AdminAdded(address newAdmin, uint256 numAdminsAfter);\n event AdministratorSetReset();\n event CredentialManagerChanged(address oldCredentialManager, address newCredentialManager);\n event Deposited(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n event Settled(\n bytes32 indexed user,\n uint64 indexed account,\n uint256 indexed nonce,\n address tokenOut,\n uint256 amountOut,\n address tokenIn,\n uint256 amountIn\n );\n event WithdrawalQuorumChanged(uint256 previous, uint256 current);\n event Withdrew(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n\n function SETTLEMENT_TYPEHASH() external view returns (bytes32);\n function addSettlerExecutor(bytes32 settler, address executor) external;\n function administrators(uint256) external view returns (address);\n function approvedSettlers(uint256) external view returns (bytes32);\n function canDeposit(address) external view returns (bool);\n function credentialManager() external view returns (address);\n function credentialManagerChangeDelayBlocks() external view returns (uint256);\n function deposit(bytes32 user, address tokenAddress, uint256 amount) external;\n function depositCounts(bytes32) external view returns (uint256);\n function executeAtomicSettlement(\n Settlement memory order,\n bytes memory data,\n bytes memory signature\n ) external;\n function executeSquashingSettlements(\n SignedSettlement[] memory requests,\n bytes[] memory data,\n bytes32 settler\n ) external;\n function getApprovedSettlers() external view returns (bytes32[] memory);\n function isAdministrator(address account) external view returns (bool);\n function lastSignatureUse() external view returns (uint256);\n function owner() external view returns (address);\n function ownerWithdrawToken(address token, address to, uint256 amount) external;\n function pendingSettlements(bytes32, uint64, uint256)\n external\n view\n returns (Settlement memory settlement, address target);\n function pullBatchSettlements(\n SignedSettlement[] memory orders,\n bytes32 user,\n uint64 account,\n address target,\n uint256 validUntil\n ) external;\n function pushBatchSettlements(bytes32 user, uint64 account) external;\n function removeSettler(bytes32 settler) external;\n function setAdministrators(address[] memory newAdministrators, uint256 newWithdrawalQuorum)\n external;\n function setCredentialManager(address newCredentialManager) external;\n function setDepositorStatus(address depositor, bool allowed) external;\n function setDomainSeparator(bytes32 domainSeparator) external;\n function setOwner(address newOwner) external;\n function settlementCaps(address) external view returns (uint256);\n function settlementCounts(bytes32, uint64) external view returns (uint256);\n function withdraw(\n Withdrawal memory withdrawal,\n bytes32 user,\n address target,\n uint256 validUntil,\n bytes32 epochHash,\n bytes[] memory signatures\n ) external;\n function withdrawalCounts(bytes32) external view returns (uint256);\n function withdrawalQuorum() external view returns (uint256);\n}\n","urls":[]},"src/interfaces/IRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IRegistry {\n struct AssetData {\n uint16 index;\n bytes32 assetAddress;\n uint64 chainId;\n uint256 maxDeposits;\n uint256 max1hrDeposits;\n uint256 minWeight;\n }\n\n struct RiskParameters {\n uint8 collateralFactor;\n uint8 liabilityFactor;\n uint256 maxCollateral;\n uint256 maxOpenInterest;\n uint256 maxSpotOpenInterest;\n uint256 maxUtilization;\n bool isolatedOnly;\n uint256[] interestKinks;\n uint256[] kinkInterestRates;\n uint256[] usdInterestKinks;\n uint256[] usdKinkInterestRates;\n uint256 skewModifier;\n uint256 skewCliff;\n int256 baseFundingRate;\n uint256 premiumClamp;\n uint256[] initialMarginClamps;\n uint256[] initialMarginFactors;\n uint256 maxFundingRate;\n uint256 maxUtilizationRate;\n uint256 bufferMultiple;\n }\n\n error ChainAlreadyExists();\n error IndexOutOfBounds();\n error InvalidBufferMultiple();\n error InvalidCollateralFactor();\n error InvalidInitialMarginsClamps();\n error InvalidInitialMarginsConfiguration();\n error InvalidInitialMarginsFactors();\n error InvalidInterestKinks();\n error InvalidLiabilityFactor();\n error InvalidMaxFundingRate();\n error InvalidMaxUtilizationRate();\n error InvalidRateInterestKinks();\n error InvalidUSDInterestKinks();\n error InvalidUSDRateInterestKinks();\n error InvalidUtilizationCap();\n error NoPendingRiskParameters(uint16 asset);\n error NotAdmin();\n error NotRiskManager();\n error RiskManagerNotSet();\n error TooSoon(uint16 asset, uint256 eligibleAt);\n error ZeroAddress();\n\n event Max1HrDepositChanged(uint64 chain, uint16 index, uint256 previous, uint256 current);\n event MaxDepositChanged(uint64 chain, uint16 index, uint256 previous, uint256 current);\n event MinWeightChanged(uint64 chain, uint16 index, uint256 previous, uint256 current);\n\n function admin() external view returns (address);\n function applyPendingRiskParameters(uint16 index) external;\n function feeAccount() external view returns (bytes32);\n function getAssetData(uint64 chainId, uint16 index) external view returns (AssetData memory);\n function getAssetIndex(uint64 chainId, bytes32 assetAddress) external view returns (uint32);\n function getAssets(uint16 start, uint16 end) external view returns (AssetData[] memory);\n function getRiskParameters(uint16 start, uint16 end)\n external\n view\n returns (RiskParameters[] memory);\n function pendingRiskParameters(uint16)\n external\n view\n returns (RiskParameters memory parameters, uint256 validAfter);\n function riskManagerMultisig() external view returns (address);\n function riskParameterChangeDelaySeconds() external view returns (uint256);\n function riskParameters(uint16)\n external\n view\n returns (\n uint8 collateralFactor,\n uint8 liabilityFactor,\n uint256 maxCollateral,\n uint256 maxOpenInterest,\n uint256 maxSpotOpenInterest,\n uint256 maxUtilization,\n bool isolatedOnly,\n uint256 skewModifier,\n uint256 skewCliff,\n int256 baseFundingRate,\n uint256 premiumClamp,\n uint256 maxFundingRate,\n uint256 maxUtilizationRate,\n uint256 bufferMultiple\n );\n function setAdmin(address newAdmin) external;\n function setAssetData(AssetData memory data) external;\n function setFeeAccount(bytes32 account) external;\n function setMax1HrDeposits(uint16 chain, uint16 index, uint256 newMaxDeposit) external;\n function setMaxDeposits(uint16 chain, uint16 index, uint256 newMaxDeposit) external;\n function setMinWeight(uint16 chain, uint16 index, uint256 newMinWeight) external;\n function setPendingRiskParameters(uint16 index, RiskParameters memory parameters) external;\n function setRiskManagerMultisig(address multisig) external;\n function validateRiskParameters(RiskParameters memory params) external pure;\n}\n","urls":[]},"src/strategies/ArbitrumOneAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {IInbox} from \"nitro-contracts/bridge/IInbox.sol\";\nimport {IDepositVault} from \"../interfaces/IDepositVault.sol\";\nimport {IAdminUpdateStrategy} from \"../interfaces/IAdminUpdateStrategy.sol\";\n\ncontract ArbitrumOneAdminUpdateStrategy is IAdminUpdateStrategy {\n address public constant INBOX = 0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f;\n\n uint256 constant MAX_SUBMISSION_COST = 0.02 ether;\n uint256 constant GAS_LIMIT = 3_000_000;\n uint256 constant MAX_FEE_PER_GAS = 5 gwei;\n\n /// @notice Reverts if not enough value was sent to the update method.\n error InsufficientMsgValue(uint256 actual, uint256 expected);\n\n /**\n * @notice Updates the administrator set and withdrawal quorum on a vault via a retryable ticket.\n * @dev This function forwards a cross-chain call to the target `vault` using Arbitrum's\n * retryable ticket mechanism. The credential manager must supply sufficient `msg.value` to cover\n * the maximum submission cost and gas fees for execution on the destination chain.\n *\n * @param vault The address of the vault contract whose administrators will be updated.\n * @param newAdministrators The complete list of administrator addresses to set on the vault.\n * @param newWithdrawalQuorum The new quorum required for withdrawals.\n *\n * @dev Reverts with {InsufficientMsgValue} if `msg.value` is less than\n * `MAX_SUBMISSION_COST + GAS_LIMIT * MAX_FEE_PER_GAS`.\n */\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable override {\n uint256 expectedValue =\n MAX_SUBMISSION_COST + GAS_LIMIT * MAX_FEE_PER_GAS;\n uint256 actualValue = msg.value;\n\n if (actualValue < expectedValue) {\n revert InsufficientMsgValue(actualValue, expectedValue);\n }\n\n bytes memory callData = abi.encodeWithSelector(\n IDepositVault.setAdministrators.selector, newAdministrators, newWithdrawalQuorum\n );\n\n IInbox inbox = IInbox(address(INBOX));\n inbox.createRetryableTicket{value: msg.value}(\n vault,\n 0,\n MAX_SUBMISSION_COST,\n msg.sender,\n msg.sender,\n GAS_LIMIT,\n MAX_FEE_PER_GAS,\n callData\n );\n }\n}\n","urls":[]},"src/strategies/IntraChainAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {IAdminUpdateStrategy} from \"../interfaces/IAdminUpdateStrategy.sol\";\nimport {IDepositVault} from \"../interfaces/IDepositVault.sol\";\n\n/// Use this strategy when updating the vault on the same chain as the credential manager.\ncontract IntraChainAdminUpdateStrategy is IAdminUpdateStrategy {\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable {\n IDepositVault(vault).setAdministrators(newAdministrators, newWithdrawalQuorum);\n }\n}\n","urls":[]},"src/strategies/OPStackAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {IDepositVault} from \"../interfaces/IDepositVault.sol\";\nimport {IAdminUpdateStrategy} from \"../interfaces/IAdminUpdateStrategy.sol\";\n\ninterface IL1CrossDomainMessenger {\n function sendMessage(address _target, bytes calldata _message, uint32 _minGasLimit)\n external\n payable;\n}\n\n/// @notice Admin update strategy for OP Stack chains (Optimism, Base, Unichain, etc)\ncontract OPStackAdminUpdateStrategy is IAdminUpdateStrategy {\n /// @notice L1 CrossDomainMessenger.\n address public immutable L1_CROSS_DOMAIN_MESSENGER;\n\n /// @notice Conservative gas limit for L2 execution.\n uint32 public constant L2_GAS_LIMIT = 3_000_000;\n\n /// @notice Reverts if messenger address is zero.\n error ZeroMessengerAddress();\n\n constructor(address l1CrossDomainMessenger) {\n if (l1CrossDomainMessenger == address(0)) revert ZeroMessengerAddress();\n L1_CROSS_DOMAIN_MESSENGER = l1CrossDomainMessenger;\n }\n\n /**\n * @notice Updates the administrator set and withdrawal quorum on an OP Stack L2 vault\n * @dev Sends a cross-domain message from L1 \u2192 L2 using the OP Stack messenger\n * @dev Forwards msg.value directly to the L1 messenger\n *\n * @param vault The L2 vault address\n * @param newAdministrators The full administrator set\n * @param newWithdrawalQuorum The withdrawal quorum\n */\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable override {\n bytes memory callData = abi.encodeWithSelector(\n IDepositVault.setAdministrators.selector, newAdministrators, newWithdrawalQuorum\n );\n\n IL1CrossDomainMessenger(L1_CROSS_DOMAIN_MESSENGER).sendMessage{value: msg.value}(\n vault, callData, L2_GAS_LIMIT\n );\n }\n}\n","urls":[]}}} \ No newline at end of file From 74d3d91c5c4c4503aeeb0b464c96867e49f2172b Mon Sep 17 00:00:00 2001 From: antazoey Date: Mon, 9 Mar 2026 10:54:33 -0500 Subject: [PATCH 2/3] update again --- tplus/evm/manifests/tplus-contracts.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tplus/evm/manifests/tplus-contracts.json b/tplus/evm/manifests/tplus-contracts.json index c0f6f3c..8bc972a 100644 --- a/tplus/evm/manifests/tplus-contracts.json +++ b/tplus/evm/manifests/tplus-contracts.json @@ -1 +1 @@ -{"compilers":[{"contractTypes":["SigTest","MockTarget"],"name":"solidity","settings":{"optimizer":{"enabled":true,"runs":200},"outputSelection":{"src/.cache/solady/main/src/utils/ECDSA.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/EfficientHashLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/SafeTransferLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]}},"remappings":["solady=src/.cache/solady/main/src"],"viaIR":true},"version":"0.8.28+commit.7893614a"},{"contractTypes":["IAtomicSettlementCallback","IDepositVault","DepositVault","IAutomataDcapAttestation","IRegistry","Settler","IAdminUpdateStrategy","OPStackAdminUpdateStrategy","ICredentialManager","SignatureTest","IntraChainAdminUpdateStrategy","Registry","IL1CrossDomainMessenger","ICheckpointer","ArbitrumOneAdminUpdateStrategy","Checkpointer","CredentialManager"],"name":"solidity","settings":{"optimizer":{"enabled":true,"runs":200},"outputSelection":{"src/.cache/nitro-contracts/main/src/bridge/DelayBufferTypes.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IBridge.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IDelayedMessageProvider.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IInbox.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IInboxBase.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/IOwnable.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/ISequencerInbox.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/bridge/Messages.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/nitro-contracts/main/src/libraries/IGasRefunder.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/ECDSA.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/EfficientHashLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/SafeTransferLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/SignatureCheckerLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/Checkpointer.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/CredentialManager.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/DepositVault.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/Registry.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IAdminUpdateStrategy.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IAtomicSettlementCallback.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IAutomataDcapAttestation.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/ICheckpointer.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/ICredentialManager.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IDepositVault.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IRegistry.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/strategies/ArbitrumOneAdminUpdateStrategy.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/strategies/IntraChainAdminUpdateStrategy.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/strategies/OPStackAdminUpdateStrategy.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]}},"remappings":["nitro-contracts=src/.cache/nitro-contracts/main/src","solady=src/.cache/solady/main/src"],"viaIR":true},"version":"0.8.30+commit.73712a01"}],"contractTypes":{"ArbitrumOneAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"InsufficientMsgValue","type":"error"},{"inputs":[],"name":"INBOX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"ArbitrumOneAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x608080604052346015576102a4908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c8063075034ae146100615763b70106971461002f575f80fd5b3461005d575f36600319011261005d576020604051734dbd4fc535ac27206064b68ffcf827b0a60bab3f8152f35b5f80fd5b606036600319011261005d576004356001600160a01b0381169081900361005d5760243567ffffffffffffffff811161005d573660238201121561005d5780600401359167ffffffffffffffff831161005d573660248460051b8401011161005d57667c585087238000341061021a576040519160208301936323c5673160e01b8552806064850160406024870152526024608485019201905f905b8082106101f0578660208761012488610127838a604435604483015203601f198101855284610238565b604051948593849263679b6ded60e01b845260048401525f602484015266470de4df8200006044840152336064840152336084840152622dc6c060a484015264012a05f20060c484015261010060e4840152518091816101048501528484015e5f828201840152601f01601f1916810103018134734dbd4fc535ac27206064b68ffcf827b0a60bab3f5af180156101e5576101be57005b602090813d83116101de575b6101d48183610238565b8101031261005d57005b503d6101ca565b6040513d5f823e3d90fd5b90919283359060018060a01b03821680920361005d576020816001938293520194019201906100fd565b631f2dda7760e21b5f5234600452667c58508723800060245260445ffd5b90601f8019910116810190811067ffffffffffffffff82111761025a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a0cf18539bc390feb28cfdf16a27fe0da61073e697506455cb8f013889eda9fa64736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{"setAdministrators(address,address[],uint256)":{"details":"This function forwards a cross-chain call to the target `vault` using Arbitrum's retryable ticket mechanism. The credential manager must supply sufficient `msg.value` to cover the maximum submission cost and gas fees for execution on the destination chain.Reverts with {InsufficientMsgValue} if `msg.value` is less than `MAX_SUBMISSION_COST + GAS_LIMIT * MAX_FEE_PER_GAS`.","params":{"newAdministrators":"The complete list of administrator addresses to set on the vault.","newWithdrawalQuorum":"The new quorum required for withdrawals.","vault":"The address of the vault contract whose administrators will be updated."}}},"version":1},"methodIdentifiers":{"INBOX()":"0xb7010697","setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c8063075034ae146100615763b70106971461002f575f80fd5b3461005d575f36600319011261005d576020604051734dbd4fc535ac27206064b68ffcf827b0a60bab3f8152f35b5f80fd5b606036600319011261005d576004356001600160a01b0381169081900361005d5760243567ffffffffffffffff811161005d573660238201121561005d5780600401359167ffffffffffffffff831161005d573660248460051b8401011161005d57667c585087238000341061021a576040519160208301936323c5673160e01b8552806064850160406024870152526024608485019201905f905b8082106101f0578660208761012488610127838a604435604483015203601f198101855284610238565b604051948593849263679b6ded60e01b845260048401525f602484015266470de4df8200006044840152336064840152336084840152622dc6c060a484015264012a05f20060c484015261010060e4840152518091816101048501528484015e5f828201840152601f01601f1916810103018134734dbd4fc535ac27206064b68ffcf827b0a60bab3f5af180156101e5576101be57005b602090813d83116101de575b6101d48183610238565b8101031261005d57005b503d6101ca565b6040513d5f823e3d90fd5b90919283359060018060a01b03821680920361005d576020816001938293520194019201906100fd565b631f2dda7760e21b5f5234600452667c58508723800060245260445ffd5b90601f8019910116810190811067ffffffffffffffff82111761025a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a0cf18539bc390feb28cfdf16a27fe0da61073e697506455cb8f013889eda9fa64736f6c634300081e0033"},"sourceId":"src/strategies/ArbitrumOneAdminUpdateStrategy.sol","sourcemap":"257:2167:24:-:0;;;;;;;;;;;;;;;;;","userdoc":{"errors":{"InsufficientMsgValue(uint256,uint256)":[{"notice":"Reverts if not enough value was sent to the update method."}]},"kind":"user","methods":{"setAdministrators(address,address[],uint256)":{"notice":"Updates the administrator set and withdrawal quorum on a vault via a retryable ticket."}},"version":1}},"Checkpointer":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadySet","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCouncilMultisig","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"name":"Withdrawals","type":"event"},{"inputs":[],"name":"CHECKPOINT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sharedSignature","type":"bytes"},{"internalType":"bytes","name":"leaderSignature","type":"bytes"},{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8[]","name":"stateRoot","type":"uint8[]"},{"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"internalType":"struct Checkpointer.Checkpoint","name":"_checkpoint","type":"tuple"}],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"councilMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setInitialCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"}],"name":"setLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setNewCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stateRoot","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateRootNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"Checkpointer","deploymentBytecode":{"bytecode":"0x608080604052346026575f80546001600160a01b03191633179055610b3e908161002b8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816307ddaf53146108be575080633ea987d31461086657806340eedabb1461083e5780634331e8dd146107ea5780635fa993b214610792578063704b6c02146107455780637438b937146106f657806374ebc7a0146106d95780638bbb26a314610150578063cc2fc84514610105578063e1193e4c146100cb5763f851a440146100a0575f80fd5b346100c7575f3660031901126100c7575f546040516001600160a01b039091168152602090f35b5f80fd5b346100c7575f3660031901126100c75760206040517ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d88152f35b346100c75760203660031901126100c7576004356005548110156100c75760209060055f5260ff8160051c5f516020610ae95f395f51905f52015460f86040519360031b161c168152f35b346100c75760603660031901126100c75760043567ffffffffffffffff81116100c7576101819036906004016108e1565b60243567ffffffffffffffff81116100c7576101a19036906004016108e1565b906044359267ffffffffffffffff84116100c7578360040191606060031986360301126100c757823593600354918286036100c75760248701916101e5838761090f565b906040519060208201928391905f905b8082106106b45750505090610216816044949303601f198101835282610945565b519020980194610226868861090f565b610232819c929c610967565b9b6102406040519d8e610945565b818d5260208d019160051b8101903682116100c75780925b82841061067757505050508a51986102886102728b610967565b9a6102806040519c8d610945565b808c52610967565b60208b019b90601f1901368d375f5b8d518110156102c857808c8f826102b36001956102c1936109d3565b5160208151910120926109d3565b5201610297565b506040518b5160208201919082908f905f5b81811061066157505050918161030361039f97959361039999979503601f198101835282610945565b5190206040519160208301937ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d885526040840152606083015260808201526080815261035060a082610945565b5190206004549060405190602082019261190160f01b84526022830152604282015260428152610381606282610945565b51902093849160018060a01b035f541693369161097f565b916109fb565b15610652576103996103be9360018060a01b036001541693369161097f565b15610652575f19821461063e5760016103db92016003558361090f565b929067ffffffffffffffff841161062a5768010000000000000000841161062a57600554846005558085106105a0575b509260055f528060051c5f5b81811061055e5750601f1982169091039081610500575b505061043a925061090f565b906040519082602083016020845252604082019060408460051b84010193815f90601e19813603015b838310610492577fef889901cd5d865c829bdf171647f02f76efbce3c0cba77197094981f41a727c87890388a1005b909192939496603f198782030188528535828112156100c7578301906020823592019167ffffffffffffffff81116100c75780360383136100c7576020828280600196849695859652848401375f828201840152601f01601f19160101999190910196019493019190610463565b5f9485925b80871061052a57505061043a94505f516020610ae95f395f51905f520155838061042e565b909260206105536001928961053e886109c5565b919060ff809160031b9316831b921b19161790565b940196019590610505565b5f5f5b6020811061058357505f516020610ae95f395f51905f52820155600101610417565b969060206105976001928a61053e866109c5565b92019701610561565b601f80860160051c910160051c5f516020610ae95f395f51905f520190601f8616806105f0575b505f516020610ae95f395f51905f52015b8181106105e5575061040b565b5f81556001016105d8565b7f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3daf8201908154905f199060200360031b1c169055866105c7565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b638baa579f60e01b5f5260045ffd5b82518452602093840193909201916001016102da565b833567ffffffffffffffff81116100c757820136601f820112156100c7576020916106a983923690848135910161097f565b815201930192610258565b90919283359060ff82168092036100c7576020816001938293520194019201906101f5565b346100c7575f3660031901126100c7576020600354604051908152f35b346100c75760203660031901126100c7575f546001600160a01b031633036107365760045461072757600480359055005b63a741a04560e01b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03811633036107365781156100c7576001600160a01b031916175f55005b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b03811633036107db576001600160a01b03191617600255005b638d62b6d960e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b031633036107db576bffffffffffffffffffffffff60a01b60015416176001555f80f35b346100c7575f3660031901126100c7576001546040516001600160a01b039091168152602090f35b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03163303610736576002546001600160a01b038116610727576001600160a01b03191617600255005b346100c7575f3660031901126100c7576002546001600160a01b03168152602090f35b9181601f840112156100c75782359167ffffffffffffffff83116100c757602083818601950101116100c757565b903590601e19813603018212156100c7570180359067ffffffffffffffff82116100c757602001918160051b360383136100c757565b90601f8019910116810190811067ffffffffffffffff82111761062a57604052565b67ffffffffffffffff811161062a5760051b60200190565b92919267ffffffffffffffff821161062a57604051916109a9601f8201601f191660200184610945565b8294818452818301116100c7578281602093845f960137010152565b3560ff811681036100c75790565b80518210156109e75760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b90915f91906001600160a01b03821615610ae05760405192600484019460248501956044860192853b15610a6457509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b979650509050815180604014610abb57604114610a815750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052610a99565b505050505f9056fe036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0a26469706673582212208508d5e21daf774af722d307fef557b7ea7450df289e6a598466b060935405c764736f6c634300081e0033"},"devdoc":{"details":"Designed for use in DStack-like distributed settlement systems.","events":{"Withdrawals(string[])":{"params":{"approvedWithdrawals":"List of withdrawal IDs approved in the checkpoint."}}},"kind":"dev","methods":{"checkpoint(bytes,bytes,(uint256,uint8[],string[]))":{"details":"Requires valid EIP-712 signatures from both admin and leader.","params":{"_checkpoint":"The checkpoint payload to commit.","leaderSignature":"Signature by the leader.","sharedSignature":"Signature by the admin."}},"constructor":{"details":"Sets the deployer as the initial admin."},"setAdmin(address)":{"params":{"newAdmin":"The new admin address."}},"setDomainSeparator(bytes32)":{"params":{"domainSeparator":"The domain separator to store."}},"setInitialCouncilMultisig(address)":{"params":{"newCouncilMultisig":"The council's Gnosis Safe address."}},"setLeader(address)":{"details":"This should be reviewed depending on the leader rotation mechanism.","params":{"newLeader":"The address of the new leader node."}},"setNewCouncilMultisig(address)":{"params":{"newCouncilMultisig":"The new multisig address."}}},"stateVariables":{"admin":{"details":"Should be set to the DStack app shared secret public key."},"councilMultisig":{"details":"Can rotate the leader and self."},"leader":{"details":"Leader is responsible for signing and submitting new checkpoints."},"stateRoot":{"details":"Serialized as `(user, eth_balance, usdc_balance, deposit_nonce, is_mm)` tuples. In production, this may store multiple roots and rotate."},"stateRootNonce":{"details":"Used to prevent replay attacks and enforce checkpoint ordering."}},"title":"Checkpointer","version":1},"methodIdentifiers":{"CHECKPOINT_TYPEHASH()":"0xe1193e4c","admin()":"0xf851a440","checkpoint(bytes,bytes,(uint256,uint8[],string[]))":"0x8bbb26a3","councilMultisig()":"0x07ddaf53","leader()":"0x40eedabb","setAdmin(address)":"0x704b6c02","setDomainSeparator(bytes32)":"0x7438b937","setInitialCouncilMultisig(address)":"0x3ea987d3","setLeader(address)":"0x4331e8dd","setNewCouncilMultisig(address)":"0x5fa993b2","stateRoot(uint256)":"0xcc2fc845","stateRootNonce()":"0x74ebc7a0"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816307ddaf53146108be575080633ea987d31461086657806340eedabb1461083e5780634331e8dd146107ea5780635fa993b214610792578063704b6c02146107455780637438b937146106f657806374ebc7a0146106d95780638bbb26a314610150578063cc2fc84514610105578063e1193e4c146100cb5763f851a440146100a0575f80fd5b346100c7575f3660031901126100c7575f546040516001600160a01b039091168152602090f35b5f80fd5b346100c7575f3660031901126100c75760206040517ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d88152f35b346100c75760203660031901126100c7576004356005548110156100c75760209060055f5260ff8160051c5f516020610ae95f395f51905f52015460f86040519360031b161c168152f35b346100c75760603660031901126100c75760043567ffffffffffffffff81116100c7576101819036906004016108e1565b60243567ffffffffffffffff81116100c7576101a19036906004016108e1565b906044359267ffffffffffffffff84116100c7578360040191606060031986360301126100c757823593600354918286036100c75760248701916101e5838761090f565b906040519060208201928391905f905b8082106106b45750505090610216816044949303601f198101835282610945565b519020980194610226868861090f565b610232819c929c610967565b9b6102406040519d8e610945565b818d5260208d019160051b8101903682116100c75780925b82841061067757505050508a51986102886102728b610967565b9a6102806040519c8d610945565b808c52610967565b60208b019b90601f1901368d375f5b8d518110156102c857808c8f826102b36001956102c1936109d3565b5160208151910120926109d3565b5201610297565b506040518b5160208201919082908f905f5b81811061066157505050918161030361039f97959361039999979503601f198101835282610945565b5190206040519160208301937ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d885526040840152606083015260808201526080815261035060a082610945565b5190206004549060405190602082019261190160f01b84526022830152604282015260428152610381606282610945565b51902093849160018060a01b035f541693369161097f565b916109fb565b15610652576103996103be9360018060a01b036001541693369161097f565b15610652575f19821461063e5760016103db92016003558361090f565b929067ffffffffffffffff841161062a5768010000000000000000841161062a57600554846005558085106105a0575b509260055f528060051c5f5b81811061055e5750601f1982169091039081610500575b505061043a925061090f565b906040519082602083016020845252604082019060408460051b84010193815f90601e19813603015b838310610492577fef889901cd5d865c829bdf171647f02f76efbce3c0cba77197094981f41a727c87890388a1005b909192939496603f198782030188528535828112156100c7578301906020823592019167ffffffffffffffff81116100c75780360383136100c7576020828280600196849695859652848401375f828201840152601f01601f19160101999190910196019493019190610463565b5f9485925b80871061052a57505061043a94505f516020610ae95f395f51905f520155838061042e565b909260206105536001928961053e886109c5565b919060ff809160031b9316831b921b19161790565b940196019590610505565b5f5f5b6020811061058357505f516020610ae95f395f51905f52820155600101610417565b969060206105976001928a61053e866109c5565b92019701610561565b601f80860160051c910160051c5f516020610ae95f395f51905f520190601f8616806105f0575b505f516020610ae95f395f51905f52015b8181106105e5575061040b565b5f81556001016105d8565b7f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3daf8201908154905f199060200360031b1c169055866105c7565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b638baa579f60e01b5f5260045ffd5b82518452602093840193909201916001016102da565b833567ffffffffffffffff81116100c757820136601f820112156100c7576020916106a983923690848135910161097f565b815201930192610258565b90919283359060ff82168092036100c7576020816001938293520194019201906101f5565b346100c7575f3660031901126100c7576020600354604051908152f35b346100c75760203660031901126100c7575f546001600160a01b031633036107365760045461072757600480359055005b63a741a04560e01b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03811633036107365781156100c7576001600160a01b031916175f55005b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b03811633036107db576001600160a01b03191617600255005b638d62b6d960e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b031633036107db576bffffffffffffffffffffffff60a01b60015416176001555f80f35b346100c7575f3660031901126100c7576001546040516001600160a01b039091168152602090f35b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03163303610736576002546001600160a01b038116610727576001600160a01b03191617600255005b346100c7575f3660031901126100c7576002546001600160a01b03168152602090f35b9181601f840112156100c75782359167ffffffffffffffff83116100c757602083818601950101116100c757565b903590601e19813603018212156100c7570180359067ffffffffffffffff82116100c757602001918160051b360383136100c757565b90601f8019910116810190811067ffffffffffffffff82111761062a57604052565b67ffffffffffffffff811161062a5760051b60200190565b92919267ffffffffffffffff821161062a57604051916109a9601f8201601f191660200184610945565b8294818452818301116100c7578281602093845f960137010152565b3560ff811681036100c75790565b80518210156109e75760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b90915f91906001600160a01b03821615610ae05760405192600484019460248501956044860192853b15610a6457509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b979650509050815180604014610abb57604114610a815750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052610a99565b505050505f9056fe036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0a26469706673582212208508d5e21daf774af722d307fef557b7ea7450df289e6a598466b060935405c764736f6c634300081e0033"},"sourceId":"src/Checkpointer.sol","sourcemap":"413:6397:13:-:0;;;;;;;2546:18;413:6397;;-1:-1:-1;;;;;;413:6397:13;2554:10;413:6397;;;;;;;;;;;;;","userdoc":{"errors":{"AlreadySet()":[{"notice":"Reverts if a value has already been set."}],"InvalidSignature()":[{"notice":"Reverts if a signature does not match the expected signer or payload."}],"NotAdmin()":[{"notice":"Reverts if caller is not the admin."}],"NotCouncilMultisig()":[{"notice":"Reverts if caller is not the current council multisig."}]},"events":{"Withdrawals(string[])":{"notice":"Emitted when a new list of approved withdrawals is recorded in a checkpoint."}},"kind":"user","methods":{"CHECKPOINT_TYPEHASH()":{"notice":"Typehash used for EIP-712 encoding of the Checkpoint struct."},"admin()":{"notice":"Address with the authority to set initial parameters."},"checkpoint(bytes,bytes,(uint256,uint8[],string[]))":{"notice":"Checkpoint submitted by a node to update the system state."},"constructor":{"notice":"Contract constructor."},"councilMultisig()":{"notice":"Gnosis Safe address used as the council multisig."},"leader()":{"notice":"Public key of the current designated leader node."},"setAdmin(address)":{"notice":"Transfers admin control to a new address."},"setDomainSeparator(bytes32)":{"notice":"Sets the EIP-712 domain separator used for verifying signatures."},"setInitialCouncilMultisig(address)":{"notice":"Sets the initial council multisig address."},"setLeader(address)":{"notice":"Sets the leader node address."},"setNewCouncilMultisig(address)":{"notice":"Allows the current council to rotate itself to a new address."},"stateRoot(uint256)":{"notice":"The current state root, encoded as a serialized vector."},"stateRootNonce()":{"notice":"Monotonically increasing nonce for checkpoint submissions."}},"notice":"Tracks and validates state root checkpoints using EIP-712 signatures from admin and leader nodes.","version":1}},"CredentialManager":{"abi":[{"inputs":[{"internalType":"address[]","name":"initialOperators","type":"address[]"},{"internalType":"uint256","name":"initialCommitteeThreshold","type":"uint256"},{"internalType":"address","name":"initialRiskManager","type":"address"},{"internalType":"address","name":"initialRegistryContract","type":"address"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct CredentialManager.MeasurementProfile[]","name":"initialMeasurements","type":"tuple[]"},{"internalType":"address","name":"initialAutomataVerifier","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmbiguousState","type":"error"},{"inputs":[],"name":"CannotCancel","type":"error"},{"inputs":[],"name":"GatheringActive","type":"error"},{"inputs":[],"name":"GatheringNotActive","type":"error"},{"inputs":[],"name":"GatheringNotExpired","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientSignatures","type":"error"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"},{"internalType":"uint256","name":"operatorCount","type":"uint256"}],"name":"InvalidCommitteeThreshold","type":"error"},{"inputs":[{"internalType":"uint256","name":"delay","type":"uint256"}],"name":"InvalidDelay","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InvalidEpoch","type":"error"},{"inputs":[],"name":"InvalidProfileConfig","type":"error"},{"inputs":[],"name":"InvalidProfileId","type":"error"},{"inputs":[],"name":"InvalidQuoteLength","type":"error"},{"inputs":[],"name":"InvalidReportData","type":"error"},{"inputs":[],"name":"InvalidVaultAddr","type":"error"},{"inputs":[],"name":"InvalidVerifier","type":"error"},{"inputs":[],"name":"InvalidZkProof","type":"error"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"},{"internalType":"string","name":"field","type":"string"}],"name":"MeasurementMismatch","type":"error"},{"inputs":[],"name":"NoCandidate","type":"error"},{"inputs":[],"name":"NoStrategy","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"NotOperator","type":"error"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"}],"name":"ProfileInactive","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"proposed","type":"uint256"}],"name":"ProposedEpochTooLow","type":"error"},{"inputs":[],"name":"SignersNotSortedOrUnique","type":"error"},{"inputs":[],"name":"StrategyAlreadyExists","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyCanceled","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyExecuted","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"uint256","name":"readyAt","type":"uint256"},{"internalType":"uint256","name":"nowTs","type":"uint256"}],"name":"TimelockNotReady","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockUnknown","type":"error"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"}],"name":"VaultNotFound","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"}],"name":"AdminUpdateStrategyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"AttestedKeyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldVerifier","type":"address"},{"indexed":true,"internalType":"address","name":"newVerifier","type":"address"}],"name":"AutomataVerifierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"CommitteeThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newEpoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newCheckpointHash","type":"bytes32"}],"name":"EpochIncremented","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"LeaderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"profileId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"MeasurementProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"newMrtd","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newRtmr0","type":"bytes32"}],"name":"MeasurementsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"OperationScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRegistry","type":"address"},{"indexed":true,"internalType":"address","name":"newRegistry","type":"address"}],"name":"RegistryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash1","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash2","type":"bytes32"}],"name":"RestartAmbiguityDetected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"leader","type":"address"},{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"RestartCandidateSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"RestartExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"RestartGatheringStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRiskManager","type":"address"},{"indexed":true,"internalType":"address","name":"newRiskManager","type":"address"}],"name":"RiskManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"targetOpType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"oldDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"TimelockDelayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"indexed":false,"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"}],"name":"VaultAdded","type":"event"},{"inputs":[],"name":"GATHERING_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_ADD_VAULT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_APPOINT_LEADER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_CANCEL_TIMELOCK","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_MANAGE_PROFILE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_REGISTER_STRATEGY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_RESTART","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_AUTOMATA_VERIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_COMMITTEE_THRESHOLD","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_DELAY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_MEASUREMENTS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_REGISTRY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_RISK_MANAGER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_VAULT_ADMINS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_WITHDRAW","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"addVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"adminUpdateStrategies","outputs":[{"internalType":"contract IAdminUpdateStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"appointLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"automataVerifier","outputs":[{"internalType":"contract IAutomataDcapAttestation","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bestCandidate","outputs":[{"internalType":"address","name":"leader","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"cancelTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"committeeThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct CredentialManager.MeasurementProfile","name":"profile","type":"tuple"}],"name":"executeManageProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"}],"name":"executeRegistryContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"}],"name":"executeRiskManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"}],"name":"executeUpdateAutomataVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCommitteeConfig","outputs":[{"internalType":"address[]","name":"members","type":"address[]"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeader","outputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"attestedKey","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getVaults","outputs":[{"components":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"}],"internalType":"struct CredentialManager.Vault[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initiateRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRestartAmbiguous","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestCheckpointHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"measurementProfiles","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProfileId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operatorToAttestedKey","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"operators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"contract IAdminUpdateStrategy","name":"strategy","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"registerAdminUpdateStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"registerAttestedKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registryContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resolveRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restartGatheringDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct CredentialManager.MeasurementProfile","name":"profile","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleManageProfile","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRegistryContract","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRiskManager","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleUpdateAutomataVerifier","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setDepositVaultAdministrators","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"internalType":"bytes","name":"tdxReportBody","type":"bytes"},{"internalType":"bytes","name":"zkProof","type":"bytes"},{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"submitRestartProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockDelayFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockOps","outputs":[{"internalType":"uint64","name":"eta","type":"uint64"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"bytes32","name":"opType","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"updateCommitteeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaults","outputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"contractName":"CredentialManager","deploymentBytecode":{"bytecode":"0x6080604052346105515761479d803803806100198161056d565b92833981019060c0818303126105515780516001600160401b0381116105515781019082601f830112156105515781519161005b61005684610592565b61056d565b9260208085838152019160051b8301019185831161055157602001905b828210610555575050506020810151610093604083016105a9565b926100a0606084016105a9565b60808401519093906001600160401b03811161055157810186601f82011215610551578051906100d261005683610592565b97602060c0818b8681520194028301019181831161055157602001925b8284106104db575050505060a061010691016105a9565b6001600e555f80546001600160a01b03191633179055936001600160a01b0316928315610495576001600160a01b031693841561049557601180546001600160a01b0319166001600160a01b039290921691909117905580519081156104c457821580156104bb575b6104a4575f5b82811061038f575050506040817f7015cf739f6bedf8447b0723aac5b7e28cc2e5551b144f8bb715b9c29768237f926003558151905f82526020820152a160018060a01b0319600954161760095560018060a01b0319600a541617600a556001600e555f5b81518110156102c2576101ed81836105bd565b519081511515806102b6575b6102a757602091600e545f52600d835260405f20600560a0835115159360ff1984541660ff861617845586810151600185015560408101516002850155606081015160038501556080810151600485015501519101557faa1bacadd202709f2df9c31faf4babdbb21a245021c22298bfcdf22861ca12c6600e54938492604051908152a25f198214610293576001809201600e55016101da565b634e487b7160e01b5f52601160045260245ffd5b637262f58f60e01b5f5260045ffd5b506020820151156101f9565b600b6020526202a3007ffc320c8b7cd913048d0600d8f8fbdd9fd65e3dee2c1f3796e3abba8cc47fa047556203f4807f5248b41ce7bdc12ebe0248f44130be972d690f78fe7dbe1a76d984641d9dcfc25562093a807f9b6d9405e2a268edd94615fe7f07c0d5d9dda2152c2e48f4e74379972af1c6188190557fa24d58aaa8deed8b2ff0e63d867e6fe155de046522ed61849f5647e59d04b6ba5f527f8de415b97204654c888cc41215aeac0a76fba4f899a3e239bdee8aedbbab23ef556040516141cb90816105d28239f35b6001600160a01b036103a182846105bd565b511690811561049557815f52600260205260ff60405f20541661048657815f52600260205260405f20600160ff19825416179055600154916801000000000000000083101561047257600183018060015583101561045e5760015f8181527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690940180546001600160a01b03191683179055927fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d9080a201610175565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b630da1c57360e41b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b50906311dcbf3760e31b5f5260045260245260445ffd5b5081831161016f565b826311dcbf3760e31b5f526004525f60245260445ffd5b60c084830312610551576040519060c082016001600160401b03811183821017610472576040528451908115158203610551578260209260c09452828701518382015260408701516040820152606087015160608201526080870151608082015260a087015160a08201528152019301926100ef565b5f80fd5b60208091610562846105a9565b815201910190610078565b6040519190601f01601f191682016001600160401b0381118382101761047257604052565b6001600160401b0381116104725760051b60200190565b51906001600160a01b038216820361055157565b805182101561045e5760209160051b01019056fe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80631276bcc5146103c9578063127f49ad146103c45780631ac4d079146103bf5780631bc12e07146103ba57806324242e77146103b557806326ddc1ba146103b05780632808e92f146103ab578063280cd09d146103a6578063281cbdd4146103a157806328c1f99b1461039c5780632d4ab28d1461039757806331709520146103925780633174b7271461038d578063333bef221461038857806335cfd9eb1461038357806340eedabb1461037e57806347842663146103795780634c051f14146103745780634dd0a0c91461036f5780634e970c8c1461036a57806359d63bcc146103655780635c1ff1f2146103605780635cc791441461035b5780635d3ae390146103565780635f250f69146103515780636583c37a1461034c578063669f6f35146103475780636d70f7ae146103425780636dfb32aa1461033d5780637f0152a81461033857806381392328146103335780638c64ea4a1461032e5780639005474214610329578063900cf0cf1461032457806395c825591461031f5780639d3e015a1461031a5780639ebc068e146103155780639fd7285c14610310578063a6aac5131461030b578063acfacc8614610306578063ae5c8bfb14610301578063b34eb182146102fc578063b5ed8b12146102f7578063b7635fb8146102f2578063be223838146102ed578063c7d06b54146102e8578063cd1d81ff146102e3578063ce0b1302146102de578063d8a0bebf146102d9578063d9be832c146102d4578063e0913aff146102cf578063e28d4906146102ca578063f5b68c67146102c5578063f698da25146102c0578063f851a440146102bb578063fb834493146102b6578063fc0e2ba7146102b1578063fdeabe1f146102ac5763fe5e82400361000e57611f8e565b611e8b565b611e51565b611e27565b611e00565b611dde565b611db7565b611d5d565b611d23565b611d06565b611ccc565b611c5d565b611c13565b611b39565b611ac3565b611a9c565b6119b3565b611996565b6118b4565b6117de565b6117b1565b6116dc565b611591565b611458565b6113f2565b6113d5565b61139b565b6112f9565b611164565b6110eb565b611028565b610fe8565b610fa5565b610f6b565b610f31565b610d89565b610ce1565b610ca7565b610bb6565b610b7c565b610b5f565b610b2a565b610b02565b610ada565b6109a5565b61096b565b61092b565b6108d2565b6108ab565b610883565b61079a565b610772565b610619565b610551565b61047f565b610458565b61041d565b6103ef565b346103eb575f3660031901126103eb57602060ff601754166040519015158152f35b5f80fd5b346103eb575f3660031901126103eb576020601254604051908152f35b6001600160a01b038116036103eb57565b346103eb5760203660031901126103eb5760043561043a8161040c565b60018060a01b03165f526005602052602060405f2054604051908152f35b346103eb575f3660031901126103eb5760206040515f5160206141765f395f51905f528152f35b346103eb5760203660031901126103eb5760043561049c8161040c565b6001600160a01b038116908115610542575f5160206141765f395f51905f526104e06040516020810190858252602081526104d860408261127b565b519020612d59565b6104e981612e65565b600a80546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141365f395f51905f525f80a37f482b97c53e48ffa324a976e2738053e9aff6eee04d8aac63b10e19411d869b825f80a3005b63d92e233d60e01b5f5260045ffd5b346103eb575f3660031901126103eb5760206040517f3f98d537f24f3ae50e4a30e12fbf3e5c35cf6f40f4ce125c82c1b88e3e7cf3df8152f35b9181601f840112156103eb578235916001600160401b0383116103eb576020808501948460051b0101116103eb57565b9060606003198301126103eb576004356105d48161040c565b916024356001600160401b0381116103eb57816105f39160040161058b565b92909291604435906001600160401b0382116103eb576106159160040161058b565b9091565b346103eb57610627366105bb565b91936001600160a01b031691908215610542576106789461066593604051602081019182526020815261065b60408261127b565b5190209485612f93565b5f5160206141165f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141165f395f51905f525f52600b6020527ffc320c8b7cd913048d0600d8f8fbdd9fd65e3dee2c1f3796e3abba8cc47fa0475491821561074c57815f5160206140f65f395f51905f526107415f5160206141165f395f51905f529384600161070e61070260209a42612045565b6001600160401b031690565b835469ffffffffffffffffffff19166001600160401b039190911690811784559201556040519081529081906020820190565b0390a3604051908152f35b6309913ab360e31b5f52600483905260245ffd5b633599e08d60e21b5f5260045260245ffd5b346103eb575f3660031901126103eb576011546040516001600160a01b039091168152602090f35b346103eb576107a8366105bb565b91936001600160a01b031691908215610542576107f9946107e69360405160208101918252602081526107dc60408261127b565b519020948561310c565b5f5160206141565f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141565f395f51905f525f52600b6020527f5585c2bd0ffb4796fa70abc2a0b1f92173aa4b9f7e1b37d256fd2a975c5abcfa5491821561074c57815f5160206140f65f395f51905f526107415f5160206141565f395f51905f529384600161070e61070260209a42612045565b346103eb575f3660031901126103eb57600a546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb5760206040515f5160206141565f395f51905f528152f35b346103eb5760203660031901126103eb576004355f52600c602052608060405f206001815491015460ff604051926001600160401b0381168452818160401c161515602085015260481c16151560408301526060820152f35b346103eb5760403660031901126103eb57600435602435905f52600860205260405f20905f52602052602060018060a01b0360405f205416604051908152f35b346103eb575f3660031901126103eb5760206040517f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd8152f35b346103eb575f3660031901126103eb576012548015610acb57421115610abc576109d86109d460165460ff1690565b1590565b610aad5760175460ff16610a9e57601354610a00906001600160a01b0316613b49565b613b49565b610a0b601554601055565b610a16601454600f55565b610a1f5f601255565b610a345f6013555f6014555f6015555f601655565b600f546010546040805183815260208101929092527f88cac99f10d8167541407023871a1cc0d797dc75e5b23f3f9f54aaf445f5602c91a16006546001600160a01b03167fd7936f419066f72741af39dde15237d9aed55a0d1d9ab0cb3280569b42c3d8f35f80a3005b6363f5b90b60e11b5f5260045ffd5b63dcd4760160e01b5f5260045ffd5b63285f264160e21b5f5260045ffd5b63cbd2c74d60e01b5f5260045ffd5b346103eb575f3660031901126103eb576006546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb576009546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb57604060018060a01b0360065416805f526005602052815f205482519182526020820152f35b346103eb575f3660031901126103eb576020600354604051908152f35b346103eb575f3660031901126103eb5760206040517f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f8152f35b346103eb5760603660031901126103eb576004356024356001600160401b0381116103eb57610be990369060040161058b565b906044356001600160401b0381116103eb57610c0990369060040161058b565b92909184158015610c9c575b610c8257917f7015cf739f6bedf8447b0723aac5b7e28cc2e5551b144f8bb715b9c29768237f949391610c6493604051602081019087825260208152610c5c60408261127b565b51902061320f565b600354610c7082600355565b604080519182526020820192909252a1005b84600154906311dcbf3760e31b5f5260045260245260445ffd5b506001548511610c15565b346103eb575f3660031901126103eb5760206040517fac5d643ec5a18c3c05126c0540540c01e724afd2beab02a045f0f5d791103a158152f35b346103eb575f3660031901126103eb576012544210610d5c57610e104201804211610d5757601255610d1e5f6013555f6014555f6015555f601655565b60ff19601754166017557f3d364c9a6ad0fb8014a11c487ec342f3a0aaf1a55973fc1bb7353ab6824a358f6020601254604051908152a1005b612031565b6301fd8f7b60e41b5f5260045ffd5b6004359060ff821682036103eb57565b359060ff821682036103eb57565b346103eb5760a03660031901126103eb57610da2610d6b565b60243590604435610db28161040c565b6064356001600160401b0381116103eb57610dd190369060040161058b565b9190926084356001600160401b0381116103eb57610df390369060040161058b565b6001600160a01b038416959094919390861561054257610e51610e45610e45610e388b610e2b8960ff165f52600860205260405f2090565b905f5260205260405f2090565b546001600160a01b031690565b6001600160a01b031690565b610f22576040805160ff868116602083019081529282018b90526001600160a01b038a1660608301527f0f05f8598640816bc7963f9e84995cc362736f66a37eaca8293048e25aed4067989097610f0596610ecd959294919390929190610ec581608081015b03601f19810183528261127b565b519020613325565b610ee687610e2b8560ff165f52600860205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b6040516001600160a01b039094168452169180602081015b0390a3005b63c45546f760e01b5f5260045ffd5b346103eb575f3660031901126103eb5760206040517f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d938152f35b346103eb575f3660031901126103eb5760206040517f8b6e6eebcf1e5aa625df96285186591a18b47d82a0e5344612aba13e51bc0e6f8152f35b346103eb575f3660031901126103eb57608060018060a01b036013541660145460155460ff60165416916040519384526020840152604083015215156060820152f35b346103eb5760203660031901126103eb576004356110058161040c565b60018060a01b03165f526002602052602060ff60405f2054166040519015158152f35b346103eb5760203660031901126103eb576004356110458161040c565b6001600160a01b038116908115610542575f5160206141165f395f51905f5261108960405160208101908582526020815261108160408261127b565b519020612d91565b61109281612e65565b600980546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141365f395f51905f525f80a37f62e09f04681da780308095cdff046660f0b1e396888312a767499401693c03e55f80a3005b346103eb5760203660031901126103eb57600435335f52600260205260ff60405f2054161561115157801561054257335f8181526005602052604081208390557fe58dd23bcf790de89fbc05578bcc206ece8cb67dee1cf099fce6ff74d052ff3e9080a3005b633b63649d60e11b5f523360045260245ffd5b346103eb576101403660031901126103eb5761117e610d6b565b6024356044359160a03660631901126103eb57610104356001600160401b0381116103eb576111b190369060040161058b565b9061012435946001600160401b0386116103eb576111d661001896369060040161058b565b959094612254565b634e487b7160e01b5f52603260045260245ffd5b60075481101561120e5760075f5260205f209060021b01905f90565b6111de565b805482101561120e575f5260205f209060021b01905f90565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b0382111761125b57604052565b61122c565b608081019081106001600160401b0382111761125b57604052565b90601f801991011681019081106001600160401b0382111761125b57604052565b604051906112ab60808361127b565b565b906040516112ba81611240565b608060ff808395546001600160401b0381168552818160401c166020860152818160481c166040860152818160501c16606086015260581c1616910152565b346103eb5760203660031901126103eb576004356007548110156103eb57611323610100916111f2565b5061139960ff825416916001810154906113446003600283015492016112ad565b9160405194855260208501526040840152606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565bf35b346103eb575f3660031901126103eb5760206040517fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e628152f35b346103eb575f3660031901126103eb576020600f54604051908152f35b346103eb5760203660031901126103eb576004355f52600d60205260c060405f2060ff81541690600181015490600281015460038201549060056004840154930154936040519515158652602086015260408501526060840152608083015260a0820152f35b346103eb5760603660031901126103eb576004356024356001600160401b0381116103eb5761148b90369060040161058b565b604435916001600160401b0383116103eb576114ae6114d493369060040161058b565b92909160405160208101906114cc81610eb78a859190602083019252565b51902061343b565b6114e6815f52600c60205260405f2090565b80546001600160401b0381161561157d57604081901c60ff166115695760481c60ff1661155557805469ff0000000000000000001916690100000000000000000017815560010154907f4ef6805613a59a1bece0b99a00b945fffadc1bb793c7064706233d30fd438c765f80a3005b632863f91560e21b5f52600482905260245ffd5b633599e08d60e21b5f52600483905260245ffd5b633e426d5160e21b5f52600483905260245ffd5b60803660031901126103eb576024356004356044356001600160401b0381116103eb576115c290369060040161058b565b906064356115e2610e45610e3887610e2b885f52600860205260405f2090565b916001600160a01b038316156116ab575f547fc55043b6a137f66033384e3f6d9b80e72303eab38436f8fdb89899dc87ce53a29490611629906001600160a01b0316610e45565b3303611692575f611640611683938293369161232c565b93945b61164d8989613ca0565b60405161167181610eb78a8a60208401966303a81a5760e11b885260248501612382565b51915af461167d6123c7565b506123f6565b610f1d60405192839283612442565b50505061169d613bec565b6116835f8060035494611643565b635c7f4b4760e11b5f5260045ffd5b6004359061ffff821682036103eb57565b6024359061ffff821682036103eb57565b346103eb5760403660031901126103eb576117066116f86116ba565b6117006116cb565b906125d1565b6040518091602082016020835281518091526020604084019201905f5b818110611731575050500390f35b9193509160206101006001926117a36060885160ff81511684528581015186850152604081015160408501520151606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565b019401910191849392611723565b346103eb575f3660031901126103eb576020604051610e108152f35b60c09060231901126103eb57602490565b346103eb576101203660031901126103eb576004356117fc366117cd565b9060e4356001600160401b0381116103eb5761181c90369060040161058b565b92610104356001600160401b0381116103eb5761183d90369060040161058b565b90823561184981612689565b806118a8575b611899576118959561188595610eb76118766118809660405192839160208301958661269d565b5190209485613551565b613a99565b6040519081529081906020820190565b0390f35b63137ec6d760e11b5f5260045ffd5b5060208301351561184f565b346103eb5760e03660031901126103eb576004356118d1366117cd565b6118f360405160208101906118eb81610eb786888661269d565b519020612dc9565b906118fd82612e65565b821561197c575b7faa1bacadd202709f2df9c31faf4babdbb21a245021c22298bfcdf22861ca12c69161197761196c5f5160206140d65f395f51905f5293865f52600d6020526119508160405f206126ec565b6040519485945f5160206141365f395f51905f525f80a3612693565b151582526020820190565b0390a2005b9150600e545f198114610d575760018101600e5591611904565b346103eb575f3660031901126103eb576020601054604051908152f35b346103eb576119c1366105bb565b91936001600160a01b03169190821561054257611a12946119ff9360405160208101918252602081526119f560408261127b565b5190209485613654565b5f5160206141765f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141765f395f51905f525f52600b6020527f5248b41ce7bdc12ebe0248f44130be972d690f78fe7dbe1a76d984641d9dcfc25491821561074c57815f5160206140f65f395f51905f526107415f5160206141765f395f51905f529384600161070e61070260209a42612045565b346103eb575f3660031901126103eb5760206040515f5160206140d65f395f51905f528152f35b346103eb57611ad1366105bb565b92939091906001600160a01b03168015610542575f80808093611b198888888c476040516020810191888352604082015260408152611b1160608261127b565b519020613757565b4790828215611b30575bf115611b2b57005b61273a565b506108fc611b23565b346103eb5760203660031901126103eb57600435611b568161040c565b6001600160a01b0316801561054257611b8a604051602081019083825260208152611b8260408261127b565b519020612e01565b611b9381612e65565b6011545f5160206141565f395f51905f5290611bb7906001600160a01b0316610e45565b601180546001600160a01b0319166001600160a01b038616179055915f5160206141365f395f51905f525f80a36001600160a01b03167ff6879817b383066906e8355b81d5157ffe8bff151dd1946b33863aeede50ff985f80a3005b346103eb575f3660031901126103eb576020600e54604051908152f35b9181601f840112156103eb578235916001600160401b0383116103eb57602083818601950101116103eb57565b346103eb5760a03660031901126103eb576004356024356001600160401b0381116103eb57611c90903690600401611c30565b9190604435926001600160401b0384116103eb57611cb5610018943690600401611c30565b9160643593611cc38561040c565b6084359561292e565b346103eb575f3660031901126103eb5760206040517ffdc5f96508969628a00bce64abbf1ea989f16e791b70592a3122d67a7792e48c8152f35b346103eb575f3660031901126103eb576020600454604051908152f35b346103eb575f3660031901126103eb5760206040517fa24d58aaa8deed8b2ff0e63d867e6fe155de046522ed61849f5647e59d04b6ba8152f35b346103eb5760203660031901126103eb576004356001548110156103eb5760015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb5760206040515f5160206141165f395f51905f528152f35b346103eb575f3660031901126103eb576020611df8612cc1565b604051908152f35b346103eb575f3660031901126103eb575f546040516001600160a01b039091168152602090f35b346103eb5760203660031901126103eb576004355f52600b602052602060405f2054604051908152f35b346103eb575f3660031901126103eb5760206040517fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a813058152f35b346103eb57611e99366105bb565b6001600160a01b0385165f908152600260205260409020549294939290919060ff1615611f14576001600160a01b0384165f908152600560205260409020541561054257604080516001600160a01b03861660208201908152610018976109fb969093909290611f0c9082908101610eb7565b51902061386d565b633b63649d60e11b5f526001600160a01b03841660045260245ffd5b90602080835192838152019201905f5b818110611f4d5750505090565b82516001600160a01b0316845260209384019390920191600101611f40565b611f8460409295949395606083526060830190611f30565b9460208201520152565b346103eb575f3660031901126103eb5760035460015460405190602082828152019060015f52827fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65f5b838110611ffc575050611ff09061189593038461127b565b60405193849384611f6c565b81546001600160a01b0316855260209094019385925060019182019101611fd8565b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b91908201809211610d5757565b35906001600160401b03821682036103eb57565b60ff6120c2608080936001600160401b0361208082612052565b1686528361209060208301610d7b565b166020870152836120a360408301610d7b565b166040870152836120b660608301610d7b565b16606087015201610d7b565b16910152565b91908260a09103126103eb576040516120e081611240565b608061212c8183956120f181612052565b85526120ff60208201610d7b565b602086015261211060408201610d7b565b604086015261212160608201610d7b565b606086015201610d7b565b910152565b600754600160401b81101561125b5780600161215292016007556007611213565b9190916122395761221f6080606060036112ab9560ff86511660ff198254161781556020860151600182015560408601516002820155019301516121b66001600160401b0382511685906001600160401b03166001600160401b0319825416179055565b602081015184546121fa9160ff60401b1990911660409190911b68ff0000000000000000161760ff60408401511660ff60481b9060481b169060ff60481b19161790565b606082015160ff60501b1990911660509190911b60ff60501b16178455015160ff1690565b815460ff60581b191660589190911b60ff60581b16179055565b61201e565b90815260c0810192916112ab9160200190612066565b95929490958215611899576122cd606494612301937fdcd264bd7d6d022cfcd2ef488637c26dba3344acfaad38a093f1755fe21085f5976040519960208b0160ff87169b8c82528d60408201528960608201526122b4608082018c612066565b61010081526122c56101208261127b565b519020613983565b6122e16122d861129c565b60ff9092168252565b8660208201528260408201526122f736856120c8565b6060820152612131565b6123106040519283928361223e565b0390a3565b6001600160401b03811161125b5760051b60200190565b92919061233881612315565b93612346604051958661127b565b602085838152019160051b81019283116103eb57905b82821061236857505050565b6020809183356123778161040c565b81520191019061235c565b9392916123a79060409260018060a01b03168652606060208701526060860190611f30565b930152565b6001600160401b03811161125b57601f01601f191660200190565b3d156123f1573d906123d8826123ac565b916123e6604051938461127b565b82523d5f602084013e565b606090565b156123fd57565b60405162461bcd60e51b815260206004820152601c60248201527f53747261746567792064656c656761746563616c6c206661696c6564000000006044820152606490fd5b9291906123a7602091604086526040860190611f30565b6124625f612315565b90612470604051928361127b565b5f825281601f196124805f612315565b01905f5b82811061249057505050565b60209060405161249f81611260565b5f81525f838201525f60408201526040516124b981611240565b5f81525f848201525f60408201525f60608201525f6080820152606082015282828501015201612484565b906124ee82612315565b6124fb604051918261127b565b828152809261250c601f1991612315565b01905f5b82811061251c57505050565b60209060405161252b81611260565b5f81525f838201525f604082015260405161254581611240565b5f81525f848201525f60408201525f60608201525f6080820152606082015282828501015201612510565b9061ffff8091169116039061ffff8211610d5757565b805182101561120e5760209160051b010190565b906040516125a781611260565b606061212c6003839560ff81541685526001810154602086015260028101546040860152016112ad565b6007549161ffff8216928084101561267d578061ffff831611612671575b508261ffff82161115612663576126109161260991612570565b61ffff1690565b612619816124e4565b915f5b8281106126295750505090565b8061264761264161263c60019486612045565b6111f2565b5061259a565b6126518287612586565b5261265c8186612586565b500161261c565b50505061266e612459565b90565b61ffff9150165f6125ef565b5050505061266e612459565b801515036103eb57565b3561266e81612689565b90929160a060c09160e0840195845280356126b781612689565b151560208501526020810135604085015260408101356060850152606081013560808501526080810135828501520135910152565b9060a060059180356126fd81612689565b60ff801986541691151516178455602081013560018501556040810135600285015560608101356003850155608081013560048501550135910155565b6040513d5f823e3d90fd5b91906040838203126103eb57825161275c81612689565b926020810151906001600160401b0382116103eb570181601f820112156103eb57805190612789826123ac565b92612797604051948561127b565b828452602083830101116103eb57815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b92906127f19061266e95936060865260608601916127b8565b926001602082015260408185039101526127b8565b9060a8116103eb5760880190602090565b90610168116103eb576101480190602090565b90610198116103eb576101780190602090565b906101c8116103eb576101a80190602090565b906101f8116103eb576101d80190602090565b9061021c116103eb576102080190601490565b9061023c116103eb5761021c0190602090565b90610244116103eb5761023c0190600890565b3590602081106128aa575090565b5f199060200360031b1b1690565b356bffffffffffffffffffffffff198116929190601482106128d8575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b356001600160c01b0319811692919060088210612913575050565b6001600160c01b031960089290920360031b82901b16169150565b9091929495936012548015908115612cb7575b50610acb576001600160a01b0387169586156105425760115461296c906001600160a01b0316610e45565b916001600160a01b03831615612ca8576129a1925f92836040518096819582946302bc2ce760e51b84528c8c600486016127d8565b03925af1908115611b2b575f905f92612c83575b5015612c6557506102488310612c5657612a18906129dc6129d68585612806565b9061289c565b6129e96129d68686612817565b6129f66129d6878761282a565b90612a046129d6888861283d565b92612a126129d68989612850565b94613d62565b83612a5e612a58612a52612a3e612a38612a328888612863565b906128b8565b60601c90565b95612a4c6129d68288612876565b95612889565b906128f8565b60c01c90565b926001600160a01b031603612c47578203612c4757600f54936001600160401b0382169480861115612c285750612a9a6109d460165460ff1690565b612bf65760145480861115612b785750612b4c907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612aeb612adc61129c565b6001600160a01b039093168352565b6020820152836040820152612b036060820160019052565b60609060018060a01b038151166bffffffffffffffffffffffff60a01b6013541617601355602081015160145560408101516015550151151560ff801960165416911617601655565b612b5b60ff1960175416601755565b604080516001600160401b039290921682526020820192909252a2565b929350509214612b87575b5050565b6015548114612b83577fa3f0eabe92ef7bacb81dba904189dc163924ee16379f429441a4117441609fff91612bc4600160ff196017541617601755565b612bf160155492604051938493846040919493926001600160401b03606083019616825260208201520152565b0390a1565b612b5b907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612aeb612adc61129c565b636762eb4960e01b5f526004526001600160401b03821660245260445ffd5b63319c9a2160e21b5f5260045ffd5b632ffd02b360e11b5f5260045ffd5b805115612c7457805190602001fd5b63e1ac453160e01b5f5260045ffd5b9050612ca191503d805f833e612c99818361127b565b810190612745565b905f6129b5565b63baa3de5f60e01b5f5260045ffd5b905042115f612941565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f3d4a1189ec311cad4499197cf097eefb10346f2894cdd7cbbcb2d2a48001c91860408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152612d5360c08261127b565b51902090565b60405160208101915f5160206141765f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206141165f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206140d65f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206141565f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b906040519060208201928352604082015230606082015246608082015260808152612d5360a08261127b565b805f52600c60205260405f209081546001600160401b038116906001600160401b03821615612eef57604081901c60ff166115695760481c60ff16611555576001600160401b0381164210612ec9575050805460ff60401b1916600160401b179055565b63c504f34d60e01b5f526004919091526001600160401b0316602452504260445260645ffd5b82633e426d5160e21b5f5260045260245ffd5b919081101561120e5760051b0190565b3561266e8161040c565b919081101561120e5760051b81013590601e19813603018212156103eb5701908135916001600160401b0383116103eb5760200182360381136103eb579190565b929192612f69826123ac565b91612f77604051938461127b565b8294818452818301116103eb578281602093845f960137010152565b5f54909491929190612fad906001600160a01b0316610e45565b331480613104575b806130fc575b6130e857600354938183036130b75784831080156130df575b6130c657612ff360045480975f5160206141165f395f51905f52613f67565b925f945f5b8781106130195750505050505050506130146112ab9160010190565b600455565b61302c613027828585612f02565b612f12565b966001600160a01b0390811690881611156130b757866130696109d46130628360018060a01b03165f52600260205260405f2090565b5460ff1690565b61309c5761308f6109d4613088613081858a8a612f1c565b3691612f5d565b8984613fe8565b61309c5750600101612ff8565b633b63649d60e11b5f526001600160a01b031660045260245ffd5b630da1c57360e41b5f5260045ffd5b6378f4355360e11b5f526004839052602485905260445ffd5b50848210612fd4565b50505050506112ab61301460045460010190565b508015612fbb565b508115612fb5565b5f54909491929190613126906001600160a01b0316610e45565b331480613207575b806131ff575b6130e857600354938183036130b75784831080156131f6575b6130c65761316c60045480975f5160206141565f395f51905f52613f67565b925f945f5b87811061318d5750505050505050506130146112ab9160010190565b61319b613027828585612f02565b966001600160a01b0390811690881611156130b757866131d16109d46130628360018060a01b03165f52600260205260405f2090565b61309c576131e96109d4613088613081858a8a612f1c565b61309c5750600101613171565b5084821061314d565b508015613134565b50811561312e565b5f54909491929190613229906001600160a01b0316610e45565b33148061331d575b80613315575b6130e857600354938183036130b757848310801561330c575b6130c65761328260045480977fac5d643ec5a18c3c05126c0540540c01e724afd2beab02a045f0f5d791103a15613f67565b925f945f5b8781106132a35750505050505050506130146112ab9160010190565b6132b1613027828585612f02565b966001600160a01b0390811690881611156130b757866132e76109d46130628360018060a01b03165f52600260205260405f2090565b61309c576132ff6109d4613088613081858a8a612f1c565b61309c5750600101613287565b50848210613250565b508015613237565b508115613231565b5f5490949192919061333f906001600160a01b0316610e45565b331480613433575b8061342b575b6130e857600354938183036130b7578483108015613422575b6130c65761339860045480977f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd613f67565b925f945f5b8781106133b95750505050505050506130146112ab9160010190565b6133c7613027828585612f02565b966001600160a01b0390811690881611156130b757866133fd6109d46130628360018060a01b03165f52600260205260405f2090565b61309c576134156109d4613088613081858a8a612f1c565b61309c575060010161339d565b50848210613366565b50801561334d565b508115613347565b5f54909491929190613455906001600160a01b0316610e45565b331480613549575b80613541575b6130e857600354938183036130b7578483108015613538575b6130c6576134ae60045480977fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a81305613f67565b925f945f5b8781106134cf5750505050505050506130146112ab9160010190565b6134dd613027828585612f02565b966001600160a01b0390811690881611156130b757866135136109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761352b6109d4613088613081858a8a612f1c565b61309c57506001016134b3565b5084821061347c565b508015613463565b50811561345d565b5f5490949192919061356b906001600160a01b0316610e45565b33148061364c575b80613644575b6130e857600354938183036130b757848310801561363b575b6130c6576135b160045480975f5160206140d65f395f51905f52613f67565b925f945f5b8781106135d25750505050505050506130146112ab9160010190565b6135e0613027828585612f02565b966001600160a01b0390811690881611156130b757866136166109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761362e6109d4613088613081858a8a612f1c565b61309c57506001016135b6565b50848210613592565b508015613579565b508115613573565b5f5490949192919061366e906001600160a01b0316610e45565b33148061374f575b80613747575b6130e857600354938183036130b757848310801561373e575b6130c6576136b460045480975f5160206141765f395f51905f52613f67565b925f945f5b8781106136d55750505050505050506130146112ab9160010190565b6136e3613027828585612f02565b966001600160a01b0390811690881611156130b757866137196109d46130628360018060a01b03165f52600260205260405f2090565b61309c576137316109d4613088613081858a8a612f1c565b61309c57506001016136b9565b50848210613695565b50801561367c565b508115613676565b5f54909491929190613771906001600160a01b0316610e45565b331480613865575b8061385d575b6130e857600354938183036130b7578483108015613854575b6130c6576137ca60045480977f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d93613f67565b925f945f5b8781106137eb5750505050505050506130146112ab9160010190565b6137f9613027828585612f02565b966001600160a01b0390811690881611156130b7578661382f6109d46130628360018060a01b03165f52600260205260405f2090565b61309c576138476109d4613088613081858a8a612f1c565b61309c57506001016137cf565b50848210613798565b50801561377f565b508115613779565b5f54909491929190613887906001600160a01b0316610e45565b33148061397b575b80613973575b6130e857600354938183036130b757848310801561396a575b6130c6576138e060045480977f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f613f67565b925f945f5b8781106139015750505050505050506130146112ab9160010190565b61390f613027828585612f02565b966001600160a01b0390811690881611156130b757866139456109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761395d6109d4613088613081858a8a612f1c565b61309c57506001016138e5565b508482106138ae565b508015613895565b50811561388f565b5f5490949192919061399d906001600160a01b0316610e45565b331480613a91575b80613a89575b6130e857600354938183036130b7578483108015613a80575b6130c6576139f660045480977fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e62613f67565b925f945f5b878110613a175750505050505050506130146112ab9160010190565b613a25613027828585612f02565b966001600160a01b0390811690881611156130b75786613a5b6109d46130628360018060a01b03165f52600260205260405f2090565b61309c57613a736109d4613088613081858a8a612f1c565b61309c57506001016139fb565b508482106139c4565b5080156139ab565b5081156139a5565b613ab0905f5160206140d65f395f51905f52612e39565b90815f52600c60205260405f2060ff815460401c16611569575f5160206140d65f395f51905f525f52600b6020527f9b6d9405e2a268edd94615fe7f07c0d5d9dda2152c2e48f4e74379972af1c618548015613b37575f5160206140f65f395f51905f526123105f5160206140d65f395f51905f529384600161070e6107028a9742612045565b6309913ab360e31b5f5260045260245ffd5b6001600160a01b0381165f8181526002602052604090205490919060ff1615613bd9576001600160a01b0381165f908152600560205260409020541561054257600680546001600160a01b031916831790556001600160a01b03165f90815260056020526040902054907f2c8c895ef6e3978e12490ffd8cd3b92d4717b223562f851382f5daf74f587b515f80a3565b50633b63649d60e11b5f5260045260245ffd5b600154613bf881612315565b91613c06604051938461127b565b818352601f19613c1583612315565b0136602085013782905f5b83811015613c99577fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68101546001600160a01b03165f9081526005602052604090205490811561054257600191613c93906001600160a01b0316613c848389612586565b6001600160a01b039091169052565b01613c20565b5091509150565b6007545f5b818110613cc55763dfffe2f960e01b5f526004839052602484905260445ffd5b613cd1612641826111f2565b8360ff8251161480613cfa575b613ceb5750600101613ca5565b6040015160601c949350505050565b5084602082015114613cde565b9060405160c081018181106001600160401b0382111761125b5760405260a06005829460ff81541615158452600181015460208501526002810154604085015260038101546060850152600481015460808501520154910152565b93929190613d80613d7b865f52600d60205260405f2090565b613d07565b94613d8e6109d48751151590565b613f555750602085018051156105425751808203613f19575050604084015180151580613f0f575b613ed1575050606083015180151580613ec7575b613e89575050608082015180151580613e7f575b613e4157505060a0015180151580613e37575b613df9575050565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523360d81b608482015260a490fd5b5080821415613df1565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264292a26a91960d91b608482015260a490fd5b5080821415613dde565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523160d81b608482015260a490fd5b5080821415613dca565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264052544d52360dc1b608482015260a490fd5b5080821415613db6565b60405163fef6c5cf60e01b81526004808201929092526024810192909252606060448301526064820152631354951160e21b608482015260a490fd5b6350dfe91360e01b5f5260045260245ffd5b916040519160208301937f4a3d56bf3b5708e5b633d12931f9923b37fde6895d6bd92957bbfa92cd003039855260408401526060830152608082015260808152613fb260a08261127b565b519020613fbd612cc1565b9060405190602082019261190160f01b84526022830152604282015260428152612d5360628261127b565b90915f91906001600160a01b038216156140cd5760405192600484019460248501956044860192853b1561405157509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b9796505090508151806040146140a85760411461406e5750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052614086565b505050505f9056feea4a6847c3f47fe0f98dcfe2e2c074e6cb42f6d74c367b33ae8516f537e775829cc91136b2c7668ecd202c7008f17e818e108b5448a7b7fd48bd2ca6b4aab51fb40912900bb80b6bc5e38d8489266de7299eedb40b03490214410117ef53ff9279883188dbf80e171cf94b3b44b6437b838158b1d3a5df6ccc709eeb7c5217296acb9fef2a4a1ecaa044f4c8979d9f48b0d5be623c860275be31c4cbd34c169cb2d153886d95f8f2d4836fb16c9fac869e1ce9cfc93d919a0f7dfe38439b9771a2646970667358221220d9a3575e6aa98198ed460c72687df8b305209a32fda153cf7302dc50f249d44a64736f6c634300081e0033"},"devdoc":{"details":"This contract acts as the governance layer and the vault registry. It manages the set of authorized operators, enforces quorum consensus for critical updates, and maintains the registry of deposit vaults across different chains. It combines immediate multi-sig actions for operational tasks with timelocked actions for high-risk configuration changes.","errors":{"InsufficientSignatures(uint256,uint256)":[{"params":{"provided":"The number of signatures provided.","required":"The current `committeeThreshold` required."}}],"InvalidCommitteeThreshold(uint256,uint256)":[{"params":{"newThreshold":"The proposed threshold.","operatorCount":"The total number of registered operators."}}],"InvalidDelay(uint256)":[{"params":{"delay":"The provided delay in seconds."}}],"NotOperator(address)":[{"params":{"signer":"The address recovered from the signature."}}],"SignersNotSortedOrUnique()":[{"details":"Signatures must be sorted strictly ascending (A < B) to prevent duplicate counting in O(N)."}],"TimelockAlreadyCanceled(bytes32)":[{"params":{"opId":"The operation hash."}}],"TimelockAlreadyExecuted(bytes32)":[{"params":{"opId":"The operation hash."}}],"TimelockNotReady(bytes32,uint256,uint256)":[{"params":{"nowTs":"The current block timestamp.","opId":"The unique hash of the operation.","readyAt":"The timestamp when the operation becomes executable."}}],"TimelockUnknown(bytes32)":[{"params":{"opId":"The operation hash."}}],"VaultNotFound(uint256,uint256)":[{"params":{"routingId":"The routing ID of the vault.","vmId":"The Chain ID for EVM chains requested."}}]},"kind":"dev","methods":{"addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":{"details":"This list is append-only. New vaults can be added, but existing ones cannot be removed.","params":{"routingId":"The routing ID of the vault.","signatures":"Corresponding signatures.","signers":"Sorted array of signers.","vaultAddr":"The address of the vault (as bytes32).","vmId":"The Chain ID for EVM chains requested."}},"cancelTimelock(bytes32,address[],bytes[])":{"details":"Can be called at any time before execution to prevent a malicious or erroneous update.","params":{"opId":"The hash of the operation to cancel."}},"constructor":{"params":{"initialCommitteeThreshold":"The number of signatures required for valid governance actions.","initialOperators":"The list of addresses that will form the initial governance council.","initialRegistryContract":"The initial Registry Contract address.","initialRiskManager":"The initial Risk Manager address."}},"domainSeparator()":{"returns":{"_0":"The domain separator hash."}},"executeRegistryContract(address)":{"params":{"newRegistry":"The address that was previously scheduled."}},"executeRiskManager(address)":{"params":{"newRiskManager":"The address that was previously scheduled."}},"getCommitteeConfig()":{"details":"Let's operators query for 'k (the committee threshold), n' thresholds and the current committee member list\"."},"getLeader()":{"details":"When querying current leader, then the contract returns the active operator_pubkey and attested_pubkey."},"getVaults(uint16,uint16)":{"details":"The input types are intentionally `uint16` to preserve the function selector `0x9fd7285c` for backward compatibility with existing Rust clients.","params":{"end":"The end index (exclusive).","start":"The start index."},"returns":{"_0":"An array of Vault structs."}},"registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":{"details":"Used to define how the Credential Manager talks to L2s (e.g., via bridges). Only one strategy can be registered per chain.","params":{"routingId":"The routing ID of the vault.","signatures":"Corresponding signatures.","signers":"Sorted array of signers.","strategy":"The address of the strategy contract.","vmId":"The Chain ID for EVM chains requested."}},"registerAttestedKey(bytes32)":{"details":"Maps the attested_pubkey of a new CE joining the quorum.","params":{"newAttestedKey":"The address derived from the TEE's public key."}},"scheduleRegistryContract(address,address[],bytes[])":{"params":{"newRegistry":"The proposed new Registry address."},"returns":{"opId":"The unique hash of the scheduled operation."}},"scheduleRiskManager(address,address[],bytes[])":{"details":"The operation cannot be executed until `TIMELOCK_DELAY` has passed.","params":{"newRiskManager":"The proposed new Risk Manager address."},"returns":{"opId":"The unique hash of the scheduled operation."}},"scheduleUpdateAutomataVerifier(address,address[],bytes[])":{"details":"Operators vote to update the verifier and the update is proposed with a timelocked delay."},"setDepositVaultAdministrators(uint256,uint256,address[],uint256)":{"details":"Admin can set arbitrary administrators/quorum using the debug path. Non-admin calls ignore the provided administrators/quorum and instead sync administrators from operator-attested keys, using the current committee threshold as the quorum.","params":{"newAdministrators":"The list of new admin addresses for that vault.","newWithdrawalQuorum":"The new quorum requirement for that vault.","routingId":"The routing ID of the vault.","vmId":"The Chain ID for EVM chains requested."}},"submitRestartProof(uint256,bytes,bytes,address,bytes32)":{"details":"We compare Epochs. The highest epoch wins.","params":{"checkpointHash":"The state hash being served.","newLeader":"The address claiming leadership.","tdxReportBody":"The 'Public Output' of the ZK Circuit (The TEE Quote Body).","zkProof":"The Groth16 proof bytes."}},"updateCommitteeThreshold(uint256,address[],bytes[])":{"details":"Requires a quorum of the *current* operators to approve.","params":{"newThreshold":"The new minimum number of signatures.","signatures":"Corresponding signatures.","signers":"Sorted array of signers."}}},"stateVariables":{"OP_APPOINT_LEADER":{"details":"Used for appointing a leader in the absence of a leader - for bootstrap or emergency recovery."},"_ACTION_TYPEHASH":{"details":"Generic Action typehash used for all governance signatures. Structure: Action(bytes32 opType, bytes32 paramsHash, uint256 nonce)"},"_EIP712_DOMAIN_TYPEHASH":{"details":"EIP-712 Domain Separator typehash."},"_NAME_HASH":{"details":"EIP-712 name hash for this contract."},"_VERSION_HASH":{"details":"EIP-712 version hash."},"adminUpdateStrategies":{"details":"Used to abstract cross-chain messaging logic (e.g., LayerZero, Optimism Messenger)."},"epoch":{"details":"Incremented on every successful restart."},"governanceNonce":{"details":"Included in every signed hash to strictly order operations and prevent replay attacks."},"latestCheckpointHash":{"details":"New nodes verify this hash against the leader's data to ensure they are on the correct fork."},"leader":{"details":"The leader is responsible for coordinating the clearing engine."},"operatorToAttestedKey":{"details":"Used to verify that a TEE signature belongs to a specific operator."},"operators":{"details":"These keys form the root of trust for the system."},"timelockDelayFor":{"details":"e.g., OP_SET_REGISTRY -> 72 hours."},"vaults":{"details":"This list is strictly append-only; vaults cannot be removed to prevent history modification."}},"title":"CredentialManager","version":1},"methodIdentifiers":{"GATHERING_DURATION()":"0xa6aac513","OP_ADD_VAULT()":"0x90054742","OP_APPOINT_LEADER()":"0x4e970c8c","OP_CANCEL_TIMELOCK()":"0xfc0e2ba7","OP_MANAGE_PROFILE()":"0xb7635fb8","OP_REGISTER_STRATEGY()":"0x333bef22","OP_RESTART()":"0xd8a0bebf","OP_SET_AUTOMATA_VERIFIER()":"0x2d4ab28d","OP_SET_COMMITTEE_THRESHOLD()":"0x5c1ff1f2","OP_SET_DELAY()":"0xe0913aff","OP_SET_MEASUREMENTS()":"0x6583c37a","OP_SET_REGISTRY()":"0x1bc12e07","OP_SET_RISK_MANAGER()":"0xf5b68c67","OP_SET_VAULT_ADMINS()":"0x26ddc1ba","OP_WITHDRAW()":"0x5f250f69","addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":"0x81392328","admin()":"0xf851a440","adminUpdateStrategies(uint256,uint256)":"0x3174b727","appointLeader(address,address[],bytes[])":"0xfdeabe1f","automataVerifier()":"0x280cd09d","bestCandidate()":"0x669f6f35","cancelTimelock(bytes32,address[],bytes[])":"0x9d3e015a","committeeThreshold()":"0x4dd0a0c9","domainSeparator()":"0xf698da25","epoch()":"0x900cf0cf","executeManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32))":"0xae5c8bfb","executeRegistryContract(address)":"0x24242e77","executeRiskManager(address)":"0x6dfb32aa","executeUpdateAutomataVerifier(address)":"0xc7d06b54","getCommitteeConfig()":"0xfe5e8240","getLeader()":"0x4c051f14","getVaults(uint16,uint16)":"0x9fd7285c","governanceNonce()":"0xd9be832c","initiateRestart()":"0x5cc79144","isOperator(address)":"0x6d70f7ae","isRestartAmbiguous()":"0x1276bcc5","latestCheckpointHash()":"0xb34eb182","leader()":"0x40eedabb","measurementProfiles(uint256)":"0x95c82559","nextProfileId()":"0xcd1d81ff","operatorToAttestedKey(address)":"0x1ac4d079","operators(uint256)":"0xe28d4906","registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":"0x5d3ae390","registerAttestedKey(bytes32)":"0x7f0152a8","registryContract()":"0x28c1f99b","resolveRestart()":"0x35cfd9eb","restartGatheringDeadline()":"0x127f49ad","riskManager()":"0x47842663","scheduleManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32),address[],bytes[])":"0xacfacc86","scheduleRegistryContract(address,address[],bytes[])":"0xb5ed8b12","scheduleRiskManager(address,address[],bytes[])":"0x2808e92f","scheduleUpdateAutomataVerifier(address,address[],bytes[])":"0x281cbdd4","setDepositVaultAdministrators(uint256,uint256,address[],uint256)":"0x9ebc068e","submitRestartProof(uint256,bytes,bytes,address,bytes32)":"0xce0b1302","timelockDelayFor(bytes32)":"0xfb834493","timelockOps(bytes32)":"0x31709520","updateCommitteeThreshold(uint256,address[],bytes[])":"0x59d63bcc","vaults(uint256)":"0x8c64ea4a","withdraw(address,address[],bytes[])":"0xbe223838"},"runtimeBytecode":{"bytecode":"0x6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80631276bcc5146103c9578063127f49ad146103c45780631ac4d079146103bf5780631bc12e07146103ba57806324242e77146103b557806326ddc1ba146103b05780632808e92f146103ab578063280cd09d146103a6578063281cbdd4146103a157806328c1f99b1461039c5780632d4ab28d1461039757806331709520146103925780633174b7271461038d578063333bef221461038857806335cfd9eb1461038357806340eedabb1461037e57806347842663146103795780634c051f14146103745780634dd0a0c91461036f5780634e970c8c1461036a57806359d63bcc146103655780635c1ff1f2146103605780635cc791441461035b5780635d3ae390146103565780635f250f69146103515780636583c37a1461034c578063669f6f35146103475780636d70f7ae146103425780636dfb32aa1461033d5780637f0152a81461033857806381392328146103335780638c64ea4a1461032e5780639005474214610329578063900cf0cf1461032457806395c825591461031f5780639d3e015a1461031a5780639ebc068e146103155780639fd7285c14610310578063a6aac5131461030b578063acfacc8614610306578063ae5c8bfb14610301578063b34eb182146102fc578063b5ed8b12146102f7578063b7635fb8146102f2578063be223838146102ed578063c7d06b54146102e8578063cd1d81ff146102e3578063ce0b1302146102de578063d8a0bebf146102d9578063d9be832c146102d4578063e0913aff146102cf578063e28d4906146102ca578063f5b68c67146102c5578063f698da25146102c0578063f851a440146102bb578063fb834493146102b6578063fc0e2ba7146102b1578063fdeabe1f146102ac5763fe5e82400361000e57611f8e565b611e8b565b611e51565b611e27565b611e00565b611dde565b611db7565b611d5d565b611d23565b611d06565b611ccc565b611c5d565b611c13565b611b39565b611ac3565b611a9c565b6119b3565b611996565b6118b4565b6117de565b6117b1565b6116dc565b611591565b611458565b6113f2565b6113d5565b61139b565b6112f9565b611164565b6110eb565b611028565b610fe8565b610fa5565b610f6b565b610f31565b610d89565b610ce1565b610ca7565b610bb6565b610b7c565b610b5f565b610b2a565b610b02565b610ada565b6109a5565b61096b565b61092b565b6108d2565b6108ab565b610883565b61079a565b610772565b610619565b610551565b61047f565b610458565b61041d565b6103ef565b346103eb575f3660031901126103eb57602060ff601754166040519015158152f35b5f80fd5b346103eb575f3660031901126103eb576020601254604051908152f35b6001600160a01b038116036103eb57565b346103eb5760203660031901126103eb5760043561043a8161040c565b60018060a01b03165f526005602052602060405f2054604051908152f35b346103eb575f3660031901126103eb5760206040515f5160206141765f395f51905f528152f35b346103eb5760203660031901126103eb5760043561049c8161040c565b6001600160a01b038116908115610542575f5160206141765f395f51905f526104e06040516020810190858252602081526104d860408261127b565b519020612d59565b6104e981612e65565b600a80546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141365f395f51905f525f80a37f482b97c53e48ffa324a976e2738053e9aff6eee04d8aac63b10e19411d869b825f80a3005b63d92e233d60e01b5f5260045ffd5b346103eb575f3660031901126103eb5760206040517f3f98d537f24f3ae50e4a30e12fbf3e5c35cf6f40f4ce125c82c1b88e3e7cf3df8152f35b9181601f840112156103eb578235916001600160401b0383116103eb576020808501948460051b0101116103eb57565b9060606003198301126103eb576004356105d48161040c565b916024356001600160401b0381116103eb57816105f39160040161058b565b92909291604435906001600160401b0382116103eb576106159160040161058b565b9091565b346103eb57610627366105bb565b91936001600160a01b031691908215610542576106789461066593604051602081019182526020815261065b60408261127b565b5190209485612f93565b5f5160206141165f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141165f395f51905f525f52600b6020527ffc320c8b7cd913048d0600d8f8fbdd9fd65e3dee2c1f3796e3abba8cc47fa0475491821561074c57815f5160206140f65f395f51905f526107415f5160206141165f395f51905f529384600161070e61070260209a42612045565b6001600160401b031690565b835469ffffffffffffffffffff19166001600160401b039190911690811784559201556040519081529081906020820190565b0390a3604051908152f35b6309913ab360e31b5f52600483905260245ffd5b633599e08d60e21b5f5260045260245ffd5b346103eb575f3660031901126103eb576011546040516001600160a01b039091168152602090f35b346103eb576107a8366105bb565b91936001600160a01b031691908215610542576107f9946107e69360405160208101918252602081526107dc60408261127b565b519020948561310c565b5f5160206141565f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141565f395f51905f525f52600b6020527f5585c2bd0ffb4796fa70abc2a0b1f92173aa4b9f7e1b37d256fd2a975c5abcfa5491821561074c57815f5160206140f65f395f51905f526107415f5160206141565f395f51905f529384600161070e61070260209a42612045565b346103eb575f3660031901126103eb57600a546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb5760206040515f5160206141565f395f51905f528152f35b346103eb5760203660031901126103eb576004355f52600c602052608060405f206001815491015460ff604051926001600160401b0381168452818160401c161515602085015260481c16151560408301526060820152f35b346103eb5760403660031901126103eb57600435602435905f52600860205260405f20905f52602052602060018060a01b0360405f205416604051908152f35b346103eb575f3660031901126103eb5760206040517f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd8152f35b346103eb575f3660031901126103eb576012548015610acb57421115610abc576109d86109d460165460ff1690565b1590565b610aad5760175460ff16610a9e57601354610a00906001600160a01b0316613b49565b613b49565b610a0b601554601055565b610a16601454600f55565b610a1f5f601255565b610a345f6013555f6014555f6015555f601655565b600f546010546040805183815260208101929092527f88cac99f10d8167541407023871a1cc0d797dc75e5b23f3f9f54aaf445f5602c91a16006546001600160a01b03167fd7936f419066f72741af39dde15237d9aed55a0d1d9ab0cb3280569b42c3d8f35f80a3005b6363f5b90b60e11b5f5260045ffd5b63dcd4760160e01b5f5260045ffd5b63285f264160e21b5f5260045ffd5b63cbd2c74d60e01b5f5260045ffd5b346103eb575f3660031901126103eb576006546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb576009546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb57604060018060a01b0360065416805f526005602052815f205482519182526020820152f35b346103eb575f3660031901126103eb576020600354604051908152f35b346103eb575f3660031901126103eb5760206040517f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f8152f35b346103eb5760603660031901126103eb576004356024356001600160401b0381116103eb57610be990369060040161058b565b906044356001600160401b0381116103eb57610c0990369060040161058b565b92909184158015610c9c575b610c8257917f7015cf739f6bedf8447b0723aac5b7e28cc2e5551b144f8bb715b9c29768237f949391610c6493604051602081019087825260208152610c5c60408261127b565b51902061320f565b600354610c7082600355565b604080519182526020820192909252a1005b84600154906311dcbf3760e31b5f5260045260245260445ffd5b506001548511610c15565b346103eb575f3660031901126103eb5760206040517fac5d643ec5a18c3c05126c0540540c01e724afd2beab02a045f0f5d791103a158152f35b346103eb575f3660031901126103eb576012544210610d5c57610e104201804211610d5757601255610d1e5f6013555f6014555f6015555f601655565b60ff19601754166017557f3d364c9a6ad0fb8014a11c487ec342f3a0aaf1a55973fc1bb7353ab6824a358f6020601254604051908152a1005b612031565b6301fd8f7b60e41b5f5260045ffd5b6004359060ff821682036103eb57565b359060ff821682036103eb57565b346103eb5760a03660031901126103eb57610da2610d6b565b60243590604435610db28161040c565b6064356001600160401b0381116103eb57610dd190369060040161058b565b9190926084356001600160401b0381116103eb57610df390369060040161058b565b6001600160a01b038416959094919390861561054257610e51610e45610e45610e388b610e2b8960ff165f52600860205260405f2090565b905f5260205260405f2090565b546001600160a01b031690565b6001600160a01b031690565b610f22576040805160ff868116602083019081529282018b90526001600160a01b038a1660608301527f0f05f8598640816bc7963f9e84995cc362736f66a37eaca8293048e25aed4067989097610f0596610ecd959294919390929190610ec581608081015b03601f19810183528261127b565b519020613325565b610ee687610e2b8560ff165f52600860205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b6040516001600160a01b039094168452169180602081015b0390a3005b63c45546f760e01b5f5260045ffd5b346103eb575f3660031901126103eb5760206040517f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d938152f35b346103eb575f3660031901126103eb5760206040517f8b6e6eebcf1e5aa625df96285186591a18b47d82a0e5344612aba13e51bc0e6f8152f35b346103eb575f3660031901126103eb57608060018060a01b036013541660145460155460ff60165416916040519384526020840152604083015215156060820152f35b346103eb5760203660031901126103eb576004356110058161040c565b60018060a01b03165f526002602052602060ff60405f2054166040519015158152f35b346103eb5760203660031901126103eb576004356110458161040c565b6001600160a01b038116908115610542575f5160206141165f395f51905f5261108960405160208101908582526020815261108160408261127b565b519020612d91565b61109281612e65565b600980546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141365f395f51905f525f80a37f62e09f04681da780308095cdff046660f0b1e396888312a767499401693c03e55f80a3005b346103eb5760203660031901126103eb57600435335f52600260205260ff60405f2054161561115157801561054257335f8181526005602052604081208390557fe58dd23bcf790de89fbc05578bcc206ece8cb67dee1cf099fce6ff74d052ff3e9080a3005b633b63649d60e11b5f523360045260245ffd5b346103eb576101403660031901126103eb5761117e610d6b565b6024356044359160a03660631901126103eb57610104356001600160401b0381116103eb576111b190369060040161058b565b9061012435946001600160401b0386116103eb576111d661001896369060040161058b565b959094612254565b634e487b7160e01b5f52603260045260245ffd5b60075481101561120e5760075f5260205f209060021b01905f90565b6111de565b805482101561120e575f5260205f209060021b01905f90565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b0382111761125b57604052565b61122c565b608081019081106001600160401b0382111761125b57604052565b90601f801991011681019081106001600160401b0382111761125b57604052565b604051906112ab60808361127b565b565b906040516112ba81611240565b608060ff808395546001600160401b0381168552818160401c166020860152818160481c166040860152818160501c16606086015260581c1616910152565b346103eb5760203660031901126103eb576004356007548110156103eb57611323610100916111f2565b5061139960ff825416916001810154906113446003600283015492016112ad565b9160405194855260208501526040840152606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565bf35b346103eb575f3660031901126103eb5760206040517fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e628152f35b346103eb575f3660031901126103eb576020600f54604051908152f35b346103eb5760203660031901126103eb576004355f52600d60205260c060405f2060ff81541690600181015490600281015460038201549060056004840154930154936040519515158652602086015260408501526060840152608083015260a0820152f35b346103eb5760603660031901126103eb576004356024356001600160401b0381116103eb5761148b90369060040161058b565b604435916001600160401b0383116103eb576114ae6114d493369060040161058b565b92909160405160208101906114cc81610eb78a859190602083019252565b51902061343b565b6114e6815f52600c60205260405f2090565b80546001600160401b0381161561157d57604081901c60ff166115695760481c60ff1661155557805469ff0000000000000000001916690100000000000000000017815560010154907f4ef6805613a59a1bece0b99a00b945fffadc1bb793c7064706233d30fd438c765f80a3005b632863f91560e21b5f52600482905260245ffd5b633599e08d60e21b5f52600483905260245ffd5b633e426d5160e21b5f52600483905260245ffd5b60803660031901126103eb576024356004356044356001600160401b0381116103eb576115c290369060040161058b565b906064356115e2610e45610e3887610e2b885f52600860205260405f2090565b916001600160a01b038316156116ab575f547fc55043b6a137f66033384e3f6d9b80e72303eab38436f8fdb89899dc87ce53a29490611629906001600160a01b0316610e45565b3303611692575f611640611683938293369161232c565b93945b61164d8989613ca0565b60405161167181610eb78a8a60208401966303a81a5760e11b885260248501612382565b51915af461167d6123c7565b506123f6565b610f1d60405192839283612442565b50505061169d613bec565b6116835f8060035494611643565b635c7f4b4760e11b5f5260045ffd5b6004359061ffff821682036103eb57565b6024359061ffff821682036103eb57565b346103eb5760403660031901126103eb576117066116f86116ba565b6117006116cb565b906125d1565b6040518091602082016020835281518091526020604084019201905f5b818110611731575050500390f35b9193509160206101006001926117a36060885160ff81511684528581015186850152604081015160408501520151606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565b019401910191849392611723565b346103eb575f3660031901126103eb576020604051610e108152f35b60c09060231901126103eb57602490565b346103eb576101203660031901126103eb576004356117fc366117cd565b9060e4356001600160401b0381116103eb5761181c90369060040161058b565b92610104356001600160401b0381116103eb5761183d90369060040161058b565b90823561184981612689565b806118a8575b611899576118959561188595610eb76118766118809660405192839160208301958661269d565b5190209485613551565b613a99565b6040519081529081906020820190565b0390f35b63137ec6d760e11b5f5260045ffd5b5060208301351561184f565b346103eb5760e03660031901126103eb576004356118d1366117cd565b6118f360405160208101906118eb81610eb786888661269d565b519020612dc9565b906118fd82612e65565b821561197c575b7faa1bacadd202709f2df9c31faf4babdbb21a245021c22298bfcdf22861ca12c69161197761196c5f5160206140d65f395f51905f5293865f52600d6020526119508160405f206126ec565b6040519485945f5160206141365f395f51905f525f80a3612693565b151582526020820190565b0390a2005b9150600e545f198114610d575760018101600e5591611904565b346103eb575f3660031901126103eb576020601054604051908152f35b346103eb576119c1366105bb565b91936001600160a01b03169190821561054257611a12946119ff9360405160208101918252602081526119f560408261127b565b5190209485613654565b5f5160206141765f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141765f395f51905f525f52600b6020527f5248b41ce7bdc12ebe0248f44130be972d690f78fe7dbe1a76d984641d9dcfc25491821561074c57815f5160206140f65f395f51905f526107415f5160206141765f395f51905f529384600161070e61070260209a42612045565b346103eb575f3660031901126103eb5760206040515f5160206140d65f395f51905f528152f35b346103eb57611ad1366105bb565b92939091906001600160a01b03168015610542575f80808093611b198888888c476040516020810191888352604082015260408152611b1160608261127b565b519020613757565b4790828215611b30575bf115611b2b57005b61273a565b506108fc611b23565b346103eb5760203660031901126103eb57600435611b568161040c565b6001600160a01b0316801561054257611b8a604051602081019083825260208152611b8260408261127b565b519020612e01565b611b9381612e65565b6011545f5160206141565f395f51905f5290611bb7906001600160a01b0316610e45565b601180546001600160a01b0319166001600160a01b038616179055915f5160206141365f395f51905f525f80a36001600160a01b03167ff6879817b383066906e8355b81d5157ffe8bff151dd1946b33863aeede50ff985f80a3005b346103eb575f3660031901126103eb576020600e54604051908152f35b9181601f840112156103eb578235916001600160401b0383116103eb57602083818601950101116103eb57565b346103eb5760a03660031901126103eb576004356024356001600160401b0381116103eb57611c90903690600401611c30565b9190604435926001600160401b0384116103eb57611cb5610018943690600401611c30565b9160643593611cc38561040c565b6084359561292e565b346103eb575f3660031901126103eb5760206040517ffdc5f96508969628a00bce64abbf1ea989f16e791b70592a3122d67a7792e48c8152f35b346103eb575f3660031901126103eb576020600454604051908152f35b346103eb575f3660031901126103eb5760206040517fa24d58aaa8deed8b2ff0e63d867e6fe155de046522ed61849f5647e59d04b6ba8152f35b346103eb5760203660031901126103eb576004356001548110156103eb5760015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb5760206040515f5160206141165f395f51905f528152f35b346103eb575f3660031901126103eb576020611df8612cc1565b604051908152f35b346103eb575f3660031901126103eb575f546040516001600160a01b039091168152602090f35b346103eb5760203660031901126103eb576004355f52600b602052602060405f2054604051908152f35b346103eb575f3660031901126103eb5760206040517fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a813058152f35b346103eb57611e99366105bb565b6001600160a01b0385165f908152600260205260409020549294939290919060ff1615611f14576001600160a01b0384165f908152600560205260409020541561054257604080516001600160a01b03861660208201908152610018976109fb969093909290611f0c9082908101610eb7565b51902061386d565b633b63649d60e11b5f526001600160a01b03841660045260245ffd5b90602080835192838152019201905f5b818110611f4d5750505090565b82516001600160a01b0316845260209384019390920191600101611f40565b611f8460409295949395606083526060830190611f30565b9460208201520152565b346103eb575f3660031901126103eb5760035460015460405190602082828152019060015f52827fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65f5b838110611ffc575050611ff09061189593038461127b565b60405193849384611f6c565b81546001600160a01b0316855260209094019385925060019182019101611fd8565b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b91908201809211610d5757565b35906001600160401b03821682036103eb57565b60ff6120c2608080936001600160401b0361208082612052565b1686528361209060208301610d7b565b166020870152836120a360408301610d7b565b166040870152836120b660608301610d7b565b16606087015201610d7b565b16910152565b91908260a09103126103eb576040516120e081611240565b608061212c8183956120f181612052565b85526120ff60208201610d7b565b602086015261211060408201610d7b565b604086015261212160608201610d7b565b606086015201610d7b565b910152565b600754600160401b81101561125b5780600161215292016007556007611213565b9190916122395761221f6080606060036112ab9560ff86511660ff198254161781556020860151600182015560408601516002820155019301516121b66001600160401b0382511685906001600160401b03166001600160401b0319825416179055565b602081015184546121fa9160ff60401b1990911660409190911b68ff0000000000000000161760ff60408401511660ff60481b9060481b169060ff60481b19161790565b606082015160ff60501b1990911660509190911b60ff60501b16178455015160ff1690565b815460ff60581b191660589190911b60ff60581b16179055565b61201e565b90815260c0810192916112ab9160200190612066565b95929490958215611899576122cd606494612301937fdcd264bd7d6d022cfcd2ef488637c26dba3344acfaad38a093f1755fe21085f5976040519960208b0160ff87169b8c82528d60408201528960608201526122b4608082018c612066565b61010081526122c56101208261127b565b519020613983565b6122e16122d861129c565b60ff9092168252565b8660208201528260408201526122f736856120c8565b6060820152612131565b6123106040519283928361223e565b0390a3565b6001600160401b03811161125b5760051b60200190565b92919061233881612315565b93612346604051958661127b565b602085838152019160051b81019283116103eb57905b82821061236857505050565b6020809183356123778161040c565b81520191019061235c565b9392916123a79060409260018060a01b03168652606060208701526060860190611f30565b930152565b6001600160401b03811161125b57601f01601f191660200190565b3d156123f1573d906123d8826123ac565b916123e6604051938461127b565b82523d5f602084013e565b606090565b156123fd57565b60405162461bcd60e51b815260206004820152601c60248201527f53747261746567792064656c656761746563616c6c206661696c6564000000006044820152606490fd5b9291906123a7602091604086526040860190611f30565b6124625f612315565b90612470604051928361127b565b5f825281601f196124805f612315565b01905f5b82811061249057505050565b60209060405161249f81611260565b5f81525f838201525f60408201526040516124b981611240565b5f81525f848201525f60408201525f60608201525f6080820152606082015282828501015201612484565b906124ee82612315565b6124fb604051918261127b565b828152809261250c601f1991612315565b01905f5b82811061251c57505050565b60209060405161252b81611260565b5f81525f838201525f604082015260405161254581611240565b5f81525f848201525f60408201525f60608201525f6080820152606082015282828501015201612510565b9061ffff8091169116039061ffff8211610d5757565b805182101561120e5760209160051b010190565b906040516125a781611260565b606061212c6003839560ff81541685526001810154602086015260028101546040860152016112ad565b6007549161ffff8216928084101561267d578061ffff831611612671575b508261ffff82161115612663576126109161260991612570565b61ffff1690565b612619816124e4565b915f5b8281106126295750505090565b8061264761264161263c60019486612045565b6111f2565b5061259a565b6126518287612586565b5261265c8186612586565b500161261c565b50505061266e612459565b90565b61ffff9150165f6125ef565b5050505061266e612459565b801515036103eb57565b3561266e81612689565b90929160a060c09160e0840195845280356126b781612689565b151560208501526020810135604085015260408101356060850152606081013560808501526080810135828501520135910152565b9060a060059180356126fd81612689565b60ff801986541691151516178455602081013560018501556040810135600285015560608101356003850155608081013560048501550135910155565b6040513d5f823e3d90fd5b91906040838203126103eb57825161275c81612689565b926020810151906001600160401b0382116103eb570181601f820112156103eb57805190612789826123ac565b92612797604051948561127b565b828452602083830101116103eb57815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b92906127f19061266e95936060865260608601916127b8565b926001602082015260408185039101526127b8565b9060a8116103eb5760880190602090565b90610168116103eb576101480190602090565b90610198116103eb576101780190602090565b906101c8116103eb576101a80190602090565b906101f8116103eb576101d80190602090565b9061021c116103eb576102080190601490565b9061023c116103eb5761021c0190602090565b90610244116103eb5761023c0190600890565b3590602081106128aa575090565b5f199060200360031b1b1690565b356bffffffffffffffffffffffff198116929190601482106128d8575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b356001600160c01b0319811692919060088210612913575050565b6001600160c01b031960089290920360031b82901b16169150565b9091929495936012548015908115612cb7575b50610acb576001600160a01b0387169586156105425760115461296c906001600160a01b0316610e45565b916001600160a01b03831615612ca8576129a1925f92836040518096819582946302bc2ce760e51b84528c8c600486016127d8565b03925af1908115611b2b575f905f92612c83575b5015612c6557506102488310612c5657612a18906129dc6129d68585612806565b9061289c565b6129e96129d68686612817565b6129f66129d6878761282a565b90612a046129d6888861283d565b92612a126129d68989612850565b94613d62565b83612a5e612a58612a52612a3e612a38612a328888612863565b906128b8565b60601c90565b95612a4c6129d68288612876565b95612889565b906128f8565b60c01c90565b926001600160a01b031603612c47578203612c4757600f54936001600160401b0382169480861115612c285750612a9a6109d460165460ff1690565b612bf65760145480861115612b785750612b4c907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612aeb612adc61129c565b6001600160a01b039093168352565b6020820152836040820152612b036060820160019052565b60609060018060a01b038151166bffffffffffffffffffffffff60a01b6013541617601355602081015160145560408101516015550151151560ff801960165416911617601655565b612b5b60ff1960175416601755565b604080516001600160401b039290921682526020820192909252a2565b929350509214612b87575b5050565b6015548114612b83577fa3f0eabe92ef7bacb81dba904189dc163924ee16379f429441a4117441609fff91612bc4600160ff196017541617601755565b612bf160155492604051938493846040919493926001600160401b03606083019616825260208201520152565b0390a1565b612b5b907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612aeb612adc61129c565b636762eb4960e01b5f526004526001600160401b03821660245260445ffd5b63319c9a2160e21b5f5260045ffd5b632ffd02b360e11b5f5260045ffd5b805115612c7457805190602001fd5b63e1ac453160e01b5f5260045ffd5b9050612ca191503d805f833e612c99818361127b565b810190612745565b905f6129b5565b63baa3de5f60e01b5f5260045ffd5b905042115f612941565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f3d4a1189ec311cad4499197cf097eefb10346f2894cdd7cbbcb2d2a48001c91860408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152612d5360c08261127b565b51902090565b60405160208101915f5160206141765f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206141165f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206140d65f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206141565f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b906040519060208201928352604082015230606082015246608082015260808152612d5360a08261127b565b805f52600c60205260405f209081546001600160401b038116906001600160401b03821615612eef57604081901c60ff166115695760481c60ff16611555576001600160401b0381164210612ec9575050805460ff60401b1916600160401b179055565b63c504f34d60e01b5f526004919091526001600160401b0316602452504260445260645ffd5b82633e426d5160e21b5f5260045260245ffd5b919081101561120e5760051b0190565b3561266e8161040c565b919081101561120e5760051b81013590601e19813603018212156103eb5701908135916001600160401b0383116103eb5760200182360381136103eb579190565b929192612f69826123ac565b91612f77604051938461127b565b8294818452818301116103eb578281602093845f960137010152565b5f54909491929190612fad906001600160a01b0316610e45565b331480613104575b806130fc575b6130e857600354938183036130b75784831080156130df575b6130c657612ff360045480975f5160206141165f395f51905f52613f67565b925f945f5b8781106130195750505050505050506130146112ab9160010190565b600455565b61302c613027828585612f02565b612f12565b966001600160a01b0390811690881611156130b757866130696109d46130628360018060a01b03165f52600260205260405f2090565b5460ff1690565b61309c5761308f6109d4613088613081858a8a612f1c565b3691612f5d565b8984613fe8565b61309c5750600101612ff8565b633b63649d60e11b5f526001600160a01b031660045260245ffd5b630da1c57360e41b5f5260045ffd5b6378f4355360e11b5f526004839052602485905260445ffd5b50848210612fd4565b50505050506112ab61301460045460010190565b508015612fbb565b508115612fb5565b5f54909491929190613126906001600160a01b0316610e45565b331480613207575b806131ff575b6130e857600354938183036130b75784831080156131f6575b6130c65761316c60045480975f5160206141565f395f51905f52613f67565b925f945f5b87811061318d5750505050505050506130146112ab9160010190565b61319b613027828585612f02565b966001600160a01b0390811690881611156130b757866131d16109d46130628360018060a01b03165f52600260205260405f2090565b61309c576131e96109d4613088613081858a8a612f1c565b61309c5750600101613171565b5084821061314d565b508015613134565b50811561312e565b5f54909491929190613229906001600160a01b0316610e45565b33148061331d575b80613315575b6130e857600354938183036130b757848310801561330c575b6130c65761328260045480977fac5d643ec5a18c3c05126c0540540c01e724afd2beab02a045f0f5d791103a15613f67565b925f945f5b8781106132a35750505050505050506130146112ab9160010190565b6132b1613027828585612f02565b966001600160a01b0390811690881611156130b757866132e76109d46130628360018060a01b03165f52600260205260405f2090565b61309c576132ff6109d4613088613081858a8a612f1c565b61309c5750600101613287565b50848210613250565b508015613237565b508115613231565b5f5490949192919061333f906001600160a01b0316610e45565b331480613433575b8061342b575b6130e857600354938183036130b7578483108015613422575b6130c65761339860045480977f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd613f67565b925f945f5b8781106133b95750505050505050506130146112ab9160010190565b6133c7613027828585612f02565b966001600160a01b0390811690881611156130b757866133fd6109d46130628360018060a01b03165f52600260205260405f2090565b61309c576134156109d4613088613081858a8a612f1c565b61309c575060010161339d565b50848210613366565b50801561334d565b508115613347565b5f54909491929190613455906001600160a01b0316610e45565b331480613549575b80613541575b6130e857600354938183036130b7578483108015613538575b6130c6576134ae60045480977fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a81305613f67565b925f945f5b8781106134cf5750505050505050506130146112ab9160010190565b6134dd613027828585612f02565b966001600160a01b0390811690881611156130b757866135136109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761352b6109d4613088613081858a8a612f1c565b61309c57506001016134b3565b5084821061347c565b508015613463565b50811561345d565b5f5490949192919061356b906001600160a01b0316610e45565b33148061364c575b80613644575b6130e857600354938183036130b757848310801561363b575b6130c6576135b160045480975f5160206140d65f395f51905f52613f67565b925f945f5b8781106135d25750505050505050506130146112ab9160010190565b6135e0613027828585612f02565b966001600160a01b0390811690881611156130b757866136166109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761362e6109d4613088613081858a8a612f1c565b61309c57506001016135b6565b50848210613592565b508015613579565b508115613573565b5f5490949192919061366e906001600160a01b0316610e45565b33148061374f575b80613747575b6130e857600354938183036130b757848310801561373e575b6130c6576136b460045480975f5160206141765f395f51905f52613f67565b925f945f5b8781106136d55750505050505050506130146112ab9160010190565b6136e3613027828585612f02565b966001600160a01b0390811690881611156130b757866137196109d46130628360018060a01b03165f52600260205260405f2090565b61309c576137316109d4613088613081858a8a612f1c565b61309c57506001016136b9565b50848210613695565b50801561367c565b508115613676565b5f54909491929190613771906001600160a01b0316610e45565b331480613865575b8061385d575b6130e857600354938183036130b7578483108015613854575b6130c6576137ca60045480977f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d93613f67565b925f945f5b8781106137eb5750505050505050506130146112ab9160010190565b6137f9613027828585612f02565b966001600160a01b0390811690881611156130b7578661382f6109d46130628360018060a01b03165f52600260205260405f2090565b61309c576138476109d4613088613081858a8a612f1c565b61309c57506001016137cf565b50848210613798565b50801561377f565b508115613779565b5f54909491929190613887906001600160a01b0316610e45565b33148061397b575b80613973575b6130e857600354938183036130b757848310801561396a575b6130c6576138e060045480977f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f613f67565b925f945f5b8781106139015750505050505050506130146112ab9160010190565b61390f613027828585612f02565b966001600160a01b0390811690881611156130b757866139456109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761395d6109d4613088613081858a8a612f1c565b61309c57506001016138e5565b508482106138ae565b508015613895565b50811561388f565b5f5490949192919061399d906001600160a01b0316610e45565b331480613a91575b80613a89575b6130e857600354938183036130b7578483108015613a80575b6130c6576139f660045480977fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e62613f67565b925f945f5b878110613a175750505050505050506130146112ab9160010190565b613a25613027828585612f02565b966001600160a01b0390811690881611156130b75786613a5b6109d46130628360018060a01b03165f52600260205260405f2090565b61309c57613a736109d4613088613081858a8a612f1c565b61309c57506001016139fb565b508482106139c4565b5080156139ab565b5081156139a5565b613ab0905f5160206140d65f395f51905f52612e39565b90815f52600c60205260405f2060ff815460401c16611569575f5160206140d65f395f51905f525f52600b6020527f9b6d9405e2a268edd94615fe7f07c0d5d9dda2152c2e48f4e74379972af1c618548015613b37575f5160206140f65f395f51905f526123105f5160206140d65f395f51905f529384600161070e6107028a9742612045565b6309913ab360e31b5f5260045260245ffd5b6001600160a01b0381165f8181526002602052604090205490919060ff1615613bd9576001600160a01b0381165f908152600560205260409020541561054257600680546001600160a01b031916831790556001600160a01b03165f90815260056020526040902054907f2c8c895ef6e3978e12490ffd8cd3b92d4717b223562f851382f5daf74f587b515f80a3565b50633b63649d60e11b5f5260045260245ffd5b600154613bf881612315565b91613c06604051938461127b565b818352601f19613c1583612315565b0136602085013782905f5b83811015613c99577fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68101546001600160a01b03165f9081526005602052604090205490811561054257600191613c93906001600160a01b0316613c848389612586565b6001600160a01b039091169052565b01613c20565b5091509150565b6007545f5b818110613cc55763dfffe2f960e01b5f526004839052602484905260445ffd5b613cd1612641826111f2565b8360ff8251161480613cfa575b613ceb5750600101613ca5565b6040015160601c949350505050565b5084602082015114613cde565b9060405160c081018181106001600160401b0382111761125b5760405260a06005829460ff81541615158452600181015460208501526002810154604085015260038101546060850152600481015460808501520154910152565b93929190613d80613d7b865f52600d60205260405f2090565b613d07565b94613d8e6109d48751151590565b613f555750602085018051156105425751808203613f19575050604084015180151580613f0f575b613ed1575050606083015180151580613ec7575b613e89575050608082015180151580613e7f575b613e4157505060a0015180151580613e37575b613df9575050565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523360d81b608482015260a490fd5b5080821415613df1565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264292a26a91960d91b608482015260a490fd5b5080821415613dde565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523160d81b608482015260a490fd5b5080821415613dca565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264052544d52360dc1b608482015260a490fd5b5080821415613db6565b60405163fef6c5cf60e01b81526004808201929092526024810192909252606060448301526064820152631354951160e21b608482015260a490fd5b6350dfe91360e01b5f5260045260245ffd5b916040519160208301937f4a3d56bf3b5708e5b633d12931f9923b37fde6895d6bd92957bbfa92cd003039855260408401526060830152608082015260808152613fb260a08261127b565b519020613fbd612cc1565b9060405190602082019261190160f01b84526022830152604282015260428152612d5360628261127b565b90915f91906001600160a01b038216156140cd5760405192600484019460248501956044860192853b1561405157509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b9796505090508151806040146140a85760411461406e5750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052614086565b505050505f9056feea4a6847c3f47fe0f98dcfe2e2c074e6cb42f6d74c367b33ae8516f537e775829cc91136b2c7668ecd202c7008f17e818e108b5448a7b7fd48bd2ca6b4aab51fb40912900bb80b6bc5e38d8489266de7299eedb40b03490214410117ef53ff9279883188dbf80e171cf94b3b44b6437b838158b1d3a5df6ccc709eeb7c5217296acb9fef2a4a1ecaa044f4c8979d9f48b0d5be623c860275be31c4cbd34c169cb2d153886d95f8f2d4836fb16c9fac869e1ce9cfc93d919a0f7dfe38439b9771a2646970667358221220d9a3575e6aa98198ed460c72687df8b305209a32fda153cf7302dc50f249d44a64736f6c634300081e0033"},"sourceId":"src/CredentialManager.sol","sourcemap":"858:48457:14:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12563:1;858:48457;-1:-1:-1;858:48457:14;;-1:-1:-1;;;;;;858:48457:14;17144:10;858:48457;;;;-1:-1:-1;;;;;858:48457:14;;17169:32;;17165:58;;-1:-1:-1;;;;;858:48457:14;;17237:37;;17233:63;;17306:68;858:48457;;-1:-1:-1;;;;;;858:48457:14;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;;;;18587:6;;18583:74;;18671:30;;:63;;;;858:48457;18667:156;;-1:-1:-1;18853:5:14;;;;;;858:48457;;;;;19218:55;858:48457;;;;;;-1:-1:-1;858:48457:14;;;;;;19218:55;858:48457;;;;;;17455:32;858:48457;;;17455:32;858:48457;;;;;;;17497:42;858:48457;;;17497:42;858:48457;;12563:1;858:48457;-1:-1:-1;17697:3:14;858:48457;;17665:30;;;;;17746:22;;;;:::i;:::-;;858:48457;;;;;17850:32;;;17697:3;17846:67;;858:48457;;12563:1;858:48457;-1:-1:-1;858:48457:14;17928:19;858:48457;;;-1:-1:-1;858:48457:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18985:10;858:48457;;;;;;;;;;;;;;;;;;;;;;;;17985:50;12563:1;858:48457;;;;;;;;;17985:50;-1:-1:-1;;858:48457:14;;;;;;;;12563:1;858:48457;;17650:13;;858:48457;;;;-1:-1:-1;858:48457:14;17306:68;858:48457;;;-1:-1:-1;858:48457:14;17846:67;17891:22;;;-1:-1:-1;17891:22:14;858:48457;-1:-1:-1;17891:22:14;17850:32;17862:6;858:48457;17862:6;;858:48457;17862:20;17850:32;;17665:30;18114:16;858:48457;;18154:8;858:48457;;18208:8;858:48457;;18264:6;858:48457;;;;9426:25;-1:-1:-1;858:48457:14;;;;;;;;;;;;18860:3;-1:-1:-1;;;;;18892:19:14;;;;:::i;:::-;858:48457;;18929:16;;;18925:42;;858:48457;-1:-1:-1;858:48457:14;18985:10;858:48457;;;;-1:-1:-1;858:48457:14;;;18981:53;;858:48457;-1:-1:-1;858:48457:14;18985:10;858:48457;;;-1:-1:-1;858:48457:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;858:48457:14;;;;;;;;;-1:-1:-1;;;;;;858:48457:14;;;;;;19120:17;;-1:-1:-1;19120:17:14;858:48457;18838:13;;858:48457;;;;-1:-1:-1;858:48457:14;;;;;-1:-1:-1;858:48457:14;;;;;-1:-1:-1;858:48457:14;;;;;-1:-1:-1;858:48457:14;18981:53;19008:26;;;-1:-1:-1;19008:26:14;;-1:-1:-1;19008:26:14;18925:42;17210:13;;;-1:-1:-1;18954:13:14;;-1:-1:-1;18954:13:14;18667:156;18602:55;;;;;-1:-1:-1;18757:55:14;;858:48457;;;;-1:-1:-1;18757:55:14;18671:63;18705:29;;;;18671:63;;18583:74;18602:55;;;;-1:-1:-1;18602:55:14;;858:48457;-1:-1:-1;858:48457:14;;;-1:-1:-1;18602:55:14;858:48457;;;;;;;;;;;;;;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;858:48457:14;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;858:48457:14;;;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;858:48457:14;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;858:48457:14;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o","userdoc":{"errors":{"CannotCancel()":[{"notice":"Thrown when attempting to cancel an operation that cannot be canceled (e.g., already executed)."}],"InsufficientSignatures(uint256,uint256)":[{"notice":"Thrown when the number of valid signatures provided is less than the required threshold."}],"InvalidCommitteeThreshold(uint256,uint256)":[{"notice":"Thrown when attempting to set a quorum threshold that is 0 or greater than the total operators."}],"InvalidDelay(uint256)":[{"notice":"Thrown when a timelock delay is set to 0 (invalid safety margin)."}],"InvalidEpoch(uint256,uint256)":[{"notice":"Thrown when the supplied epoch is invalid"}],"InvalidProfileConfig()":[{"notice":"Thrown when the used profile is configured incorrectly."}],"InvalidProfileId()":[{"notice":"Thrown when the used profile does not exist."}],"InvalidQuoteLength()":[{"notice":"Thrown when a Quote length is invalid."}],"InvalidReportData()":[{"notice":"Thrown when a Quote ReportData does not match params."}],"InvalidVaultAddr()":[{"notice":"Thrown when a Vault address is empty (bytes32(0))."}],"InvalidVerifier()":[{"notice":"Thrown when a Quote verifier is invalid."}],"InvalidZkProof()":[{"notice":"Thrown when the ZK Proof attesting measurements is invalid."}],"MeasurementMismatch(bytes32,bytes32,string)":[{"notice":"Thrown when the measured TEE state does not match the expected state."}],"NoStrategy()":[{"notice":"Thrown when attempting to update vault admins on a chain that has no registered strategy."}],"NotOperator(address)":[{"notice":"Thrown when a signature belongs to an address that is not a registered operator."}],"ProfileInactive(uint256)":[{"notice":"Thrown when the used profile is not active."}],"SignersNotSortedOrUnique()":[{"notice":"Thrown when the provided signatures are not sorted by signer address or contain duplicates."}],"StrategyAlreadyExists()":[{"notice":"Thrown when attempting to register a strategy for a chain that already has one."}],"TimelockAlreadyCanceled(bytes32)":[{"notice":"Thrown when attempting to execute or cancel an operation that has already been canceled."}],"TimelockAlreadyExecuted(bytes32)":[{"notice":"Thrown when attempting to execute or schedule an operation that has already been executed."}],"TimelockNotReady(bytes32,uint256,uint256)":[{"notice":"Thrown when attempting to execute a timelock before the delay has elapsed."}],"TimelockUnknown(bytes32)":[{"notice":"Thrown when attempting to act on a timelock ID that does not exist or was never scheduled."}],"VaultNotFound(uint256,uint256)":[{"notice":"Thrown when a requested vault cannot be found for the specified chain."}],"ZeroAddress()":[{"notice":"Thrown when a critical configuration address (e.g., Risk Manager) is set to address(0)."}]},"events":{"AdminUpdateStrategyRegistered(uint256,uint256,address)":{"notice":"Emitted when a new cross-chain strategy is registered."},"AttestedKeyRegistered(address,bytes32)":{"notice":"Emitted when a new attested key for an operator is registered."},"CommitteeThresholdUpdated(uint256,uint256)":{"notice":"Emitted when the signature threshold is updated."},"DepositVaultAdministratorsUpdated(uint256,address[],uint256)":{"notice":"Emitted when the admin set of a remote vault is updated."},"DepositVaultAdministratorsUpdated(uint256,uint256,address[],uint256)":{"notice":"Emitted when a new cross-chain strategy is registered."},"LeaderUpdated(address,bytes32)":{"notice":"Emitted when the quorum leader is updated."},"MeasurementsUpdated(bytes32,bytes32)":{"notice":"Emitted when the measurements are updated."},"OperatorAdded(address)":{"notice":"Emitted when a new operator is added during initialization."},"VaultAdded(uint256,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8))":{"notice":"Emitted when a new vault is added to the registry."}},"kind":"user","methods":{"addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":{"notice":"Registers a new deposit vault to the system."},"admin()":{"notice":"TEMP Admin path, to be revised later."},"adminUpdateStrategies(uint256,uint256)":{"notice":"Maps a RoutingID to the VMID to the Strategy Contract responsible for sending messages to it."},"appointLeader(address,address[],bytes[])":{"notice":"Manually appoints a leader. Used for bootstrapping or emergency recovery."},"cancelTimelock(bytes32,address[],bytes[])":{"notice":"Cancels a pending timelocked operation."},"committeeThreshold()":{"notice":"The minimum number of signatures required to execute a governance action."},"constructor":{"notice":"Initializes the Credential Manager with the initial operator set and configuration."},"domainSeparator()":{"notice":"Returns the EIP-712 domain separator used for verifying governance signatures."},"epoch()":{"notice":"Tracks the logical era of the TEE state to prevent replay attacks."},"executeRegistryContract(address)":{"notice":"Executes a pending Registry Contract update if the timelock has expired."},"executeRiskManager(address)":{"notice":"Executes a pending Risk Manager update if the timelock has expired."},"executeUpdateAutomataVerifier(address)":{"notice":"Sxecudes a timelocked update for the Automata Verifier address."},"getCommitteeConfig()":{"notice":"Returns the full Committee configuration."},"getLeader()":{"notice":"Returns the current Leader's Operator Address and Attested Key."},"getVaults(uint16,uint16)":{"notice":"Returns a paginated list of registered vaults."},"governanceNonce()":{"notice":"A monotonically increasing nonce for governance actions."},"initiateRestart()":{"notice":"Step 1: Initiates the gathering window if the system is down."},"isOperator(address)":{"notice":"Lookup to check if an address is an operator."},"latestCheckpointHash()":{"notice":"The hash of the system state (inventory) associated with the current epoch."},"leader()":{"notice":"The current active leader (Operator Address)."},"measurementProfiles(uint256)":{"notice":"The current \"Gold Image\" measurements required for valid Quotes. Matches based on profile."},"operatorToAttestedKey(address)":{"notice":"Maps Operator (EOA) -> Attested Key (TEE Address)."},"operators(uint256)":{"notice":"The list of authorized Clearing Engine operator addresses (EOAs)."},"registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":{"notice":"Registers a strategy contract to handle updates for a specific chain."},"registerAttestedKey(bytes32)":{"notice":"Allows an operator to register their TEE's attested key."},"registryContract()":{"notice":"The address of the global Registry Contract used for asset/settler configurations."},"resolveRestart()":{"notice":"Step 3: Finalizes the restart after the window closes."},"riskManager()":{"notice":"The address of the Risk Manager (or multisig) authorized to adjust risk parameters."},"scheduleManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32),address[],bytes[])":{"notice":"Governance proposes adding or updating a measurement profile (e.g., for Phala or GCP)."},"scheduleRegistryContract(address,address[],bytes[])":{"notice":"Schedules a timelocked update for the Registry Contract address."},"scheduleRiskManager(address,address[],bytes[])":{"notice":"Schedules a timelocked update for the Risk Manager address."},"scheduleUpdateAutomataVerifier(address,address[],bytes[])":{"notice":"Schedules a timelocked update for the Automata Verifier."},"setDepositVaultAdministrators(uint256,uint256,address[],uint256)":{"notice":"Updates the administrators or withdrawal quorum for a vault on a remote chain."},"submitRestartProof(uint256,bytes,bytes,address,bytes32)":{"notice":"Restarts the system using a Trustless ZK Proof (Automata / SP1). The contract stores the \"Best\" candidate."},"timelockDelayFor(bytes32)":{"notice":"Configuration mapping for how long specific operations must be delayed."},"timelockOps(bytes32)":{"notice":"Stores the status of individual scheduled operations by their hash ID."},"updateCommitteeThreshold(uint256,address[],bytes[])":{"notice":"Updates the number of signatures required for valid governance actions."},"vaults(uint256)":{"notice":"The registry of all authorized Deposit Vaults."},"withdraw(address,address[],bytes[])":{"notice":"Withdraw funds held by this contract."}},"notice":"The centralized Root of Trust for the TEE Clearing Engine.","version":1}},"DepositVault":{"abi":[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_credentialManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EmptyOrders","type":"error"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAdministrators","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAmountFromExecutor","type":"error"},{"inputs":[{"internalType":"uint256","name":"settlementIndex","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientCallbackReturnForSettlement","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"given","type":"uint256"}],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"MissedQuorum","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCredentialManager","type":"error"},{"inputs":[],"name":"NotExecutor","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"PayloadMismatch","type":"error"},{"inputs":[],"name":"SettlerNotApproved","type":"error"},{"inputs":[],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroWithdrawalQuorum","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"numAdminsAfter","type":"uint256"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[],"name":"AdministratorSetReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldCredentialManager","type":"address"},{"indexed":false,"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"CredentialManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"account","type":"uint64"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"Settled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"WithdrawalQuorumChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[],"name":"SETTLEMENT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"},{"internalType":"address","name":"executor","type":"address"}],"name":"addSettlerExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"administrators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedSettlers","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManagerChangeDelayBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"depositCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct DepositVault.Settlement","name":"order","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"executeAtomicSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct DepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"clearingEngineSignature","type":"bytes"}],"internalType":"struct DepositVault.SignedSettlement[]","name":"requests","type":"tuple[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"executeSquashingSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getApprovedSettlers","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAdministrator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSignatureUse","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingSettlements","outputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct DepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"address","name":"target","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct DepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"clearingEngineSignature","type":"bytes"}],"internalType":"struct DepositVault.SignedSettlement[]","name":"orders","type":"tuple[]"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"name":"pullBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"}],"name":"pushBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"removeSettler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"setCredentialManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setDepositorStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"settlementCaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"settlementCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct DepositVault.Withdrawal","name":"withdrawal","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes32","name":"epochHash","type":"bytes32"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"withdrawalCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"DepositVault","deploymentBytecode":{"bytecode":"0x60803460ad57601f6126e038819003918201601f19168301916001600160401b0383118484101760b157808492604094855283398101031260ad57604b602060458360c5565b920160c5565b6138406006556001600160a01b03909116908115609e576001600160a01b0316908115609e5760018060a01b03195f5416175f5560018060a01b0319600154161760015560405161260790816100d98239f35b63d92e233d60e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820360ad5756fe60806040526004361015610011575f80fd5b5f3560e01c80630a2eb30114611fbd5780630b9b17a614611df657806313af403514611dab57806317aa2e2514611abd57806321e6652c14611a10578063224b93e1146119b457806323c56731146117525780632b0c1a1e1461172a5780633684f4ac146116505780633a87fe4d146116185780633d63ea93146115ee57806341774bfe1461149b5780634bf0d3311461145e5780637438b9371461142d57806382ff8b1e146114035780638da5cb5b146113dc5780638dff23051461139757806392698ac6146112e157806393ea8a7d146112c4578063952df83214610ff557806398af977214610fbd578063a33c9d0014610fa0578063ad9fa8bc14610e7b578063b1fb79c014610e41578063b24e085a14610600578063d7a99d7a14610353578063d89d151014610311578063d8c8785d146102f4578063d954863c146101c95763f585b64f14610163575f80fd5b346101b65760603660031901126101b65761017c611fea565b610184612000565b5f549091906001600160a01b031633036101ba576001600160a01b038216156101b6576101b4916044359161250a565b005b5f80fd5b6330cd747160e01b5f5260045ffd5b346101b65760603660031901126101b6576004356101e5612000565b604435335f52600e60205260ff60405f205416156102c2578015610297577f9d677c46e10ba33882144473956fae8d2c52353dcde5aab8230d1bd280cfc3b4816102328593303387612482565b825f52600b60205260405f2054936102646040519283928360209093929193604081019460018060a01b031681520152565b0390a35f52600b60205260405f20805490600182018092116102835755005b634e487b7160e01b5f52601160045260245ffd5b606460405162461bcd60e51b81526020600482015260046024820152635a65726f60e01b6044820152fd5b60405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b6044820152606490fd5b346101b6575f3660031901126101b6576020600f54604051908152f35b346101b65760203660031901126101b657600435600d548110156101b65761033a60209161217f565b905460405160039290921b1c6001600160a01b03168152f35b346101b657366003190161014081126101b657610100136101b657610104356001600160401b0381116101b65761038e9036906004016121c4565b90610124356001600160401b0381116101b6576103af9036906004016121c4565b92906084359160a435936001600160401b0385168095036101b65760e435918242116105f1575f85815260036020908152604080832033845260010190915290205460ff16156105e257845f52600a60205260405f20865f5260205260405f20549660c435978089036105cb575061047290600254956104666001600160601b031961043961225d565b60601b16968b8b8b6024359b6001600160601b0319610456612273565b60601b168d6064359d8e9361229d565b602081519101206124e0565b43600f55845f52600a60205260405f20865f5260205260405f2080549160018301809311610283576020928692556104c76104ab61225d565b604051631f8eac2760e11b815295869485949260048601612448565b03815f335af19081156105c0575f9161058e575b50818110610579579061051b7ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c9392610512612273565b30903390612482565b61052d823361052861225d565b61250a565b61057461053861225d565b91610541612273565b604080516001600160a01b0395861681526020810196909652931692840192909252606083019190915281906080820190565b0390a4005b63d44c3d9d60e01b5f5260045260245260445ffd5b90506020813d6020116105b8575b816105a9602093836120ef565b810103126101b65751866104db565b3d915061059c565b6040513d5f823e3d90fd5b88906306427aeb60e01b5f5260045260245260445ffd5b6361968ebb60e11b5f5260045ffd5b630407b05b60e31b5f5260045ffd5b346101b65760603660031901126101b6576004356001600160401b0381116101b657610630903690600401612040565b6024356001600160401b0381116101b65761064f903690600401612040565b90604435828403610e3257805f52600760205260ff60405f20541615610e23575f90815260036020908152604080832033845260010190915290205460ff16156105e2578260011b83810460021484151715610283576106ae816123e4565b906106bc60405192836120ef565b8082526106cb601f19916123e4565b015f5b818110610df45750505f915f5b858110610ad257505f5b838110610a1057505f5b8381106109b75750610700856123e4565b9361070e60405195866120ef565b858552601f1961071d876123e4565b013660208701375f5b8681106108d3575050505f5b8281106107f85785855f5b81811061074657005b60019061075d3661075883868861223a565b612352565b60808101516001600160401b0360a083015116907ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c60c084015193868060a01b038151166107ef60208301519260608a8060a01b03604083015116910151906040519485948590949392606092608083019660018060a01b03168352602083015260018060a01b031660408201520152565b0390a40161073d565b5f60606108058385612416565b51015113610816575b600101610732565b6001600160a01b036108288284612416565b51511660606108378385612416565b510151905f5f5b828a8a808410610883575050505082811061086c5750600192916108659130903390612482565b905061080e565b905063d44c3d9d60e01b5f5260045260245260445ffd5b6001600160a01b03916108a49160409161089e91879161223a565b01612289565b16146108b3575b60010161083e565b906108cb6001916108c4848b612416565b5190612345565b9190506108ab565b6108e236610758838a8c61223a565b8051602082810151610920926001600160a01b031661090286888a6123fb565b604051631f8eac2760e11b8152958694859491939160048601612448565b03815f335af19081156105c0575f91610986575b5061093f8389612416565b52606061094c8389612416565b519101908151116109605750600101610726565b61096a8288612416565b519051916359a771d160e01b5f5260045260245260445260645ffd5b90506020813d82116109af575b816109a0602093836120ef565b810103126101b657518a610934565b3d9150610993565b805f60606109c760019487612416565b510151126109d6575b016106ef565b610a0b828060a01b036109e98387612416565b515116610a0360606109fb8589612416565b510151612438565b90339061250a565b6109d0565b806020610a1f60019386612416565b5101516040610a2e8387612416565b5101511015610a7457610a5e6020610a468387612416565b5101516040610a558488612416565b510151906123d7565b6060610a6a8387612416565b5101525b016106e5565b6040610a808286612416565b5101516020610a8f8387612416565b5101511015610a6e57610abe610ab96040610aaa8488612416565b5101516020610a558589612416565b612438565b6060610aca8387612416565b510152610a6e565b610add81878961223a565b610120813603126101b65760405190610af58261209d565b610aff3682612352565b8252610100810135906001600160401b0382116101b6570136601f820112156101b65780356001600160401b038111610de05760405191610b4a601f8301601f1916602001846120ef565b81835236602083830101116101b657815f926020809301838601378301015260208201525160808101516001600160401b0360a0830151169160c08101519260e08201519060408301519360018060a01b0385169284519660206060870151960151968242116105f157835f52600a60205260405f206001600160401b0386165f5260205260405f2054808310610dc957508f918f8b90610c1f610c3d96610c2c948a8f8f8f90918d92610c379b600254906001600160601b03199060601b16926001600160601b03199060601b169061229d565b602081519101209461223a565b610100810190612313565b916124e0565b43600f555f52600a6020526001600160401b0360405f2091165f5260205260405f208054906001820180921161028357555f9182805b8a8110610d81575b5015610d3d575b50505f5b878110610cf2575b5015610c9f575b50506001016106db565b94610cea916001939660405191610cb5836120b8565b858060a01b031682525f602083015260408201525f6060820152610cd98287612416565b52610ce48186612416565b5061242a565b939088610c95565b6001600160a01b0384811690610d08838a612416565b51511614610d1857600101610c86565b60409150610d269087612416565b5101610d33828251612345565b905260018a610c8e565b90610d7992989160405191610d51836120b8565b825260208201525f60408201525f6060820152610d6e8289612416565b52610ce48188612416565b958a80610c82565b836001600160a01b03610d94838d612416565b51511614610da457600101610c73565b60209150610db2908a612416565b5101610dbf828251612345565b905260018d610c7b565b90506306427aeb60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52604160045260245ffd5b602090604051610e03816120b8565b5f81525f838201525f60408201525f6060820152828286010152016106ce565b63be4ab3c760e01b5f5260045ffd5b631d6e22b960e01b5f5260045ffd5b346101b6575f3660031901126101b65760206040517fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb8152f35b346101b65760403660031901126101b657600435610e97612000565b5f549091906001600160a01b031633036101ba57805f52600760205260ff60405f20541615610f49575b5f52600360205260405f2090600182019160018060a01b0382165f528260205260ff60405f20541615610ef057005b8054600160401b811015610de057610f0d916001820181556121af565b81546001600160a01b0393841660039290921b82811b94901b19169290921790555f90815260209190915260409020805460ff19166001179055005b600454600160401b811015610de057610f82610f6c826001859401600455612197565b819391549060031b91821b915f19901b19161790565b9055805f52600760205260405f20600160ff19825416179055610ec1565b346101b6575f3660031901126101b6576020600654604051908152f35b346101b65760203660031901126101b6576001600160a01b03610fde611fea565b165f526008602052602060405f2054604051908152f35b346101b657366003190161010081126101b6576060136101b6576064356084356001600160a01b03811681036101b65760a4359160e4356001600160401b0381116101b657611048903690600401612040565b9290936005548142116105f1578085106112ae57835f52600c60205260405f20549560443596808803611297575061107f866123e4565b9061108d60405192836120ef565b868252601f1961109c886123e4565b013660208401375f916002546001600160601b03196110b961225d565b60601b16602435966040519160208301937f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba8552604084015260608301528760808301528960a08301528b60c083015260e082015260c4356101008201526001600160601b03198860601b16610120820152610120815261113c610140826120ef565b5190205f5b8981106111e5575b505050509080929394955081106111d0575050825f52600c60205260405f2080549060018201809211610283577fc4f5735f1abe60807c07c06560e4a6d7eb655a37442b6a47e3ab1998c9611e2f936111ab9284925543600f5561052861225d565b6111b361225d565b604080516001600160a01b039290921682526020820192909252a3005b6326a15da760e01b5f5260045260245260445ffd5b6111fa6111f3828c876123fb565b908461255b565b6001600160a01b03811690811561128857611214906121f1565b156112885760015f5b87811061125d575b50611240575b5085851461123b57600101611141565b611149565b9461125691956112508286612416565b5261242a565b938b61122b565b826001600160a01b036112708389612416565b51161461127f5760010161121d565b50505f8d611225565b638baa579f60e01b5f5260045ffd5b87906306427aeb60e01b5f5260045260245260445ffd5b846326a15da760e01b5f5260045260245260445ffd5b346101b6575f3660031901126101b6576020600554604051908152f35b346101b6575f3660031901126101b6576040518060206004549283815201809260045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b905f5b818110611381575050508161133f9103826120ef565b604051918291602083019060208452518091526040830191905f5b818110611368575050500390f35b825184528594506020938401939092019160010161135a565b8254845260209093019260019283019201611329565b346101b65760403660031901126101b6576113b061202a565b6004355f52600a6020526001600160401b0360405f2091165f52602052602060405f2054604051908152f35b346101b6575f3660031901126101b6575f546040516001600160a01b039091168152602090f35b346101b65760203660031901126101b6576004355f52600c602052602060405f2054604051908152f35b346101b65760203660031901126101b6575f546001600160a01b031633036101ba576002546101b657600435600255005b346101b65760203660031901126101b6576001600160a01b0361147f611fea565b165f52600e602052602060ff60405f2054166040519015158152f35b346101b65760203660031901126101b6575f54600435906001600160a01b031633036101ba576004545f828152600760205260408120805460ff191690555b818110611565575b50505f52600360205260405f205f60018201905b8254811015611539578061150c600192856121af565b838060a01b0391549060031b1c16828060a01b03165f528260205260405f2060ff198154169055016114f6565b82545f8455838161154657005b5f5260205f20908101905b81811061155a57005b5f8155600101611551565b8261156f82612197565b90549060031b1c14611583576001016114da565b905f19810190811161028357610f6c61159e6115ab92612197565b90549060031b1c92612197565b905560045480156115da575f19016115c281612197565b8154905f199060031b1b1916905560045581806114e2565b634e487b7160e01b5f52603160045260245ffd5b346101b65760203660031901126101b6576004355f52600b602052602060405f2054604051908152f35b346101b65760203660031901126101b6576004356004548110156101b657611641602091612197565b90549060031b1c604051908152f35b346101b65760603660031901126101b65761166961202a565b604435906004355f5260096020526001600160401b0360405f2091165f5260205260405f2080548210156101b657610120916116a491612070565b506116ae81612110565b90600860018060a01b039101541660e06040519260018060a01b0381511684526020810151602085015260018060a01b03604082015116604085015260608101516060850152608081015160808501526001600160401b0360a08201511660a085015260c081015160c0850152015160e0830152610100820152f35b346101b6575f3660031901126101b6576001546040516001600160a01b039091168152602090f35b346101b65760403660031901126101b6576004356001600160401b0381116101b657611782903690600401612040565b600154909190602435906001600160a01b031633036119a5576001811061199657808310611980575f5b838110156117e8576001600160a01b036117cb600583901b8501612289565b16156117d9576001016117ac565b63d92e233d60e01b5f5260045ffd5b5091906001600160401b038211610de057600160401b8211610de057600d5482600d5580831061193c575b50600d5f525f5b82811061190157837f74e3f7a222a002bb0346144c8442604f86b79a5319301c8b2393dbe33ba3f1ec5f80a1600d545f5b8181106118965782600554908060055580820361186457005b7f71847092dda23e5394806b377214ca90449cdd1413463150e7f577ccefea54d89160409182519182526020820152a1005b61189f8161217f565b905460018301929160031b1c6001600160a01b031682821161028357604080516001600160a01b0392909216825260208201939093526001927f723c2b747529ca7f5eb53a74808f4a8b9bf264f0fc450fd904900151da74548a91a10161184b565b600190602061190f84612289565b930192817fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501550161181a565b600d5f527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb59081019083015b8181106119755750611813565b5f8155600101611968565b82633e1a6b7d60e21b5f5260045260245260445ffd5b6345f8facb60e11b5f5260045ffd5b6326b672e560e01b5f5260045ffd5b346101b65760403660031901126101b6576119cd611fea565b602435908115158092036101b6575f546001600160a01b031633036101ba5760018060a01b03165f52600e60205260405f209060ff801983541691161790555f80f35b346101b65760203660031901126101b657611a29611fea565b5f546001600160a01b031633036101ba576001600160a01b031680156117d957611a58600f5460065490612345565b431015611aae5760407feb63fb900cbf0301de00619a02ae3f5996820dabc03207c0e0d97046e521d7b99160015490806001600160601b0360a01b83161760015582519160018060a01b031682526020820152a1005b636fed7d8560e01b5f5260045ffd5b346101b65760a03660031901126101b6576004356001600160401b0381116101b657611aed903690600401612040565b90602435604435916001600160401b0383168093036101b657606435906001600160a01b038216908183036101b657608435918242116105f157845f52600960205260405f20865f5260205260405f20546101b657611b4b336121f1565b15611d9c57845f52600a60205260405f20865f5260205260405f205493600254948815611d8d575f5b898110611ba2578989895f52600a60205260405f20905f52602052611b9e60405f20918254612345565b9055005b611bad818b8761223a565b9160c083013590808203611d78575088929190818c8a8a848f6bffffffffffffffffffffffff19611bdd8a612289565b60601b169960208a01359a6001600160601b031960408c01611bfe90612289565b60601b168c60608d013592611c129861229d565b8051906020012091611c24918a61223a565b6101008101611c3291612313565b90611c3c926124e0565b600181018091116102835792895f52600960205260405f208b5f5260205260405f2090604051611c6b8161209d565b611c753686612352565b815260208101928884528054600160401b811015610de057611c9c91600182018155612070565b939093611d65579051805184546001600160a01b03199081166001600160a01b03928316178655602083015160018781019190915560408401516002880180548416918516919091179055606084015160038801556080840151600488015560a084015160058801805467ffffffffffffffff19166001600160401b039290921691909117905560c0840151600688015560e09390930151600787015592516008909501805490931694169390931790559092611d5f9190869061052890612289565b01611b74565b634e487b7160e01b5f525f60045260245ffd5b6306427aeb60e01b5f5260045260245260445ffd5b63164bb4b560e11b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346101b65760203660031901126101b657611dc4611fea565b5f54906001600160a01b03821633036101ba576001600160a01b03169081156117d9576001600160a01b031916175f55005b346101b65760403660031901126101b657600435611e1261202a565b611e1b336121f1565b15611d9c576001600160401b0316905f5b815f52600960205260405f20835f5260205260405f205463ffffffff82161015611f3c5763ffffffff90825f52600960205260405f20845f52602052611e758160405f20612070565b50611ebe60405191611e868361209d565b611e8f81612110565b8084526008909101546001600160a01b0390811660208501819052604083015160609093015192309216612482565b5160c0810151815160208084015160408086015160609687015182516001600160a01b0396871681529485019390935293909316928201929092529283015290859085907ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c90608090a41663ffffffff811461028357600101611e2c565b505f52600960205260405f20905f5260205260405f208054905f815581611f5f57005b81600902916009830403610283575f5260205f20908101905b818110611f8157005b805f600992555f60018201555f60028201555f60038201555f60048201555f60058201555f60068201555f60078201555f600882015501611f78565b346101b65760203660031901126101b6576020611fe0611fdb611fea565b6121f1565b6040519015158152f35b600435906001600160a01b03821682036101b657565b602435906001600160a01b03821682036101b657565b35906001600160a01b03821682036101b657565b602435906001600160401b03821682036101b657565b9181601f840112156101b6578235916001600160401b0383116101b6576020808501948460051b0101116101b657565b8054821015612089575f52600960205f20910201905f90565b634e487b7160e01b5f52603260045260245ffd5b604081019081106001600160401b03821117610de057604052565b608081019081106001600160401b03821117610de057604052565b61010081019081106001600160401b03821117610de057604052565b90601f801991011681019081106001600160401b03821117610de057604052565b9060405161211d816120d3565b82546001600160a01b039081168252600184015460208301526002840154166040820152600383015460608201526004830154608082015260058301546001600160401b031660a0820152600683015460c082015260079092015460e0830152565b600d5481101561208957600d5f5260205f2001905f90565b6004548110156120895760045f5260205f2001905f90565b8054821015612089575f5260205f2001905f90565b9181601f840112156101b6578235916001600160401b0383116101b657602083818601950101116101b657565b600d54905f5b828110612205575050505f90565b61220e8161217f565b905460039190911b1c6001600160a01b0390811690831614612232576001016121f7565b505050600190565b91908110156120895760051b8101359061011e19813603018212156101b6570190565b6004356001600160a01b03811681036101b65790565b6044356001600160a01b03811681036101b65790565b356001600160a01b03811681036101b65790565b989796959493929190604051997fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208c015260408b015260608a0152608089015260a088015260c087015260e08601526101008501526101208401526101408301526101408252612311610160836120ef565b565b903590601e19813603018212156101b657018035906001600160401b0382116101b6576020019181360383136101b657565b9190820180921161028357565b9190826101009103126101b65760405161236b816120d3565b809261237681612016565b82526020810135602083015261238e60408201612016565b6040830152606081013560608301526080810135608083015260a08101356001600160401b03811681036101b65760e091829160a085015260c081013560c08501520135910152565b9190820391821161028357565b6001600160401b038111610de05760051b60200190565b90821015612089576124129160051b810190612313565b9091565b80518210156120895760209160051b010190565b5f1981146102835760010190565b600160ff1b8114610283575f0390565b9284926080959260018060a01b03168552602085015260606040850152816060850152848401375f828201840152601f01601f1916010190565b916040519360605260405260601b602c526323b872dd60601b600c5260205f6064601c82855af1908160015f511416156124c2575b50505f606052604052565b3b153d1710156124d3575f806124b7565b637939f4245f526004601cfd5b906124eb929161255b565b6001600160a01b0381161561128857612503906121f1565b1561128857565b919060145260345263a9059cbb60601b5f5260205f6044601082855af1908160015f5114161561253d575b50505f603452565b3b153d17101561254e575f80612535565b6390b8ec185f526004601cfd5b604080515f959490939181146125a65760411461257757505050565b604080929395508101355f1a60205281375b5f526020604060805f60015afa505f6060523d6060185191604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b031660605290925061258956fea26469706673582212203fdca5d1551af74b875d1f0e4b8878b123412bb78ae4783affa417e9c133ff7964736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{"addSettlerExecutor(bytes32,address)":{"details":"Reverts with `NotOwner`; Only the admin can set the settler executor.","params":{"executor":": The settler's assigned executor address.","settler":": The settler's tplus account key."}},"constructor":{"details":"Reverts with `ZeroAddress()` if `_owner` is null.Reverts with `ZeroAddress()` if `_credentialManager` is null.","params":{"_credentialManager":"The address of the credential manager.","_owner":"The address to set as the owner."}},"deposit(bytes32,address,uint256)":{"details":"Reverts if the amount is 0.","params":{"amount":": The amount of the token to deposit.","tokenAddress":": The address of the token to deposit.","user":": The user whose account will be credited with the deposit."}},"executeAtomicSettlement((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes,bytes)":{"details":"Reverts with `Expired` if the block timestamp is greater than `validUntil`.Reverts with `NotExecutor`; Only the executor can settle.Reverts with `InvalidNonce` if the nonce has already been used.Reverts with `SignatureError` if the signer is not an admin.Reverts with `InsufficientAmountFromExecutor` if the `order.amountIn` is less than what the executor reports","params":{"data":": The data to execute as part of settlement callback.","order":": The settlement order.","signature":": The signature from the t+ clearing engine."}},"executeSquashingSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes[],bytes32)":{"params":{"requests":"List of settlement requests"}},"getApprovedSettlers()":{"returns":{"_0":"An array of addresses (as bytes32) that are currently approved settlers."}},"pullBatchSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":{"details":"Reverts with `Expired` if the block timestamp is greater than `validUntil`.Reverts if a batch settlement has already started.Reverts with `NotAdmin`; Only an admin can execute the settlement.Reverts with `InvalidNonce` if the nonce has already been used.Reverts with `SignatureError` if the signer is not an admin.","params":{"orders":": The settlement orders.","target":": The target address to send the token to, pull tokens from, and execute callback on.","user":": The t+ user who is executing the settlement.","validUntil":": The timestamp when the settlement signature expires."}},"pushBatchSettlements(bytes32,uint64)":{"details":"Reverts with `NotAdmin`; Only an admin can execute the settlement.","params":{"account":": The account of the t+ user to execute settlement against","user":": The t+ user who is executing the settlement."}},"removeSettler(bytes32)":{"details":"Reverts with `NotOwner`; Only the admin can remove a settler.","params":{"settler":": The settler's tplus account key."}},"setDomainSeparator(bytes32)":{"details":"Reverts with `NotOwner`; Only the admin can set the domain separator.","params":{"domainSeparator":": The value to set."}},"setOwner(address)":{"details":"Reverts with `NotOwner`; Only the owner can set a new owner."},"withdraw((address,uint256,uint256),bytes32,address,uint256,bytes32,bytes[])":{"details":"Reverts with `Expired` if the block timestamp is greater than `validUntil`.Reverts with `InvalidNonce` if the nonce has already been used.Reverts with `SignatureError` if the signer is not an admin.","params":{"signatures":": t+ clearing engine signatures.","target":": The target address to send the token to.","user":": The user whose account will be debited by the withdrawal.","validUntil":": The timestamp when the withdrawal signature expires.","withdrawal":": The withdrawal token and amount."}}},"stateVariables":{"credentialManager":{"details":"In production, this will be an upgradeable proxy"},"owner":{"details":"Should be set to the DStack container shared secret address."},"settlementCaps":{"details":"Currently unused \u2014 implementation pending design finalization."}},"version":1},"methodIdentifiers":{"SETTLEMENT_TYPEHASH()":"0xb1fb79c0","addSettlerExecutor(bytes32,address)":"0xad9fa8bc","administrators(uint256)":"0xd89d1510","approvedSettlers(uint256)":"0x3a87fe4d","canDeposit(address)":"0x4bf0d331","credentialManager()":"0x2b0c1a1e","credentialManagerChangeDelayBlocks()":"0xa33c9d00","deposit(bytes32,address,uint256)":"0xd954863c","depositCounts(bytes32)":"0x3d63ea93","executeAtomicSettlement((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes,bytes)":"0xd7a99d7a","executeSquashingSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes[],bytes32)":"0xb24e085a","getApprovedSettlers()":"0x92698ac6","isAdministrator(address)":"0x0a2eb301","lastSignatureUse()":"0xd8c8785d","owner()":"0x8da5cb5b","ownerWithdrawToken(address,address,uint256)":"0xf585b64f","pendingSettlements(bytes32,uint64,uint256)":"0x3684f4ac","pullBatchSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":"0x17aa2e25","pushBatchSettlements(bytes32,uint64)":"0x0b9b17a6","removeSettler(bytes32)":"0x41774bfe","setAdministrators(address[],uint256)":"0x23c56731","setCredentialManager(address)":"0x21e6652c","setDepositorStatus(address,bool)":"0x224b93e1","setDomainSeparator(bytes32)":"0x7438b937","setOwner(address)":"0x13af4035","settlementCaps(address)":"0x98af9772","settlementCounts(bytes32,uint64)":"0x8dff2305","withdraw((address,uint256,uint256),bytes32,address,uint256,bytes32,bytes[])":"0x952df832","withdrawalCounts(bytes32)":"0x82ff8b1e","withdrawalQuorum()":"0x93ea8a7d"},"runtimeBytecode":{"bytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c80630a2eb30114611fbd5780630b9b17a614611df657806313af403514611dab57806317aa2e2514611abd57806321e6652c14611a10578063224b93e1146119b457806323c56731146117525780632b0c1a1e1461172a5780633684f4ac146116505780633a87fe4d146116185780633d63ea93146115ee57806341774bfe1461149b5780634bf0d3311461145e5780637438b9371461142d57806382ff8b1e146114035780638da5cb5b146113dc5780638dff23051461139757806392698ac6146112e157806393ea8a7d146112c4578063952df83214610ff557806398af977214610fbd578063a33c9d0014610fa0578063ad9fa8bc14610e7b578063b1fb79c014610e41578063b24e085a14610600578063d7a99d7a14610353578063d89d151014610311578063d8c8785d146102f4578063d954863c146101c95763f585b64f14610163575f80fd5b346101b65760603660031901126101b65761017c611fea565b610184612000565b5f549091906001600160a01b031633036101ba576001600160a01b038216156101b6576101b4916044359161250a565b005b5f80fd5b6330cd747160e01b5f5260045ffd5b346101b65760603660031901126101b6576004356101e5612000565b604435335f52600e60205260ff60405f205416156102c2578015610297577f9d677c46e10ba33882144473956fae8d2c52353dcde5aab8230d1bd280cfc3b4816102328593303387612482565b825f52600b60205260405f2054936102646040519283928360209093929193604081019460018060a01b031681520152565b0390a35f52600b60205260405f20805490600182018092116102835755005b634e487b7160e01b5f52601160045260245ffd5b606460405162461bcd60e51b81526020600482015260046024820152635a65726f60e01b6044820152fd5b60405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b6044820152606490fd5b346101b6575f3660031901126101b6576020600f54604051908152f35b346101b65760203660031901126101b657600435600d548110156101b65761033a60209161217f565b905460405160039290921b1c6001600160a01b03168152f35b346101b657366003190161014081126101b657610100136101b657610104356001600160401b0381116101b65761038e9036906004016121c4565b90610124356001600160401b0381116101b6576103af9036906004016121c4565b92906084359160a435936001600160401b0385168095036101b65760e435918242116105f1575f85815260036020908152604080832033845260010190915290205460ff16156105e257845f52600a60205260405f20865f5260205260405f20549660c435978089036105cb575061047290600254956104666001600160601b031961043961225d565b60601b16968b8b8b6024359b6001600160601b0319610456612273565b60601b168d6064359d8e9361229d565b602081519101206124e0565b43600f55845f52600a60205260405f20865f5260205260405f2080549160018301809311610283576020928692556104c76104ab61225d565b604051631f8eac2760e11b815295869485949260048601612448565b03815f335af19081156105c0575f9161058e575b50818110610579579061051b7ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c9392610512612273565b30903390612482565b61052d823361052861225d565b61250a565b61057461053861225d565b91610541612273565b604080516001600160a01b0395861681526020810196909652931692840192909252606083019190915281906080820190565b0390a4005b63d44c3d9d60e01b5f5260045260245260445ffd5b90506020813d6020116105b8575b816105a9602093836120ef565b810103126101b65751866104db565b3d915061059c565b6040513d5f823e3d90fd5b88906306427aeb60e01b5f5260045260245260445ffd5b6361968ebb60e11b5f5260045ffd5b630407b05b60e31b5f5260045ffd5b346101b65760603660031901126101b6576004356001600160401b0381116101b657610630903690600401612040565b6024356001600160401b0381116101b65761064f903690600401612040565b90604435828403610e3257805f52600760205260ff60405f20541615610e23575f90815260036020908152604080832033845260010190915290205460ff16156105e2578260011b83810460021484151715610283576106ae816123e4565b906106bc60405192836120ef565b8082526106cb601f19916123e4565b015f5b818110610df45750505f915f5b858110610ad257505f5b838110610a1057505f5b8381106109b75750610700856123e4565b9361070e60405195866120ef565b858552601f1961071d876123e4565b013660208701375f5b8681106108d3575050505f5b8281106107f85785855f5b81811061074657005b60019061075d3661075883868861223a565b612352565b60808101516001600160401b0360a083015116907ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c60c084015193868060a01b038151166107ef60208301519260608a8060a01b03604083015116910151906040519485948590949392606092608083019660018060a01b03168352602083015260018060a01b031660408201520152565b0390a40161073d565b5f60606108058385612416565b51015113610816575b600101610732565b6001600160a01b036108288284612416565b51511660606108378385612416565b510151905f5f5b828a8a808410610883575050505082811061086c5750600192916108659130903390612482565b905061080e565b905063d44c3d9d60e01b5f5260045260245260445ffd5b6001600160a01b03916108a49160409161089e91879161223a565b01612289565b16146108b3575b60010161083e565b906108cb6001916108c4848b612416565b5190612345565b9190506108ab565b6108e236610758838a8c61223a565b8051602082810151610920926001600160a01b031661090286888a6123fb565b604051631f8eac2760e11b8152958694859491939160048601612448565b03815f335af19081156105c0575f91610986575b5061093f8389612416565b52606061094c8389612416565b519101908151116109605750600101610726565b61096a8288612416565b519051916359a771d160e01b5f5260045260245260445260645ffd5b90506020813d82116109af575b816109a0602093836120ef565b810103126101b657518a610934565b3d9150610993565b805f60606109c760019487612416565b510151126109d6575b016106ef565b610a0b828060a01b036109e98387612416565b515116610a0360606109fb8589612416565b510151612438565b90339061250a565b6109d0565b806020610a1f60019386612416565b5101516040610a2e8387612416565b5101511015610a7457610a5e6020610a468387612416565b5101516040610a558488612416565b510151906123d7565b6060610a6a8387612416565b5101525b016106e5565b6040610a808286612416565b5101516020610a8f8387612416565b5101511015610a6e57610abe610ab96040610aaa8488612416565b5101516020610a558589612416565b612438565b6060610aca8387612416565b510152610a6e565b610add81878961223a565b610120813603126101b65760405190610af58261209d565b610aff3682612352565b8252610100810135906001600160401b0382116101b6570136601f820112156101b65780356001600160401b038111610de05760405191610b4a601f8301601f1916602001846120ef565b81835236602083830101116101b657815f926020809301838601378301015260208201525160808101516001600160401b0360a0830151169160c08101519260e08201519060408301519360018060a01b0385169284519660206060870151960151968242116105f157835f52600a60205260405f206001600160401b0386165f5260205260405f2054808310610dc957508f918f8b90610c1f610c3d96610c2c948a8f8f8f90918d92610c379b600254906001600160601b03199060601b16926001600160601b03199060601b169061229d565b602081519101209461223a565b610100810190612313565b916124e0565b43600f555f52600a6020526001600160401b0360405f2091165f5260205260405f208054906001820180921161028357555f9182805b8a8110610d81575b5015610d3d575b50505f5b878110610cf2575b5015610c9f575b50506001016106db565b94610cea916001939660405191610cb5836120b8565b858060a01b031682525f602083015260408201525f6060820152610cd98287612416565b52610ce48186612416565b5061242a565b939088610c95565b6001600160a01b0384811690610d08838a612416565b51511614610d1857600101610c86565b60409150610d269087612416565b5101610d33828251612345565b905260018a610c8e565b90610d7992989160405191610d51836120b8565b825260208201525f60408201525f6060820152610d6e8289612416565b52610ce48188612416565b958a80610c82565b836001600160a01b03610d94838d612416565b51511614610da457600101610c73565b60209150610db2908a612416565b5101610dbf828251612345565b905260018d610c7b565b90506306427aeb60e01b5f5260045260245260445ffd5b634e487b7160e01b5f52604160045260245ffd5b602090604051610e03816120b8565b5f81525f838201525f60408201525f6060820152828286010152016106ce565b63be4ab3c760e01b5f5260045ffd5b631d6e22b960e01b5f5260045ffd5b346101b6575f3660031901126101b65760206040517fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb8152f35b346101b65760403660031901126101b657600435610e97612000565b5f549091906001600160a01b031633036101ba57805f52600760205260ff60405f20541615610f49575b5f52600360205260405f2090600182019160018060a01b0382165f528260205260ff60405f20541615610ef057005b8054600160401b811015610de057610f0d916001820181556121af565b81546001600160a01b0393841660039290921b82811b94901b19169290921790555f90815260209190915260409020805460ff19166001179055005b600454600160401b811015610de057610f82610f6c826001859401600455612197565b819391549060031b91821b915f19901b19161790565b9055805f52600760205260405f20600160ff19825416179055610ec1565b346101b6575f3660031901126101b6576020600654604051908152f35b346101b65760203660031901126101b6576001600160a01b03610fde611fea565b165f526008602052602060405f2054604051908152f35b346101b657366003190161010081126101b6576060136101b6576064356084356001600160a01b03811681036101b65760a4359160e4356001600160401b0381116101b657611048903690600401612040565b9290936005548142116105f1578085106112ae57835f52600c60205260405f20549560443596808803611297575061107f866123e4565b9061108d60405192836120ef565b868252601f1961109c886123e4565b013660208401375f916002546001600160601b03196110b961225d565b60601b16602435966040519160208301937f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba8552604084015260608301528760808301528960a08301528b60c083015260e082015260c4356101008201526001600160601b03198860601b16610120820152610120815261113c610140826120ef565b5190205f5b8981106111e5575b505050509080929394955081106111d0575050825f52600c60205260405f2080549060018201809211610283577fc4f5735f1abe60807c07c06560e4a6d7eb655a37442b6a47e3ab1998c9611e2f936111ab9284925543600f5561052861225d565b6111b361225d565b604080516001600160a01b039290921682526020820192909252a3005b6326a15da760e01b5f5260045260245260445ffd5b6111fa6111f3828c876123fb565b908461255b565b6001600160a01b03811690811561128857611214906121f1565b156112885760015f5b87811061125d575b50611240575b5085851461123b57600101611141565b611149565b9461125691956112508286612416565b5261242a565b938b61122b565b826001600160a01b036112708389612416565b51161461127f5760010161121d565b50505f8d611225565b638baa579f60e01b5f5260045ffd5b87906306427aeb60e01b5f5260045260245260445ffd5b846326a15da760e01b5f5260045260245260445ffd5b346101b6575f3660031901126101b6576020600554604051908152f35b346101b6575f3660031901126101b6576040518060206004549283815201809260045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b905f5b818110611381575050508161133f9103826120ef565b604051918291602083019060208452518091526040830191905f5b818110611368575050500390f35b825184528594506020938401939092019160010161135a565b8254845260209093019260019283019201611329565b346101b65760403660031901126101b6576113b061202a565b6004355f52600a6020526001600160401b0360405f2091165f52602052602060405f2054604051908152f35b346101b6575f3660031901126101b6575f546040516001600160a01b039091168152602090f35b346101b65760203660031901126101b6576004355f52600c602052602060405f2054604051908152f35b346101b65760203660031901126101b6575f546001600160a01b031633036101ba576002546101b657600435600255005b346101b65760203660031901126101b6576001600160a01b0361147f611fea565b165f52600e602052602060ff60405f2054166040519015158152f35b346101b65760203660031901126101b6575f54600435906001600160a01b031633036101ba576004545f828152600760205260408120805460ff191690555b818110611565575b50505f52600360205260405f205f60018201905b8254811015611539578061150c600192856121af565b838060a01b0391549060031b1c16828060a01b03165f528260205260405f2060ff198154169055016114f6565b82545f8455838161154657005b5f5260205f20908101905b81811061155a57005b5f8155600101611551565b8261156f82612197565b90549060031b1c14611583576001016114da565b905f19810190811161028357610f6c61159e6115ab92612197565b90549060031b1c92612197565b905560045480156115da575f19016115c281612197565b8154905f199060031b1b1916905560045581806114e2565b634e487b7160e01b5f52603160045260245ffd5b346101b65760203660031901126101b6576004355f52600b602052602060405f2054604051908152f35b346101b65760203660031901126101b6576004356004548110156101b657611641602091612197565b90549060031b1c604051908152f35b346101b65760603660031901126101b65761166961202a565b604435906004355f5260096020526001600160401b0360405f2091165f5260205260405f2080548210156101b657610120916116a491612070565b506116ae81612110565b90600860018060a01b039101541660e06040519260018060a01b0381511684526020810151602085015260018060a01b03604082015116604085015260608101516060850152608081015160808501526001600160401b0360a08201511660a085015260c081015160c0850152015160e0830152610100820152f35b346101b6575f3660031901126101b6576001546040516001600160a01b039091168152602090f35b346101b65760403660031901126101b6576004356001600160401b0381116101b657611782903690600401612040565b600154909190602435906001600160a01b031633036119a5576001811061199657808310611980575f5b838110156117e8576001600160a01b036117cb600583901b8501612289565b16156117d9576001016117ac565b63d92e233d60e01b5f5260045ffd5b5091906001600160401b038211610de057600160401b8211610de057600d5482600d5580831061193c575b50600d5f525f5b82811061190157837f74e3f7a222a002bb0346144c8442604f86b79a5319301c8b2393dbe33ba3f1ec5f80a1600d545f5b8181106118965782600554908060055580820361186457005b7f71847092dda23e5394806b377214ca90449cdd1413463150e7f577ccefea54d89160409182519182526020820152a1005b61189f8161217f565b905460018301929160031b1c6001600160a01b031682821161028357604080516001600160a01b0392909216825260208201939093526001927f723c2b747529ca7f5eb53a74808f4a8b9bf264f0fc450fd904900151da74548a91a10161184b565b600190602061190f84612289565b930192817fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb501550161181a565b600d5f527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb59081019083015b8181106119755750611813565b5f8155600101611968565b82633e1a6b7d60e21b5f5260045260245260445ffd5b6345f8facb60e11b5f5260045ffd5b6326b672e560e01b5f5260045ffd5b346101b65760403660031901126101b6576119cd611fea565b602435908115158092036101b6575f546001600160a01b031633036101ba5760018060a01b03165f52600e60205260405f209060ff801983541691161790555f80f35b346101b65760203660031901126101b657611a29611fea565b5f546001600160a01b031633036101ba576001600160a01b031680156117d957611a58600f5460065490612345565b431015611aae5760407feb63fb900cbf0301de00619a02ae3f5996820dabc03207c0e0d97046e521d7b99160015490806001600160601b0360a01b83161760015582519160018060a01b031682526020820152a1005b636fed7d8560e01b5f5260045ffd5b346101b65760a03660031901126101b6576004356001600160401b0381116101b657611aed903690600401612040565b90602435604435916001600160401b0383168093036101b657606435906001600160a01b038216908183036101b657608435918242116105f157845f52600960205260405f20865f5260205260405f20546101b657611b4b336121f1565b15611d9c57845f52600a60205260405f20865f5260205260405f205493600254948815611d8d575f5b898110611ba2578989895f52600a60205260405f20905f52602052611b9e60405f20918254612345565b9055005b611bad818b8761223a565b9160c083013590808203611d78575088929190818c8a8a848f6bffffffffffffffffffffffff19611bdd8a612289565b60601b169960208a01359a6001600160601b031960408c01611bfe90612289565b60601b168c60608d013592611c129861229d565b8051906020012091611c24918a61223a565b6101008101611c3291612313565b90611c3c926124e0565b600181018091116102835792895f52600960205260405f208b5f5260205260405f2090604051611c6b8161209d565b611c753686612352565b815260208101928884528054600160401b811015610de057611c9c91600182018155612070565b939093611d65579051805184546001600160a01b03199081166001600160a01b03928316178655602083015160018781019190915560408401516002880180548416918516919091179055606084015160038801556080840151600488015560a084015160058801805467ffffffffffffffff19166001600160401b039290921691909117905560c0840151600688015560e09390930151600787015592516008909501805490931694169390931790559092611d5f9190869061052890612289565b01611b74565b634e487b7160e01b5f525f60045260245ffd5b6306427aeb60e01b5f5260045260245260445ffd5b63164bb4b560e11b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346101b65760203660031901126101b657611dc4611fea565b5f54906001600160a01b03821633036101ba576001600160a01b03169081156117d9576001600160a01b031916175f55005b346101b65760403660031901126101b657600435611e1261202a565b611e1b336121f1565b15611d9c576001600160401b0316905f5b815f52600960205260405f20835f5260205260405f205463ffffffff82161015611f3c5763ffffffff90825f52600960205260405f20845f52602052611e758160405f20612070565b50611ebe60405191611e868361209d565b611e8f81612110565b8084526008909101546001600160a01b0390811660208501819052604083015160609093015192309216612482565b5160c0810151815160208084015160408086015160609687015182516001600160a01b0396871681529485019390935293909316928201929092529283015290859085907ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c90608090a41663ffffffff811461028357600101611e2c565b505f52600960205260405f20905f5260205260405f208054905f815581611f5f57005b81600902916009830403610283575f5260205f20908101905b818110611f8157005b805f600992555f60018201555f60028201555f60038201555f60048201555f60058201555f60068201555f60078201555f600882015501611f78565b346101b65760203660031901126101b6576020611fe0611fdb611fea565b6121f1565b6040519015158152f35b600435906001600160a01b03821682036101b657565b602435906001600160a01b03821682036101b657565b35906001600160a01b03821682036101b657565b602435906001600160401b03821682036101b657565b9181601f840112156101b6578235916001600160401b0383116101b6576020808501948460051b0101116101b657565b8054821015612089575f52600960205f20910201905f90565b634e487b7160e01b5f52603260045260245ffd5b604081019081106001600160401b03821117610de057604052565b608081019081106001600160401b03821117610de057604052565b61010081019081106001600160401b03821117610de057604052565b90601f801991011681019081106001600160401b03821117610de057604052565b9060405161211d816120d3565b82546001600160a01b039081168252600184015460208301526002840154166040820152600383015460608201526004830154608082015260058301546001600160401b031660a0820152600683015460c082015260079092015460e0830152565b600d5481101561208957600d5f5260205f2001905f90565b6004548110156120895760045f5260205f2001905f90565b8054821015612089575f5260205f2001905f90565b9181601f840112156101b6578235916001600160401b0383116101b657602083818601950101116101b657565b600d54905f5b828110612205575050505f90565b61220e8161217f565b905460039190911b1c6001600160a01b0390811690831614612232576001016121f7565b505050600190565b91908110156120895760051b8101359061011e19813603018212156101b6570190565b6004356001600160a01b03811681036101b65790565b6044356001600160a01b03811681036101b65790565b356001600160a01b03811681036101b65790565b989796959493929190604051997fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208c015260408b015260608a0152608089015260a088015260c087015260e08601526101008501526101208401526101408301526101408252612311610160836120ef565b565b903590601e19813603018212156101b657018035906001600160401b0382116101b6576020019181360383136101b657565b9190820180921161028357565b9190826101009103126101b65760405161236b816120d3565b809261237681612016565b82526020810135602083015261238e60408201612016565b6040830152606081013560608301526080810135608083015260a08101356001600160401b03811681036101b65760e091829160a085015260c081013560c08501520135910152565b9190820391821161028357565b6001600160401b038111610de05760051b60200190565b90821015612089576124129160051b810190612313565b9091565b80518210156120895760209160051b010190565b5f1981146102835760010190565b600160ff1b8114610283575f0390565b9284926080959260018060a01b03168552602085015260606040850152816060850152848401375f828201840152601f01601f1916010190565b916040519360605260405260601b602c526323b872dd60601b600c5260205f6064601c82855af1908160015f511416156124c2575b50505f606052604052565b3b153d1710156124d3575f806124b7565b637939f4245f526004601cfd5b906124eb929161255b565b6001600160a01b0381161561128857612503906121f1565b1561128857565b919060145260345263a9059cbb60601b5f5260205f6044601082855af1908160015f5114161561253d575b50505f603452565b3b153d17101561254e575f80612535565b6390b8ec185f526004601cfd5b604080515f959490939181146125a65760411461257757505050565b604080929395508101355f1a60205281375b5f526020604060805f60015afa505f6060523d6060185191604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b031660605290925061258956fea26469706673582212203fdca5d1551af74b875d1f0e4b8878b123412bb78ae4783affa417e9c133ff7964736f6c634300081e0033"},"sourceId":"src/DepositVault.sol","sourcemap":"325:35225:15:-:0;;;;;;;;;;;;;-1:-1:-1;;325:35225:15;;;;-1:-1:-1;;;;;325:35225:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;1329:5;;325:35225;-1:-1:-1;;;;;325:35225:15;;;;9015:20;;9011:46;;-1:-1:-1;;;;;325:35225:15;;9071:32;;9067:58;;325:35225;;;;;;-1:-1:-1;325:35225:15;;;-1:-1:-1;325:35225:15;;;;;;;9159:38;325:35225;;;9159:38;325:35225;;;;;;;;;;9067:58;9044:13;;;-1:-1:-1;9112:13:15;;-1:-1:-1;9112:13:15;325:35225;-1:-1:-1;325:35225:15;;;;;;-1:-1:-1;325:35225:15;;;;;-1:-1:-1;325:35225:15;;;;-1:-1:-1;;;;;325:35225:15;;;;;;:::o","userdoc":{"errors":{"EmptyOrders()":[{"notice":"Reverts if an order array is empty."}],"Expired()":[{"notice":"Reverts if a signed operation is past its deadline."}],"InsufficientAdministrators(uint256,uint256)":[{"notice":"Reverts if insufficient administrators are provided when setting the administrators"}],"InsufficientAmountFromExecutor(uint256,uint256)":[{"notice":"Reverts if a settlement callback returns an insufficient input token amount"}],"InsufficientCallbackReturnForSettlement(uint256,uint256,uint256)":[{"notice":"Reverts if a settlement callback returns insufficient amount for a specific settlement"}],"InvalidNonce(uint256,uint256)":[{"notice":"Reverts if the nonce used in a transaction is incorrect."}],"InvalidSignature()":[{"notice":"Reverts if the signature provided is invalid."}],"MissedQuorum(uint256,uint256)":[{"notice":"Reverts when an insufficient number of signatures are provided for a withdrawal request"}],"NotAdmin()":[{"notice":"Reverts if the caller is not an admin."}],"NotCredentialManager()":[{"notice":"Reverts if the caller is not the credential manager"}],"NotExecutor()":[{"notice":"Reverts if the caller is not the authorized executor."}],"NotOwner()":[{"notice":"Reverts if the caller is not the owner."}],"PayloadMismatch()":[{"notice":"Reverts if the number of callback data payloads does not match the number of settlement requests"}],"SettlerNotApproved()":[{"notice":"Reverts if the specified settler is not an approved settler on this vault"}],"TooSoon()":[{"notice":"Reverts if an insufficient number of blocks have elapsed since the last signature use"}],"ZeroAddress()":[{"notice":"Reverts when given the zero address."}],"ZeroWithdrawalQuorum()":[{"notice":"Reverts if a new withdrawal quorum value is equal to zero"}]},"events":{"AdminAdded(address,uint256)":{"notice":"Signals that a new administrator has been added to the vault"},"AdministratorSetReset()":{"notice":"Indicates that the set of administrators has been cleared and is now empty"},"CredentialManagerChanged(address,address)":{"notice":"Signals that the credential manager address has changed"},"Deposited(bytes32,uint256,address,uint256)":{"notice":"Signals a deposit."},"Settled(bytes32,uint64,uint256,address,uint256,address,uint256)":{"notice":"Signals a settlement."},"WithdrawalQuorumChanged(uint256,uint256)":{"notice":"Signals that the withdrawal quorum has changed"},"Withdrew(bytes32,uint256,address,uint256)":{"notice":"Signals a withdrawal."}},"kind":"user","methods":{"SETTLEMENT_TYPEHASH()":{"notice":"Makes the signature unambiguous that it is for settlements."},"addSettlerExecutor(bytes32,address)":{"notice":"Sets the settle executor."},"administrators(uint256)":{"notice":"Set of administrators"},"approvedSettlers(uint256)":{"notice":"List of all approved settler IDs."},"constructor":{"notice":"Initializes the contract and sets the owner."},"credentialManager()":{"notice":"The address responsible for adding or removing administrators"},"deposit(bytes32,address,uint256)":{"notice":"Deposits a token into the vault."},"depositCounts(bytes32)":{"notice":"Maps user ID pairs to their deposit count (nonce)."},"executeAtomicSettlement((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes,bytes)":{"notice":"Executes an atomic settlement."},"executeSquashingSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes[],bytes32)":{"notice":"Execute a sequence of settlement requests in a squashing fashion"},"getApprovedSettlers()":{"notice":"Get the array of approved settlers."},"lastSignatureUse()":{"notice":"Block number of latest signature use"},"owner()":{"notice":"The admin approves settlements and withdrawals."},"pendingSettlements(bytes32,uint64,uint256)":{"notice":"Maps (settler ID, account_index) pairs to their queue of pending batch settlements."},"pullBatchSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":{"notice":"Pulls funds for execution during a settlement batch."},"pushBatchSettlements(bytes32,uint64)":{"notice":"Pushes expected funds from a batch settlement to the deposit vault."},"removeSettler(bytes32)":{"notice":"Removes a settler."},"setDomainSeparator(bytes32)":{"notice":"Sets the domain separators for EIP-712 signatures."},"setOwner(address)":{"notice":"Sets the owner of the vault."},"settlementCaps(address)":{"notice":"Maximum total tokens that can be settled in a single block for each token."},"settlementCounts(bytes32,uint64)":{"notice":"Maps (settler ID, account_index) pairs to their settlement count (nonce)."},"withdraw((address,uint256,uint256),bytes32,address,uint256,bytes32,bytes[])":{"notice":"Withdraws a token from the vault."},"withdrawalCounts(bytes32)":{"notice":"Maps user ID to their withdrawal count (nonce)."},"withdrawalQuorum()":{"notice":"Minimum number of administrator signatures to approve a withdrawal request"}},"version":1}},"IAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"IAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IAdminUpdateStrategy.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IAtomicSettlementCallback":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onAtomicSettlement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"contractName":"IAtomicSettlementCallback","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"onAtomicSettlement(address,uint256,bytes)":"0x3f1d584e"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IAtomicSettlementCallback.sol","sourcemap":"","userdoc":{"kind":"user","methods":{"onAtomicSettlement(address,uint256,bytes)":{"notice":"Computes the minimum expected quantity of `token` that will be received by the deposit vault upon execution of an atomic settlement request"}},"version":1}},"IAutomataDcapAttestation":{"abi":[{"inputs":[{"internalType":"bytes","name":"output","type":"bytes"},{"internalType":"enum IAutomataDcapAttestation.ZkCoProcessorType","name":"zkvm","type":"uint8"},{"internalType":"bytes","name":"proofBytes","type":"bytes"}],"name":"verifyAndAttestWithZKProof","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"errorData","type":"bytes"}],"stateMutability":"nonpayable","type":"function"}],"contractName":"IAutomataDcapAttestation","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"details":"Bindings for the 'AutomataDcapAttestation' contract. Compatible with Automata V3 ZK Coprocessor logic.","kind":"dev","methods":{"verifyAndAttestWithZKProof(bytes,uint8,bytes)":{"params":{"output":"The Public Values (Journal) - effectively the Quote Body.","proofBytes":"The actual (Groth16) proof.","zkvm":"The type of ZKVM used."},"returns":{"errorData":"Error message if failed, or empty if success.","success":"True if valid."}}},"version":1},"methodIdentifiers":{"verifyAndAttestWithZKProof(bytes,uint8,bytes)":"0x57859ce0"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IAutomataDcapAttestation.sol","sourcemap":"","userdoc":{"kind":"user","methods":{"verifyAndAttestWithZKProof(bytes,uint8,bytes)":{"notice":"Verifies a SNARK proof (Groth16) for a TEE Quote."}},"notice":"Interface for Automata's DCAP Attestation Verifier (V3)","version":1}},"ICheckpointer":{"abi":[{"inputs":[],"name":"AlreadySet","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCouncilMultisig","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"name":"Withdrawals","type":"event"},{"inputs":[],"name":"CHECKPOINT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sharedSignature","type":"bytes"},{"internalType":"bytes","name":"leaderSignature","type":"bytes"},{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8[]","name":"stateRoot","type":"uint8[]"},{"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"internalType":"struct ICheckpointer.Checkpoint","name":"_checkpoint","type":"tuple"}],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"councilMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setInitialCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"}],"name":"setLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setNewCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stateRoot","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateRootNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"ICheckpointer","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"CHECKPOINT_TYPEHASH()":"0xe1193e4c","admin()":"0xf851a440","checkpoint(bytes,bytes,(uint256,uint8[],string[]))":"0x8bbb26a3","councilMultisig()":"0x07ddaf53","leader()":"0x40eedabb","setAdmin(address)":"0x704b6c02","setDomainSeparator(bytes32)":"0x7438b937","setInitialCouncilMultisig(address)":"0x3ea987d3","setLeader(address)":"0x4331e8dd","setNewCouncilMultisig(address)":"0x5fa993b2","stateRoot(uint256)":"0xcc2fc845","stateRootNonce()":"0x74ebc7a0"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/ICheckpointer.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"ICredentialManager":{"abi":[{"inputs":[],"name":"AmbiguousState","type":"error"},{"inputs":[],"name":"CannotCancel","type":"error"},{"inputs":[],"name":"GatheringActive","type":"error"},{"inputs":[],"name":"GatheringNotActive","type":"error"},{"inputs":[],"name":"GatheringNotExpired","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientSignatures","type":"error"},{"inputs":[{"internalType":"uint256","name":"newCommittee","type":"uint256"},{"internalType":"uint256","name":"operatorCount","type":"uint256"}],"name":"InvalidCommittee","type":"error"},{"inputs":[{"internalType":"uint256","name":"delay","type":"uint256"}],"name":"InvalidDelay","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InvalidEpoch","type":"error"},{"inputs":[],"name":"InvalidProfileConfig","type":"error"},{"inputs":[],"name":"InvalidProfileId","type":"error"},{"inputs":[],"name":"InvalidQuoteLength","type":"error"},{"inputs":[],"name":"InvalidReportData","type":"error"},{"inputs":[],"name":"InvalidVaultAddr","type":"error"},{"inputs":[],"name":"InvalidVerifier","type":"error"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"},{"internalType":"string","name":"field","type":"string"}],"name":"MeasurementMismatch","type":"error"},{"inputs":[],"name":"NoCandidate","type":"error"},{"inputs":[],"name":"NoStrategy","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"NotOperator","type":"error"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"}],"name":"ProfileInactive","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"proposed","type":"uint256"}],"name":"ProposedEpochTooLow","type":"error"},{"inputs":[],"name":"SignersNotSortedOrUnique","type":"error"},{"inputs":[],"name":"StrategyAlreadyExists","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyCanceled","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyExecuted","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"uint256","name":"readyAt","type":"uint256"},{"internalType":"uint256","name":"nowTs","type":"uint256"}],"name":"TimelockNotReady","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockUnknown","type":"error"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"}],"name":"VaultNotFound","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"}],"name":"AdminUpdateStrategyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"AttestedKeyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldVerifier","type":"address"},{"indexed":true,"internalType":"address","name":"newVerifier","type":"address"}],"name":"AutomataVerifierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"CommitteeThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newEpoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newCheckpointHash","type":"bytes32"}],"name":"EpochIncremented","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"LeaderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"profileId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"MeasurementProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"newMrtd","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newRtmr0","type":"bytes32"}],"name":"MeasurementsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"OperationScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRegistry","type":"address"},{"indexed":true,"internalType":"address","name":"newRegistry","type":"address"}],"name":"RegistryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash1","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash2","type":"bytes32"}],"name":"RestartAmbiguityDetected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"leader","type":"address"},{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"RestartCandidateSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"RestartExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"RestartGatheringStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRiskManager","type":"address"},{"indexed":true,"internalType":"address","name":"newRiskManager","type":"address"}],"name":"RiskManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"targetOpType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"oldDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"TimelockDelayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"indexed":false,"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"}],"name":"VaultAdded","type":"event"},{"inputs":[],"name":"GATHERING_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_ADD_VAULT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_APPOINT_LEADER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_CANCEL_TIMELOCK","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_MANAGE_PROFILE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_REGISTER_STRATEGY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_RESTART","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_AUTOMATA_VERIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_COMMITTEE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_DELAY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_MEASUREMENTS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_REGISTRY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_RISK_MANAGER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_VAULT_ADMINS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_WITHDRAW","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"addVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"adminUpdateStrategies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"appointLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"automataVerifier","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bestCandidate","outputs":[{"internalType":"address","name":"leader","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"cancelTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"committeeThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct ICredentialManager.MeasurementProfile","name":"profile","type":"tuple"}],"name":"executeManageProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"}],"name":"executeRegistryContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"}],"name":"executeRiskManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"}],"name":"executeUpdateAutomataVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCouncilConfig","outputs":[{"internalType":"address[]","name":"members","type":"address[]"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeader","outputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"attestedKey","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getVaults","outputs":[{"components":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"}],"internalType":"struct ICredentialManager.Vault[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initiateRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRestartAmbiguous","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestCheckpointHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"measurementProfiles","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProfileId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operatorToAttestedKey","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"operators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"address","name":"strategy","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"registerAdminUpdateStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"registerAttestedKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registryContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resolveRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restartGatheringDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct ICredentialManager.MeasurementProfile","name":"profile","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleManageProfile","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRegistryContract","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRiskManager","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleUpdateAutomataVerifier","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setDepositVaultAdministrators","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"internalType":"bytes","name":"tdxReportBody","type":"bytes"},{"internalType":"bytes","name":"zkProof","type":"bytes"},{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"submitRestartProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockDelayFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockOps","outputs":[{"internalType":"uint64","name":"eta","type":"uint64"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"bytes32","name":"opType","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"updateCommitteeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaults","outputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"internalType":"bytes32","name":"checkMrtd","type":"bytes32"},{"internalType":"bytes32","name":"checkRtmr0","type":"bytes32"},{"internalType":"bytes32","name":"checkRtmr1","type":"bytes32"},{"internalType":"bytes32","name":"checkRtmr2","type":"bytes32"},{"internalType":"bytes32","name":"checkRtmr3","type":"bytes32"}],"name":"verifyMeasurements","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"contractName":"ICredentialManager","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"GATHERING_DURATION()":"0xa6aac513","OP_ADD_VAULT()":"0x90054742","OP_APPOINT_LEADER()":"0x4e970c8c","OP_CANCEL_TIMELOCK()":"0xfc0e2ba7","OP_MANAGE_PROFILE()":"0xb7635fb8","OP_REGISTER_STRATEGY()":"0x333bef22","OP_RESTART()":"0xd8a0bebf","OP_SET_AUTOMATA_VERIFIER()":"0x2d4ab28d","OP_SET_COMMITTEE()":"0x76be6315","OP_SET_DELAY()":"0xe0913aff","OP_SET_MEASUREMENTS()":"0x6583c37a","OP_SET_REGISTRY()":"0x1bc12e07","OP_SET_RISK_MANAGER()":"0xf5b68c67","OP_SET_VAULT_ADMINS()":"0x26ddc1ba","OP_WITHDRAW()":"0x5f250f69","addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":"0x81392328","admin()":"0xf851a440","adminUpdateStrategies(uint256,uint256)":"0x3174b727","appointLeader(address,address[],bytes[])":"0xfdeabe1f","automataVerifier()":"0x280cd09d","bestCandidate()":"0x669f6f35","cancelTimelock(bytes32,address[],bytes[])":"0x9d3e015a","committeeThreshold()":"0x4dd0a0c9","domainSeparator()":"0xf698da25","epoch()":"0x900cf0cf","executeManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32))":"0xae5c8bfb","executeRegistryContract(address)":"0x24242e77","executeRiskManager(address)":"0x6dfb32aa","executeUpdateAutomataVerifier(address)":"0xc7d06b54","getCouncilConfig()":"0x04235842","getLeader()":"0x4c051f14","getVaults(uint16,uint16)":"0x9fd7285c","governanceNonce()":"0xd9be832c","initiateRestart()":"0x5cc79144","isOperator(address)":"0x6d70f7ae","isRestartAmbiguous()":"0x1276bcc5","latestCheckpointHash()":"0xb34eb182","leader()":"0x40eedabb","measurementProfiles(uint256)":"0x95c82559","nextProfileId()":"0xcd1d81ff","operatorToAttestedKey(address)":"0x1ac4d079","operators(uint256)":"0xe28d4906","registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":"0x5d3ae390","registerAttestedKey(bytes32)":"0x7f0152a8","registryContract()":"0x28c1f99b","resolveRestart()":"0x35cfd9eb","restartGatheringDeadline()":"0x127f49ad","riskManager()":"0x47842663","scheduleManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32),address[],bytes[])":"0xacfacc86","scheduleRegistryContract(address,address[],bytes[])":"0xb5ed8b12","scheduleRiskManager(address,address[],bytes[])":"0x2808e92f","scheduleUpdateAutomataVerifier(address,address[],bytes[])":"0x281cbdd4","setDepositVaultAdministrators(uint256,uint256,address[],uint256)":"0x9ebc068e","submitRestartProof(uint256,bytes,bytes,address,bytes32)":"0xce0b1302","timelockDelayFor(bytes32)":"0xfb834493","timelockOps(bytes32)":"0x31709520","updateCommitteeThreshold(uint256,address[],bytes[])":"0x59d63bcc","vaults(uint256)":"0x8c64ea4a","verifyMeasurements(uint256,bytes32,bytes32,bytes32,bytes32,bytes32)":"0x80446e4a","withdraw(address,address[],bytes[])":"0xbe223838"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/ICredentialManager.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IDepositVault":{"abi":[{"inputs":[],"name":"EmptyOrders","type":"error"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAdministrators","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAmountFromExecutor","type":"error"},{"inputs":[{"internalType":"uint256","name":"settlementIndex","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientCallbackReturnForSettlement","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"given","type":"uint256"}],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"MissedQuorum","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCredentialManager","type":"error"},{"inputs":[],"name":"NotExecutor","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"PayloadMismatch","type":"error"},{"inputs":[],"name":"SettlerNotApproved","type":"error"},{"inputs":[],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroWithdrawalQuorum","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"numAdminsAfter","type":"uint256"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[],"name":"AdministratorSetReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldCredentialManager","type":"address"},{"indexed":false,"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"CredentialManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"account","type":"uint64"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"Settled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"WithdrawalQuorumChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[],"name":"SETTLEMENT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"},{"internalType":"address","name":"executor","type":"address"}],"name":"addSettlerExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"administrators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedSettlers","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManagerChangeDelayBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"depositCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct IDepositVault.Settlement","name":"order","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"executeAtomicSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct IDepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"clearingEngineSignature","type":"bytes"}],"internalType":"struct IDepositVault.SignedSettlement[]","name":"requests","type":"tuple[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"executeSquashingSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getApprovedSettlers","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAdministrator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSignatureUse","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingSettlements","outputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct IDepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"address","name":"target","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct IDepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"clearingEngineSignature","type":"bytes"}],"internalType":"struct IDepositVault.SignedSettlement[]","name":"orders","type":"tuple[]"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"name":"pullBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"}],"name":"pushBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"removeSettler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"setCredentialManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setDepositorStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"settlementCaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"settlementCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct IDepositVault.Withdrawal","name":"withdrawal","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes32","name":"epochHash","type":"bytes32"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"withdrawalCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"IDepositVault","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"SETTLEMENT_TYPEHASH()":"0xb1fb79c0","addSettlerExecutor(bytes32,address)":"0xad9fa8bc","administrators(uint256)":"0xd89d1510","approvedSettlers(uint256)":"0x3a87fe4d","canDeposit(address)":"0x4bf0d331","credentialManager()":"0x2b0c1a1e","credentialManagerChangeDelayBlocks()":"0xa33c9d00","deposit(bytes32,address,uint256)":"0xd954863c","depositCounts(bytes32)":"0x3d63ea93","executeAtomicSettlement((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes,bytes)":"0xd7a99d7a","executeSquashingSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes[],bytes32)":"0xb24e085a","getApprovedSettlers()":"0x92698ac6","isAdministrator(address)":"0x0a2eb301","lastSignatureUse()":"0xd8c8785d","owner()":"0x8da5cb5b","ownerWithdrawToken(address,address,uint256)":"0xf585b64f","pendingSettlements(bytes32,uint64,uint256)":"0x3684f4ac","pullBatchSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":"0x17aa2e25","pushBatchSettlements(bytes32,uint64)":"0x0b9b17a6","removeSettler(bytes32)":"0x41774bfe","setAdministrators(address[],uint256)":"0x23c56731","setCredentialManager(address)":"0x21e6652c","setDepositorStatus(address,bool)":"0x224b93e1","setDomainSeparator(bytes32)":"0x7438b937","setOwner(address)":"0x13af4035","settlementCaps(address)":"0x98af9772","settlementCounts(bytes32,uint64)":"0x8dff2305","withdraw((address,uint256,uint256),bytes32,address,uint256,bytes32,bytes[])":"0x952df832","withdrawalCounts(bytes32)":"0x82ff8b1e","withdrawalQuorum()":"0x93ea8a7d"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IDepositVault.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IL1CrossDomainMessenger":{"abi":[{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"}],"name":"sendMessage","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"IL1CrossDomainMessenger","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"sendMessage(address,bytes,uint32)":"0x3dbb202b"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/strategies/OPStackAdminUpdateStrategy.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IRegistry":{"abi":[{"inputs":[],"name":"ChainAlreadyExists","type":"error"},{"inputs":[],"name":"IndexOutOfBounds","type":"error"},{"inputs":[],"name":"InvalidBufferMultiple","type":"error"},{"inputs":[],"name":"InvalidCollateralFactor","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsClamps","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsConfiguration","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsFactors","type":"error"},{"inputs":[],"name":"InvalidInterestKinks","type":"error"},{"inputs":[],"name":"InvalidLiabilityFactor","type":"error"},{"inputs":[],"name":"InvalidMaxFundingRate","type":"error"},{"inputs":[],"name":"InvalidMaxUtilizationRate","type":"error"},{"inputs":[],"name":"InvalidRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUtilizationCap","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"}],"name":"NoPendingRiskParameters","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotRiskManager","type":"error"},{"inputs":[],"name":"RiskManagerNotSet","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"},{"internalType":"uint256","name":"eligibleAt","type":"uint256"}],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chain","type":"uint64"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"Max1HrDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chain","type":"uint64"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MaxDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"chain","type":"uint64"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MinWeightChanged","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"}],"name":"applyPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAccount","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint16","name":"index","type":"uint16"}],"name":"getAssetData","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct IRegistry.AssetData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"}],"name":"getAssetIndex","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getAssets","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct IRegistry.AssetData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"pendingRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters","name":"parameters","type":"tuple"},{"internalType":"uint256","name":"validAfter","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManagerMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskParameterChangeDelaySeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"riskParameters","outputs":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"internalType":"uint64","name":"chainId","type":"uint64"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct IRegistry.AssetData","name":"data","type":"tuple"}],"name":"setAssetData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"account","type":"bytes32"}],"name":"setFeeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"chain","type":"uint16"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMax1HrDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"chain","type":"uint16"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMaxDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"chain","type":"uint16"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMinWeight","type":"uint256"}],"name":"setMinWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"},{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters","name":"parameters","type":"tuple"}],"name":"setPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"multisig","type":"address"}],"name":"setRiskManagerMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters","name":"params","type":"tuple"}],"name":"validateRiskParameters","outputs":[],"stateMutability":"pure","type":"function"}],"contractName":"IRegistry","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"admin()":"0xf851a440","applyPendingRiskParameters(uint16)":"0x6cbb0b54","feeAccount()":"0x65e17c9d","getAssetData(uint64,uint16)":"0xf247ceb9","getAssetIndex(uint64,bytes32)":"0x39006126","getAssets(uint16,uint16)":"0x0cb661c7","getRiskParameters(uint16,uint16)":"0xf0fef575","pendingRiskParameters(uint16)":"0xa812e224","riskManagerMultisig()":"0x525ea8b7","riskParameterChangeDelaySeconds()":"0x04cd46f9","riskParameters(uint16)":"0x114bb9c5","setAdmin(address)":"0x704b6c02","setAssetData((uint16,bytes32,uint64,uint256,uint256,uint256))":"0xe4380c93","setFeeAccount(bytes32)":"0xe2a0a600","setMax1HrDeposits(uint16,uint16,uint256)":"0x3c0f2a2f","setMaxDeposits(uint16,uint16,uint256)":"0xe492729d","setMinWeight(uint16,uint16,uint256)":"0xc515c8c6","setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0xb4bb0646","setRiskManagerMultisig(address)":"0x4ffcbdfb","validateRiskParameters((uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0x57990261"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IRegistry.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IntraChainAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"IntraChainAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x6080806040523460155761017e908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c63075034ae14610027575f80fd5b6060366003190112610144576004356001600160a01b038116908190036101445760243567ffffffffffffffff8111610144573660238201121561014457806004013567ffffffffffffffff8111610144573660248260051b8401011161014457823b15610144579083916323c5673160e01b8352806044840160406004860152526024606484019201905f905b8082106101145750505091815f818195604435602483015203925af18015610109576100df575080f35b905067ffffffffffffffff81116100f557604052005b634e487b7160e01b5f52604160045260245ffd5b6040513d5f823e3d90fd5b9193509183356001600160a01b0381169190829003610144576020816001938293520194019201859392916100b5565b5f80fdfea2646970667358221220c69d8dbf734e631495fa06bb43414b35a41e05f7dee0f399706c5e4bedd6c1f064736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f905f3560e01c63075034ae14610027575f80fd5b6060366003190112610144576004356001600160a01b038116908190036101445760243567ffffffffffffffff8111610144573660238201121561014457806004013567ffffffffffffffff8111610144573660248260051b8401011161014457823b15610144579083916323c5673160e01b8352806044840160406004860152526024606484019201905f905b8082106101145750505091815f818195604435602483015203925af18015610109576100df575080f35b905067ffffffffffffffff81116100f557604052005b634e487b7160e01b5f52604160045260245ffd5b6040513d5f823e3d90fd5b9193509183356001600160a01b0381169190829003610144576020816001938293520194019201859392916100b5565b5f80fdfea2646970667358221220c69d8dbf734e631495fa06bb43414b35a41e05f7dee0f399706c5e4bedd6c1f064736f6c634300081e0033"},"sourceId":"src/strategies/IntraChainAdminUpdateStrategy.sol","sourcemap":"290:322:25:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"notice":"Use this strategy when updating the vault on the same chain as the credential manager.","version":1}},"MockTarget":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onAtomicSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"}],"contractName":"MockTarget","deploymentBytecode":{"bytecode":"0x6080806040523460135760b1908160188239f35b5f80fdfe6004361015600b575f80fd5b5f3560e01c633f1d584e14601d575f80fd5b3460775760603660031901126077576004356001600160a01b0381160360775760443567ffffffffffffffff811160775736602382011215607757806004013567ffffffffffffffff811160775736910160240111607757005b5f80fdfea26469706673582212206cf91bafe3a0f54d58f9735d82a4757234fa3d217135826792ecef05e5d5837c64736f6c634300081c0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"onAtomicSettlement(address,uint256,bytes)":"0x3f1d584e"},"runtimeBytecode":{"bytecode":"0x6004361015600b575f80fd5b5f3560e01c633f1d584e14601d575f80fd5b3460775760603660031901126077576004356001600160a01b0381160360775760443567ffffffffffffffff811160775736602382011215607757806004013567ffffffffffffffff811160775736910160240111607757005b5f80fdfea26469706673582212206cf91bafe3a0f54d58f9735d82a4757234fa3d217135826792ecef05e5d5837c64736f6c634300081c0033"},"sourceId":"src/MockTarget.sol","sourcemap":"149:148:4:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}},"OPStackAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"address","name":"l1CrossDomainMessenger","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ZeroMessengerAddress","type":"error"},{"inputs":[],"name":"L1_CROSS_DOMAIN_MESSENGER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"L2_GAS_LIMIT","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"OPStackAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x60a034608057601f61033938819003918201601f19168301916001600160401b03831184841017608457808492602094604052833981010312608057516001600160a01b038116808203608057156071576080526040516102a090816100998239608051818181605401526101590152f35b637dc8404d60e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c908163075034ae146100a4575080635e743ef7146100865763f904facb1461003f575f80fd5b346100835780600319360112610083576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346100835780600319360112610083576020604051622dc6c08152f35b90506060366003190112610200576004356001600160a01b03811690819003610200576024359167ffffffffffffffff831161020057366023840112156102005782600401359267ffffffffffffffff8411610200573660248560051b8301011161020057928160208101946323c5673160e01b8652826064830160406024850152526024608483019101925f905b8082106102045750506101579250604435604483015203601f198101835282610234565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610200575f926084604051809681958294633dbb202b60e01b84526004840152606060248401525180918160648501528484015e8181018301879052622dc6c06044830152601f01601f1916810103019134905af180156101f5576101e7575080f35b6101f391505f90610234565b005b6040513d5f823e3d90fd5b5f80fd5b9092509083356001600160a01b038116919082900361020057602081600193829352019401920184929391610133565b90601f8019910116810190811067ffffffffffffffff82111761025657604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220fdcfda93542236fa6c6acb7164967d4dac5ba9d6a97702bf0e69b659712a22e864736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{"setAdministrators(address,address[],uint256)":{"details":"Sends a cross-domain message from L1 \u2192 L2 using the OP Stack messengerForwards msg.value directly to the L1 messenger","params":{"newAdministrators":"The full administrator set","newWithdrawalQuorum":"The withdrawal quorum","vault":"The L2 vault address"}}},"version":1},"methodIdentifiers":{"L1_CROSS_DOMAIN_MESSENGER()":"0xf904facb","L2_GAS_LIMIT()":"0x5e743ef7","setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f905f3560e01c908163075034ae146100a4575080635e743ef7146100865763f904facb1461003f575f80fd5b346100835780600319360112610083576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346100835780600319360112610083576020604051622dc6c08152f35b90506060366003190112610200576004356001600160a01b03811690819003610200576024359167ffffffffffffffff831161020057366023840112156102005782600401359267ffffffffffffffff8411610200573660248560051b8301011161020057928160208101946323c5673160e01b8652826064830160406024850152526024608483019101925f905b8082106102045750506101579250604435604483015203601f198101835282610234565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610200575f926084604051809681958294633dbb202b60e01b84526004840152606060248401525180918160648501528484015e8181018301879052622dc6c06044830152601f01601f1916810103019134905af180156101f5576101e7575080f35b6101f391505f90610234565b005b6040513d5f823e3d90fd5b5f80fd5b9092509083356001600160a01b038116919082900361020057602081600193829352019401920184929391610133565b90601f8019910116810190811067ffffffffffffffff82111761025657604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220fdcfda93542236fa6c6acb7164967d4dac5ba9d6a97702bf0e69b659712a22e864736f6c634300081e0033"},"sourceId":"src/strategies/OPStackAdminUpdateStrategy.sol","sourcemap":"446:1455:26:-:0;;;;;;;;;;;;;-1:-1:-1;;446:1455:26;;;;-1:-1:-1;;;;;446:1455:26;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;446:1455:26;;;;;;;868:36;864:71;;945:50;;446:1455;;;;;;;;945:50;446:1455;;;;;;;;;;;864:71;913:22;;;-1:-1:-1;913:22:26;;-1:-1:-1;913:22:26;446:1455;-1:-1:-1;446:1455:26;;;;;;-1:-1:-1;446:1455:26;;;;;-1:-1:-1;446:1455:26","userdoc":{"errors":{"ZeroMessengerAddress()":[{"notice":"Reverts if messenger address is zero."}]},"kind":"user","methods":{"L1_CROSS_DOMAIN_MESSENGER()":{"notice":"L1 CrossDomainMessenger."},"L2_GAS_LIMIT()":{"notice":"Conservative gas limit for L2 execution."},"setAdministrators(address,address[],uint256)":{"notice":"Updates the administrator set and withdrawal quorum on an OP Stack L2 vault"}},"notice":"Admin update strategy for OP Stack chains (Optimism, Base, Unichain, etc)","version":1}},"Registry":{"abi":[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ChainAlreadyExists","type":"error"},{"inputs":[],"name":"IndexOutOfBounds","type":"error"},{"inputs":[],"name":"InvalidBufferMultiple","type":"error"},{"inputs":[],"name":"InvalidCollateralFactor","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsClamps","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsConfiguration","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsFactors","type":"error"},{"inputs":[],"name":"InvalidInterestKinks","type":"error"},{"inputs":[],"name":"InvalidLiabilityFactor","type":"error"},{"inputs":[],"name":"InvalidMaxFundingRate","type":"error"},{"inputs":[],"name":"InvalidMaxUtilizationRate","type":"error"},{"inputs":[],"name":"InvalidRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUtilizationCap","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"}],"name":"NoPendingRiskParameters","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotRiskManager","type":"error"},{"inputs":[],"name":"RiskManagerNotSet","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"},{"internalType":"uint256","name":"eligibleAt","type":"uint256"}],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"Max1HrDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MaxDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MinWeightChanged","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"}],"name":"applyPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAccount","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"}],"name":"getAssetData","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct Registry.AssetData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"}],"name":"getAssetIndex","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getAssets","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct Registry.AssetData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"pendingRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters","name":"parameters","type":"tuple"},{"internalType":"uint256","name":"validAfter","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManagerMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskParameterChangeDelaySeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"riskParameters","outputs":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct Registry.AssetData","name":"data","type":"tuple"}],"name":"setAssetData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"account","type":"bytes32"}],"name":"setFeeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMax1HrDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMaxDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMinWeight","type":"uint256"}],"name":"setMinWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"},{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters","name":"parameters","type":"tuple"}],"name":"setPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"multisig","type":"address"}],"name":"setRiskManagerMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters","name":"params","type":"tuple"}],"name":"validateRiskParameters","outputs":[],"stateMutability":"pure","type":"function"}],"contractName":"Registry","deploymentBytecode":{"bytecode":"0x608034607657601f6122e038819003918201601f19168301916001600160401b03831184841017607a57808492602094604052833981010312607657516001600160a01b03811690819003607657620151806002555f80546001600160a01b031916919091179055604051612251908161008f8239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816304cd46f91461115d575080630cb661c7146110e4578063114bb9c5146110165780632491905014610f655780633a076ddd14610ec05780634ffcbdfb14610e6d578063525ea8b714610e455780635799026114610e0b57806365e17c9d14610dee578063698670e314610dba5780636cbb0b54146109d5578063704b6c0214610951578063a7b7b47014610858578063a812e22414610801578063af8c83381461074b578063b4bb064614610418578063bc67a603146101ec578063e2a0a600146101b3578063f0fef575146101235763f851a440146100f8575f80fd5b3461011f575f36600319011261011f575f546040516001600160a01b039091168152602090f35b5f80fd5b3461011f57604036600319011261011f5761014d61013f611177565b610147611188565b90611f7c565b6040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061018457505050500390f35b919360019193955060206101a38192603f198a82030186528851611643565b9601920192018594939192610175565b3461011f57602036600319011261011f576001546001600160a01b031633036101de57600435600755005b6206732360e51b5f5260045ffd5b3461011f5760e036600319011261011f5760405161020981611230565b610211611177565b815260208101906024358252604060431936011261011f576040519161023683611215565b6044356001600160401b038116810361011f5783526064356001600160401b038116810361011f5760208401526040820192835260608201916084358352608081019160a435835260a0820160c435815260018060a01b036001541633036101de5761ffff83511660055410610409578151156103fa5761ffff8351165f52600660205260405f20938651966001600160401b036020818a511699015116936001600160401b0389165f528660205260405f206001600160401b0386165f52602052600160405f2001546103eb5760059460018801976001600160401b038954159b165f526020526001600160401b0360405f2091165f5260205261ffff60405f2096511661ffff19875416178655516001860155519561035a8760028701611e68565b516003850155516004840155519101558054600160401b8110156103d75761038791600182018155611844565b9190916103c45761039791611e68565b61039d57005b600554600181018091116103b057600555005b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b6329409fff60e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b634e23d03560e01b5f5260045ffd5b3461011f57604036600319011261011f57610431611177565b6024356001600160401b03811161011f5761045090369060040161130a565b6001549091906001600160a01b031633036101de5761047861ffff6005549216918210611b00565b61048182611b8d565b61048d60025442611796565b906040519261049b84611215565b8352602083019182525f52600360205260405f20915160ff81511683549061ff00602084015160081b169161ffff19161717835560408101516001840155606081015160028401556080810151600384015560a081015160048401556005830160c0820151151560ff801983541691161790556006830160e0820151908151916001600160401b0383116103d7576020906105368484611e28565b01905f5260205f205f5b838110610737575050505060078301610100820151908151916001600160401b0383116103d7576020906105748484611e28565b01905f5260205f205f5b838110610723575050505060088301610120820151908151916001600160401b0383116103d7576020906105b28484611e28565b01905f5260205f205f5b83811061070f575050505060098301610140820151908151916001600160401b0383116103d7576020906105f08484611e28565b01905f5260205f205f5b8381106106fb5750505050610160810151600a840155610180810151600b8401556101a0810151600c8401556101c0810151600d840155600e83016101e0820151908151916001600160401b0383116103d75760209061065a8484611e28565b01905f5260205f205f5b8381106106e75750505050600f8301610200820151908151916001600160401b0383116103d7576020906106988484611e28565b01905f5260205f205f5b8381106106d35761022085015160108801556102408501516011880155610260850151601288015585516013880155005b6001906020845194019381840155016106a2565b600190602084519401938184015501610664565b6001906020845194019381840155016105fa565b6001906020845194019381840155016105bc565b60019060208451940193818401550161057e565b600190602084519401938184015501610540565b3461011f57610759366111ea565b6001549092906001600160a01b031633036101de576107fc7f9b0a62bc173ccdd4228691d9af5cbe894061fb605491498f20216dc69fdcee1e936005546107a661ffff8616918210611b00565b6107af84611b35565b6107bb60208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600401805490839055905194859485611b49565b0390a1005b3461011f57602036600319011261011f5761ffff61081d611177565b165f52600360205261084e60405f206013610837826114ff565b910154604051928392604084526040840190611643565b9060208301520390f35b3461011f57610866366111ea565b6001549092906001600160a01b031633036101de576107fc7f61add8ab6aedaf5e8c15fd0f3b5dc7239de9517bae157dc6f09438d619959a5b936005546108b361ffff8616918210611b00565b805f52600660205260405f206001600160401b036108d086611b35565b165f5260205260405f2060208501906001600160401b036108f083611b35565b165f52602052600560405f200154915f52600660205260405f206001600160401b0361091b87611b35565b165f526020526001600160401b0361093660405f2092611b35565b165f5260205281600560405f20015560405194859485611b49565b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b03811633036109c6578115806109b3575b6109a4576001600160a01b031916175f55005b632b47857560e01b5f5260045ffd5b506001546001600160a01b031615610991565b637bfa4b9f60e01b5f5260045ffd5b3461011f57602036600319011261011f576109ee611177565b610a0161ffff6005549216918210611b00565b805f52600360205260405f20601360405191610a1c83611215565b610a25816114ff565b83520154602082019080825215610da7575142811015610d91575051610a4a81611b8d565b815f52600460205260405f209060ff81511682549061ff00602084015160081b169161ffff19161717825560408101516001830155606081015160028301556080810151600383015560a081015160048301556005820160c0820151151560ff801983541691161790556006820160e0820151908151916001600160401b0383116103d757602090610adc8484611e28565b01905f5260205f205f5b838110610d7d575050505060078201610100820151908151916001600160401b0383116103d757602090610b1a8484611e28565b01905f5260205f205f5b838110610d69575050505060088201610120820151908151916001600160401b0383116103d757602090610b588484611e28565b01905f5260205f205f5b838110610d55575050505060098201610140820151908151916001600160401b0383116103d757602090610b968484611e28565b01905f5260205f205f5b838110610d415750505050610160810151600a830155610180810151600b8301556101a0810151600c8301556101c0810151600d830155600e82016101e0820151908151916001600160401b0383116103d757602090610c008484611e28565b01905f5260205f205f5b838110610d2d5750505050600f8201610200820151908151916001600160401b0383116103d757602090610c3e8484611e28565b01905f5260205f205f5b838110610d195786866012610260886102208101516010850155610240810151601185015501519101555f5260036020525f601360408220828155826001820155826002820155826003820155826004820155826005820155610cad60068201611df8565b610cb960078201611df8565b610cc560088201611df8565b610cd160098201611df8565b82600a82015582600b82015582600c82015582600d820155610cf5600e8201611df8565b610d01600f8201611df8565b82601082015582601182015582601282015501555f80f35b600190602084519401938184015501610c48565b600190602084519401938184015501610c0a565b600190602084519401938184015501610ba0565b600190602084519401938184015501610b62565b600190602084519401938184015501610b24565b600190602084519401938184015501610ae6565b82636bfedefd60e11b5f5260045260245260445ffd5b8263193e674760e21b5f5260045260245ffd5b3461011f5736600319016060811261011f5760401361011f576020610de0604435611d61565b63ffffffff60405191168152f35b3461011f575f36600319011261011f576020600754604051908152f35b3461011f57602036600319011261011f576004356001600160401b03811161011f57610e3e610e4391369060040161130a565b611b8d565b005b3461011f575f36600319011261011f576001546040516001600160a01b039091168152602090f35b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b031633036109c6576bffffffffffffffffffffffff60a01b60015416176001555f80f35b3461011f5736600319016060811261011f5760401361011f5760443561ffff811680910361011f57610ef06117a3565b505f52600660205260405f206004356001600160401b038116810361011f57806001600160401b039150165f5260205260405f206024356001600160401b038116810361011f57806001600160401b039150165f5260205260e0610f5660405f20611881565b610f636040518092611199565bf35b3461011f57610f73366111ea565b6001549092906001600160a01b031633036101de576107fc7f35095f4ef942f9cb4170d9a93adc7fe9ebc8faf2df4a91b87b0dced92784718f93600554610fc061ffff8616918210611b00565b610fc984611b35565b610fd560208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600301805490839055905194859485611b49565b3461011f57602036600319011261011f5761ffff611032611177565b165f5260046020526101c060ff60405f20805490600181015460028201546003830154600484015486600586015416600a86015490600b87015492600c88015494600d8901549660108a015498601260118c01549b01549b60206040519e8f92818116845260081c1691015260408d015260608c015260808b015260a08a0152151560c089015260e08801526101008701526101208601526101408501526101608401526101808301526101a0820152f35b3461011f57604036600319011261011f5761110e611100611177565b611108611188565b906118ed565b6040518091602082016020835281518091526020604084019201905f5b818110611139575050500390f35b91935091602060e08261114f6001948851611199565b01940191019184939261112b565b3461011f575f36600319011261011f576020906002548152f35b6004359061ffff8216820361011f57565b6024359061ffff8216820361011f57565b60a060c09161ffff8151168452602081015160208501526001600160401b03602060408301518281511660408801520151166060850152606081015160808501526080810151828501520151910152565b600319016080811261011f5760401361011f5760049060443561ffff8116810361011f579060643590565b604081019081106001600160401b038211176103d757604052565b60c081019081106001600160401b038211176103d757604052565b61028081019081106001600160401b038211176103d757604052565b90601f801991011681019081106001600160401b038211176103d757604052565b359060ff8216820361011f57565b6001600160401b0381116103d75760051b60200190565b9080601f8301121561011f5781356112c481611296565b926112d26040519485611267565b81845260208085019260051b82010192831161011f57602001905b8282106112fa5750505090565b81358152602091820191016112ed565b9190916102808184031261011f57604051906113258261124b565b819361133082611288565b835261133e60208301611288565b602084015260408201356040840152606082013560608401526080820135608084015260a082013560a084015260c0820135801515810361011f5760c084015260e08201356001600160401b03811161011f578161139d9184016112ad565b60e08401526101008201356001600160401b03811161011f57816113c29184016112ad565b6101008401526101208201356001600160401b03811161011f57816113e89184016112ad565b6101208401526101408201356001600160401b03811161011f578161140e9184016112ad565b6101408401526101608201356101608401526101808201356101808401526101a08201356101a08401526101c08201356101c08401526101e08201356001600160401b03811161011f57816114649184016112ad565b6101e0840152610200820135916001600160401b03831161011f576114906102609392849383016112ad565b6102008501526102208101356102208501526102408101356102408501520135910152565b90604051918281549182825260208201905f5260205f20925f5b8181106114e65750506114e492500383611267565b565b84548352600194850194879450602090930192016114cf565b9060405161150c8161124b565b6102606012829460ff8154818116865260081c166020850152600181015460408501526002810154606085015260038101546080850152600481015460a085015260ff600582015416151560c0850152611568600682016114b5565b60e0850152611579600782016114b5565b61010085015261158b600882016114b5565b61012085015261159d600982016114b5565b610140850152600a810154610160850152600b810154610180850152600c8101546101a0850152600d8101546101c08501526115db600e82016114b5565b6101e08501526115ed600f82016114b5565b610200850152601081015461022085015260118101546102408501520154910152565b90602080835192838152019201905f5b81811061162d5750505090565b8251845260209384019390920191600101611620565b9060ff825116815260ff602083015116602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c0820151151560c08201526102608061174e61173a6116f66116e26116ce6116ba60e08a015161028060e08b01526102808a0190611610565b6101008a01518982036101008b0152611610565b6101208901518882036101208a0152611610565b610140880151878203610140890152611610565b6101608701516101608701526101808701516101808701526101a08701516101a08701526101c08701516101c08701526101e08701518682036101e0880152611610565b610200860151858203610200870152611610565b93610220810151610220850152610240810151610240850152015191015290565b35906001600160401b038216820361011f57565b61ffff1661ffff81146103b05760010190565b919082018092116103b057565b604051906117b082611230565b5f60a0838281528260208201526040516117c981611215565b83815283602082015260408201528260608201528260808201520152565b604051906117f6602083611267565b5f80835282815b82811061180957505050565b6020906118146117a3565b828285010152016117fd565b9061ffff8091169116039061ffff82116103b057565b5f1981146103b05760010190565b8054821015611859575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b80518210156118595760209160051b010190565b9060405161188e81611230565b60a06005829461ffff8154168452600181015460208501526040516118b281611215565b6001600160401b036002830154818116835260401c166020820152604085015260038101546060850152600481015460808501520154910152565b6005545f9290835b61ffff85168281101561192b576119259161191f915f526006602052600160405f20015490611796565b94611783565b936118f5565b5093509193909361ffff81169380851015611ae3578061ffff871611611af4575b5061ffff851694848610611ae35761ffff9161196c919693959496611820565b1661197681611296565b916119846040519384611267565b818352601f1961199383611296565b015f5b818110611ac05750505f905f945f5b61ffff811689811080611ab7575b15611aab575f52600660205260405f209460018601948554995f915b8b831080611aa2575b15611a85578581101580611a7c575b611a04575b6119f86119fe91611836565b92611836565b916119cf565b611a0e8389611844565b50546001600160401b0381166001600160401b03165f528960205260405f209060401c6001600160401b03166001600160401b03165f5260205260405f209a80611a5790611836565b9b611a6190611881565b611a6b828d61186d565b52611a76908b61186d565b506119ec565b508681106119e7565b9b9497509550509750611a9790611783565b9792969390976119a5565b50838b106119d8565b50949750505050505050565b508588106119b3565b602090611ad19896949793986117a3565b82828801015201969195929496611996565b505092505050611af16117e7565b90565b61ffff1694505f61194c565b15611b0757565b60405162461bcd60e51b815260206004820152600660248201526508585cdcd95d60d21b6044820152606490fd5b356001600160401b038116810361011f5790565b9094939261ffff6080936001600160401b03611b78602060a087019a83611b6f8261176f565b1688520161176f565b16602085015216604083015260608201520152565b606460ff82511611611d5257606460ff60208301511611611d4357670de0b6b3a764000060a082015111611d345761047661022082015111611d255761047661024082015111611d1657610260810151620f42408110908115611d09575b50611cfa5760e08101611bfe8151612108565b15611ceb57611c0d9051612180565b15611ceb576101208101611c218151612108565b15611cdc57611c309051612180565b15611cdc57611c436101008201516121b0565b15611ccd57611c566101408201516121b0565b15611cbe576101e0810161020081515192019182515103611caf57611c7b9051612108565b15611ca057611c8a90516121e4565b15611c9157565b637015a03b60e01b5f5260045ffd5b6329f7281b60e21b5f5260045ffd5b63bfa51ee360e01b5f5260045ffd5b635646ba3b60e11b5f5260045ffd5b630adc448560e21b5f5260045ffd5b630376a9ef60e31b5f5260045ffd5b6365c991a560e01b5f5260045ffd5b63adb838cd60e01b5f5260045ffd5b621e84809150115f611beb565b6328be116d60e21b5f5260045ffd5b63076eb25360e11b5f5260045ffd5b63cc15654960e01b5f5260045ffd5b632a7f863d60e21b5f5260045ffd5b6302f22cad60e61b5f5260045ffd5b6004356001600160401b038116810361011f57602435916001600160401b038316830361011f575f6001600160401b038060055494169416905b61ffff811684811015611dea57805f52600660205260405f20865f5260205260405f20835f52602052600160405f2001548414611de15750611ddc90611783565b611d9b565b94505050505090565b50505050505063ffffffff90565b8054905f815581611e07575050565b5f5260205f20908101905b818110611e1d575050565b5f8155600101611e12565b90600160401b81116103d757815491818155828210611e4657505050565b5f5260205f2091820191015b818110611e5d575050565b5f8155600101611e52565b906001600160401b038151166fffffffffffffffff00000000000000006020845493836001600160401b03198616178655015160401b16916fffffffffffffffffffffffffffffffff191617179055565b60405190611ec8602083611267565b5f80835282815b828110611edb57505050565b602090604051611eea8161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828501015201611ecf565b60055461ffff80831694939116808510156120fb578061ffff8316116120f3575b508361ffff8216106120e75761ffff91611fb691611820565b16611fc081611296565b92611fce6040519485611267565b818452601f19611fdd83611296565b015f5b8181106120465750505f5b61ffff811690838210156120405781830161ffff81116103b05761203b9261ffff61203592165f52600460205261202460405f206114ff565b61202e828a61186d565b528761186d565b50611783565b611feb565b50505050565b6020906040516120558161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828901015201611fe0565b50509050611af1611eb9565b90505f611f9d565b5050509050611af1611eb9565b8051905f908215801561216c575b612165575f915b83831061212d5750505050600190565b612137838361186d565b5190620f4240821161215c5781106121545760019092019161211d565b505050505f90565b50505050505f90565b5050505f90565b508051156118595760208101511515612116565b8051801515918261219057505090565b5f19820192509082116103b057620f4240916121ab9161186d565b511490565b8051905f90815b8383106121c75750505050600190565b6121d1838361186d565b51908110612154576001909201916121b7565b8051905f90620f423f5b8383106121fe5750505050600190565b612208838361186d565b51908111612154576001909201916121ee56fea26469706673582212201a0e5b061dbc5669db9937ab714356062c9af05eea7b1d4bb9eeaf0073ef81fe64736f6c634300081e0033"},"devdoc":{"details":"Uses admin and multisig roles to control sensitive operations like asset registration and risk configuration.","kind":"dev","methods":{"applyPendingRiskParameters(uint16)":{"details":"Reverts with `\"!asset\"` if index >= assets.count.Reverts with `NoPendingRiskParameters` if there are no pending risk parameters for the specified assetReverts with `TooSoon` if the pending risk parameters are not yet eligible","params":{"index":"The asset index."}},"constructor":{"details":"Sets the deployer as the initial admin.","params":{"_admin":"The admin controller of the vault."}},"getAssetData((uint64,uint64),uint16)":{"params":{"chainId":"the chain ID to query.","index":"The asset index to query."},"returns":{"_0":"The corresponding AssetData struct."}},"getAssetIndex((uint64,uint64),bytes32)":{"params":{"assetAddress":"The asset address (as bytes32).","chainId":"The chain ID to search."},"returns":{"_0":"The index of the asset, or `type(uint32).max` if not found."}},"getAssets(uint16,uint16)":{"params":{"end":"The end index (not-inclusive).","start":"The start index (inclusive)."},"returns":{"_0":"An array of AssetData structs."}},"getRiskParameters(uint16,uint16)":{"params":{"end":"The end index (not inclusive).","start":"The start index (inclusive)."},"returns":{"_0":"An array of RiskParameters."}},"setAdmin(address)":{"details":"Reverts with `NotAdmin`; Only the admin can set a new admin.The new administrator address is allowed to be the null address. Setting the administrator to this address disables administration of the registry contract.","params":{"newAdmin":"The new admin address."}},"setAssetData((uint16,bytes32,(uint64,uint64),uint256,uint256,uint256))":{"details":"Automatically adds new assets or chain instances if not already present.Reverts with `NotRiskManager`; Only the risk manager can set asset data.","params":{"data":"The chain-specific asset data."}},"setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":{"details":"Reverts with `NotRiskManager`; Only the risk manager can set risk parameters.Reverts with `\"!asset\"` if index >= assets.count.","params":{"index":"The asset index.","parameters":"The risk parameters to set"}},"setRiskManagerMultisig(address)":{"details":"Reverts with `NotAdmin`; Only the admin can set a risk manager.","params":{"multisig":"The new address to set."}}},"title":"Registry","version":1},"methodIdentifiers":{"admin()":"0xf851a440","applyPendingRiskParameters(uint16)":"0x6cbb0b54","feeAccount()":"0x65e17c9d","getAssetData((uint64,uint64),uint16)":"0x3a076ddd","getAssetIndex((uint64,uint64),bytes32)":"0x698670e3","getAssets(uint16,uint16)":"0x0cb661c7","getRiskParameters(uint16,uint16)":"0xf0fef575","pendingRiskParameters(uint16)":"0xa812e224","riskManagerMultisig()":"0x525ea8b7","riskParameterChangeDelaySeconds()":"0x04cd46f9","riskParameters(uint16)":"0x114bb9c5","setAdmin(address)":"0x704b6c02","setAssetData((uint16,bytes32,(uint64,uint64),uint256,uint256,uint256))":"0xbc67a603","setFeeAccount(bytes32)":"0xe2a0a600","setMax1HrDeposits((uint64,uint64),uint16,uint256)":"0xaf8c8338","setMaxDeposits((uint64,uint64),uint16,uint256)":"0x24919050","setMinWeight((uint64,uint64),uint16,uint256)":"0xa7b7b470","setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0xb4bb0646","setRiskManagerMultisig(address)":"0x4ffcbdfb","validateRiskParameters((uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0x57990261"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816304cd46f91461115d575080630cb661c7146110e4578063114bb9c5146110165780632491905014610f655780633a076ddd14610ec05780634ffcbdfb14610e6d578063525ea8b714610e455780635799026114610e0b57806365e17c9d14610dee578063698670e314610dba5780636cbb0b54146109d5578063704b6c0214610951578063a7b7b47014610858578063a812e22414610801578063af8c83381461074b578063b4bb064614610418578063bc67a603146101ec578063e2a0a600146101b3578063f0fef575146101235763f851a440146100f8575f80fd5b3461011f575f36600319011261011f575f546040516001600160a01b039091168152602090f35b5f80fd5b3461011f57604036600319011261011f5761014d61013f611177565b610147611188565b90611f7c565b6040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061018457505050500390f35b919360019193955060206101a38192603f198a82030186528851611643565b9601920192018594939192610175565b3461011f57602036600319011261011f576001546001600160a01b031633036101de57600435600755005b6206732360e51b5f5260045ffd5b3461011f5760e036600319011261011f5760405161020981611230565b610211611177565b815260208101906024358252604060431936011261011f576040519161023683611215565b6044356001600160401b038116810361011f5783526064356001600160401b038116810361011f5760208401526040820192835260608201916084358352608081019160a435835260a0820160c435815260018060a01b036001541633036101de5761ffff83511660055410610409578151156103fa5761ffff8351165f52600660205260405f20938651966001600160401b036020818a511699015116936001600160401b0389165f528660205260405f206001600160401b0386165f52602052600160405f2001546103eb5760059460018801976001600160401b038954159b165f526020526001600160401b0360405f2091165f5260205261ffff60405f2096511661ffff19875416178655516001860155519561035a8760028701611e68565b516003850155516004840155519101558054600160401b8110156103d75761038791600182018155611844565b9190916103c45761039791611e68565b61039d57005b600554600181018091116103b057600555005b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b6329409fff60e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b634e23d03560e01b5f5260045ffd5b3461011f57604036600319011261011f57610431611177565b6024356001600160401b03811161011f5761045090369060040161130a565b6001549091906001600160a01b031633036101de5761047861ffff6005549216918210611b00565b61048182611b8d565b61048d60025442611796565b906040519261049b84611215565b8352602083019182525f52600360205260405f20915160ff81511683549061ff00602084015160081b169161ffff19161717835560408101516001840155606081015160028401556080810151600384015560a081015160048401556005830160c0820151151560ff801983541691161790556006830160e0820151908151916001600160401b0383116103d7576020906105368484611e28565b01905f5260205f205f5b838110610737575050505060078301610100820151908151916001600160401b0383116103d7576020906105748484611e28565b01905f5260205f205f5b838110610723575050505060088301610120820151908151916001600160401b0383116103d7576020906105b28484611e28565b01905f5260205f205f5b83811061070f575050505060098301610140820151908151916001600160401b0383116103d7576020906105f08484611e28565b01905f5260205f205f5b8381106106fb5750505050610160810151600a840155610180810151600b8401556101a0810151600c8401556101c0810151600d840155600e83016101e0820151908151916001600160401b0383116103d75760209061065a8484611e28565b01905f5260205f205f5b8381106106e75750505050600f8301610200820151908151916001600160401b0383116103d7576020906106988484611e28565b01905f5260205f205f5b8381106106d35761022085015160108801556102408501516011880155610260850151601288015585516013880155005b6001906020845194019381840155016106a2565b600190602084519401938184015501610664565b6001906020845194019381840155016105fa565b6001906020845194019381840155016105bc565b60019060208451940193818401550161057e565b600190602084519401938184015501610540565b3461011f57610759366111ea565b6001549092906001600160a01b031633036101de576107fc7f9b0a62bc173ccdd4228691d9af5cbe894061fb605491498f20216dc69fdcee1e936005546107a661ffff8616918210611b00565b6107af84611b35565b6107bb60208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600401805490839055905194859485611b49565b0390a1005b3461011f57602036600319011261011f5761ffff61081d611177565b165f52600360205261084e60405f206013610837826114ff565b910154604051928392604084526040840190611643565b9060208301520390f35b3461011f57610866366111ea565b6001549092906001600160a01b031633036101de576107fc7f61add8ab6aedaf5e8c15fd0f3b5dc7239de9517bae157dc6f09438d619959a5b936005546108b361ffff8616918210611b00565b805f52600660205260405f206001600160401b036108d086611b35565b165f5260205260405f2060208501906001600160401b036108f083611b35565b165f52602052600560405f200154915f52600660205260405f206001600160401b0361091b87611b35565b165f526020526001600160401b0361093660405f2092611b35565b165f5260205281600560405f20015560405194859485611b49565b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b03811633036109c6578115806109b3575b6109a4576001600160a01b031916175f55005b632b47857560e01b5f5260045ffd5b506001546001600160a01b031615610991565b637bfa4b9f60e01b5f5260045ffd5b3461011f57602036600319011261011f576109ee611177565b610a0161ffff6005549216918210611b00565b805f52600360205260405f20601360405191610a1c83611215565b610a25816114ff565b83520154602082019080825215610da7575142811015610d91575051610a4a81611b8d565b815f52600460205260405f209060ff81511682549061ff00602084015160081b169161ffff19161717825560408101516001830155606081015160028301556080810151600383015560a081015160048301556005820160c0820151151560ff801983541691161790556006820160e0820151908151916001600160401b0383116103d757602090610adc8484611e28565b01905f5260205f205f5b838110610d7d575050505060078201610100820151908151916001600160401b0383116103d757602090610b1a8484611e28565b01905f5260205f205f5b838110610d69575050505060088201610120820151908151916001600160401b0383116103d757602090610b588484611e28565b01905f5260205f205f5b838110610d55575050505060098201610140820151908151916001600160401b0383116103d757602090610b968484611e28565b01905f5260205f205f5b838110610d415750505050610160810151600a830155610180810151600b8301556101a0810151600c8301556101c0810151600d830155600e82016101e0820151908151916001600160401b0383116103d757602090610c008484611e28565b01905f5260205f205f5b838110610d2d5750505050600f8201610200820151908151916001600160401b0383116103d757602090610c3e8484611e28565b01905f5260205f205f5b838110610d195786866012610260886102208101516010850155610240810151601185015501519101555f5260036020525f601360408220828155826001820155826002820155826003820155826004820155826005820155610cad60068201611df8565b610cb960078201611df8565b610cc560088201611df8565b610cd160098201611df8565b82600a82015582600b82015582600c82015582600d820155610cf5600e8201611df8565b610d01600f8201611df8565b82601082015582601182015582601282015501555f80f35b600190602084519401938184015501610c48565b600190602084519401938184015501610c0a565b600190602084519401938184015501610ba0565b600190602084519401938184015501610b62565b600190602084519401938184015501610b24565b600190602084519401938184015501610ae6565b82636bfedefd60e11b5f5260045260245260445ffd5b8263193e674760e21b5f5260045260245ffd5b3461011f5736600319016060811261011f5760401361011f576020610de0604435611d61565b63ffffffff60405191168152f35b3461011f575f36600319011261011f576020600754604051908152f35b3461011f57602036600319011261011f576004356001600160401b03811161011f57610e3e610e4391369060040161130a565b611b8d565b005b3461011f575f36600319011261011f576001546040516001600160a01b039091168152602090f35b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b031633036109c6576bffffffffffffffffffffffff60a01b60015416176001555f80f35b3461011f5736600319016060811261011f5760401361011f5760443561ffff811680910361011f57610ef06117a3565b505f52600660205260405f206004356001600160401b038116810361011f57806001600160401b039150165f5260205260405f206024356001600160401b038116810361011f57806001600160401b039150165f5260205260e0610f5660405f20611881565b610f636040518092611199565bf35b3461011f57610f73366111ea565b6001549092906001600160a01b031633036101de576107fc7f35095f4ef942f9cb4170d9a93adc7fe9ebc8faf2df4a91b87b0dced92784718f93600554610fc061ffff8616918210611b00565b610fc984611b35565b610fd560208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600301805490839055905194859485611b49565b3461011f57602036600319011261011f5761ffff611032611177565b165f5260046020526101c060ff60405f20805490600181015460028201546003830154600484015486600586015416600a86015490600b87015492600c88015494600d8901549660108a015498601260118c01549b01549b60206040519e8f92818116845260081c1691015260408d015260608c015260808b015260a08a0152151560c089015260e08801526101008701526101208601526101408501526101608401526101808301526101a0820152f35b3461011f57604036600319011261011f5761110e611100611177565b611108611188565b906118ed565b6040518091602082016020835281518091526020604084019201905f5b818110611139575050500390f35b91935091602060e08261114f6001948851611199565b01940191019184939261112b565b3461011f575f36600319011261011f576020906002548152f35b6004359061ffff8216820361011f57565b6024359061ffff8216820361011f57565b60a060c09161ffff8151168452602081015160208501526001600160401b03602060408301518281511660408801520151166060850152606081015160808501526080810151828501520151910152565b600319016080811261011f5760401361011f5760049060443561ffff8116810361011f579060643590565b604081019081106001600160401b038211176103d757604052565b60c081019081106001600160401b038211176103d757604052565b61028081019081106001600160401b038211176103d757604052565b90601f801991011681019081106001600160401b038211176103d757604052565b359060ff8216820361011f57565b6001600160401b0381116103d75760051b60200190565b9080601f8301121561011f5781356112c481611296565b926112d26040519485611267565b81845260208085019260051b82010192831161011f57602001905b8282106112fa5750505090565b81358152602091820191016112ed565b9190916102808184031261011f57604051906113258261124b565b819361133082611288565b835261133e60208301611288565b602084015260408201356040840152606082013560608401526080820135608084015260a082013560a084015260c0820135801515810361011f5760c084015260e08201356001600160401b03811161011f578161139d9184016112ad565b60e08401526101008201356001600160401b03811161011f57816113c29184016112ad565b6101008401526101208201356001600160401b03811161011f57816113e89184016112ad565b6101208401526101408201356001600160401b03811161011f578161140e9184016112ad565b6101408401526101608201356101608401526101808201356101808401526101a08201356101a08401526101c08201356101c08401526101e08201356001600160401b03811161011f57816114649184016112ad565b6101e0840152610200820135916001600160401b03831161011f576114906102609392849383016112ad565b6102008501526102208101356102208501526102408101356102408501520135910152565b90604051918281549182825260208201905f5260205f20925f5b8181106114e65750506114e492500383611267565b565b84548352600194850194879450602090930192016114cf565b9060405161150c8161124b565b6102606012829460ff8154818116865260081c166020850152600181015460408501526002810154606085015260038101546080850152600481015460a085015260ff600582015416151560c0850152611568600682016114b5565b60e0850152611579600782016114b5565b61010085015261158b600882016114b5565b61012085015261159d600982016114b5565b610140850152600a810154610160850152600b810154610180850152600c8101546101a0850152600d8101546101c08501526115db600e82016114b5565b6101e08501526115ed600f82016114b5565b610200850152601081015461022085015260118101546102408501520154910152565b90602080835192838152019201905f5b81811061162d5750505090565b8251845260209384019390920191600101611620565b9060ff825116815260ff602083015116602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c0820151151560c08201526102608061174e61173a6116f66116e26116ce6116ba60e08a015161028060e08b01526102808a0190611610565b6101008a01518982036101008b0152611610565b6101208901518882036101208a0152611610565b610140880151878203610140890152611610565b6101608701516101608701526101808701516101808701526101a08701516101a08701526101c08701516101c08701526101e08701518682036101e0880152611610565b610200860151858203610200870152611610565b93610220810151610220850152610240810151610240850152015191015290565b35906001600160401b038216820361011f57565b61ffff1661ffff81146103b05760010190565b919082018092116103b057565b604051906117b082611230565b5f60a0838281528260208201526040516117c981611215565b83815283602082015260408201528260608201528260808201520152565b604051906117f6602083611267565b5f80835282815b82811061180957505050565b6020906118146117a3565b828285010152016117fd565b9061ffff8091169116039061ffff82116103b057565b5f1981146103b05760010190565b8054821015611859575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b80518210156118595760209160051b010190565b9060405161188e81611230565b60a06005829461ffff8154168452600181015460208501526040516118b281611215565b6001600160401b036002830154818116835260401c166020820152604085015260038101546060850152600481015460808501520154910152565b6005545f9290835b61ffff85168281101561192b576119259161191f915f526006602052600160405f20015490611796565b94611783565b936118f5565b5093509193909361ffff81169380851015611ae3578061ffff871611611af4575b5061ffff851694848610611ae35761ffff9161196c919693959496611820565b1661197681611296565b916119846040519384611267565b818352601f1961199383611296565b015f5b818110611ac05750505f905f945f5b61ffff811689811080611ab7575b15611aab575f52600660205260405f209460018601948554995f915b8b831080611aa2575b15611a85578581101580611a7c575b611a04575b6119f86119fe91611836565b92611836565b916119cf565b611a0e8389611844565b50546001600160401b0381166001600160401b03165f528960205260405f209060401c6001600160401b03166001600160401b03165f5260205260405f209a80611a5790611836565b9b611a6190611881565b611a6b828d61186d565b52611a76908b61186d565b506119ec565b508681106119e7565b9b9497509550509750611a9790611783565b9792969390976119a5565b50838b106119d8565b50949750505050505050565b508588106119b3565b602090611ad19896949793986117a3565b82828801015201969195929496611996565b505092505050611af16117e7565b90565b61ffff1694505f61194c565b15611b0757565b60405162461bcd60e51b815260206004820152600660248201526508585cdcd95d60d21b6044820152606490fd5b356001600160401b038116810361011f5790565b9094939261ffff6080936001600160401b03611b78602060a087019a83611b6f8261176f565b1688520161176f565b16602085015216604083015260608201520152565b606460ff82511611611d5257606460ff60208301511611611d4357670de0b6b3a764000060a082015111611d345761047661022082015111611d255761047661024082015111611d1657610260810151620f42408110908115611d09575b50611cfa5760e08101611bfe8151612108565b15611ceb57611c0d9051612180565b15611ceb576101208101611c218151612108565b15611cdc57611c309051612180565b15611cdc57611c436101008201516121b0565b15611ccd57611c566101408201516121b0565b15611cbe576101e0810161020081515192019182515103611caf57611c7b9051612108565b15611ca057611c8a90516121e4565b15611c9157565b637015a03b60e01b5f5260045ffd5b6329f7281b60e21b5f5260045ffd5b63bfa51ee360e01b5f5260045ffd5b635646ba3b60e11b5f5260045ffd5b630adc448560e21b5f5260045ffd5b630376a9ef60e31b5f5260045ffd5b6365c991a560e01b5f5260045ffd5b63adb838cd60e01b5f5260045ffd5b621e84809150115f611beb565b6328be116d60e21b5f5260045ffd5b63076eb25360e11b5f5260045ffd5b63cc15654960e01b5f5260045ffd5b632a7f863d60e21b5f5260045ffd5b6302f22cad60e61b5f5260045ffd5b6004356001600160401b038116810361011f57602435916001600160401b038316830361011f575f6001600160401b038060055494169416905b61ffff811684811015611dea57805f52600660205260405f20865f5260205260405f20835f52602052600160405f2001548414611de15750611ddc90611783565b611d9b565b94505050505090565b50505050505063ffffffff90565b8054905f815581611e07575050565b5f5260205f20908101905b818110611e1d575050565b5f8155600101611e12565b90600160401b81116103d757815491818155828210611e4657505050565b5f5260205f2091820191015b818110611e5d575050565b5f8155600101611e52565b906001600160401b038151166fffffffffffffffff00000000000000006020845493836001600160401b03198616178655015160401b16916fffffffffffffffffffffffffffffffff191617179055565b60405190611ec8602083611267565b5f80835282815b828110611edb57505050565b602090604051611eea8161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828501015201611ecf565b60055461ffff80831694939116808510156120fb578061ffff8316116120f3575b508361ffff8216106120e75761ffff91611fb691611820565b16611fc081611296565b92611fce6040519485611267565b818452601f19611fdd83611296565b015f5b8181106120465750505f5b61ffff811690838210156120405781830161ffff81116103b05761203b9261ffff61203592165f52600460205261202460405f206114ff565b61202e828a61186d565b528761186d565b50611783565b611feb565b50505050565b6020906040516120558161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828901015201611fe0565b50509050611af1611eb9565b90505f611f9d565b5050509050611af1611eb9565b8051905f908215801561216c575b612165575f915b83831061212d5750505050600190565b612137838361186d565b5190620f4240821161215c5781106121545760019092019161211d565b505050505f90565b50505050505f90565b5050505f90565b508051156118595760208101511515612116565b8051801515918261219057505090565b5f19820192509082116103b057620f4240916121ab9161186d565b511490565b8051905f90815b8383106121c75750505050600190565b6121d1838361186d565b51908110612154576001909201916121b7565b8051905f90620f423f5b8383106121fe5750505050600190565b612208838361186d565b51908111612154576001909201916121ee56fea26469706673582212201a0e5b061dbc5669db9937ab714356062c9af05eea7b1d4bb9eeaf0073ef81fe64736f6c634300081e0033"},"sourceId":"src/Registry.sol","sourcemap":"306:22119:16:-:0;;;;;;;;;;;;;-1:-1:-1;;306:22119:16;;;;-1:-1:-1;;;;;306:22119:16;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;306:22119:16;;;;;;;;699:6;;306:22119;-1:-1:-1;306:22119:16;;-1:-1:-1;;;;;;306:22119:16;;;;;;;;;;;;;;;;;-1:-1:-1;306:22119:16;;;;;;-1:-1:-1;306:22119:16;;;;;-1:-1:-1;306:22119:16","userdoc":{"errors":{"ChainAlreadyExists()":[{"notice":"Reverts if adding a chain to an asset that already exists."}],"IndexOutOfBounds()":[{"notice":"Reverts if the asset index is out of bounds."}],"InvalidBufferMultiple()":[{"notice":"Reverts if the buffer multiple value is less than 1% or greater than 2%."}],"InvalidCollateralFactor()":[{"notice":"Reverts if the collateral factor (CF) specified as part of risk parameters is greater than one"}],"InvalidInitialMarginsClamps()":[{"notice":"Reverts if the initial margin clamps specified as part of risk parameters are not increasing or are above 100"}],"InvalidInitialMarginsConfiguration()":[{"notice":"Reverts if the size of the initial margin clamps does not match the size of the initial margin factors (specified as part of risk parameters)"}],"InvalidInitialMarginsFactors()":[{"notice":"Reverts if the initial margin clamps specified as part of risk parameters are not decreasing or are above 100"}],"InvalidInterestKinks()":[{"notice":"Reverts if the interest kinks specified as part of risk parameters are not increasing from 0 to 1"}],"InvalidLiabilityFactor()":[{"notice":"Reverts if the liability factor (LF) specified as part of risk parameters is greater than one"}],"InvalidMaxFundingRate()":[{"notice":"Reverts if the funding rate cap specified as part of risk parameters is greater than ~1000% APR"}],"InvalidMaxUtilizationRate()":[{"notice":"Reverts if the utilization rate cap specified as part of risk parameters is greater than ~1000% APR"}],"InvalidRateInterestKinks()":[{"notice":"Reverts if the interest rates specified as part of risk parameters are not increasing"}],"InvalidUSDInterestKinks()":[{"notice":"Reverts if the USD-denominated interest kinks specified as part of risk parameters are not increasing from 0 to 1"}],"InvalidUSDRateInterestKinks()":[{"notice":"Reverts if the USD-denominated interest rates specified as part of risk parameters are not increasing"}],"InvalidUtilizationCap()":[{"notice":"Reverts if the utilization cap specified as part of risk parameters is greater than one"}],"NoPendingRiskParameters(uint16)":[{"notice":"Reverts if there is are no risk parameters queued for the specified asset"}],"NotAdmin()":[{"notice":"Reverts if caller is not the admin."}],"NotRiskManager()":[{"notice":"Reverts if caller is not the risk manager multisig."}],"RiskManagerNotSet()":[{"notice":"Reverts if the risk manager is not set."}],"TooSoon(uint16,uint256)":[{"notice":"Reverts if the pending risk parameters are not yet eligible for application"}],"ZeroAddress()":[{"notice":"Reverts if an address is zero."}]},"events":{"Max1HrDepositChanged((uint64,uint64),uint16,uint256,uint256)":{"notice":"Signals that the maximum hourly deposit has changed for a given asset"},"MaxDepositChanged((uint64,uint64),uint16,uint256,uint256)":{"notice":"Signals that the maximum deposit has changed for a given asset"},"MinWeightChanged((uint64,uint64),uint16,uint256,uint256)":{"notice":"Signals that the minimum weight has changed for a given asset"}},"kind":"user","methods":{"admin()":{"notice":"Address of the admin; primarily used for initial setup."},"applyPendingRiskParameters(uint16)":{"notice":"Applies the pending risk parameters for the specified asset if they exist."},"constructor":{"notice":"Contract constructor."},"feeAccount()":{"notice":"Account for receiving fees and paying rewards."},"getAssetData((uint64,uint64),uint16)":{"notice":"Retrieves asset data for a specific asset and chain."},"getAssetIndex((uint64,uint64),bytes32)":{"notice":"Returns the asset index for a given chain and address."},"getAssets(uint16,uint16)":{"notice":"Returns all registered asset data across all chains."},"getRiskParameters(uint16,uint16)":{"notice":"Returns the full list of risk parameters for all registered assets."},"pendingRiskParameters(uint16)":{"notice":"Mapping of asset index to new risk parameters to be applied to the registry, but only after they become eligible"},"riskManagerMultisig()":{"notice":"Multisig wallet address responsible for managing risk-related configurations."},"riskParameterChangeDelaySeconds()":{"notice":"Number of seconds to wait before new risk parameters become effective"},"riskParameters(uint16)":{"notice":"Mapping of asset index to associated risk parameters."},"setAdmin(address)":{"notice":"Updates the admin address."},"setAssetData((uint16,bytes32,(uint64,uint64),uint256,uint256,uint256))":{"notice":"Sets or updates asset data for a specific asset index and chain."},"setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":{"notice":"Sets pending risk parameters for a specific asset index."},"setRiskManagerMultisig(address)":{"notice":"Updates the risk manager multisig address."}},"notice":"Central registry for managing assets and associated risk parameters across multiple chains.","version":1}},"Settler":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onAtomicSettlement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"contractName":"Settler","deploymentBytecode":{"bytecode":"0x6080806040523460135760c0908160188239f35b5f80fdfe60808060405260043610156011575f80fd5b5f3560e01c633f1d584e146023575f80fd5b3460865760603660031901126086576004356001600160a01b0381160360865760443567ffffffffffffffff811160865736602382011215608657806004013567ffffffffffffffff81116086573691016024011160865780620f424060209252f35b5f80fdfea2646970667358221220a8714c703f33fadc15c70b5e85fe4339baf5c2eadde619da4d23e7a4d23416e264736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"onAtomicSettlement(address,uint256,bytes)":"0x3f1d584e"},"runtimeBytecode":{"bytecode":"0x60808060405260043610156011575f80fd5b5f3560e01c633f1d584e146023575f80fd5b3460865760603660031901126086576004356001600160a01b0381160360865760443567ffffffffffffffff811160865736602382011215608657806004013567ffffffffffffffff81116086573691016024011160865780620f424060209252f35b5f80fdfea2646970667358221220a8714c703f33fadc15c70b5e85fe4339baf5c2eadde619da4d23e7a4d23416e264736f6c634300081e0033"},"sourceId":"src/Settler.sol","sourcemap":"59:173:0:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}},"SigTest":{"abi":[{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"check","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"contractName":"SigTest","deploymentBytecode":{"bytecode":"0x608080604052346015576101c9908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c63197ff59b14610024575f80fd5b346100a35760603660031901126100a3576004356001600160a01b03811681036100a35760443567ffffffffffffffff81116100a357366023820112156100a357806004013567ffffffffffffffff81116100a35736602482840101116100a3576020926024610099930190602435906100a7565b6040519015158152f35b5f80fd5b92939290915f906001600160a01b0383161561018a576040519160048301602484019560448501916064860193873b156101115750936064938a80948a9b9c9460209b9a9998630b135d3f60e11b8a525260408a52523701915afa9051630b135d3f60e11b141690565b99935050939550508060401461015e5760411461012e5750505050565b60408092939496508101355f1a60205281375b5f526020600160805f825afa511860601b3d11915f606052604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b031660605291935090610141565b505f945050505056fea26469706673582212208a106949f349498c2239c8e95c70bad1b3b3e62a5294423000b592793b14c09564736f6c634300081c0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"check(address,bytes32,bytes)":"0x197ff59b"},"runtimeBytecode":{"bytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c63197ff59b14610024575f80fd5b346100a35760603660031901126100a3576004356001600160a01b03811681036100a35760443567ffffffffffffffff81116100a357366023820112156100a357806004013567ffffffffffffffff81116100a35736602482840101116100a3576020926024610099930190602435906100a7565b6040519015158152f35b5f80fd5b92939290915f906001600160a01b0383161561018a576040519160048301602484019560448501916064860193873b156101115750936064938a80948a9b9c9460209b9a9998630b135d3f60e11b8a525260408a52523701915afa9051630b135d3f60e11b141690565b99935050939550508060401461015e5760411461012e5750505050565b60408092939496508101355f1a60205281375b5f526020600160805f825afa511860601b3d11915f606052604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b031660605291935090610141565b505f945050505056fea26469706673582212208a106949f349498c2239c8e95c70bad1b3b3e62a5294423000b592793b14c09564736f6c634300081c0033"},"sourceId":"src/SigTest.sol","sourcemap":"140:221:1:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}},"SignatureTest":{"abi":[{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct SignatureTest.Settlement","name":"order","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"name":"getSettlementPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getSigningAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct SignatureTest.Withdrawal","name":"withdrawal","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes32","name":"epochHash","type":"bytes32"}],"name":"getWithdrawalPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"}],"contractName":"SignatureTest","deploymentBytecode":{"bytecode":"0x608080604052346015576103e4908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c908163035563461461025e5750806336116c161461018b5780637438b937146101735780639e5c3980146100735763f698da2514610053575f80fd5b3461006f575f36600319011261006f5760205f54604051908152f35b5f80fd5b3461006f573660031901610100811261006f5760a01361006f5760c43567ffffffffffffffff811680910361006f575f546bffffffffffffffffffffffff196100ba610362565b60601b16916044356001600160a01b038116810361006f5761016f93604051937fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208601526040850152606084015260243560808401526bffffffffffffffffffffffff199060601b1660a083015260643560c083015260a43560e083015261010082015260843561012082015260e435610140820152610140815261016361016082610378565b60405191829182610338565b0390f35b3461006f57602036600319011261006f576004355f55005b3461006f57366003190160e0811261006f5760601361006f576084356001600160a01b038116810361006f575f5461016f916bffffffffffffffffffffffff196101d3610362565b60601b16604051927f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba602085015260408401526060830152602435608083015260643560a083015260443560c083015260a43560e083015260c4356101008301526bffffffffffffffffffffffff199060601b16610120820152610120815261016361014082610378565b3461006f57604036600319011261006f576004356024359167ffffffffffffffff831161006f573660238401121561006f5782600401359167ffffffffffffffff831161006f5760248401366024858701011161006f576020945f9480604014610310576041146102e057505050505b6040516001600160a01b039091168152f35b604092939450606401355f1a855281375b5f5281604060805f60015afa505f6060523d60601851906040526102ce565b506044013560ff81901c601b01865290356040526001600160ff1b03166060529091506102f1565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b6004356001600160a01b038116810361006f5790565b90601f8019910116810190811067ffffffffffffffff82111761039a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a2f355b36c760bb58250919fd43010925bdca95acc99830f86f5bc7e95898c4064736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"domainSeparator()":"0xf698da25","getSettlementPayload((address,uint256,address,uint256,uint256),bytes32,uint64,uint256)":"0x9e5c3980","getSigningAddress(bytes32,bytes)":"0x03556346","getWithdrawalPayload((address,uint256,uint256),bytes32,address,uint256,bytes32)":"0x36116c16","setDomainSeparator(bytes32)":"0x7438b937"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f3560e01c908163035563461461025e5750806336116c161461018b5780637438b937146101735780639e5c3980146100735763f698da2514610053575f80fd5b3461006f575f36600319011261006f5760205f54604051908152f35b5f80fd5b3461006f573660031901610100811261006f5760a01361006f5760c43567ffffffffffffffff811680910361006f575f546bffffffffffffffffffffffff196100ba610362565b60601b16916044356001600160a01b038116810361006f5761016f93604051937fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208601526040850152606084015260243560808401526bffffffffffffffffffffffff199060601b1660a083015260643560c083015260a43560e083015261010082015260843561012082015260e435610140820152610140815261016361016082610378565b60405191829182610338565b0390f35b3461006f57602036600319011261006f576004355f55005b3461006f57366003190160e0811261006f5760601361006f576084356001600160a01b038116810361006f575f5461016f916bffffffffffffffffffffffff196101d3610362565b60601b16604051927f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba602085015260408401526060830152602435608083015260643560a083015260443560c083015260a43560e083015260c4356101008301526bffffffffffffffffffffffff199060601b16610120820152610120815261016361014082610378565b3461006f57604036600319011261006f576004356024359167ffffffffffffffff831161006f573660238401121561006f5782600401359167ffffffffffffffff831161006f5760248401366024858701011161006f576020945f9480604014610310576041146102e057505050505b6040516001600160a01b039091168152f35b604092939450606401355f1a855281375b5f5281604060805f60015afa505f6060523d60601851906040526102ce565b506044013560ff81901c601b01865290356040526001600160ff1b03166060529091506102f1565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b6004356001600160a01b038116810361006f5790565b90601f8019910116810190811067ffffffffffffffff82111761039a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a2f355b36c760bb58250919fd43010925bdca95acc99830f86f5bc7e95898c4064736f6c634300081e0033"},"sourceId":"src/SignatureTest.sol","sourcemap":"112:2016:17:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}}},"manifest":"ethpm/3","sources":{"src/Checkpointer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {EfficientHashLib} from \"solady/utils/EfficientHashLib.sol\";\nimport {SignatureCheckerLib} from \"solady/utils/SignatureCheckerLib.sol\";\n\n/**\n * @title Checkpointer\n * @notice Tracks and validates state root checkpoints using EIP-712 signatures from admin and leader nodes.\n * @dev Designed for use in DStack-like distributed settlement systems.\n */\ncontract Checkpointer {\n /**\n * @notice Address with the authority to set initial parameters.\n * @dev Should be set to the DStack app shared secret public key.\n */\n address public admin;\n\n /**\n * @notice Public key of the current designated leader node.\n * @dev Leader is responsible for signing and submitting new checkpoints.\n */\n address public leader;\n\n /**\n * @notice Gnosis Safe address used as the council multisig.\n * @dev Can rotate the leader and self.\n */\n address public councilMultisig;\n\n /**\n * @notice Monotonically increasing nonce for checkpoint submissions.\n * @dev Used to prevent replay attacks and enforce checkpoint ordering.\n */\n uint256 public stateRootNonce;\n\n /// @notice Typehash used for EIP-712 encoding of the Checkpoint struct.\n bytes32 public constant CHECKPOINT_TYPEHASH =\n keccak256(\"Checkpoint(uint256 nonce,uint8[] stateRoot,string[] approvedWithdrawals)\");\n\n /**\n * @notice Emitted when a new list of approved withdrawals is recorded in a checkpoint.\n * @param approvedWithdrawals List of withdrawal IDs approved in the checkpoint.\n */\n event Withdrawals(string[] approvedWithdrawals);\n\n /// @notice Cached domain separator for EIP-712 signature verification.\n bytes32 internal _domainSeparator;\n\n /**\n * @notice The current state root, encoded as a serialized vector.\n * @dev Serialized as `(user, eth_balance, usdc_balance, deposit_nonce, is_mm)` tuples.\n * In production, this may store multiple roots and rotate.\n */\n uint8[] public stateRoot;\n\n /// @notice Reverts if caller is not the admin.\n error NotAdmin();\n\n /// @notice Reverts if a value has already been set.\n error AlreadySet();\n\n /// @notice Reverts if caller is not the current council multisig.\n error NotCouncilMultisig();\n\n /// @notice Reverts if a signature does not match the expected signer or payload.\n error InvalidSignature();\n\n /**\n * @notice Contract constructor.\n * @dev Sets the deployer as the initial admin.\n */\n constructor() {\n admin = msg.sender;\n }\n\n /**\n * @notice Sets the EIP-712 domain separator used for verifying signatures.\n * @param domainSeparator The domain separator to store.\n */\n function setDomainSeparator(bytes32 domainSeparator) external {\n if (msg.sender != admin) revert NotAdmin();\n if (_domainSeparator != 0) revert AlreadySet();\n _domainSeparator = domainSeparator;\n }\n\n /**\n * @notice Transfers admin control to a new address.\n * @param newAdmin The new admin address.\n */\n function setAdmin(address newAdmin) external {\n if (msg.sender != admin) revert NotAdmin();\n require(newAdmin != address(0));\n admin = newAdmin;\n }\n\n /**\n * @notice Sets the initial council multisig address.\n * @param newCouncilMultisig The council's Gnosis Safe address.\n */\n function setInitialCouncilMultisig(address newCouncilMultisig) external {\n if (msg.sender != admin) revert NotAdmin();\n if (councilMultisig != address(0)) revert AlreadySet();\n councilMultisig = newCouncilMultisig;\n }\n\n /**\n * @notice Allows the current council to rotate itself to a new address.\n * @param newCouncilMultisig The new multisig address.\n */\n function setNewCouncilMultisig(address newCouncilMultisig) external {\n if (msg.sender != councilMultisig) revert NotCouncilMultisig();\n councilMultisig = newCouncilMultisig;\n }\n\n /**\n * @notice Sets the leader node address.\n * @dev This should be reviewed depending on the leader rotation mechanism.\n * @param newLeader The address of the new leader node.\n */\n function setLeader(address newLeader) external {\n if (msg.sender != councilMultisig) revert NotCouncilMultisig();\n leader = newLeader;\n }\n\n /**\n * @notice Checkpoint submitted by a node to update the system state.\n * @dev Requires valid EIP-712 signatures from both admin and leader.\n * @param sharedSignature Signature by the admin.\n * @param leaderSignature Signature by the leader.\n * @param _checkpoint The checkpoint payload to commit.\n */\n function checkpoint(\n bytes calldata sharedSignature,\n bytes calldata leaderSignature,\n Checkpoint calldata _checkpoint\n ) external {\n require(_checkpoint.nonce == stateRootNonce); // dev: Nonce mismatch\n\n // Compute the EIP-712 struct hash.\n bytes32 structHash = EfficientHashLib.hash(\n abi.encode(\n CHECKPOINT_TYPEHASH,\n _checkpoint.nonce,\n EfficientHashLib.hash(abi.encodePacked(_checkpoint.stateRoot)),\n hashStringArray(_checkpoint.approvedWithdrawals)\n )\n );\n\n // Check both admin and leader signatures.\n bytes32 digest =\n EfficientHashLib.hash(abi.encodePacked(\"\\x19\\x01\", _domainSeparator, structHash));\n\n if (!SignatureCheckerLib.isValidSignatureNow(admin, digest, sharedSignature)) {\n revert InvalidSignature();\n }\n\n if (!SignatureCheckerLib.isValidSignatureNow(leader, digest, leaderSignature)) {\n revert InvalidSignature();\n }\n\n stateRootNonce++;\n stateRoot = _checkpoint.stateRoot;\n\n emit Withdrawals(_checkpoint.approvedWithdrawals);\n }\n\n /**\n * @notice Internal helper for hashing an array of strings.\n * @dev Each string is hashed individually and packed before final hashing.\n * @param arr The array of strings to hash.\n * @return A single keccak256 hash of the packed array of hashed strings.\n */\n function hashStringArray(string[] memory arr) internal pure returns (bytes32) {\n bytes32[] memory hashedStrings = new bytes32[](arr.length);\n for (uint256 i = 0; i < arr.length; i++) {\n hashedStrings[i] = EfficientHashLib.hash(bytes(arr[i]));\n }\n return EfficientHashLib.hash(abi.encodePacked(hashedStrings));\n }\n\n /**\n * @notice Struct defining a checkpoint message.\n * @dev Checkpoints include the current state root, a nonce, and a list of approved withdrawals.\n */\n struct Checkpoint {\n uint256 nonce;\n uint8[] stateRoot;\n string[] approvedWithdrawals;\n }\n}\n","urls":[]},"src/CredentialManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {SignatureCheckerLib} from \"solady/utils/SignatureCheckerLib.sol\";\nimport {EfficientHashLib} from \"solady/utils/EfficientHashLib.sol\";\nimport {IAdminUpdateStrategy} from \"./interfaces/IAdminUpdateStrategy.sol\";\nimport {IAutomataDcapAttestation} from \"./interfaces/IAutomataDcapAttestation.sol\";\n\n/// @title CredentialManager\n/// @notice The centralized Root of Trust for the TEE Clearing Engine.\n/// @dev This contract acts as the governance layer and the vault registry. It manages the\n/// set of authorized operators, enforces quorum consensus for critical updates, and\n/// maintains the registry of deposit vaults across different chains.\n/// It combines immediate multi-sig actions for operational tasks with timelocked\n/// actions for high-risk configuration changes.\ncontract CredentialManager {\n using SignatureCheckerLib for address;\n\n // =============================================================\n // STRUCTS\n // =============================================================\n\n /// @notice Configuration for a specific chain/vault.\n struct ChainConfig {\n uint64 blockTimeMs;\n // Confs\n uint8 defaultConfirmations;\n uint8 depositIngestConfirmations;\n uint8 withdrawalIngestConfirmations;\n uint8 settlementIngestConfirmations;\n }\n\n /// @notice Represents a deposit vault deployed on a specific chain.\n /// @dev Addresses are stored as bytes32 to support non-EVM chains (e.g., Solana, SVM).\n struct Vault {\n uint8 routingId;\n uint256 vmId; // ChainId for EVM chains.\n /// @notice The address of the vault on that chain (left-aligned or native format).\n bytes32 vaultAddress;\n ChainConfig config;\n }\n\n /// @notice Tracks the lifecycle state of a timelocked operation.\n struct TimelockOp {\n /// @notice The timestamp (seconds since unix epoch) after which the operation can be executed.\n uint64 eta;\n /// @notice True if the operation has already been executed.\n bool executed;\n /// @notice True if the operation was explicitly canceled by the operators.\n bool canceled;\n /// @notice The type hash of the operation (e.g., OP_SET_RISK_MANAGER) for verification.\n bytes32 opType;\n }\n\n /// @notice Defines the expected state of the TEE software.\n struct MeasurementProfile {\n bool active; // Is this profile currently allowed?\n bytes32 mrtd; // Mandatory (Code Identity)\n bytes32 rtmr0; // Optional (Set to 0 to skip check)\n bytes32 rtmr1; // Optional\n bytes32 rtmr2; // Optional\n bytes32 rtmr3; // Optional\n }\n\n struct RestartCandidate {\n address leader;\n uint256 epoch;\n bytes32 checkpointHash;\n bool exists;\n }\n\n // =============================================================\n // ERRORS\n // =============================================================\n\n /// @notice Thrown when a signature belongs to an address that is not a registered operator.\n /// @param signer The address recovered from the signature.\n error NotOperator(address signer);\n\n /// @notice Thrown when the provided signatures are not sorted by signer address or contain duplicates.\n /// @dev Signatures must be sorted strictly ascending (A < B) to prevent duplicate counting in O(N).\n error SignersNotSortedOrUnique();\n\n /// @notice Thrown when the number of valid signatures provided is less than the required threshold.\n /// @param provided The number of signatures provided.\n /// @param required The current `committeeThreshold` required.\n error InsufficientSignatures(uint256 provided, uint256 required);\n\n /// @notice Thrown when attempting to set a quorum threshold that is 0 or greater than the total operators.\n /// @param newThreshold The proposed threshold.\n /// @param operatorCount The total number of registered operators.\n error InvalidCommitteeThreshold(uint256 newThreshold, uint256 operatorCount);\n\n /// @notice Thrown when attempting to execute a timelock before the delay has elapsed.\n /// @param opId The unique hash of the operation.\n /// @param readyAt The timestamp when the operation becomes executable.\n /// @param nowTs The current block timestamp.\n error TimelockNotReady(bytes32 opId, uint256 readyAt, uint256 nowTs);\n\n /// @notice Thrown when attempting to act on a timelock ID that does not exist or was never scheduled.\n /// @param opId The operation hash.\n error TimelockUnknown(bytes32 opId);\n\n /// @notice Thrown when attempting to execute or schedule an operation that has already been executed.\n /// @param opId The operation hash.\n error TimelockAlreadyExecuted(bytes32 opId);\n\n /// @notice Thrown when attempting to execute or cancel an operation that has already been canceled.\n /// @param opId The operation hash.\n error TimelockAlreadyCanceled(bytes32 opId);\n\n /// @notice Thrown when a timelock delay is set to 0 (invalid safety margin).\n /// @param delay The provided delay in seconds.\n error InvalidDelay(uint256 delay);\n\n /// @notice Thrown when attempting to cancel an operation that cannot be canceled (e.g., already executed).\n error CannotCancel();\n\n /// @notice Thrown when a critical configuration address (e.g., Risk Manager) is set to address(0).\n error ZeroAddress();\n\n /// @notice Thrown when a Vault address is empty (bytes32(0)).\n error InvalidVaultAddr();\n\n /// @notice Thrown when attempting to register a strategy for a chain that already has one.\n error StrategyAlreadyExists();\n\n /// @notice Thrown when attempting to update vault admins on a chain that has no registered strategy.\n error NoStrategy();\n\n /// @notice Thrown when a requested vault cannot be found for the specified chain.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n error VaultNotFound(uint256 routingId, uint256 vmId);\n\n /// @notice Thrown when the measured TEE state does not match the expected state.\n error MeasurementMismatch(bytes32 expected, bytes32 actual, string field);\n\n /// @notice Thrown when the ZK Proof attesting measurements is invalid.\n error InvalidZkProof();\n\n /// @notice Thrown when the supplied epoch is invalid\n error InvalidEpoch(uint256 expected, uint256 actual);\n /// @notice Thrown when a Quote ReportData does not match params.\n error InvalidReportData();\n /// @notice Thrown when a Quote length is invalid.\n error InvalidQuoteLength();\n /// @notice Thrown when a Quote verifier is invalid.\n error InvalidVerifier();\n /// @notice Thrown when the used profile is not active.\n error ProfileInactive(uint256 profileId);\n /// @notice Thrown when the used profile does not exist.\n error InvalidProfileId();\n /// @notice Thrown when the used profile is configured incorrectly.\n error InvalidProfileConfig();\n\n // Certificate gathering errors\n error GatheringActive();\n error GatheringNotActive();\n error GatheringNotExpired();\n error AmbiguousState();\n error NoCandidate();\n error ProposedEpochTooLow(uint256 current, uint256 proposed);\n\n // =============================================================\n // CONSTANTS & TYPEHASHES\n // =============================================================\n\n /// @dev EIP-712 Domain Separator typehash.\n bytes32 private constant _EIP712_DOMAIN_TYPEHASH = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n\n /// @dev EIP-712 name hash for this contract.\n bytes32 private constant _NAME_HASH = keccak256(\"CredentialManager\");\n\n /// @dev EIP-712 version hash.\n bytes32 private constant _VERSION_HASH = keccak256(\"1\");\n\n /// @dev Generic Action typehash used for all governance signatures.\n /// Structure: Action(bytes32 opType, bytes32 paramsHash, uint256 nonce)\n bytes32 private constant _ACTION_TYPEHASH =\n keccak256(\"Action(bytes32 opType,bytes32 paramsHash,uint256 nonce)\");\n\n /// @dev Used for appointing a leader in the absence of a leader - for bootstrap or emergency recovery.\n bytes32 public constant OP_APPOINT_LEADER = keccak256(\"OP_APPOINT_LEADER\");\n\n // --- Operation Types (for Signature Verification) ---\n\n // Immediate Actions (Executed immediately upon valid quorum)\n bytes32 public constant OP_SET_COMMITTEE_THRESHOLD = keccak256(\"OP_SET_COMMITTEE_THRESHOLD\");\n bytes32 public constant OP_ADD_VAULT = keccak256(\"OP_ADD_VAULT\");\n bytes32 public constant OP_REGISTER_STRATEGY = keccak256(\"OP_REGISTER_ADMIN_UPDATE_STRATEGY\");\n bytes32 public constant OP_SET_VAULT_ADMINS = keccak256(\"OP_SET_DEPOSIT_VAULT_ADMINS\");\n bytes32 public constant OP_CANCEL_TIMELOCK = keccak256(\"OP_CANCEL_TIMELOCK\");\n bytes32 public constant OP_WITHDRAW = keccak256(\"OP_WITHDRAW\");\n\n // Timelocked Actions (Scheduled first, executed later)\n bytes32 public constant OP_SET_RISK_MANAGER = keccak256(\"OP_SET_RISK_MANAGER\");\n bytes32 public constant OP_SET_REGISTRY = keccak256(\"OP_SET_REGISTRY\");\n bytes32 public constant OP_SET_MEASUREMENTS = keccak256(\"OP_SET_MEASUREMENTS\");\n bytes32 public constant OP_SET_DELAY = keccak256(\"OP_SET_DELAY\");\n bytes32 public constant OP_MANAGE_PROFILE = keccak256(\"OP_MANAGE_PROFILE\");\n\n // Restarts\n bytes32 public constant OP_RESTART = keccak256(\"OP_RESTART\");\n bytes32 public constant OP_SET_AUTOMATA_VERIFIER = keccak256(\"OP_SET_AUTOMATA_VERIFIER\");\n\n // Certificate gathering\n uint256 public constant GATHERING_DURATION = 1 hours;\n\n // =============================================================\n // STORAGE\n // =============================================================\n\n // --- Governance State ---\n\n /// @notice TEMP Admin path, to be revised later.\n address public admin;\n\n /// @notice The list of authorized Clearing Engine operator addresses (EOAs).\n /// @dev These keys form the root of trust for the system.\n address[] public operators;\n\n /// @notice Lookup to check if an address is an operator.\n mapping(address => bool) public isOperator;\n\n /// @notice The minimum number of signatures required to execute a governance action.\n uint256 public committeeThreshold;\n\n /// @notice A monotonically increasing nonce for governance actions.\n /// @dev Included in every signed hash to strictly order operations and prevent replay attacks.\n uint256 public governanceNonce;\n\n /// @notice Maps Operator (EOA) -> Attested Key (TEE Address).\n /// @dev Used to verify that a TEE signature belongs to a specific operator.\n mapping(address => bytes32) public operatorToAttestedKey;\n\n /// @notice The current active leader (Operator Address).\n /// @dev The leader is responsible for coordinating the clearing engine.\n address public leader;\n\n // --- Execution State (Vault Registry) ---\n\n /// @notice The registry of all authorized Deposit Vaults.\n /// @dev This list is strictly append-only; vaults cannot be removed to prevent history modification.\n Vault[] public vaults;\n\n /// @notice Maps a RoutingID to the VMID to the Strategy Contract responsible for sending messages to it.\n /// @dev Used to abstract cross-chain messaging logic (e.g., LayerZero, Optimism Messenger).\n mapping(uint256 => mapping(uint256 => IAdminUpdateStrategy)) public adminUpdateStrategies;\n\n // --- Configuration ---\n\n /// @notice The address of the Risk Manager (or multisig) authorized to adjust risk parameters.\n address public riskManager;\n\n /// @notice The address of the global Registry Contract used for asset/settler configurations.\n address public registryContract;\n\n // --- Timelock State ---\n\n /// @notice Configuration mapping for how long specific operations must be delayed.\n /// @dev e.g., OP_SET_REGISTRY -> 72 hours.\n mapping(bytes32 => uint256) public timelockDelayFor;\n\n /// @notice Stores the status of individual scheduled operations by their hash ID.\n mapping(bytes32 => TimelockOp) public timelockOps;\n\n // --- TDX measurements ---\n\n /// @notice The current \"Gold Image\" measurements required for valid Quotes. Matches based on profile.\n mapping(uint256 => MeasurementProfile) public measurementProfiles;\n uint256 public nextProfileId = 1;\n\n // --- Restarts ---\n\n /// @notice Tracks the logical era of the TEE state to prevent replay attacks.\n /// @dev Incremented on every successful restart.\n uint256 public epoch;\n\n /// @notice The hash of the system state (inventory) associated with the current epoch.\n /// @dev New nodes verify this hash against the leader's data to ensure they are on the correct fork.\n bytes32 public latestCheckpointHash;\n\n // ZK Verifier Contract (Automata)\n IAutomataDcapAttestation public automataVerifier;\n\n // --- Certificate gathering ---\n uint256 public restartGatheringDeadline; // 0 = Inactive, >0 = Active\n RestartCandidate public bestCandidate;\n bool public isRestartAmbiguous;\n\n // =============================================================\n // EVENTS\n // =============================================================\n\n /// @notice Emitted when a new operator is added during initialization.\n event OperatorAdded(address indexed operator);\n\n /// @notice Emitted when the signature threshold is updated.\n event CommitteeThresholdUpdated(uint256 oldThreshold, uint256 newThreshold);\n\n /// @notice Emitted when a new vault is added to the registry.\n event VaultAdded(\n uint256 indexed routingId, uint256 indexed vmId, bytes32 vaultAddr, ChainConfig config\n );\n\n /// @notice Emitted when a new cross-chain strategy is registered.\n event DepositVaultAdministratorsUpdated(\n uint256 indexed routingId,\n uint256 indexed vmId,\n address[] newAdministrators,\n uint256 newWithdrawalQuorum\n );\n\n /// @notice Emitted when the admin set of a remote vault is updated.\n event DepositVaultAdministratorsUpdated(\n uint256 indexed chainId, address[] newAdministrators, uint256 newWithdrawalQuorum\n );\n\n /// @notice Emitted when a new cross-chain strategy is registered.\n event AdminUpdateStrategyRegistered(\n uint256 indexed routingId, uint256 indexed vmId, address strategy\n );\n\n /// @notice Emitted when a new attested key for an operator is registered.\n event AttestedKeyRegistered(address indexed operator, bytes32 indexed newAttestedKey);\n\n /// @notice Emitted when the quorum leader is updated.\n event LeaderUpdated(address indexed newLeader, bytes32 indexed newAttestedKey);\n\n // Timelock Events\n event OperationScheduled(bytes32 indexed opId, bytes32 indexed opType, uint256 eta);\n event OperationExecuted(bytes32 indexed opId, bytes32 indexed opType);\n event OperationCanceled(bytes32 indexed opId, bytes32 indexed opType);\n\n event RiskManagerUpdated(address indexed oldRiskManager, address indexed newRiskManager);\n event RegistryUpdated(address indexed oldRegistry, address indexed newRegistry);\n event TimelockDelayUpdated(bytes32 indexed targetOpType, uint256 oldDelay, uint256 newDelay);\n\n // Measurement & Restart Events\n /// @notice Emitted when the measurements are updated.\n event MeasurementsUpdated(bytes32 newMrtd, bytes32 newRtmr0);\n event MeasurementProfileUpdated(uint256 indexed profileId, bool active);\n event EpochIncremented(uint256 newEpoch, bytes32 newCheckpointHash);\n event RestartExecuted(address indexed newLeader, uint256 indexed epoch);\n event AutomataVerifierUpdated(address indexed oldVerifier, address indexed newVerifier);\n\n // Certificate gathering events\n event RestartGatheringStarted(uint256 deadline);\n event RestartCandidateSubmitted(address indexed leader, uint256 epoch, bytes32 checkpointHash);\n event RestartAmbiguityDetected(uint256 epoch, bytes32 hash1, bytes32 hash2);\n\n // =============================================================\n // INITIALIZATION\n // =============================================================\n\n /// @notice Initializes the Credential Manager with the initial operator set and configuration.\n /// @param initialOperators The list of addresses that will form the initial governance council.\n /// @param initialCommitteeThreshold The number of signatures required for valid governance actions.\n /// @param initialRiskManager The initial Risk Manager address.\n /// @param initialRegistryContract The initial Registry Contract address.\n constructor(\n address[] memory initialOperators,\n uint256 initialCommitteeThreshold,\n address initialRiskManager,\n address initialRegistryContract,\n MeasurementProfile[] memory initialMeasurements,\n address initialAutomataVerifier\n ) {\n admin = msg.sender;\n\n if (initialRiskManager == address(0)) revert ZeroAddress();\n if (initialRegistryContract == address(0)) revert ZeroAddress();\n automataVerifier = IAutomataDcapAttestation(initialAutomataVerifier);\n\n _initOperators(initialOperators, initialCommitteeThreshold);\n\n riskManager = initialRiskManager;\n registryContract = initialRegistryContract;\n // Start IDs at 1 so 0 can be used as a null/sentinel value\n nextProfileId = 1;\n\n for (uint256 i = 0; i < initialMeasurements.length; i++) {\n MeasurementProfile memory p = initialMeasurements[i];\n\n // Safety Check: Active profiles must have an MRTD\n if (p.active && p.mrtd == bytes32(0)) revert InvalidProfileConfig();\n\n measurementProfiles[nextProfileId] = p;\n emit MeasurementProfileUpdated(nextProfileId, p.active);\n nextProfileId++;\n }\n\n // Default Timelocks\n timelockDelayFor[OP_SET_RISK_MANAGER] = 48 hours;\n timelockDelayFor[OP_SET_REGISTRY] = 72 hours;\n timelockDelayFor[OP_MANAGE_PROFILE] = 7 days;\n timelockDelayFor[OP_SET_DELAY] = 7 days;\n }\n\n /// @dev Internal helper to process the operator list and set the threshold.\n function _initOperators(address[] memory initialOperators, uint256 initialCommitteeThreshold)\n internal\n {\n uint256 n = initialOperators.length;\n if (n == 0) revert InvalidCommitteeThreshold(initialCommitteeThreshold, 0);\n if (initialCommitteeThreshold == 0 || initialCommitteeThreshold > n) {\n revert InvalidCommitteeThreshold(initialCommitteeThreshold, n);\n }\n\n for (uint256 i = 0; i < n; i++) {\n address op = initialOperators[i];\n if (op == address(0)) revert ZeroAddress();\n if (isOperator[op]) revert SignersNotSortedOrUnique();\n isOperator[op] = true;\n operators.push(op);\n emit OperatorAdded(op);\n }\n committeeThreshold = initialCommitteeThreshold;\n emit CommitteeThresholdUpdated(0, initialCommitteeThreshold);\n }\n\n // =============================================================\n // QUORUM & KEYS\n // =============================================================\n\n /// @notice Allows an operator to register their TEE's attested key.\n /// @dev Maps the attested_pubkey of a new CE joining the quorum.\n /// @param newAttestedKey The address derived from the TEE's public key.\n function registerAttestedKey(bytes32 newAttestedKey) external {\n if (!isOperator[msg.sender]) revert NotOperator(msg.sender);\n if (newAttestedKey == bytes32(0)) revert ZeroAddress();\n\n operatorToAttestedKey[msg.sender] = newAttestedKey;\n emit AttestedKeyRegistered(msg.sender, newAttestedKey);\n }\n\n /// @notice Returns the full Committee configuration.\n /// @dev Let's operators query for 'k (the committee threshold), n' thresholds and the current committee member list\".\n function getCommitteeConfig()\n external\n view\n returns (address[] memory members, uint256 k, uint256 n)\n {\n return (operators, committeeThreshold, operators.length);\n }\n\n /// @notice Returns the current Leader's Operator Address and Attested Key.\n /// @dev When querying current leader, then the contract returns the active operator_pubkey and attested_pubkey.\n function getLeader() external view returns (address operator, bytes32 attestedKey) {\n return (leader, operatorToAttestedKey[leader]);\n }\n\n /// @dev Internal helper to update mappings.\n function _setAttestedKey(address op, bytes32 attKey) internal {\n operatorToAttestedKey[op] = attKey;\n emit AttestedKeyRegistered(op, attKey);\n }\n\n /// @dev Builds the administrator list from operator-attested keys.\n function _getAttestedAdministrators() internal view returns (address[] memory admins) {\n uint256 len = operators.length;\n admins = new address[](len);\n for (uint256 i = 0; i < len; i++) {\n bytes32 attKey = operatorToAttestedKey[operators[i]];\n if (attKey == bytes32(0)) revert ZeroAddress();\n admins[i] = address(uint160(uint256(attKey)));\n }\n }\n\n /// @dev Internal helper to rotate the leader for use in restarts.\n function _updateLeader(address newLeader) internal {\n if (!isOperator[newLeader]) revert NotOperator(newLeader);\n // Check bytes32 zero\n if (operatorToAttestedKey[newLeader] == bytes32(0)) revert ZeroAddress();\n leader = newLeader;\n\n emit LeaderUpdated(newLeader, operatorToAttestedKey[newLeader]);\n }\n\n /// @notice Manually appoints a leader. Used for bootstrapping or emergency recovery.\n function appointLeader(\n address newLeader,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (!isOperator[newLeader]) revert NotOperator(newLeader);\n\n // Leader MUST have a registered key, or they cannot sign Attestations/Checkpoints\n if (operatorToAttestedKey[newLeader] == bytes32(0)) revert ZeroAddress();\n\n bytes32 paramsHash = keccak256(abi.encode(newLeader));\n _requireCommitteeApproval(OP_APPOINT_LEADER, paramsHash, signers, signatures);\n\n _updateLeader(newLeader);\n }\n\n // =============================================================\n // RESTART CERTIFICATION & CERTIFICATE GATHERING\n // =============================================================\n\n /// @notice Step 1: Initiates the gathering window if the system is down.\n function initiateRestart() external {\n if (restartGatheringDeadline > block.timestamp) revert GatheringActive();\n\n // Start 1 hour window\n restartGatheringDeadline = block.timestamp + GATHERING_DURATION;\n\n // Clear previous state\n delete bestCandidate;\n isRestartAmbiguous = false;\n\n emit RestartGatheringStarted(restartGatheringDeadline);\n }\n\n /// @notice Restarts the system using a Trustless ZK Proof (Automata / SP1). The contract stores the \"Best\" candidate.\n /// @dev We compare Epochs. The highest epoch wins.\n /// @param tdxReportBody The 'Public Output' of the ZK Circuit (The TEE Quote Body).\n /// @param zkProof The Groth16 proof bytes.\n /// @param newLeader The address claiming leadership.\n /// @param checkpointHash The state hash being served.\n function submitRestartProof(\n uint256 profileId,\n bytes calldata tdxReportBody,\n bytes calldata zkProof,\n address newLeader,\n bytes32 checkpointHash\n ) external {\n if (restartGatheringDeadline == 0 || block.timestamp > restartGatheringDeadline) {\n revert GatheringNotActive();\n }\n if (newLeader == address(0)) revert ZeroAddress();\n if (address(automataVerifier) == address(0)) revert InvalidVerifier();\n\n // 1. ZK Verification\n // Assert that the 'tdxReportBody' was indeed generated by a genuine Intel TDX hardware\n // running the code logic proved by the ZK circuit.\n (bool success, bytes memory errorData) = automataVerifier.verifyAndAttestWithZKProof(\n tdxReportBody,\n IAutomataDcapAttestation.ZkCoProcessorType.Succinct, // Opinionated: Use SP1\n zkProof\n );\n\n // Handle failure explicitly\n if (!success) {\n // Forward the error from Automata if possible, or generic revert\n if (errorData.length > 0) {\n assembly {\n let retLen := mload(errorData)\n revert(add(32, errorData), retLen)\n }\n } else {\n revert InvalidZkProof();\n }\n }\n\n // 2. Policy Check (The \"Gold Image\")\n // Verify that the Code Hash (MRTD) inside the verified body matches our governance.\n // MRTD is at offset 136. We take the first 32 bytes of the SHA384.\n if (tdxReportBody.length < 584) revert InvalidQuoteLength();\n bytes32 qMrtd = bytes32(tdxReportBody[136:168]);\n\n // RTMRs start at 328. Stride is 48 bytes.\n bytes32 qRtmr0 = bytes32(tdxReportBody[328:360]);\n bytes32 qRtmr1 = bytes32(tdxReportBody[376:408]);\n bytes32 qRtmr2 = bytes32(tdxReportBody[424:456]);\n bytes32 qRtmr3 = bytes32(tdxReportBody[472:504]);\n\n verifyMeasurements(profileId, qMrtd, qRtmr0, qRtmr1, qRtmr2, qRtmr3);\n\n // 3. Identity Binding\n // Verify that the TEE explicitly committed to this Leader and Checkpoint in ReportData.\n // [Leader (20) | Checkpoint (32) | Epoch (8) | ProcessedCount (4)]\n // Total 64 bytes at Offset 520\n // A. Extract Leader (Bytes 520..540)\n address recoveredLeader = address(bytes20(tdxReportBody[520:540]));\n\n // B. Extract Checkpoint (Bytes 540..572)\n bytes32 recoveredCheckpoint = bytes32(tdxReportBody[540:572]);\n\n // C. Extract Epoch (Bytes 572..580)\n // We read 8 bytes, cast to uint64.\n uint64 recoveredEpoch = uint64(bytes8(tdxReportBody[572:580]));\n\n if (recoveredLeader != newLeader) revert InvalidReportData();\n if (recoveredCheckpoint != checkpointHash) revert InvalidReportData();\n\n // 5. Monotonicity Check\n if (recoveredEpoch <= epoch) {\n revert ProposedEpochTooLow(epoch, recoveredEpoch);\n }\n\n // If this is the first valid candidate\n if (!bestCandidate.exists) {\n bestCandidate = RestartCandidate({\n leader: newLeader,\n epoch: recoveredEpoch,\n checkpointHash: checkpointHash,\n exists: true\n });\n emit RestartCandidateSubmitted(newLeader, recoveredEpoch, checkpointHash);\n return;\n }\n\n // If we already have a candidate, COMPARE.\n\n // Case 1: Proposed Epoch is HIGHER -> Replace Best\n if (recoveredEpoch > bestCandidate.epoch) {\n // Strictly better epoch -> Replace\n bestCandidate = RestartCandidate({\n leader: newLeader,\n epoch: recoveredEpoch,\n checkpointHash: checkpointHash,\n exists: true\n });\n isRestartAmbiguous = false;\n emit RestartCandidateSubmitted(newLeader, recoveredEpoch, checkpointHash);\n }\n // Case 2: Proposed Epoch is EQUAL\n else if (recoveredEpoch == bestCandidate.epoch) {\n // If Hash is DIFFERENT -> SPLIT BRAIN\n if (checkpointHash != bestCandidate.checkpointHash) {\n isRestartAmbiguous = true;\n emit RestartAmbiguityDetected(\n recoveredEpoch, bestCandidate.checkpointHash, checkpointHash\n );\n }\n // If Hash is SAME, ignore (duplicate proposal)\n }\n // Case 3: Proposed Epoch is LOWER -> Ignore\n }\n\n /// @notice Step 3: Finalizes the restart after the window closes.\n function resolveRestart() external {\n if (restartGatheringDeadline == 0) revert GatheringNotActive();\n if (block.timestamp <= restartGatheringDeadline) revert GatheringNotExpired();\n\n if (!bestCandidate.exists) revert NoCandidate();\n if (isRestartAmbiguous) revert AmbiguousState();\n\n // Apply State\n _updateLeader(bestCandidate.leader);\n latestCheckpointHash = bestCandidate.checkpointHash;\n epoch = bestCandidate.epoch;\n\n // Reset Gathering\n restartGatheringDeadline = 0;\n delete bestCandidate;\n\n emit EpochIncremented(epoch, latestCheckpointHash);\n emit RestartExecuted(leader, epoch);\n }\n\n // =============================================================\n // GOVERNANCE VERIFICATION\n // =============================================================\n\n /// @notice Returns the EIP-712 domain separator used for verifying governance signatures.\n /// @return The domain separator hash.\n function domainSeparator() public view returns (bytes32) {\n return keccak256(\n abi.encode(\n _EIP712_DOMAIN_TYPEHASH, _NAME_HASH, _VERSION_HASH, block.chainid, address(this)\n )\n );\n }\n\n /// @dev Reconstructs the signed EIP-712 digest for a specific action.\n function _hashAction(bytes32 opType, bytes32 paramsHash, uint256 nonce)\n internal\n view\n returns (bytes32)\n {\n bytes32 structHash = keccak256(abi.encode(_ACTION_TYPEHASH, opType, paramsHash, nonce));\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator(), structHash));\n }\n\n /// @notice Verifies that a payload has been signed by a valid quorum of operators.\n /// @dev This is the core access control modifier. It verifies:\n /// 1. Sufficient signatures (k of n).\n /// 2. Signers are valid operators.\n /// 3. Signatures are unique and sorted (to prevent duplicates).\n /// 4. The payload matches the expected operation type and parameters.\n /// 5. Increments the nonce to prevent replay attacks.\n /// @param opType The operation identifier (e.g., OP_ADD_VAULT).\n /// @param paramsHash The keccak256 hash of the abi-encoded parameters.\n /// @param signers An array of operator addresses who signed the payload. Must be sorted ascending.\n /// @param signatures An array of signatures corresponding to the signers.\n function _requireCommitteeApproval(\n bytes32 opType,\n bytes32 paramsHash,\n address[] calldata signers,\n bytes[] calldata signatures\n ) internal {\n // If sender is admin and no signatures provided, skip verification.\n if (msg.sender == admin && signers.length == 0 && signatures.length == 0) {\n // Increment nonce anyway to simulate state change/prevent strict replays\n unchecked {\n governanceNonce++;\n }\n return;\n }\n uint256 q = committeeThreshold;\n if (signers.length != signatures.length) revert SignersNotSortedOrUnique();\n if (signers.length < q || signatures.length < q) {\n revert InsufficientSignatures(signers.length, q);\n }\n\n bytes32 digest = _hashAction(opType, paramsHash, governanceNonce);\n\n address prev = address(0);\n for (uint256 i = 0; i < q; i++) {\n address signer = signers[i];\n // Enforce sorted order to check for duplicates (O(N) vs O(N^2))\n if (signer <= prev) revert SignersNotSortedOrUnique();\n prev = signer;\n\n if (!isOperator[signer]) revert NotOperator(signer);\n\n // Handles EIP-1271 and EOA signatures.\n if (!signer.isValidSignatureNow(digest, signatures[i])) revert NotOperator(signer);\n }\n\n // Increment nonce to invalidate this hash for future use\n unchecked {\n governanceNonce++;\n }\n }\n\n // =============================================================\n // IMMEDIATE ACTIONS\n // =============================================================\n\n /// @notice Updates the number of signatures required for valid governance actions.\n /// @dev Requires a quorum of the *current* operators to approve.\n /// @param newThreshold The new minimum number of signatures.\n /// @param signers Sorted array of signers.\n /// @param signatures Corresponding signatures.\n function updateCommitteeThreshold(\n uint256 newThreshold,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (newThreshold == 0 || newThreshold > operators.length) {\n revert InvalidCommitteeThreshold(newThreshold, operators.length);\n }\n\n bytes32 paramsHash = keccak256(abi.encode(newThreshold));\n _requireCommitteeApproval(OP_SET_COMMITTEE_THRESHOLD, paramsHash, signers, signatures);\n\n uint256 oldThreshold = committeeThreshold;\n committeeThreshold = newThreshold;\n\n emit CommitteeThresholdUpdated(oldThreshold, newThreshold);\n }\n\n /// @notice Registers a new deposit vault to the system.\n /// @dev This list is append-only. New vaults can be added, but existing ones cannot be removed.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n /// @param vaultAddr The address of the vault (as bytes32).\n /// @param signers Sorted array of signers.\n /// @param signatures Corresponding signatures.\n function addVault(\n uint8 routingId,\n uint256 vmId,\n bytes32 vaultAddr,\n ChainConfig calldata config,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (vaultAddr == bytes32(0)) revert InvalidVaultAddr();\n\n bytes32 paramsHash = keccak256(abi.encode(routingId, vmId, vaultAddr, config));\n _requireCommitteeApproval(OP_ADD_VAULT, paramsHash, signers, signatures);\n\n vaults.push(\n Vault({routingId: routingId, vmId: vmId, vaultAddress: vaultAddr, config: config})\n );\n emit VaultAdded(routingId, vmId, vaultAddr, config);\n }\n\n /// @notice Registers a strategy contract to handle updates for a specific chain.\n /// @dev Used to define how the Credential Manager talks to L2s (e.g., via bridges).\n /// Only one strategy can be registered per chain.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n /// @param strategy The address of the strategy contract.\n /// @param signers Sorted array of signers.\n /// @param signatures Corresponding signatures.\n function registerAdminUpdateStrategy(\n uint8 routingId,\n uint256 vmId,\n IAdminUpdateStrategy strategy,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (address(strategy) == address(0)) revert ZeroAddress();\n if (address(adminUpdateStrategies[routingId][vmId]) != address(0)) {\n revert StrategyAlreadyExists();\n }\n\n bytes32 paramsHash = keccak256(abi.encode(routingId, vmId, address(strategy)));\n _requireCommitteeApproval(OP_REGISTER_STRATEGY, paramsHash, signers, signatures);\n\n adminUpdateStrategies[routingId][vmId] = strategy;\n emit AdminUpdateStrategyRegistered(routingId, vmId, address(strategy));\n }\n\n /// @notice Updates the administrators or withdrawal quorum for a vault on a remote chain.\n /// @dev Admin can set arbitrary administrators/quorum using the debug path.\n /// Non-admin calls ignore the provided administrators/quorum and instead sync administrators\n /// from operator-attested keys, using the current committee threshold as the quorum.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n /// @param newAdministrators The list of new admin addresses for that vault.\n /// @param newWithdrawalQuorum The new quorum requirement for that vault.\n function setDepositVaultAdministrators(\n uint256 routingId,\n uint256 vmId,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable {\n IAdminUpdateStrategy strategy = adminUpdateStrategies[routingId][vmId];\n if (address(strategy) == address(0)) revert NoStrategy();\n\n address[] memory admins;\n uint256 withdrawalQuorum;\n if (msg.sender == admin) {\n admins = newAdministrators;\n withdrawalQuorum = newWithdrawalQuorum;\n } else {\n admins = _getAttestedAdministrators();\n withdrawalQuorum = committeeThreshold;\n }\n\n // Delegatecall allows this contract to retain its identity (msg.sender) when calling the bridge.\n (bool ok,) = address(strategy)\n .delegatecall(\n abi.encodeWithSelector(\n strategy.setAdministrators.selector,\n _getVaultAddress(routingId, vmId),\n admins,\n withdrawalQuorum\n )\n );\n require(ok, \"Strategy delegatecall failed\");\n emit DepositVaultAdministratorsUpdated(routingId, vmId, admins, withdrawalQuorum);\n }\n\n /// @notice Withdraw funds held by this contract.\n function withdraw(address account, address[] calldata signers, bytes[] calldata signatures)\n external\n {\n if (account == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(account, address(this).balance));\n _requireCommitteeApproval(OP_WITHDRAW, paramsHash, signers, signatures);\n payable(account).transfer(address(this).balance);\n }\n\n // =============================================================\n // VIEW HELPERS\n // =============================================================\n\n /// @notice Returns a paginated list of registered vaults.\n /// @dev The input types are intentionally `uint16` to preserve the function selector\n /// `0x9fd7285c` for backward compatibility with existing Rust clients.\n /// @param start The start index.\n /// @param end The end index (exclusive).\n /// @return An array of Vault structs.\n function getVaults(uint16 start, uint16 end) external view returns (Vault[] memory) {\n uint256 count = vaults.length;\n if (start >= count) return new Vault[](0);\n if (end > count) end = uint16(count);\n if (end <= start) return new Vault[](0);\n\n uint256 len = uint256(end - start);\n Vault[] memory out = new Vault[](len);\n for (uint256 i = 0; i < len; i++) {\n out[i] = vaults[uint256(start) + i];\n }\n return out;\n }\n\n function _getVaultAddress(uint256 routingId, uint256 vmId) internal view returns (address) {\n uint256 len = vaults.length;\n for (uint256 i; i < len; ++i) {\n Vault memory vault = vaults[i];\n if (vault.routingId == routingId && vault.vmId == vmId) {\n // Convert bytes32 to address (assuming left-aligned or standard encoding).\n // Shifts right 96 bits to recover the 160-bit address if it was stored left-aligned.\n return address(uint160(uint256(vault.vaultAddress >> 96)));\n }\n }\n revert VaultNotFound(routingId, vmId);\n }\n\n // =============================================================\n // TIMELOCKED ACTIONS\n // =============================================================\n\n /// @notice Schedules a timelocked update for the Risk Manager address.\n /// @dev The operation cannot be executed until `TIMELOCK_DELAY` has passed.\n /// @param newRiskManager The proposed new Risk Manager address.\n /// @return opId The unique hash of the scheduled operation.\n function scheduleRiskManager(\n address newRiskManager,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n if (newRiskManager == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRiskManager));\n _requireCommitteeApproval(OP_SET_RISK_MANAGER, paramsHash, signers, signatures);\n opId = _schedule(OP_SET_RISK_MANAGER, paramsHash);\n }\n\n /// @notice Executes a pending Risk Manager update if the timelock has expired.\n /// @param newRiskManager The address that was previously scheduled.\n function executeRiskManager(address newRiskManager) external {\n if (newRiskManager == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRiskManager));\n bytes32 opId = _opId(OP_SET_RISK_MANAGER, paramsHash);\n\n _executeTimelock(opId);\n\n address old = riskManager;\n riskManager = newRiskManager;\n emit OperationExecuted(opId, OP_SET_RISK_MANAGER);\n emit RiskManagerUpdated(old, newRiskManager);\n }\n\n /// @notice Schedules a timelocked update for the Registry Contract address.\n /// @param newRegistry The proposed new Registry address.\n /// @return opId The unique hash of the scheduled operation.\n function scheduleRegistryContract(\n address newRegistry,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n if (newRegistry == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRegistry));\n _requireCommitteeApproval(OP_SET_REGISTRY, paramsHash, signers, signatures);\n opId = _schedule(OP_SET_REGISTRY, paramsHash);\n }\n\n /// @notice Executes a pending Registry Contract update if the timelock has expired.\n /// @param newRegistry The address that was previously scheduled.\n function executeRegistryContract(address newRegistry) external {\n if (newRegistry == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRegistry));\n bytes32 opId = _opId(OP_SET_REGISTRY, paramsHash);\n\n _executeTimelock(opId);\n\n address old = registryContract;\n registryContract = newRegistry;\n emit OperationExecuted(opId, OP_SET_REGISTRY);\n emit RegistryUpdated(old, newRegistry);\n }\n\n // Timelocked measurement actions\n\n /// @notice Validates measurements against a specific approved Profile.\n /// @dev Supports \"Partial Matching\": If the Profile has bytes32(0) for an RTMR,\n /// skips checking that specific register (accommodating different provider patterns).\n function verifyMeasurements(\n uint256 profileId,\n bytes32 checkMrtd,\n bytes32 checkRtmr0,\n bytes32 checkRtmr1,\n bytes32 checkRtmr2,\n bytes32 checkRtmr3\n ) internal view {\n MeasurementProfile memory profile = measurementProfiles[profileId];\n\n if (!profile.active) revert ProfileInactive(profileId);\n if (profile.mrtd == bytes32(0)) revert ZeroAddress();\n\n // MRTD is always mandatory\n if (checkMrtd != profile.mrtd) revert MeasurementMismatch(profile.mrtd, checkMrtd, \"MRTD\");\n\n // RTMRs are conditional based on the Profile configuration\n if (profile.rtmr0 != bytes32(0) && checkRtmr0 != profile.rtmr0) {\n revert MeasurementMismatch(profile.rtmr0, checkRtmr0, \"RTMR0\");\n }\n\n if (profile.rtmr1 != bytes32(0) && checkRtmr1 != profile.rtmr1) {\n revert MeasurementMismatch(profile.rtmr1, checkRtmr1, \"RTMR1\");\n }\n\n if (profile.rtmr2 != bytes32(0) && checkRtmr2 != profile.rtmr2) {\n revert MeasurementMismatch(profile.rtmr2, checkRtmr2, \"RTMR2\");\n }\n\n if (profile.rtmr3 != bytes32(0) && checkRtmr3 != profile.rtmr3) {\n revert MeasurementMismatch(profile.rtmr3, checkRtmr3, \"RTMR3\");\n }\n }\n\n /// @notice Governance proposes adding or updating a measurement profile (e.g., for Phala or GCP).\n function scheduleManageProfile(\n uint256 profileId,\n MeasurementProfile calldata profile,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n // Anti-Bricking: MRTD must never be zero if activating\n if (profile.active && profile.mrtd == bytes32(0)) revert InvalidVaultAddr();\n\n bytes32 paramsHash = keccak256(abi.encode(profileId, profile));\n _requireCommitteeApproval(OP_MANAGE_PROFILE, paramsHash, signers, signatures);\n opId = _schedule(OP_MANAGE_PROFILE, paramsHash);\n }\n\n function executeManageProfile(uint256 profileId, MeasurementProfile calldata profile) external {\n bytes32 paramsHash = keccak256(abi.encode(profileId, profile));\n bytes32 opId = _opId(OP_MANAGE_PROFILE, paramsHash);\n\n _executeTimelock(opId);\n\n // Auto-increment ID if adding a new one with ID 0\n uint256 idToUpdate = profileId;\n if (idToUpdate == 0) {\n idToUpdate = nextProfileId++;\n }\n\n measurementProfiles[idToUpdate] = profile;\n emit OperationExecuted(opId, OP_MANAGE_PROFILE);\n emit MeasurementProfileUpdated(idToUpdate, profile.active);\n }\n\n /// @notice Sxecudes a timelocked update for the Automata Verifier address.\n function executeUpdateAutomataVerifier(address newVerifier) external {\n if (newVerifier == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newVerifier));\n bytes32 opId = _opId(OP_SET_AUTOMATA_VERIFIER, paramsHash);\n _executeTimelock(opId);\n\n address old = address(automataVerifier);\n automataVerifier = IAutomataDcapAttestation(newVerifier);\n\n emit OperationExecuted(opId, OP_SET_AUTOMATA_VERIFIER);\n emit AutomataVerifierUpdated(old, newVerifier);\n }\n\n /// @notice Schedules a timelocked update for the Automata Verifier.\n /// @dev Operators vote to update the verifier and the update is proposed with a timelocked delay.\n function scheduleUpdateAutomataVerifier(\n address newVerifier,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n if (newVerifier == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newVerifier));\n _requireCommitteeApproval(OP_SET_AUTOMATA_VERIFIER, paramsHash, signers, signatures);\n opId = _schedule(OP_SET_AUTOMATA_VERIFIER, paramsHash);\n }\n\n // Timelock cancellation\n\n /// @notice Cancels a pending timelocked operation.\n /// @dev Can be called at any time before execution to prevent a malicious or erroneous update.\n /// @param opId The hash of the operation to cancel.\n function cancelTimelock(bytes32 opId, address[] calldata signers, bytes[] calldata signatures)\n external\n {\n bytes32 paramsHash = keccak256(abi.encode(opId));\n _requireCommitteeApproval(OP_CANCEL_TIMELOCK, paramsHash, signers, signatures);\n\n TimelockOp storage op = timelockOps[opId];\n if (op.eta == 0) revert TimelockUnknown(opId);\n if (op.executed) revert TimelockAlreadyExecuted(opId);\n if (op.canceled) revert TimelockAlreadyCanceled(opId);\n\n op.canceled = true;\n emit OperationCanceled(opId, op.opType);\n }\n\n // =============================================================\n // TIMELOCK INTERNAL LOGIC\n // =============================================================\n\n /// @dev Deterministically generates the operation ID hash.\n function _opId(bytes32 opType, bytes32 paramsHash) internal view returns (bytes32) {\n return keccak256(abi.encode(opType, paramsHash, address(this), block.chainid));\n }\n\n /// @dev Internal helper to schedule an operation.\n function _schedule(bytes32 opType, bytes32 paramsHash) internal returns (bytes32 opId) {\n opId = _opId(opType, paramsHash);\n TimelockOp storage op = timelockOps[opId];\n if (op.executed) revert TimelockAlreadyExecuted(opId);\n\n uint256 delay = timelockDelayFor[opType];\n if (delay == 0) revert InvalidDelay(delay);\n\n uint64 eta = uint64(block.timestamp + delay);\n op.eta = eta;\n op.executed = false;\n op.canceled = false;\n op.opType = opType;\n emit OperationScheduled(opId, opType, eta);\n }\n\n /// @dev Internal helper to validate if an operation is ready for execution.\n function _executeTimelock(bytes32 opId) internal {\n TimelockOp storage op = timelockOps[opId];\n if (op.eta == 0) revert TimelockUnknown(opId);\n if (op.executed) revert TimelockAlreadyExecuted(opId);\n if (op.canceled) revert TimelockAlreadyCanceled(opId);\n if (block.timestamp < op.eta) revert TimelockNotReady(opId, op.eta, block.timestamp);\n op.executed = true;\n }\n\n /// @notice Allows the contract to receive ETH (needed for strategies that require fees).\n receive() external payable {}\n}\n","urls":[]},"src/DepositVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {SafeTransferLib} from \"solady/utils/SafeTransferLib.sol\";\nimport {EfficientHashLib} from \"solady/utils/EfficientHashLib.sol\";\nimport {ECDSA} from \"solady/utils/ECDSA.sol\";\nimport {IAtomicSettlementCallback} from \"./interfaces/IAtomicSettlementCallback.sol\";\n\ncontract DepositVault {\n /**\n * @notice The admin approves settlements and withdrawals.\n * @dev Should be set to the DStack container shared secret address.\n */\n address public owner;\n\n /**\n * @notice The address responsible for adding or removing administrators\n * @dev In production, this will be an upgradeable proxy\n */\n address public credentialManager;\n\n /// @notice Domain separator used for signature verification. It should include the routing ID, the vm ID, this\n /// vault address, and the settlement schema version.\n bytes32 internal _domainSeparator;\n\n /// @notice Maps settler IDs to their executor addresses.\n mapping(bytes32 => SettlerInfo) settlerExecutorMap;\n\n /// @notice List of all approved settler IDs.\n bytes32[] public approvedSettlers;\n\n /// @notice Minimum number of administrator signatures to approve a withdrawal request\n uint256 public withdrawalQuorum;\n\n uint256 public credentialManagerChangeDelayBlocks = 14400;\n\n /// @notice Tracks which settler IDs have been approved.\n mapping(bytes32 => bool) internal settlerIsApproved;\n\n /**\n * @notice Maximum total tokens that can be settled in a single block for each token.\n * @dev Currently unused \u2014 implementation pending design finalization.\n */\n mapping(address => uint256) public settlementCaps;\n\n /// @notice Maps (settler ID, account_index) pairs to their queue of pending batch settlements.\n mapping(bytes32 => mapping(uint64 => PendingSettlement[])) public pendingSettlements;\n\n /// @notice Maps (settler ID, account_index) pairs to their settlement count (nonce).\n mapping(bytes32 => mapping(uint64 => uint256)) public settlementCounts;\n\n /// @notice Maps user ID pairs to their deposit count (nonce).\n mapping(bytes32 => uint256) public depositCounts;\n\n /// @notice Maps user ID to their withdrawal count (nonce).\n mapping(bytes32 => uint256) public withdrawalCounts;\n\n /// @notice Set of administrators\n address[] public administrators;\n\n // TODO: Delete before official production.\n mapping(address => bool) public canDeposit;\n\n /// @notice Block number of latest signature use\n uint256 public lastSignatureUse;\n\n /**\n * Makes the signature unambiguous that it is for settlements.\n */\n bytes32 public constant SETTLEMENT_TYPEHASH = keccak256(\"SettlementApprovalV1\");\n\n /**\n * Makes the signature unambiguous that it is for withdrawals.\n */\n bytes32 constant WITHDRAWAL_TYPEHASH = keccak256(\"WithdrawalApprovalV1\");\n\n /// @notice Request for settlement\n /// @dev Used for all forms of settlement supported by the t+ vault\n struct Settlement {\n /// @notice Address of the token to be sent OUT from the vault\n address tokenOut;\n /// @notice Quantity of the output token to be sent OUT from the vault\n uint256 amountOut;\n /// @notice Address of the token to be sent IN to the vault\n address tokenIn;\n /// @notice Quantity of the input token to be sent IN from the vault\n uint256 amountIn;\n /// @notice Unique identifier of the user being settled\n bytes32 user;\n /// @notice Account index of the user being settled\n uint64 account;\n /// @notice Settlement nonce for this request\n uint256 nonce;\n /// @notice Timestamp at which this request is valid until (i.e.,\n /// immediately after this time this request is considered\n /// expired)\n uint256 validUntil;\n }\n\n /// @notice A settlement request with associated signatures\n struct SignedSettlement {\n /// @notice Settlement request\n Settlement settlement;\n /// @notice Signature from the t+ Clearing Engine (CE)\n bytes clearingEngineSignature;\n }\n\n /**\n * @notice Stores pending settlements for a given (user ID, account_index) pair when batch settlement is used.\n * @dev Target is the address expected to execute the settlement.\n */\n struct PendingSettlement {\n Settlement settlement;\n address target;\n }\n\n /// @notice Records a withdrawal.\n struct Withdrawal {\n address tokenAddress;\n uint256 amount;\n uint256 nonce;\n }\n\n /// @notice Information about a settler account.\n struct SettlerInfo {\n address[] executors;\n mapping(address => bool) isExecutor;\n }\n\n /// @notice Balance of a token for squashing purposes\n struct TokenSquashingBalance {\n /// @notice Address of the token that this balance represents\n address token;\n /// @notice Total quantity of tokens that the vault needs to receive\n uint256 input;\n /// @notice Total quantity of tokens that the vault needs to send\n uint256 output;\n /// @notice Net quantity of tokens that the vault needs to receive\n /// (i.e., negative implies sending more tokens out than the\n /// vault is receiving)\n int256 netAmount;\n }\n\n /// @notice Signals a settlement.\n event Settled(\n bytes32 indexed user,\n uint64 indexed account,\n uint256 indexed nonce,\n address tokenOut,\n uint256 amountOut,\n address tokenIn,\n uint256 amountIn\n );\n\n /// @notice Indicates that the set of administrators has been cleared and is now empty\n event AdministratorSetReset();\n\n /// @notice Signals that the withdrawal quorum has changed\n event WithdrawalQuorumChanged(uint256 previous, uint256 current);\n\n /// @notice Signals that the credential manager address has changed\n event CredentialManagerChanged(address oldCredentialManager, address newCredentialManager);\n\n /// @notice Signals that a new administrator has been added to the vault\n event AdminAdded(address newAdmin, uint256 numAdminsAfter);\n\n /// @notice Signals a deposit.\n event Deposited(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n\n /// @notice Signals a withdrawal.\n event Withdrew(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n\n /// @notice Reverts if the caller is not the owner.\n error NotOwner();\n\n /// @notice Reverts if the specified settler is not an approved settler on\n /// this vault\n error SettlerNotApproved();\n\n /// @notice Reverts if the number of callback data payloads does not match\n /// the number of settlement requests\n error PayloadMismatch();\n\n /// @notice Reverts if a settlement callback returns an insufficient input token amount\n error InsufficientAmountFromExecutor(uint256 actual, uint256 required);\n\n /// @notice Reverts if a settlement callback returns insufficient amount for a specific settlement\n error InsufficientCallbackReturnForSettlement(\n uint256 settlementIndex, uint256 actual, uint256 required\n );\n\n /// @notice Reverts if an insufficient number of blocks have elapsed since the last signature use\n error TooSoon();\n\n /// @notice Reverts if the caller is not the credential manager\n error NotCredentialManager();\n\n /// @notice Reverts if a new withdrawal quorum value is equal to zero\n error ZeroWithdrawalQuorum();\n\n /// @notice Reverts if insufficient administrators are provided when setting the administrators\n error InsufficientAdministrators(uint256 actual, uint256 required);\n\n /// @notice Reverts if the caller is not an admin.\n error NotAdmin();\n\n /// @notice Reverts if the caller is not the authorized executor.\n error NotExecutor();\n\n /// @notice Reverts if a signed operation is past its deadline.\n error Expired();\n\n /// @notice Reverts if the nonce used in a transaction is incorrect.\n error InvalidNonce(uint256 expected, uint256 given);\n\n /// @notice Reverts if the signature provided is invalid.\n error InvalidSignature();\n\n /// @notice Reverts if an order array is empty.\n error EmptyOrders();\n\n /// @notice Reverts when given the zero address.\n error ZeroAddress();\n\n /// @notice Reverts when an insufficient number of signatures are provided for a withdrawal request\n error MissedQuorum(uint256 provided, uint256 required);\n\n /**\n * @notice Initializes the contract and sets the owner.\n * @param _owner The address to set as the owner.\n * @param _credentialManager The address of the credential manager.\n * @dev Reverts with `ZeroAddress()` if `_owner` is null.\n * @dev Reverts with `ZeroAddress()` if `_credentialManager` is null.\n */\n constructor(address _owner, address _credentialManager) {\n if (_owner == address(0)) revert ZeroAddress();\n if (_credentialManager == address(0)) revert ZeroAddress();\n owner = _owner;\n credentialManager = _credentialManager;\n }\n\n function isAdministrator(address account) public view returns (bool) {\n for (uint256 i = 0; i < administrators.length; i++) {\n if (administrators[i] == account) return true;\n }\n\n return false;\n }\n\n /**\n * @notice Sets the owner of the vault.\n * @dev Reverts with `NotOwner`; Only the owner can set a new owner.\n */\n function setOwner(address newOwner) external {\n if (msg.sender != owner) revert NotOwner();\n if (newOwner == address(0)) revert ZeroAddress();\n owner = newOwner;\n }\n\n function setCredentialManager(address newCredentialManager) external {\n if (msg.sender != owner) revert NotOwner();\n if (newCredentialManager == address(0)) revert ZeroAddress();\n /* TODO(jmcph4): check against `latestApproval`! */\n if (block.number >= lastSignatureUse + credentialManagerChangeDelayBlocks) {\n revert TooSoon();\n }\n address oldCredentialManager = credentialManager;\n credentialManager = newCredentialManager;\n emit CredentialManagerChanged(oldCredentialManager, newCredentialManager);\n }\n\n function setAdministrators(address[] calldata newAdministrators, uint256 newWithdrawalQuorum)\n external\n {\n if (msg.sender != credentialManager) revert NotCredentialManager();\n if (newWithdrawalQuorum < 1) revert ZeroWithdrawalQuorum();\n if (newAdministrators.length < newWithdrawalQuorum) {\n revert InsufficientAdministrators(newAdministrators.length, newWithdrawalQuorum);\n }\n\n // It's critical there are no zero-addresses; otherwise, errored signatures may mistakenly pass.\n for (uint256 i = 0; i < newAdministrators.length; i++) {\n if (newAdministrators[i] == address(0)) revert ZeroAddress();\n }\n\n administrators = newAdministrators;\n emit AdministratorSetReset();\n\n for (uint256 i = 0; i < administrators.length; i++) {\n address currAdmin = administrators[i];\n emit AdminAdded(currAdmin, i + 1);\n }\n\n uint256 oldWithdrawalQuorum = withdrawalQuorum;\n withdrawalQuorum = newWithdrawalQuorum;\n if (oldWithdrawalQuorum != newWithdrawalQuorum) {\n emit WithdrawalQuorumChanged(oldWithdrawalQuorum, newWithdrawalQuorum);\n }\n }\n\n /**\n * @notice Sets the domain separators for EIP-712 signatures.\n * @param domainSeparator: The value to set.\n * @dev Reverts with `NotOwner`; Only the admin can set the domain separator.\n */\n function setDomainSeparator(bytes32 domainSeparator) external {\n if (msg.sender != owner) revert NotOwner();\n require(_domainSeparator == 0); // dev: Already set.\n _domainSeparator = domainSeparator;\n }\n\n /**\n * @notice Sets the settle executor.\n * @param settler: The settler's tplus account key.\n * @param executor: The settler's assigned executor address.\n * @dev Reverts with `NotOwner`; Only the admin can set the settler executor.\n */\n function addSettlerExecutor(bytes32 settler, address executor) external {\n if (msg.sender != owner) revert NotOwner();\n\n if (!settlerIsApproved[settler]) {\n approvedSettlers.push(settler);\n settlerIsApproved[settler] = true;\n }\n\n SettlerInfo storage data = settlerExecutorMap[settler];\n if (!data.isExecutor[executor]) {\n data.executors.push(executor);\n data.isExecutor[executor] = true;\n }\n }\n\n /**\n * @notice Removes a settler.\n * @param settler: The settler's tplus account key.\n * @dev Reverts with `NotOwner`; Only the admin can remove a settler.\n */\n function removeSettler(bytes32 settler) external {\n if (msg.sender != owner) revert NotOwner();\n uint256 length = approvedSettlers.length;\n\n settlerIsApproved[settler] = false;\n\n for (uint256 i = 0; i < length; i++) {\n if (approvedSettlers[i] == settler) {\n // Move last element to this spot and pop the last element.\n approvedSettlers[i] = approvedSettlers[length - 1];\n approvedSettlers.pop();\n break;\n }\n }\n\n // Remove all executors.\n SettlerInfo storage info = settlerExecutorMap[settler];\n for (uint256 i = 0; i < info.executors.length; i++) {\n address exec = info.executors[i];\n info.isExecutor[exec] = false;\n }\n delete info.executors;\n }\n\n /**\n * @notice Deposits a token into the vault.\n * @param user: The user whose account will be credited with the deposit.\n * @param tokenAddress: The address of the token to deposit.\n * @param amount: The amount of the token to deposit.\n * @dev Reverts if the amount is 0.\n */\n function deposit(bytes32 user, address tokenAddress, uint256 amount) external {\n require(canDeposit[msg.sender], \"!depositor\");\n require(amount != 0, \"Zero\");\n\n // Move tokens from the target user to this vault.\n SafeTransferLib.safeTransferFrom(tokenAddress, msg.sender, address(this), amount);\n\n emit Deposited(user, depositCounts[user], tokenAddress, amount);\n depositCounts[user] += 1;\n }\n\n // TODO: Delete this method and notion of approved-depositor before official production.\n function setDepositorStatus(address depositor, bool allowed) external {\n if (msg.sender != owner) revert NotOwner();\n canDeposit[depositor] = allowed;\n }\n\n /**\n * @notice Executes an atomic settlement.\n * @param order: The settlement order.\n * @param data: The data to execute as part of settlement callback.\n * @param signature: The signature from the t+ clearing engine.\n * @dev Reverts with `Expired` if the block timestamp is greater than `validUntil`.\n * @dev Reverts with `NotExecutor`; Only the executor can settle.\n * @dev Reverts with `InvalidNonce` if the nonce has already been used.\n * @dev Reverts with `SignatureError` if the signer is not an admin.\n * @dev Reverts with `InsufficientAmountFromExecutor` if the `order.amountIn` is less than what the executor reports\n */\n function executeAtomicSettlement(\n Settlement calldata order,\n bytes calldata data,\n bytes calldata signature\n ) external {\n bytes32 user = order.user;\n uint64 account = order.account;\n uint256 validUntil = order.validUntil;\n\n if (block.timestamp > validUntil) revert Expired();\n if (!settlerExecutorMap[user].isExecutor[msg.sender]) revert NotExecutor();\n\n uint256 expectedNonce = settlementCounts[user][account];\n if (order.nonce != expectedNonce) revert InvalidNonce(expectedNonce, order.nonce);\n\n bytes32 digest = keccak256(\n bytes.concat(\n SETTLEMENT_TYPEHASH,\n _domainSeparator,\n bytes32(uint256(uint160(order.tokenOut)) << 96),\n bytes32(order.amountOut),\n bytes32(uint256(uint160(order.tokenIn)) << 96),\n bytes32(order.amountIn),\n user,\n bytes32(uint256(uint160(account))),\n bytes32(order.nonce),\n bytes32(validUntil)\n )\n );\n\n // Check the signature and record latest signature usage if it's valid\n checkApproval(digest, signature);\n lastSignatureUse = block.number;\n\n // Ensure to bump the nonce _before_ the callback to avoid signature replay.\n settlementCounts[user][account] += 1;\n\n // Invoke callback on the executor\n uint256 expectedAmountIn = IAtomicSettlementCallback(msg.sender)\n .onAtomicSettlement(order.tokenOut, order.amountOut, data);\n if (expectedAmountIn < order.amountIn) {\n revert InsufficientAmountFromExecutor(expectedAmountIn, order.amountIn);\n }\n\n // Transfer tokens IN from the executor\n SafeTransferLib.safeTransferFrom(order.tokenIn, msg.sender, address(this), expectedAmountIn);\n\n // Transfer tokens OUT to the executor\n SafeTransferLib.safeTransfer(order.tokenOut, msg.sender, order.amountOut);\n\n emit Settled(\n user,\n account,\n order.nonce,\n order.tokenOut,\n order.amountOut,\n order.tokenIn,\n order.amountIn\n );\n }\n\n /// @notice Execute a sequence of settlement requests in a squashing fashion\n /// @param requests List of settlement requests\n function executeSquashingSettlements(\n SignedSettlement[] calldata requests,\n bytes[] calldata data,\n bytes32 settler\n ) external {\n address caller = msg.sender;\n uint256 numRequests = requests.length;\n uint256 numDataPayloads = data.length;\n if (numRequests != numDataPayloads) revert PayloadMismatch();\n\n /**\n * SAFETY(jmcph4): Check that settler is approved\n *\n * This prevents unauthorised settlers from executing settlements.\n */\n if (!settlerIsApproved[settler]) revert SettlerNotApproved();\n\n /**\n * SAFETY(jmcph4): Check that the caller is an assigned executor for this settler\n *\n * This prevents unauthorised execution of valid settlement requests.\n */\n if (!settlerExecutorMap[settler].isExecutor[caller]) revert NotExecutor();\n\n // Allocate token balances for netting off\n TokenSquashingBalance[] memory balances = new TokenSquashingBalance[](numRequests * 2);\n uint256 numUniqueTokens = 0;\n\n for (uint256 i = 0; i < numRequests; i++) {\n SignedSettlement memory currRequest = requests[i];\n bytes32 user = currRequest.settlement.user;\n uint64 account = currRequest.settlement.account;\n uint256 actualNonce = currRequest.settlement.nonce;\n uint256 validUntil = currRequest.settlement.validUntil;\n address tokenIn = currRequest.settlement.tokenIn;\n address tokenOut = currRequest.settlement.tokenOut;\n uint256 amountIn = currRequest.settlement.amountIn; /* TODO(jmcph4): callback */\n uint256 amountOut = currRequest.settlement.amountOut;\n\n /**\n * SAFETY(jmcph4): Check expiry\n *\n * This prevents stale settlement requests from being executed.\n */\n if (block.timestamp > validUntil) revert Expired();\n\n /**\n * SAFETY(jmcph4): Check nonce\n *\n * This prevents replay attacks on settlement requests.\n */\n uint256 expectedNonce = settlementCounts[user][account];\n if (actualNonce < expectedNonce) revert InvalidNonce(expectedNonce, actualNonce);\n\n bytes32 digest = keccak256(\n bytes.concat(\n SETTLEMENT_TYPEHASH,\n _domainSeparator,\n bytes32(uint256(uint160(tokenOut)) << 96),\n bytes32(amountOut),\n bytes32(uint256(uint160(tokenIn)) << 96),\n bytes32(amountIn),\n user,\n bytes32(uint256(uint160(account))),\n bytes32(actualNonce),\n bytes32(validUntil)\n )\n );\n\n /**\n * SAFETY(jmcph4): Verify t+ Clearing Engine (CE) signature\n *\n * This prevents unauthorised settlements.\n */\n checkApproval(digest, requests[i].clearingEngineSignature); /* TODO(jmcph4): horrific calldata load */\n lastSignatureUse = block.number;\n\n /**\n * SAFETY(jmcph4): Increment settlement nonce prior to invoking the\n * callback\n *\n * This prevents replay attacks (reentrant or otherwise) on\n * settlement requests.\n */\n settlementCounts[user][account] += 1;\n\n // Apply this request to running net token balances\n bool inputFound = false;\n bool outputFound = false;\n for (uint256 j = 0; j < numUniqueTokens; j++) {\n if (balances[j].token == tokenIn) {\n balances[j].input += amountIn;\n inputFound = true;\n break;\n }\n }\n\n if (!inputFound) {\n balances[numUniqueTokens] = TokenSquashingBalance(tokenIn, amountIn, 0, 0);\n numUniqueTokens++;\n }\n\n for (uint256 j = 0; j < numUniqueTokens; j++) {\n if (balances[j].token == tokenOut) {\n balances[j].output += amountOut;\n outputFound = true;\n break;\n }\n }\n\n if (!outputFound) {\n balances[numUniqueTokens] = TokenSquashingBalance(tokenOut, 0, amountOut, 0);\n numUniqueTokens++;\n }\n }\n\n // Net off each token balance\n for (uint256 i = 0; i < numUniqueTokens; i++) {\n if (balances[i].input > balances[i].output) {\n balances[i].netAmount = int256(balances[i].input - balances[i].output);\n } else if (balances[i].output > balances[i].input) {\n balances[i].netAmount = -int256(balances[i].output - balances[i].input);\n }\n }\n\n // Push funds out from the vault and into the executor\n for (uint256 i = 0; i < numUniqueTokens; i++) {\n // Negative net amount implies that we must push funds out from the vault\n if (balances[i].netAmount < 0) {\n // Transfer tokens OUT to the executor\n SafeTransferLib.safeTransfer(\n balances[i].token, caller, uint256(-balances[i].netAmount)\n );\n }\n }\n\n // Call callbacks and record return values\n uint256[] memory callbackReturns = new uint256[](numRequests);\n\n for (uint256 i = 0; i < numRequests; i++) {\n Settlement memory request = requests[i].settlement;\n\n /**\n * SAFETY(jmcph4): Record callback return value\n *\n * The executor reports how much of tokenIn it will provide for this\n * specific settlement. Pass the per-settlement amountOut, not the net.\n * These values will be validated against requirements before pulling funds.\n */\n callbackReturns[i] = IAtomicSettlementCallback(msg.sender)\n .onAtomicSettlement(request.tokenOut, request.amountOut, data[i]);\n\n /**\n * SAFETY(jmcph4): Validate per-settlement callback return\n *\n * Ensure the executor commits to provide at least the promised amountIn\n * for THIS specific settlement. This prevents cross-settlement subsidization\n * where an executor could shortchange one user while overpaying another.\n */\n if (callbackReturns[i] < request.amountIn) {\n revert InsufficientCallbackReturnForSettlement(\n i, callbackReturns[i], request.amountIn\n );\n }\n }\n\n // Validate callback returns and pull funds\n for (uint256 i = 0; i < numUniqueTokens; i++) {\n // Only process tokens that need to be pulled (positive net amount)\n if (balances[i].netAmount > 0) {\n address token = balances[i].token;\n uint256 requiredAmount = uint256(balances[i].netAmount);\n\n /**\n * SAFETY(jmcph4): Sum callback returns by token\n *\n * Calculate total amount the executor has committed to provide\n * for this token across all settlements.\n */\n uint256 totalCallbackAmount = 0;\n for (uint256 j = 0; j < numRequests; j++) {\n if (requests[j].settlement.tokenIn == token) {\n totalCallbackAmount += callbackReturns[j];\n }\n }\n\n /**\n * SAFETY(jmcph4): Validate executor commitment\n *\n * Ensure the executor has committed to provide at least the\n * required net amount for this token.\n */\n if (totalCallbackAmount < requiredAmount) {\n revert InsufficientAmountFromExecutor(totalCallbackAmount, requiredAmount);\n }\n\n // Transfer tokens IN from the executor\n SafeTransferLib.safeTransferFrom(token, caller, address(this), requiredAmount);\n }\n }\n\n // Emit settlement events\n for (uint256 i = 0; i < numRequests; i++) {\n Settlement memory request = requests[i].settlement;\n\n /**\n * SAFETY(jmcph4): Emit per-settlement amounts\n *\n * Events must reflect the actual per-settlement amounts, not the netted\n * amounts. This ensures proper accounting and allows off-chain systems\n * to correctly track what each user received.\n */\n emit Settled(\n request.user,\n request.account,\n request.nonce,\n request.tokenOut,\n request.amountOut,\n request.tokenIn,\n request.amountIn\n );\n }\n }\n\n /**\n * @notice Pulls funds for execution during a settlement batch.\n * @param orders: The settlement orders.\n * @param user: The t+ user who is executing the settlement.\n * @param target: The target address to send the token to, pull tokens from, and execute callback on.\n * @param validUntil: The timestamp when the settlement signature expires.\n * @dev Reverts with `Expired` if the block timestamp is greater than `validUntil`.\n * @dev Reverts if a batch settlement has already started.\n * @dev Reverts with `NotAdmin`; Only an admin can execute the settlement.\n * @dev Reverts with `InvalidNonce` if the nonce has already been used.\n * @dev Reverts with `SignatureError` if the signer is not an admin.\n */\n function pullBatchSettlements(\n SignedSettlement[] calldata orders,\n bytes32 user,\n uint64 account,\n address target,\n uint256 validUntil\n ) external {\n if (block.timestamp > validUntil) revert Expired();\n require(pendingSettlements[user][account].length == 0);\n if (!isAdministrator(msg.sender)) revert NotAdmin();\n\n uint256 expectedNonce = settlementCounts[user][account];\n bytes32 domainSeparator = _domainSeparator;\n uint256 ordersLength = orders.length;\n if (ordersLength == 0) revert EmptyOrders();\n\n for (uint256 i = 0; i < ordersLength; ++i) {\n Settlement calldata s = orders[i].settlement;\n\n uint256 nonce = s.nonce;\n if (nonce != expectedNonce) revert InvalidNonce(expectedNonce, nonce);\n\n bytes32 digest = keccak256(\n bytes.concat(\n SETTLEMENT_TYPEHASH,\n domainSeparator,\n bytes32(uint256(uint160(s.tokenOut)) << 96),\n bytes32(s.amountOut),\n bytes32(uint256(uint160(s.tokenIn)) << 96),\n bytes32(s.amountIn),\n user,\n bytes32(uint256(uint160(account))),\n bytes32(s.nonce),\n bytes32(validUntil)\n )\n );\n\n checkApproval(digest, orders[i].clearingEngineSignature);\n expectedNonce = nonce + 1;\n\n pendingSettlements[user][account].push(\n PendingSettlement({settlement: s, target: target})\n );\n SafeTransferLib.safeTransfer(s.tokenOut, target, s.amountOut);\n }\n\n settlementCounts[user][account] += ordersLength;\n }\n\n /**\n * @notice Pushes expected funds from a batch settlement to the deposit vault.\n * @param user: The t+ user who is executing the settlement.\n * @param account: The account of the t+ user to execute settlement against\n * @dev Reverts with `NotAdmin`; Only an admin can execute the settlement.\n */\n function pushBatchSettlements(bytes32 user, uint64 account) external {\n if (!isAdministrator(msg.sender)) revert NotAdmin();\n\n for (uint32 i = 0; i < pendingSettlements[user][account].length; i++) {\n PendingSettlement memory pendingSettlement = pendingSettlements[user][account][i];\n\n SafeTransferLib.safeTransferFrom(\n pendingSettlement.settlement.tokenIn,\n pendingSettlement.target,\n address(this),\n pendingSettlement.settlement.amountIn\n );\n emit Settled(\n user,\n account,\n pendingSettlement.settlement.nonce,\n pendingSettlement.settlement.tokenOut,\n pendingSettlement.settlement.amountOut,\n pendingSettlement.settlement.tokenIn,\n pendingSettlement.settlement.amountIn\n );\n }\n delete pendingSettlements[user][account];\n }\n\n /**\n * @notice Withdraws a token from the vault.\n * @param withdrawal: The withdrawal token and amount.\n * @param user: The user whose account will be debited by the withdrawal.\n * @param target: The target address to send the token to.\n * @param validUntil: The timestamp when the withdrawal signature expires.\n * @param signatures: t+ clearing engine signatures.\n * @dev Reverts with `Expired` if the block timestamp is greater than `validUntil`.\n * @dev Reverts with `InvalidNonce` if the nonce has already been used.\n * @dev Reverts with `SignatureError` if the signer is not an admin.\n */\n function withdraw(\n Withdrawal calldata withdrawal,\n bytes32 user,\n address target,\n uint256 validUntil,\n bytes32 epochHash,\n bytes[] calldata signatures\n ) external {\n /* PERF(jmcph4): cache storage variable to the stack */\n uint256 quorum = withdrawalQuorum;\n if (block.timestamp > validUntil) revert Expired();\n if (signatures.length < withdrawalQuorum) {\n revert MissedQuorum(signatures.length, quorum);\n }\n\n uint256 expectedNonce = withdrawalCounts[user];\n if (withdrawal.nonce != expectedNonce) {\n revert InvalidNonce(expectedNonce, withdrawal.nonce);\n }\n\n /**\n * BEGIN SIGNATURE CHECKS *************************\n */\n\n // Set of administrators that have provided signatures for this withdrawal\n address[] memory seenAdmins = new address[](signatures.length);\n uint256 numSeenAdmins = 0;\n\n // PERF(jmcph4): No need to recompute inside the loop body\n bytes32 digest = keccak256(\n bytes.concat(\n WITHDRAWAL_TYPEHASH,\n _domainSeparator,\n bytes32(uint256(uint160((withdrawal.tokenAddress))) << 96),\n bytes32(withdrawal.amount),\n user,\n bytes32(withdrawal.nonce),\n bytes32(validUntil),\n bytes32(epochHash),\n bytes32(uint256(uint160(target)) << 96)\n )\n );\n\n for (uint256 i = 0; i < signatures.length; i++) {\n /* Verify the signature.\n *\n * This determines whether the digest is really signed by the provided\n * signature and computes the signer's address.\n */\n address signer = ECDSA.tryRecoverCalldata(digest, signatures[i]);\n if (signer == address(0)) revert InvalidSignature();\n\n // Check that the recovered signer is in fact an administrator\n if (!isAdministrator(signer)) revert InvalidSignature();\n\n /* Check that this administrator is unique. Without this step, a\n * single admin could provide `k` signatures where `k == withdrawalQuorum`\n * and we'd happily approve the withdrawal.\n */\n bool isCurrentSignerUnique = true;\n for (uint256 j = 0; j < numSeenAdmins; j++) {\n if (seenAdmins[j] == signer) {\n isCurrentSignerUnique = false;\n break;\n }\n }\n if (isCurrentSignerUnique) {\n seenAdmins[numSeenAdmins] = signer;\n numSeenAdmins++;\n }\n if (numSeenAdmins == quorum) break;\n }\n\n if (numSeenAdmins < quorum) revert MissedQuorum(numSeenAdmins, quorum);\n\n /**\n * END SIGNATURE CHECKS *************************\n */\n\n // SAFETY(jmcph4): Purposely bump the nonce as close to signature verification as possible, to alleviate callback concerns.\n withdrawalCounts[user] += 1;\n\n // Record latest signature usage\n lastSignatureUse = block.number;\n\n SafeTransferLib.safeTransfer(withdrawal.tokenAddress, target, withdrawal.amount);\n emit Withdrew(user, withdrawal.nonce, withdrawal.tokenAddress, withdrawal.amount);\n }\n\n /**\n * @notice Get the array of approved settlers.\n * @return An array of addresses (as bytes32) that are currently approved settlers.\n */\n function getApprovedSettlers() external view returns (bytes32[] memory) {\n return approvedSettlers;\n }\n\n // TODO: Delete this method before official production.\n function ownerWithdrawToken(address token, address to, uint256 amount) external {\n if (msg.sender != owner) revert NotOwner();\n require(to != address(0));\n SafeTransferLib.safeTransfer(token, to, amount);\n }\n\n function checkApproval(bytes32 digest, bytes calldata signature) internal view {\n address signer = ECDSA.tryRecoverCalldata(digest, signature);\n if (signer == address(0)) revert InvalidSignature();\n if (!isAdministrator(signer)) revert InvalidSignature();\n }\n}\n","urls":[]},"src/Registry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @title Registry\n * @notice Central registry for managing assets and associated risk parameters across multiple chains.\n * @dev Uses admin and multisig roles to control sensitive operations like asset registration and risk configuration.\n */\ncontract Registry {\n /// @notice Address of the admin; primarily used for initial setup.\n address public admin;\n\n /// @notice Multisig wallet address responsible for managing risk-related configurations.\n address public riskManagerMultisig;\n\n /// @notice Number of seconds to wait before new risk parameters become effective\n uint256 public riskParameterChangeDelaySeconds = 1 days;\n\n /// @notice Mapping of asset index to new risk parameters to be applied to the registry, but only after they become eligible\n mapping(uint16 => PendingRiskParameters) public pendingRiskParameters;\n\n /// @notice Mapping of asset index to associated risk parameters.\n mapping(uint16 => RiskParameters) public riskParameters;\n\n /// @notice Registry of all registered assets and associated chain data.\n AssetRegistry assets;\n\n /// @notice Account for receiving fees and paying rewards.\n bytes32 public feeAccount;\n\n /// @notice Signals that the maximum deposit has changed for a given asset\n event MaxDepositChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n\n /// @notice Signals that the maximum hourly deposit has changed for a given asset\n event Max1HrDepositChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n\n /// @notice Signals that the minimum weight has changed for a given asset\n event MinWeightChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n\n /// @notice Defines risk-related configuration parameters for an asset.\n struct RiskParameters {\n /// @notice Percentage of asset value that can be counted as collateral (e.g., 90 = 90%).\n uint8 collateralFactor;\n\n /// @notice Percentage multiplier applied to liabilities for risk calculations (e.g., 90 = 90%).\n uint8 liabilityFactor;\n\n /// @notice Maximum allowable collateral amount for this asset. May be unenforced on-chain.\n uint256 maxCollateral;\n\n /// @notice Maximum total open interest allowed for derivatives positions.\n uint256 maxOpenInterest;\n\n /// @notice Maximum open interest allowed for spot positions.\n uint256 maxSpotOpenInterest;\n\n /// @notice Maximum allowed utilization ratio of available liquidity.\n uint256 maxUtilization;\n\n /// @notice If true, asset can only be used in isolated margin mode.\n bool isolatedOnly;\n\n /// @notice Utilization points where the interest rate curve slope changes, scaled in 1/100th of a basis point.\n uint256[] interestKinks;\n\n /// @notice Interest rates corresponding to `interestKinks`, scaled in 1/100th of a basis point.\n uint256[] kinkInterestRates;\n\n /// @notice USD-denominated utilization kink points, scaled in 1/100th of a basis point.\n uint256[] usdInterestKinks;\n\n /// @notice USD-denominated interest rates corresponding to `usdInterestKinks`, scaled in 1/100th of a basis point.\n uint256[] usdKinkInterestRates;\n\n /// @notice Multiplier applied to skew-based pricing adjustments, scaled in 1/100th of a basis point.\n uint256 skewModifier;\n\n /// @notice Skew threshold at which maximum skew adjustment applies, scaled in 1/100th of a basis point.\n uint256 skewCliff;\n\n /// @notice Base funding rate applied regardless of skew direction, scaled in 1/100th of a basis point.\n int256 baseFundingRate;\n\n /// @notice Maximum allowed premium adjustment, scaled in 1/100th of a basis point.\n uint256 premiumClamp;\n\n /// @notice Maximum premium impact applied during initial margin calculation, scaled in 1/100th of a basis point.\n uint256[] initialMarginClamps;\n\n /// @notice Multipliers applied to position size when calculating initial margin, scaled in 1/100th of a basis point.\n uint256[] initialMarginFactors;\n\n /// @notice Maximum absolute funding rate allowed, scaled in 1/100th of a basis point.\n uint256 maxFundingRate;\n\n /// @notice Maximum interest rate applied at full utilization, scaled in 1/100th of a basis point.\n uint256 maxUtilizationRate;\n\n /// @notice Additional safety buffer multiplier applied to risk calculations, scaled in 1/100th of a basis point.\n uint256 bufferMultiple;\n }\n\n struct PendingRiskParameters {\n RiskParameters parameters;\n uint256 validAfter;\n }\n\n /**\n * @notice Struct for managing a list of registered assets.\n * @dev Assets are stored by index and can span multiple chains.\n */\n struct AssetRegistry {\n uint256 count; // Total number of assets.\n mapping(uint16 => Asset) registry; // Mapping from index to asset struct.\n }\n\n /**\n * @notice Struct for identifying a chain.\n */\n struct ChainId {\n // The routing ID e.g. 0=EVM style chains.\n uint64 routingId;\n\n // e.g. EVM chainId.\n uint64 vmId;\n }\n\n /**\n * @notice Struct representing an asset across multiple chains.\n */\n struct Asset {\n mapping(uint64 => mapping(uint64 => AssetData)) data; // Routing ID => Chain ID => AssetData.\n ChainId[] chains; // List of all known chain IDs for this asset.\n }\n\n /**\n * @notice Chain-specific metadata for an asset.\n * @dev Uses bytes32 for `assetAddress` to support non-EVM chains like Solana.\n */\n struct AssetData {\n uint16 index;\n bytes32 assetAddress;\n ChainId chainId;\n uint256 maxDeposits; // Cap on deposits (collateral cap).\n uint256 max1hrDeposits; // Cap on fungible deposits over one hour\n uint256 minWeight; // Raw weight value (not percentage)\n }\n\n /// @notice Reverts if caller is not the admin.\n error NotAdmin();\n\n /// @notice Reverts if there is are no risk parameters queued for the specified asset\n error NoPendingRiskParameters(uint16 asset);\n\n /// @notice Reverts if the pending risk parameters are not yet eligible for application\n error TooSoon(uint16 asset, uint256 eligibleAt);\n\n /// @notice Reverts if caller is not the risk manager multisig.\n error NotRiskManager();\n\n /// @notice Reverts if the asset index is out of bounds.\n error IndexOutOfBounds();\n\n /// @notice Reverts if the collateral factor (CF) specified as part of risk parameters is greater than one\n error InvalidCollateralFactor();\n\n /// @notice Reverts if the liability factor (LF) specified as part of risk parameters is greater than one\n error InvalidLiabilityFactor();\n\n /// @notice Reverts if the utilization cap specified as part of risk parameters is greater than one\n error InvalidUtilizationCap();\n\n /// @notice Reverts if the funding rate cap specified as part of risk parameters is greater than ~1000% APR\n error InvalidMaxFundingRate();\n\n /// @notice Reverts if the utilization rate cap specified as part of risk parameters is greater than ~1000% APR\n error InvalidMaxUtilizationRate();\n\n /// @notice Reverts if the buffer multiple value is less than 1% or greater than 2%.\n error InvalidBufferMultiple();\n\n /// @notice Reverts if the interest kinks specified as part of risk parameters are not increasing from 0 to 1\n error InvalidInterestKinks();\n\n /// @notice Reverts if the interest rates specified as part of risk parameters are not increasing\n error InvalidRateInterestKinks();\n\n /// @notice Reverts if the USD-denominated interest kinks specified as part of risk parameters are not increasing from 0 to 1\n error InvalidUSDInterestKinks();\n\n /// @notice Reverts if the USD-denominated interest rates specified as part of risk parameters are not increasing\n error InvalidUSDRateInterestKinks();\n\n /// @notice Reverts if the size of the initial margin clamps does not match the size of the initial margin factors (specified as part of risk parameters)\n error InvalidInitialMarginsConfiguration();\n\n /// @notice Reverts if the initial margin clamps specified as part of risk parameters are not increasing or are above 100\n error InvalidInitialMarginsClamps();\n\n /// @notice Reverts if the initial margin clamps specified as part of risk parameters are not decreasing or are above 100\n error InvalidInitialMarginsFactors();\n\n /// @notice Reverts if adding a chain to an asset that already exists.\n error ChainAlreadyExists();\n\n /// @notice Reverts if an address is zero.\n error ZeroAddress();\n\n /// @notice Reverts if the risk manager is not set.\n error RiskManagerNotSet();\n\n /**\n * @notice Contract constructor.\n * @param _admin The admin controller of the vault.\n * @dev Sets the deployer as the initial admin.\n */\n constructor(address _admin) {\n admin = _admin;\n }\n\n /**\n * @notice Updates the risk manager multisig address.\n * @param multisig The new address to set.\n * @dev Reverts with `NotAdmin`; Only the admin can set a risk manager.\n */\n function setRiskManagerMultisig(address multisig) external {\n if (msg.sender != admin) revert NotAdmin();\n riskManagerMultisig = multisig;\n }\n\n /**\n * @notice Updates the admin address.\n * @param newAdmin The new admin address.\n * @dev Reverts with `NotAdmin`; Only the admin can set a new admin.\n * @dev The new administrator address is allowed to be the null address.\n * Setting the administrator to this address disables administration\n * of the registry contract.\n */\n function setAdmin(address newAdmin) external {\n if (msg.sender != admin) revert NotAdmin();\n if (newAdmin == address(0) && riskManagerMultisig == address(0)) {\n revert RiskManagerNotSet();\n }\n admin = newAdmin;\n }\n\n /**\n * @notice Sets or updates asset data for a specific asset index and chain.\n * @dev Automatically adds new assets or chain instances if not already present.\n * @param data The chain-specific asset data.\n * @dev Reverts with `NotRiskManager`; Only the risk manager can set asset data.\n */\n function setAssetData(AssetData memory data) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n if (data.index > assets.count) revert IndexOutOfBounds();\n\n // Prevent registering asset with zero-address. Zero-address means that asset\n // has not yet been set on a chain, where is this case it has.\n if (data.assetAddress == bytes32(0)) revert ZeroAddress();\n\n Asset storage reg = assets.registry[data.index];\n\n uint64 routingId = data.chainId.routingId;\n uint64 vmId = data.chainId.vmId;\n\n // Cannot edit the chain or address when already set.\n if (reg.data[routingId][vmId].assetAddress != bytes32(0)) {\n revert ChainAlreadyExists();\n }\n\n bool isNewAsset = reg.chains.length == 0;\n reg.data[routingId][vmId] = data;\n reg.chains.push(data.chainId);\n\n if (isNewAsset) {\n assets.count += 1;\n }\n }\n\n function setMaxDeposits(ChainId calldata chainId, uint16 index, uint256 newMaxDeposit)\n external\n {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n\n uint64 routingId = chainId.routingId;\n uint64 vmId = chainId.vmId;\n\n uint256 oldMaxDeposit = assets.registry[index].data[routingId][vmId].maxDeposits;\n assets.registry[index].data[routingId][vmId].maxDeposits = newMaxDeposit;\n emit MaxDepositChanged(chainId, index, oldMaxDeposit, newMaxDeposit);\n }\n\n function setMax1HrDeposits(ChainId calldata chainId, uint16 index, uint256 newMaxDeposit)\n external\n {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n\n uint64 routingId = chainId.routingId;\n uint64 vmId = chainId.vmId;\n\n uint256 oldMaxDeposit = assets.registry[index].data[routingId][vmId].max1hrDeposits;\n assets.registry[index].data[routingId][vmId].max1hrDeposits = newMaxDeposit;\n emit Max1HrDepositChanged(chainId, index, oldMaxDeposit, newMaxDeposit);\n }\n\n function setMinWeight(ChainId calldata chain, uint16 index, uint256 newMinWeight) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n uint256 oldMinWeight = assets.registry[index].data[chain.routingId][chain.vmId].minWeight;\n assets.registry[index].data[chain.routingId][chain.vmId].minWeight = newMinWeight;\n emit MinWeightChanged(chain, index, oldMinWeight, newMinWeight);\n }\n\n /**\n * @notice Retrieves asset data for a specific asset and chain.\n * @param chainId the chain ID to query.\n * @param index The asset index to query.\n * @return The corresponding AssetData struct.\n */\n function getAssetData(ChainId calldata chainId, uint16 index)\n external\n view\n returns (AssetData memory)\n {\n return assets.registry[index].data[chainId.routingId][chainId.vmId];\n }\n\n /**\n * @notice Returns all registered asset data across all chains.\n * @return An array of AssetData structs.\n * @param start The start index (inclusive).\n * @param end The end index (not-inclusive).\n */\n function getAssets(uint16 start, uint16 end) external view returns (AssetData[] memory) {\n // First, compute the total flattened entries\n uint256 totalEntries = 0;\n for (uint16 i = 0; i < assets.count; i++) {\n totalEntries += assets.registry[i].chains.length;\n }\n\n // Return empty array if start >= totalEntries\n if (start >= totalEntries) {\n return new AssetData[](0);\n }\n\n if (end > totalEntries) {\n // casting to 'uint16' is safe because we won't ever that many assets.\n // forge-lint: disable-next-line(unsafe-typecast)\n end = uint16(totalEntries);\n }\n\n if (end < start) {\n return new AssetData[](0);\n }\n\n uint16 length = end - start;\n AssetData[] memory result = new AssetData[](length);\n\n uint256 r = 0;\n uint256 resIdx = 0;\n\n for (uint16 i = 0; i < assets.count && resIdx < length; ++i) {\n Asset storage asset = assets.registry[i];\n uint256 chainsLen = asset.chains.length;\n\n for (uint256 c = 0; c < chainsLen && resIdx < length; ++c) {\n if (r >= start && r < end) {\n ChainId storage chain = asset.chains[c];\n result[resIdx++] = asset.data[chain.routingId][chain.vmId];\n }\n\n ++r;\n }\n }\n\n return result;\n }\n\n /**\n * @notice Returns the asset index for a given chain and address.\n * @param chainId The chain ID to search.\n * @param assetAddress The asset address (as bytes32).\n * @return The index of the asset, or `type(uint32).max` if not found.\n */\n function getAssetIndex(ChainId calldata chainId, bytes32 assetAddress)\n external\n view\n returns (uint32)\n {\n uint64 routingId = chainId.routingId;\n uint64 vmId = chainId.vmId;\n\n for (uint16 i = 0; i < assets.count; i++) {\n if (assetAddress == assets.registry[i].data[routingId][vmId].assetAddress) {\n return i;\n }\n }\n return type(uint32).max;\n }\n\n /**\n * @notice Sets pending risk parameters for a specific asset index.\n * @param index The asset index.\n * @param parameters The risk parameters to set\n * @dev Reverts with `NotRiskManager`; Only the risk manager can set risk parameters.\n * @dev Reverts with `\"!asset\"` if index >= assets.count.\n */\n function setPendingRiskParameters(uint16 index, RiskParameters memory parameters) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n validateRiskParameters(parameters);\n PendingRiskParameters memory pendingParams = PendingRiskParameters({\n parameters: parameters, validAfter: block.timestamp + riskParameterChangeDelaySeconds\n });\n pendingRiskParameters[index] = pendingParams;\n }\n\n /**\n * @notice Applies the pending risk parameters for the specified asset if they exist.\n * @param index The asset index.\n * @dev Reverts with `\"!asset\"` if index >= assets.count.\n * @dev Reverts with `NoPendingRiskParameters` if there are no pending risk parameters for the specified asset\n * @dev Reverts with `TooSoon` if the pending risk parameters are not yet eligible\n */\n function applyPendingRiskParameters(uint16 index) external {\n require(index < assets.count, \"!asset\");\n PendingRiskParameters memory pendingParams = pendingRiskParameters[index];\n if (pendingParams.validAfter == 0) revert NoPendingRiskParameters(index);\n if (pendingParams.validAfter >= block.timestamp) {\n revert TooSoon(index, pendingParams.validAfter);\n }\n RiskParameters memory params = pendingParams.parameters;\n validateRiskParameters(params);\n riskParameters[index] = params;\n delete pendingRiskParameters[index];\n }\n\n function validateRiskParameters(RiskParameters memory params) public pure {\n if (params.collateralFactor > 1e2) revert InvalidCollateralFactor();\n if (params.liabilityFactor > 1e2) revert InvalidLiabilityFactor();\n if (params.maxUtilization > 1e18) revert InvalidUtilizationCap();\n if (params.maxFundingRate > 1142) revert InvalidMaxFundingRate();\n if (params.maxUtilizationRate > 1142) revert InvalidMaxUtilizationRate();\n\n uint256 bufferMultiple = params.bufferMultiple;\n if (bufferMultiple < 1e6 || bufferMultiple > 2e6) revert InvalidBufferMultiple();\n\n if (!validateStartAtZeroIsAlwaysBelowOneAndIncreases(params.interestKinks)) {\n revert InvalidInterestKinks();\n }\n if (!validateLastIsOne(params.interestKinks)) revert InvalidInterestKinks();\n if (!validateStartAtZeroIsAlwaysBelowOneAndIncreases(params.usdInterestKinks)) {\n revert InvalidUSDInterestKinks();\n }\n if (!validateLastIsOne(params.usdInterestKinks)) revert InvalidUSDInterestKinks();\n\n if (!validateIncreases(params.kinkInterestRates)) {\n revert InvalidRateInterestKinks();\n }\n if (!validateIncreases(params.usdKinkInterestRates)) {\n revert InvalidUSDRateInterestKinks();\n }\n\n if (params.initialMarginClamps.length != params.initialMarginFactors.length) {\n revert InvalidInitialMarginsConfiguration();\n }\n if (!validateStartAtZeroIsAlwaysBelowOneAndIncreases(params.initialMarginClamps)) {\n revert InvalidInitialMarginsClamps();\n }\n if (!validateIMFactors(params.initialMarginFactors)) revert InvalidInitialMarginsFactors();\n }\n\n /**\n * @notice Last point should be (1_000_000)\n */\n function validateLastIsOne(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n return len != 0 && xs[len - 1] == 1_000_000;\n }\n\n /**\n * @notice Validate that a series of values is increasing\n */\n function validateIncreases(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n uint256 prev = 0;\n\n for (uint256 i; i < len; ++i) {\n uint256 cur = xs[i];\n if (cur < prev) return false;\n prev = cur;\n }\n\n return true;\n }\n\n /**\n * @notice IM clamps must always increase and be <= 1 (1_000_000), and first point must be 0\n */\n function validateStartAtZeroIsAlwaysBelowOneAndIncreases(uint256[] memory xs)\n internal\n pure\n returns (bool)\n {\n uint256 len = xs.length;\n uint256 prev = 0;\n\n if (len == 0 || xs[0] != 0) {\n return false;\n }\n\n for (uint256 i; i < len; ++i) {\n uint256 cur = xs[i];\n if (cur > 1_000_000) return false;\n if (cur < prev) return false;\n prev = cur;\n }\n\n return true;\n }\n\n /**\n * @notice IM factors must always decreases and be < 1 (1_000_000)\n */\n function validateIMFactors(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n uint256 prev = 999_999;\n\n for (uint256 i; i < len; ++i) {\n uint256 cur = xs[i];\n if (cur > prev) return false;\n prev = cur;\n }\n\n return true;\n }\n\n function sumIsOne(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n uint256 sum;\n\n for (uint256 i; i < len; ++i) {\n sum += xs[i];\n if (sum > 1e6) return false;\n }\n\n return sum == 1e6;\n }\n\n /**\n * @notice Returns the full list of risk parameters for all registered assets.\n * @return An array of RiskParameters.\n * @param start The start index (inclusive).\n * @param end The end index (not inclusive).\n */\n function getRiskParameters(uint16 start, uint16 end)\n external\n view\n returns (RiskParameters[] memory)\n {\n uint16 count = uint16(assets.count);\n\n if (start >= count) {\n return new RiskParameters[](0);\n }\n\n if (end > count) {\n end = count;\n }\n\n if (end < start) {\n return new RiskParameters[](0);\n }\n\n uint256 length = end - start;\n RiskParameters[] memory result = new RiskParameters[](length);\n\n for (uint16 i = 0; i < length; ++i) {\n result[i] = riskParameters[start + i];\n }\n\n return result;\n }\n\n function setFeeAccount(bytes32 account) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n feeAccount = account;\n }\n}\n","urls":[]},"src/interfaces/IAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IAdminUpdateStrategy {\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable;\n}\n","urls":[]},"src/interfaces/IAtomicSettlementCallback.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IAtomicSettlementCallback {\n /// @notice Computes the minimum expected quantity of `token` that will be\n /// received by the deposit vault upon execution of an atomic\n /// settlement request\n function onAtomicSettlement(address token, uint256 amount, bytes calldata data)\n external\n returns (uint256);\n}\n","urls":[]},"src/interfaces/IAutomataDcapAttestation.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @notice Interface for Automata's DCAP Attestation Verifier (V3)\n/// @dev Bindings for the 'AutomataDcapAttestation' contract.\n/// Compatible with Automata V3 ZK Coprocessor logic.\ninterface IAutomataDcapAttestation {\n // Enum definition from Automata's library\n enum ZkCoProcessorType {\n RiscZero,\n Succinct // SP1\n }\n\n /// @notice Verifies a SNARK proof (Groth16) for a TEE Quote.\n /// @param output The Public Values (Journal) - effectively the Quote Body.\n /// @param zkvm The type of ZKVM used.\n /// @param proofBytes The actual (Groth16) proof.\n /// @return success True if valid.\n /// @return errorData Error message if failed, or empty if success.\n function verifyAndAttestWithZKProof(\n bytes calldata output,\n ZkCoProcessorType zkvm,\n bytes calldata proofBytes\n ) external returns (bool success, bytes memory errorData);\n}\n","urls":[]},"src/interfaces/ICheckpointer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface ICheckpointer {\n struct Checkpoint {\n uint256 nonce;\n uint8[] stateRoot;\n string[] approvedWithdrawals;\n }\n\n error AlreadySet();\n error InvalidSignature();\n error NotAdmin();\n error NotCouncilMultisig();\n\n event Withdrawals(string[] approvedWithdrawals);\n\n function CHECKPOINT_TYPEHASH() external view returns (bytes32);\n function admin() external view returns (address);\n function checkpoint(\n bytes memory sharedSignature,\n bytes memory leaderSignature,\n Checkpoint memory _checkpoint\n ) external;\n function councilMultisig() external view returns (address);\n function leader() external view returns (address);\n function setAdmin(address newAdmin) external;\n function setDomainSeparator(bytes32 domainSeparator) external;\n function setInitialCouncilMultisig(address newCouncilMultisig) external;\n function setLeader(address newLeader) external;\n function setNewCouncilMultisig(address newCouncilMultisig) external;\n function stateRoot(uint256) external view returns (uint8);\n function stateRootNonce() external view returns (uint256);\n}\n","urls":[]},"src/interfaces/ICredentialManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface ICredentialManager {\n struct ChainConfig {\n uint64 blockTimeMs;\n uint8 defaultConfirmations;\n uint8 depositIngestConfirmations;\n uint8 withdrawalIngestConfirmations;\n uint8 settlementIngestConfirmations;\n }\n\n struct MeasurementProfile {\n bool active;\n bytes32 mrtd;\n bytes32 rtmr0;\n bytes32 rtmr1;\n bytes32 rtmr2;\n bytes32 rtmr3;\n }\n\n struct Vault {\n uint8 routingId;\n uint256 vmId;\n bytes32 vaultAddress;\n ChainConfig config;\n }\n\n error AmbiguousState();\n error CannotCancel();\n error GatheringActive();\n error GatheringNotActive();\n error GatheringNotExpired();\n error InsufficientSignatures(uint256 provided, uint256 required);\n error InvalidDelay(uint256 delay);\n error InvalidEpoch(uint256 expected, uint256 actual);\n error InvalidProfileConfig();\n error InvalidProfileId();\n error InvalidCommittee(uint256 newCommittee, uint256 operatorCount);\n error InvalidQuoteLength();\n error InvalidReportData();\n error InvalidVaultAddr();\n error InvalidVerifier();\n error MeasurementMismatch(bytes32 expected, bytes32 actual, string field);\n error NoCandidate();\n error NoStrategy();\n error NotOperator(address signer);\n error ProfileInactive(uint256 profileId);\n error ProposedEpochTooLow(uint256 current, uint256 proposed);\n error SignersNotSortedOrUnique();\n error StrategyAlreadyExists();\n error TimelockAlreadyCanceled(bytes32 opId);\n error TimelockAlreadyExecuted(bytes32 opId);\n error TimelockNotReady(bytes32 opId, uint256 readyAt, uint256 nowTs);\n error TimelockUnknown(bytes32 opId);\n error VaultNotFound(uint256 routingId, uint256 vmId);\n error ZeroAddress();\n\n event AdminUpdateStrategyRegistered(\n uint256 indexed routingId, uint256 indexed vmId, address strategy\n );\n event AttestedKeyRegistered(address indexed operator, bytes32 indexed newAttestedKey);\n event AutomataVerifierUpdated(address indexed oldVerifier, address indexed newVerifier);\n event DepositVaultAdministratorsUpdated(\n uint256 indexed routingId,\n uint256 indexed vmId,\n address[] newAdministrators,\n uint256 newWithdrawalQuorum\n );\n event DepositVaultAdministratorsUpdated(\n uint256 indexed chainId, address[] newAdministrators, uint256 newWithdrawalQuorum\n );\n event EpochIncremented(uint256 newEpoch, bytes32 newCheckpointHash);\n event LeaderUpdated(address indexed newLeader, bytes32 indexed newAttestedKey);\n event MeasurementProfileUpdated(uint256 indexed profileId, bool active);\n event MeasurementsUpdated(bytes32 newMrtd, bytes32 newRtmr0);\n event OperationCanceled(bytes32 indexed opId, bytes32 indexed opType);\n event OperationExecuted(bytes32 indexed opId, bytes32 indexed opType);\n event OperationScheduled(bytes32 indexed opId, bytes32 indexed opType, uint256 eta);\n event OperatorAdded(address indexed operator);\n event CommitteeThresholdUpdated(uint256 oldThreshold, uint256 newThreshold);\n event RegistryUpdated(address indexed oldRegistry, address indexed newRegistry);\n event RestartAmbiguityDetected(uint256 epoch, bytes32 hash1, bytes32 hash2);\n event RestartCandidateSubmitted(address indexed leader, uint256 epoch, bytes32 checkpointHash);\n event RestartExecuted(address indexed newLeader, uint256 indexed epoch);\n event RestartGatheringStarted(uint256 deadline);\n event RiskManagerUpdated(address indexed oldRiskManager, address indexed newRiskManager);\n event TimelockDelayUpdated(bytes32 indexed targetOpType, uint256 oldDelay, uint256 newDelay);\n event VaultAdded(\n uint256 indexed routingId, uint256 indexed vmId, bytes32 vaultAddr, ChainConfig config\n );\n\n receive() external payable;\n\n function GATHERING_DURATION() external view returns (uint256);\n function OP_ADD_VAULT() external view returns (bytes32);\n function OP_APPOINT_LEADER() external view returns (bytes32);\n function OP_CANCEL_TIMELOCK() external view returns (bytes32);\n function OP_MANAGE_PROFILE() external view returns (bytes32);\n function OP_REGISTER_STRATEGY() external view returns (bytes32);\n function OP_RESTART() external view returns (bytes32);\n function OP_SET_AUTOMATA_VERIFIER() external view returns (bytes32);\n function OP_SET_DELAY() external view returns (bytes32);\n function OP_SET_MEASUREMENTS() external view returns (bytes32);\n function OP_SET_COMMITTEE() external view returns (bytes32);\n function OP_SET_REGISTRY() external view returns (bytes32);\n function OP_SET_RISK_MANAGER() external view returns (bytes32);\n function OP_SET_VAULT_ADMINS() external view returns (bytes32);\n function OP_WITHDRAW() external view returns (bytes32);\n function addVault(\n uint8 routingId,\n uint256 vmId,\n bytes32 vaultAddr,\n ChainConfig memory config,\n address[] memory signers,\n bytes[] memory signatures\n ) external;\n function admin() external view returns (address);\n function adminUpdateStrategies(uint256, uint256) external view returns (address);\n function appointLeader(address newLeader, address[] memory signers, bytes[] memory signatures)\n external;\n function automataVerifier() external view returns (address);\n function bestCandidate()\n external\n view\n returns (address leader, uint256 epoch, bytes32 checkpointHash, bool exists);\n function cancelTimelock(bytes32 opId, address[] memory signers, bytes[] memory signatures)\n external;\n function domainSeparator() external view returns (bytes32);\n function epoch() external view returns (uint256);\n function executeManageProfile(uint256 profileId, MeasurementProfile memory profile) external;\n function executeRegistryContract(address newRegistry) external;\n function executeRiskManager(address newRiskManager) external;\n function executeUpdateAutomataVerifier(address newVerifier) external;\n function getCouncilConfig()\n external\n view\n returns (address[] memory members, uint256 k, uint256 n);\n function getLeader() external view returns (address operator, bytes32 attestedKey);\n function getVaults(uint16 start, uint16 end) external view returns (Vault[] memory);\n function governanceNonce() external view returns (uint256);\n function initiateRestart() external;\n function isOperator(address) external view returns (bool);\n function isRestartAmbiguous() external view returns (bool);\n function latestCheckpointHash() external view returns (bytes32);\n function leader() external view returns (address);\n function measurementProfiles(uint256)\n external\n view\n returns (\n bool active,\n bytes32 mrtd,\n bytes32 rtmr0,\n bytes32 rtmr1,\n bytes32 rtmr2,\n bytes32 rtmr3\n );\n function nextProfileId() external view returns (uint256);\n function operatorToAttestedKey(address) external view returns (bytes32);\n function operators(uint256) external view returns (address);\n function committeeThreshold() external view returns (uint256);\n function registerAdminUpdateStrategy(\n uint8 routingId,\n uint256 vmId,\n address strategy,\n address[] memory signers,\n bytes[] memory signatures\n ) external;\n function registerAttestedKey(bytes32 newAttestedKey) external;\n function registryContract() external view returns (address);\n function resolveRestart() external;\n function restartGatheringDeadline() external view returns (uint256);\n function riskManager() external view returns (address);\n function scheduleManageProfile(\n uint256 profileId,\n MeasurementProfile memory profile,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function scheduleRegistryContract(\n address newRegistry,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function scheduleRiskManager(\n address newRiskManager,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function scheduleUpdateAutomataVerifier(\n address newVerifier,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function setDepositVaultAdministrators(\n uint256 routingId,\n uint256 vmId,\n address[] memory newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable;\n function submitRestartProof(\n uint256 profileId,\n bytes memory tdxReportBody,\n bytes memory zkProof,\n address newLeader,\n bytes32 checkpointHash\n ) external;\n function timelockDelayFor(bytes32) external view returns (uint256);\n function timelockOps(bytes32)\n external\n view\n returns (uint64 eta, bool executed, bool canceled, bytes32 opType);\n function updateCommitteeThreshold(\n uint256 newThreshold,\n address[] memory signers,\n bytes[] memory signatures\n ) external;\n function vaults(uint256)\n external\n view\n returns (uint8 routingId, uint256 vmId, bytes32 vaultAddress, ChainConfig memory config);\n function verifyMeasurements(\n uint256 profileId,\n bytes32 checkMrtd,\n bytes32 checkRtmr0,\n bytes32 checkRtmr1,\n bytes32 checkRtmr2,\n bytes32 checkRtmr3\n ) external view;\n function withdraw(address account, address[] memory signers, bytes[] memory signatures) external;\n}\n","urls":[]},"src/interfaces/IDepositVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IDepositVault {\n struct Settlement {\n address tokenOut;\n uint256 amountOut;\n address tokenIn;\n uint256 amountIn;\n bytes32 user;\n uint64 account;\n uint256 nonce;\n uint256 validUntil;\n }\n\n struct SignedSettlement {\n Settlement settlement;\n bytes clearingEngineSignature;\n }\n\n struct Withdrawal {\n address tokenAddress;\n uint256 amount;\n uint256 nonce;\n }\n\n error EmptyOrders();\n error Expired();\n error InsufficientAdministrators(uint256 actual, uint256 required);\n error InsufficientAmountFromExecutor(uint256 actual, uint256 required);\n error InsufficientCallbackReturnForSettlement(\n uint256 settlementIndex, uint256 actual, uint256 required\n );\n error InvalidNonce(uint256 expected, uint256 given);\n error InvalidSignature();\n error MissedQuorum(uint256 provided, uint256 required);\n error NotAdmin();\n error NotCredentialManager();\n error NotExecutor();\n error NotOwner();\n error PayloadMismatch();\n error SettlerNotApproved();\n error TooSoon();\n error ZeroAddress();\n error ZeroWithdrawalQuorum();\n\n event AdminAdded(address newAdmin, uint256 numAdminsAfter);\n event AdministratorSetReset();\n event CredentialManagerChanged(address oldCredentialManager, address newCredentialManager);\n event Deposited(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n event Settled(\n bytes32 indexed user,\n uint64 indexed account,\n uint256 indexed nonce,\n address tokenOut,\n uint256 amountOut,\n address tokenIn,\n uint256 amountIn\n );\n event WithdrawalQuorumChanged(uint256 previous, uint256 current);\n event Withdrew(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n\n function SETTLEMENT_TYPEHASH() external view returns (bytes32);\n function addSettlerExecutor(bytes32 settler, address executor) external;\n function administrators(uint256) external view returns (address);\n function approvedSettlers(uint256) external view returns (bytes32);\n function canDeposit(address) external view returns (bool);\n function credentialManager() external view returns (address);\n function credentialManagerChangeDelayBlocks() external view returns (uint256);\n function deposit(bytes32 user, address tokenAddress, uint256 amount) external;\n function depositCounts(bytes32) external view returns (uint256);\n function executeAtomicSettlement(\n Settlement memory order,\n bytes memory data,\n bytes memory signature\n ) external;\n function executeSquashingSettlements(\n SignedSettlement[] memory requests,\n bytes[] memory data,\n bytes32 settler\n ) external;\n function getApprovedSettlers() external view returns (bytes32[] memory);\n function isAdministrator(address account) external view returns (bool);\n function lastSignatureUse() external view returns (uint256);\n function owner() external view returns (address);\n function ownerWithdrawToken(address token, address to, uint256 amount) external;\n function pendingSettlements(bytes32, uint64, uint256)\n external\n view\n returns (Settlement memory settlement, address target);\n function pullBatchSettlements(\n SignedSettlement[] memory orders,\n bytes32 user,\n uint64 account,\n address target,\n uint256 validUntil\n ) external;\n function pushBatchSettlements(bytes32 user, uint64 account) external;\n function removeSettler(bytes32 settler) external;\n function setAdministrators(address[] memory newAdministrators, uint256 newWithdrawalQuorum)\n external;\n function setCredentialManager(address newCredentialManager) external;\n function setDepositorStatus(address depositor, bool allowed) external;\n function setDomainSeparator(bytes32 domainSeparator) external;\n function setOwner(address newOwner) external;\n function settlementCaps(address) external view returns (uint256);\n function settlementCounts(bytes32, uint64) external view returns (uint256);\n function withdraw(\n Withdrawal memory withdrawal,\n bytes32 user,\n address target,\n uint256 validUntil,\n bytes32 epochHash,\n bytes[] memory signatures\n ) external;\n function withdrawalCounts(bytes32) external view returns (uint256);\n function withdrawalQuorum() external view returns (uint256);\n}\n","urls":[]},"src/interfaces/IRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IRegistry {\n struct AssetData {\n uint16 index;\n bytes32 assetAddress;\n uint64 chainId;\n uint256 maxDeposits;\n uint256 max1hrDeposits;\n uint256 minWeight;\n }\n\n struct RiskParameters {\n uint8 collateralFactor;\n uint8 liabilityFactor;\n uint256 maxCollateral;\n uint256 maxOpenInterest;\n uint256 maxSpotOpenInterest;\n uint256 maxUtilization;\n bool isolatedOnly;\n uint256[] interestKinks;\n uint256[] kinkInterestRates;\n uint256[] usdInterestKinks;\n uint256[] usdKinkInterestRates;\n uint256 skewModifier;\n uint256 skewCliff;\n int256 baseFundingRate;\n uint256 premiumClamp;\n uint256[] initialMarginClamps;\n uint256[] initialMarginFactors;\n uint256 maxFundingRate;\n uint256 maxUtilizationRate;\n uint256 bufferMultiple;\n }\n\n error ChainAlreadyExists();\n error IndexOutOfBounds();\n error InvalidBufferMultiple();\n error InvalidCollateralFactor();\n error InvalidInitialMarginsClamps();\n error InvalidInitialMarginsConfiguration();\n error InvalidInitialMarginsFactors();\n error InvalidInterestKinks();\n error InvalidLiabilityFactor();\n error InvalidMaxFundingRate();\n error InvalidMaxUtilizationRate();\n error InvalidRateInterestKinks();\n error InvalidUSDInterestKinks();\n error InvalidUSDRateInterestKinks();\n error InvalidUtilizationCap();\n error NoPendingRiskParameters(uint16 asset);\n error NotAdmin();\n error NotRiskManager();\n error RiskManagerNotSet();\n error TooSoon(uint16 asset, uint256 eligibleAt);\n error ZeroAddress();\n\n event Max1HrDepositChanged(uint64 chain, uint16 index, uint256 previous, uint256 current);\n event MaxDepositChanged(uint64 chain, uint16 index, uint256 previous, uint256 current);\n event MinWeightChanged(uint64 chain, uint16 index, uint256 previous, uint256 current);\n\n function admin() external view returns (address);\n function applyPendingRiskParameters(uint16 index) external;\n function feeAccount() external view returns (bytes32);\n function getAssetData(uint64 chainId, uint16 index) external view returns (AssetData memory);\n function getAssetIndex(uint64 chainId, bytes32 assetAddress) external view returns (uint32);\n function getAssets(uint16 start, uint16 end) external view returns (AssetData[] memory);\n function getRiskParameters(uint16 start, uint16 end)\n external\n view\n returns (RiskParameters[] memory);\n function pendingRiskParameters(uint16)\n external\n view\n returns (RiskParameters memory parameters, uint256 validAfter);\n function riskManagerMultisig() external view returns (address);\n function riskParameterChangeDelaySeconds() external view returns (uint256);\n function riskParameters(uint16)\n external\n view\n returns (\n uint8 collateralFactor,\n uint8 liabilityFactor,\n uint256 maxCollateral,\n uint256 maxOpenInterest,\n uint256 maxSpotOpenInterest,\n uint256 maxUtilization,\n bool isolatedOnly,\n uint256 skewModifier,\n uint256 skewCliff,\n int256 baseFundingRate,\n uint256 premiumClamp,\n uint256 maxFundingRate,\n uint256 maxUtilizationRate,\n uint256 bufferMultiple\n );\n function setAdmin(address newAdmin) external;\n function setAssetData(AssetData memory data) external;\n function setFeeAccount(bytes32 account) external;\n function setMax1HrDeposits(uint16 chain, uint16 index, uint256 newMaxDeposit) external;\n function setMaxDeposits(uint16 chain, uint16 index, uint256 newMaxDeposit) external;\n function setMinWeight(uint16 chain, uint16 index, uint256 newMinWeight) external;\n function setPendingRiskParameters(uint16 index, RiskParameters memory parameters) external;\n function setRiskManagerMultisig(address multisig) external;\n function validateRiskParameters(RiskParameters memory params) external pure;\n}\n","urls":[]},"src/strategies/ArbitrumOneAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {IInbox} from \"nitro-contracts/bridge/IInbox.sol\";\nimport {IDepositVault} from \"../interfaces/IDepositVault.sol\";\nimport {IAdminUpdateStrategy} from \"../interfaces/IAdminUpdateStrategy.sol\";\n\ncontract ArbitrumOneAdminUpdateStrategy is IAdminUpdateStrategy {\n address public constant INBOX = 0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f;\n\n uint256 constant MAX_SUBMISSION_COST = 0.02 ether;\n uint256 constant GAS_LIMIT = 3_000_000;\n uint256 constant MAX_FEE_PER_GAS = 5 gwei;\n\n /// @notice Reverts if not enough value was sent to the update method.\n error InsufficientMsgValue(uint256 actual, uint256 expected);\n\n /**\n * @notice Updates the administrator set and withdrawal quorum on a vault via a retryable ticket.\n * @dev This function forwards a cross-chain call to the target `vault` using Arbitrum's\n * retryable ticket mechanism. The credential manager must supply sufficient `msg.value` to cover\n * the maximum submission cost and gas fees for execution on the destination chain.\n *\n * @param vault The address of the vault contract whose administrators will be updated.\n * @param newAdministrators The complete list of administrator addresses to set on the vault.\n * @param newWithdrawalQuorum The new quorum required for withdrawals.\n *\n * @dev Reverts with {InsufficientMsgValue} if `msg.value` is less than\n * `MAX_SUBMISSION_COST + GAS_LIMIT * MAX_FEE_PER_GAS`.\n */\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable override {\n uint256 expectedValue =\n MAX_SUBMISSION_COST + GAS_LIMIT * MAX_FEE_PER_GAS;\n uint256 actualValue = msg.value;\n\n if (actualValue < expectedValue) {\n revert InsufficientMsgValue(actualValue, expectedValue);\n }\n\n bytes memory callData = abi.encodeWithSelector(\n IDepositVault.setAdministrators.selector, newAdministrators, newWithdrawalQuorum\n );\n\n IInbox inbox = IInbox(address(INBOX));\n inbox.createRetryableTicket{value: msg.value}(\n vault,\n 0,\n MAX_SUBMISSION_COST,\n msg.sender,\n msg.sender,\n GAS_LIMIT,\n MAX_FEE_PER_GAS,\n callData\n );\n }\n}\n","urls":[]},"src/strategies/IntraChainAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {IAdminUpdateStrategy} from \"../interfaces/IAdminUpdateStrategy.sol\";\nimport {IDepositVault} from \"../interfaces/IDepositVault.sol\";\n\n/// Use this strategy when updating the vault on the same chain as the credential manager.\ncontract IntraChainAdminUpdateStrategy is IAdminUpdateStrategy {\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable {\n IDepositVault(vault).setAdministrators(newAdministrators, newWithdrawalQuorum);\n }\n}\n","urls":[]},"src/strategies/OPStackAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {IDepositVault} from \"../interfaces/IDepositVault.sol\";\nimport {IAdminUpdateStrategy} from \"../interfaces/IAdminUpdateStrategy.sol\";\n\ninterface IL1CrossDomainMessenger {\n function sendMessage(address _target, bytes calldata _message, uint32 _minGasLimit)\n external\n payable;\n}\n\n/// @notice Admin update strategy for OP Stack chains (Optimism, Base, Unichain, etc)\ncontract OPStackAdminUpdateStrategy is IAdminUpdateStrategy {\n /// @notice L1 CrossDomainMessenger.\n address public immutable L1_CROSS_DOMAIN_MESSENGER;\n\n /// @notice Conservative gas limit for L2 execution.\n uint32 public constant L2_GAS_LIMIT = 3_000_000;\n\n /// @notice Reverts if messenger address is zero.\n error ZeroMessengerAddress();\n\n constructor(address l1CrossDomainMessenger) {\n if (l1CrossDomainMessenger == address(0)) revert ZeroMessengerAddress();\n L1_CROSS_DOMAIN_MESSENGER = l1CrossDomainMessenger;\n }\n\n /**\n * @notice Updates the administrator set and withdrawal quorum on an OP Stack L2 vault\n * @dev Sends a cross-domain message from L1 \u2192 L2 using the OP Stack messenger\n * @dev Forwards msg.value directly to the L1 messenger\n *\n * @param vault The L2 vault address\n * @param newAdministrators The full administrator set\n * @param newWithdrawalQuorum The withdrawal quorum\n */\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable override {\n bytes memory callData = abi.encodeWithSelector(\n IDepositVault.setAdministrators.selector, newAdministrators, newWithdrawalQuorum\n );\n\n IL1CrossDomainMessenger(L1_CROSS_DOMAIN_MESSENGER).sendMessage{value: msg.value}(\n vault, callData, L2_GAS_LIMIT\n );\n }\n}\n","urls":[]}}} \ No newline at end of file +{"compilers":[{"contractTypes":["SigTest","MockTarget"],"name":"solidity","settings":{"optimizer":{"enabled":true,"runs":200},"outputSelection":{"src/.cache/solady/main/src/utils/ECDSA.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/EfficientHashLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/SafeTransferLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]}},"remappings":["solady=src/.cache/solady/main/src"],"viaIR":true},"version":"0.8.28+commit.7893614a"},{"contractTypes":["DepositVault","IntraChainAdminUpdateStrategy","IRegistry","OPStackAdminUpdateStrategy","SignatureTest","ICheckpointer","IAutomataDcapAttestation","IAtomicSettlementCallback","IAdminUpdateStrategy","ICredentialManager","ArbitrumOneAdminUpdateStrategy","IDepositVault","Settler","Checkpointer","CredentialManager","Registry","IL1CrossDomainMessenger"],"name":"solidity","settings":{"optimizer":{"enabled":true,"runs":200},"outputSelection":{"src/.cache/solady/main/src/utils/ECDSA.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/EfficientHashLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/.cache/solady/main/src/utils/SafeTransferLib.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/DepositVault.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IAtomicSettlementCallback.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/ICredentialManager.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IDepositVault.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]},"src/interfaces/IRegistry.sol":{"":["ast"],"*":["abi","bin-runtime","devdoc","userdoc","evm.bytecode.object","evm.bytecode.sourceMap","evm.deployedBytecode.object"]}},"remappings":["solady=src/.cache/solady/main/src"],"viaIR":true},"version":"0.8.30+commit.73712a01"}],"contractTypes":{"ArbitrumOneAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"InsufficientMsgValue","type":"error"},{"inputs":[],"name":"INBOX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"ArbitrumOneAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x608080604052346015576102a4908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c8063075034ae146100615763b70106971461002f575f80fd5b3461005d575f36600319011261005d576020604051734dbd4fc535ac27206064b68ffcf827b0a60bab3f8152f35b5f80fd5b606036600319011261005d576004356001600160a01b0381169081900361005d5760243567ffffffffffffffff811161005d573660238201121561005d5780600401359167ffffffffffffffff831161005d573660248460051b8401011161005d57667c585087238000341061021a576040519160208301936323c5673160e01b8552806064850160406024870152526024608485019201905f905b8082106101f0578660208761012488610127838a604435604483015203601f198101855284610238565b604051948593849263679b6ded60e01b845260048401525f602484015266470de4df8200006044840152336064840152336084840152622dc6c060a484015264012a05f20060c484015261010060e4840152518091816101048501528484015e5f828201840152601f01601f1916810103018134734dbd4fc535ac27206064b68ffcf827b0a60bab3f5af180156101e5576101be57005b602090813d83116101de575b6101d48183610238565b8101031261005d57005b503d6101ca565b6040513d5f823e3d90fd5b90919283359060018060a01b03821680920361005d576020816001938293520194019201906100fd565b631f2dda7760e21b5f5234600452667c58508723800060245260445ffd5b90601f8019910116810190811067ffffffffffffffff82111761025a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a0cf18539bc390feb28cfdf16a27fe0da61073e697506455cb8f013889eda9fa64736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{"setAdministrators(address,address[],uint256)":{"details":"This function forwards a cross-chain call to the target `vault` using Arbitrum's retryable ticket mechanism. The credential manager must supply sufficient `msg.value` to cover the maximum submission cost and gas fees for execution on the destination chain.Reverts with {InsufficientMsgValue} if `msg.value` is less than `MAX_SUBMISSION_COST + GAS_LIMIT * MAX_FEE_PER_GAS`.","params":{"newAdministrators":"The complete list of administrator addresses to set on the vault.","newWithdrawalQuorum":"The new quorum required for withdrawals.","vault":"The address of the vault contract whose administrators will be updated."}}},"version":1},"methodIdentifiers":{"INBOX()":"0xb7010697","setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c8063075034ae146100615763b70106971461002f575f80fd5b3461005d575f36600319011261005d576020604051734dbd4fc535ac27206064b68ffcf827b0a60bab3f8152f35b5f80fd5b606036600319011261005d576004356001600160a01b0381169081900361005d5760243567ffffffffffffffff811161005d573660238201121561005d5780600401359167ffffffffffffffff831161005d573660248460051b8401011161005d57667c585087238000341061021a576040519160208301936323c5673160e01b8552806064850160406024870152526024608485019201905f905b8082106101f0578660208761012488610127838a604435604483015203601f198101855284610238565b604051948593849263679b6ded60e01b845260048401525f602484015266470de4df8200006044840152336064840152336084840152622dc6c060a484015264012a05f20060c484015261010060e4840152518091816101048501528484015e5f828201840152601f01601f1916810103018134734dbd4fc535ac27206064b68ffcf827b0a60bab3f5af180156101e5576101be57005b602090813d83116101de575b6101d48183610238565b8101031261005d57005b503d6101ca565b6040513d5f823e3d90fd5b90919283359060018060a01b03821680920361005d576020816001938293520194019201906100fd565b631f2dda7760e21b5f5234600452667c58508723800060245260445ffd5b90601f8019910116810190811067ffffffffffffffff82111761025a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a0cf18539bc390feb28cfdf16a27fe0da61073e697506455cb8f013889eda9fa64736f6c634300081e0033"},"sourceId":"src/strategies/ArbitrumOneAdminUpdateStrategy.sol","sourcemap":"257:2167:24:-:0;;;;;;;;;;;;;;;;;","userdoc":{"errors":{"InsufficientMsgValue(uint256,uint256)":[{"notice":"Reverts if not enough value was sent to the update method."}]},"kind":"user","methods":{"setAdministrators(address,address[],uint256)":{"notice":"Updates the administrator set and withdrawal quorum on a vault via a retryable ticket."}},"version":1}},"Checkpointer":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadySet","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCouncilMultisig","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"name":"Withdrawals","type":"event"},{"inputs":[],"name":"CHECKPOINT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sharedSignature","type":"bytes"},{"internalType":"bytes","name":"leaderSignature","type":"bytes"},{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8[]","name":"stateRoot","type":"uint8[]"},{"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"internalType":"struct Checkpointer.Checkpoint","name":"_checkpoint","type":"tuple"}],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"councilMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setInitialCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"}],"name":"setLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setNewCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stateRoot","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateRootNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"Checkpointer","deploymentBytecode":{"bytecode":"0x608080604052346026575f80546001600160a01b03191633179055610b3e908161002b8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816307ddaf53146108be575080633ea987d31461086657806340eedabb1461083e5780634331e8dd146107ea5780635fa993b214610792578063704b6c02146107455780637438b937146106f657806374ebc7a0146106d95780638bbb26a314610150578063cc2fc84514610105578063e1193e4c146100cb5763f851a440146100a0575f80fd5b346100c7575f3660031901126100c7575f546040516001600160a01b039091168152602090f35b5f80fd5b346100c7575f3660031901126100c75760206040517ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d88152f35b346100c75760203660031901126100c7576004356005548110156100c75760209060055f5260ff8160051c5f516020610ae95f395f51905f52015460f86040519360031b161c168152f35b346100c75760603660031901126100c75760043567ffffffffffffffff81116100c7576101819036906004016108e1565b60243567ffffffffffffffff81116100c7576101a19036906004016108e1565b906044359267ffffffffffffffff84116100c7578360040191606060031986360301126100c757823593600354918286036100c75760248701916101e5838761090f565b906040519060208201928391905f905b8082106106b45750505090610216816044949303601f198101835282610945565b519020980194610226868861090f565b610232819c929c610967565b9b6102406040519d8e610945565b818d5260208d019160051b8101903682116100c75780925b82841061067757505050508a51986102886102728b610967565b9a6102806040519c8d610945565b808c52610967565b60208b019b90601f1901368d375f5b8d518110156102c857808c8f826102b36001956102c1936109d3565b5160208151910120926109d3565b5201610297565b506040518b5160208201919082908f905f5b81811061066157505050918161030361039f97959361039999979503601f198101835282610945565b5190206040519160208301937ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d885526040840152606083015260808201526080815261035060a082610945565b5190206004549060405190602082019261190160f01b84526022830152604282015260428152610381606282610945565b51902093849160018060a01b035f541693369161097f565b916109fb565b15610652576103996103be9360018060a01b036001541693369161097f565b15610652575f19821461063e5760016103db92016003558361090f565b929067ffffffffffffffff841161062a5768010000000000000000841161062a57600554846005558085106105a0575b509260055f528060051c5f5b81811061055e5750601f1982169091039081610500575b505061043a925061090f565b906040519082602083016020845252604082019060408460051b84010193815f90601e19813603015b838310610492577fef889901cd5d865c829bdf171647f02f76efbce3c0cba77197094981f41a727c87890388a1005b909192939496603f198782030188528535828112156100c7578301906020823592019167ffffffffffffffff81116100c75780360383136100c7576020828280600196849695859652848401375f828201840152601f01601f19160101999190910196019493019190610463565b5f9485925b80871061052a57505061043a94505f516020610ae95f395f51905f520155838061042e565b909260206105536001928961053e886109c5565b919060ff809160031b9316831b921b19161790565b940196019590610505565b5f5f5b6020811061058357505f516020610ae95f395f51905f52820155600101610417565b969060206105976001928a61053e866109c5565b92019701610561565b601f80860160051c910160051c5f516020610ae95f395f51905f520190601f8616806105f0575b505f516020610ae95f395f51905f52015b8181106105e5575061040b565b5f81556001016105d8565b7f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3daf8201908154905f199060200360031b1c169055866105c7565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b638baa579f60e01b5f5260045ffd5b82518452602093840193909201916001016102da565b833567ffffffffffffffff81116100c757820136601f820112156100c7576020916106a983923690848135910161097f565b815201930192610258565b90919283359060ff82168092036100c7576020816001938293520194019201906101f5565b346100c7575f3660031901126100c7576020600354604051908152f35b346100c75760203660031901126100c7575f546001600160a01b031633036107365760045461072757600480359055005b63a741a04560e01b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03811633036107365781156100c7576001600160a01b031916175f55005b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b03811633036107db576001600160a01b03191617600255005b638d62b6d960e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b031633036107db576bffffffffffffffffffffffff60a01b60015416176001555f80f35b346100c7575f3660031901126100c7576001546040516001600160a01b039091168152602090f35b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03163303610736576002546001600160a01b038116610727576001600160a01b03191617600255005b346100c7575f3660031901126100c7576002546001600160a01b03168152602090f35b9181601f840112156100c75782359167ffffffffffffffff83116100c757602083818601950101116100c757565b903590601e19813603018212156100c7570180359067ffffffffffffffff82116100c757602001918160051b360383136100c757565b90601f8019910116810190811067ffffffffffffffff82111761062a57604052565b67ffffffffffffffff811161062a5760051b60200190565b92919267ffffffffffffffff821161062a57604051916109a9601f8201601f191660200184610945565b8294818452818301116100c7578281602093845f960137010152565b3560ff811681036100c75790565b80518210156109e75760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b90915f91906001600160a01b03821615610ae05760405192600484019460248501956044860192853b15610a6457509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b979650509050815180604014610abb57604114610a815750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052610a99565b505050505f9056fe036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0a26469706673582212208508d5e21daf774af722d307fef557b7ea7450df289e6a598466b060935405c764736f6c634300081e0033"},"devdoc":{"details":"Designed for use in DStack-like distributed settlement systems.","events":{"Withdrawals(string[])":{"params":{"approvedWithdrawals":"List of withdrawal IDs approved in the checkpoint."}}},"kind":"dev","methods":{"checkpoint(bytes,bytes,(uint256,uint8[],string[]))":{"details":"Requires valid EIP-712 signatures from both admin and leader.","params":{"_checkpoint":"The checkpoint payload to commit.","leaderSignature":"Signature by the leader.","sharedSignature":"Signature by the admin."}},"constructor":{"details":"Sets the deployer as the initial admin."},"setAdmin(address)":{"params":{"newAdmin":"The new admin address."}},"setDomainSeparator(bytes32)":{"params":{"domainSeparator":"The domain separator to store."}},"setInitialCouncilMultisig(address)":{"params":{"newCouncilMultisig":"The council's Gnosis Safe address."}},"setLeader(address)":{"details":"This should be reviewed depending on the leader rotation mechanism.","params":{"newLeader":"The address of the new leader node."}},"setNewCouncilMultisig(address)":{"params":{"newCouncilMultisig":"The new multisig address."}}},"stateVariables":{"admin":{"details":"Should be set to the DStack app shared secret public key."},"councilMultisig":{"details":"Can rotate the leader and self."},"leader":{"details":"Leader is responsible for signing and submitting new checkpoints."},"stateRoot":{"details":"Serialized as `(user, eth_balance, usdc_balance, deposit_nonce, is_mm)` tuples. In production, this may store multiple roots and rotate."},"stateRootNonce":{"details":"Used to prevent replay attacks and enforce checkpoint ordering."}},"title":"Checkpointer","version":1},"methodIdentifiers":{"CHECKPOINT_TYPEHASH()":"0xe1193e4c","admin()":"0xf851a440","checkpoint(bytes,bytes,(uint256,uint8[],string[]))":"0x8bbb26a3","councilMultisig()":"0x07ddaf53","leader()":"0x40eedabb","setAdmin(address)":"0x704b6c02","setDomainSeparator(bytes32)":"0x7438b937","setInitialCouncilMultisig(address)":"0x3ea987d3","setLeader(address)":"0x4331e8dd","setNewCouncilMultisig(address)":"0x5fa993b2","stateRoot(uint256)":"0xcc2fc845","stateRootNonce()":"0x74ebc7a0"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816307ddaf53146108be575080633ea987d31461086657806340eedabb1461083e5780634331e8dd146107ea5780635fa993b214610792578063704b6c02146107455780637438b937146106f657806374ebc7a0146106d95780638bbb26a314610150578063cc2fc84514610105578063e1193e4c146100cb5763f851a440146100a0575f80fd5b346100c7575f3660031901126100c7575f546040516001600160a01b039091168152602090f35b5f80fd5b346100c7575f3660031901126100c75760206040517ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d88152f35b346100c75760203660031901126100c7576004356005548110156100c75760209060055f5260ff8160051c5f516020610ae95f395f51905f52015460f86040519360031b161c168152f35b346100c75760603660031901126100c75760043567ffffffffffffffff81116100c7576101819036906004016108e1565b60243567ffffffffffffffff81116100c7576101a19036906004016108e1565b906044359267ffffffffffffffff84116100c7578360040191606060031986360301126100c757823593600354918286036100c75760248701916101e5838761090f565b906040519060208201928391905f905b8082106106b45750505090610216816044949303601f198101835282610945565b519020980194610226868861090f565b610232819c929c610967565b9b6102406040519d8e610945565b818d5260208d019160051b8101903682116100c75780925b82841061067757505050508a51986102886102728b610967565b9a6102806040519c8d610945565b808c52610967565b60208b019b90601f1901368d375f5b8d518110156102c857808c8f826102b36001956102c1936109d3565b5160208151910120926109d3565b5201610297565b506040518b5160208201919082908f905f5b81811061066157505050918161030361039f97959361039999979503601f198101835282610945565b5190206040519160208301937ff0231fa1a05c1ebcb4f35a12b1dcea172e840b8488bfdf9a22a26a8c427f94d885526040840152606083015260808201526080815261035060a082610945565b5190206004549060405190602082019261190160f01b84526022830152604282015260428152610381606282610945565b51902093849160018060a01b035f541693369161097f565b916109fb565b15610652576103996103be9360018060a01b036001541693369161097f565b15610652575f19821461063e5760016103db92016003558361090f565b929067ffffffffffffffff841161062a5768010000000000000000841161062a57600554846005558085106105a0575b509260055f528060051c5f5b81811061055e5750601f1982169091039081610500575b505061043a925061090f565b906040519082602083016020845252604082019060408460051b84010193815f90601e19813603015b838310610492577fef889901cd5d865c829bdf171647f02f76efbce3c0cba77197094981f41a727c87890388a1005b909192939496603f198782030188528535828112156100c7578301906020823592019167ffffffffffffffff81116100c75780360383136100c7576020828280600196849695859652848401375f828201840152601f01601f19160101999190910196019493019190610463565b5f9485925b80871061052a57505061043a94505f516020610ae95f395f51905f520155838061042e565b909260206105536001928961053e886109c5565b919060ff809160031b9316831b921b19161790565b940196019590610505565b5f5f5b6020811061058357505f516020610ae95f395f51905f52820155600101610417565b969060206105976001928a61053e866109c5565b92019701610561565b601f80860160051c910160051c5f516020610ae95f395f51905f520190601f8616806105f0575b505f516020610ae95f395f51905f52015b8181106105e5575061040b565b5f81556001016105d8565b7f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3daf8201908154905f199060200360031b1c169055866105c7565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b638baa579f60e01b5f5260045ffd5b82518452602093840193909201916001016102da565b833567ffffffffffffffff81116100c757820136601f820112156100c7576020916106a983923690848135910161097f565b815201930192610258565b90919283359060ff82168092036100c7576020816001938293520194019201906101f5565b346100c7575f3660031901126100c7576020600354604051908152f35b346100c75760203660031901126100c7575f546001600160a01b031633036107365760045461072757600480359055005b63a741a04560e01b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03811633036107365781156100c7576001600160a01b031916175f55005b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b03811633036107db576001600160a01b03191617600255005b638d62b6d960e01b5f5260045ffd5b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7576002546001600160a01b031633036107db576bffffffffffffffffffffffff60a01b60015416176001555f80f35b346100c7575f3660031901126100c7576001546040516001600160a01b039091168152602090f35b346100c75760203660031901126100c7576004356001600160a01b038116908190036100c7575f546001600160a01b03163303610736576002546001600160a01b038116610727576001600160a01b03191617600255005b346100c7575f3660031901126100c7576002546001600160a01b03168152602090f35b9181601f840112156100c75782359167ffffffffffffffff83116100c757602083818601950101116100c757565b903590601e19813603018212156100c7570180359067ffffffffffffffff82116100c757602001918160051b360383136100c757565b90601f8019910116810190811067ffffffffffffffff82111761062a57604052565b67ffffffffffffffff811161062a5760051b60200190565b92919267ffffffffffffffff821161062a57604051916109a9601f8201601f191660200184610945565b8294818452818301116100c7578281602093845f960137010152565b3560ff811681036100c75790565b80518210156109e75760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b90915f91906001600160a01b03821615610ae05760405192600484019460248501956044860192853b15610a6457509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b979650509050815180604014610abb57604114610a815750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052610a99565b505050505f9056fe036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0a26469706673582212208508d5e21daf774af722d307fef557b7ea7450df289e6a598466b060935405c764736f6c634300081e0033"},"sourceId":"src/Checkpointer.sol","sourcemap":"413:6397:13:-:0;;;;;;;2546:18;413:6397;;-1:-1:-1;;;;;;413:6397:13;2554:10;413:6397;;;;;;;;;;;;;","userdoc":{"errors":{"AlreadySet()":[{"notice":"Reverts if a value has already been set."}],"InvalidSignature()":[{"notice":"Reverts if a signature does not match the expected signer or payload."}],"NotAdmin()":[{"notice":"Reverts if caller is not the admin."}],"NotCouncilMultisig()":[{"notice":"Reverts if caller is not the current council multisig."}]},"events":{"Withdrawals(string[])":{"notice":"Emitted when a new list of approved withdrawals is recorded in a checkpoint."}},"kind":"user","methods":{"CHECKPOINT_TYPEHASH()":{"notice":"Typehash used for EIP-712 encoding of the Checkpoint struct."},"admin()":{"notice":"Address with the authority to set initial parameters."},"checkpoint(bytes,bytes,(uint256,uint8[],string[]))":{"notice":"Checkpoint submitted by a node to update the system state."},"constructor":{"notice":"Contract constructor."},"councilMultisig()":{"notice":"Gnosis Safe address used as the council multisig."},"leader()":{"notice":"Public key of the current designated leader node."},"setAdmin(address)":{"notice":"Transfers admin control to a new address."},"setDomainSeparator(bytes32)":{"notice":"Sets the EIP-712 domain separator used for verifying signatures."},"setInitialCouncilMultisig(address)":{"notice":"Sets the initial council multisig address."},"setLeader(address)":{"notice":"Sets the leader node address."},"setNewCouncilMultisig(address)":{"notice":"Allows the current council to rotate itself to a new address."},"stateRoot(uint256)":{"notice":"The current state root, encoded as a serialized vector."},"stateRootNonce()":{"notice":"Monotonically increasing nonce for checkpoint submissions."}},"notice":"Tracks and validates state root checkpoints using EIP-712 signatures from admin and leader nodes.","version":1}},"CredentialManager":{"abi":[{"inputs":[{"internalType":"address[]","name":"initialOperators","type":"address[]"},{"internalType":"uint256","name":"initialCommitteeThreshold","type":"uint256"},{"internalType":"address","name":"initialRiskManager","type":"address"},{"internalType":"address","name":"initialRegistryContract","type":"address"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct CredentialManager.MeasurementProfile[]","name":"initialMeasurements","type":"tuple[]"},{"internalType":"address","name":"initialAutomataVerifier","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmbiguousState","type":"error"},{"inputs":[],"name":"CannotCancel","type":"error"},{"inputs":[],"name":"GatheringActive","type":"error"},{"inputs":[],"name":"GatheringNotActive","type":"error"},{"inputs":[],"name":"GatheringNotExpired","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientSignatures","type":"error"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"},{"internalType":"uint256","name":"operatorCount","type":"uint256"}],"name":"InvalidCommitteeThreshold","type":"error"},{"inputs":[{"internalType":"uint256","name":"delay","type":"uint256"}],"name":"InvalidDelay","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InvalidEpoch","type":"error"},{"inputs":[],"name":"InvalidProfileConfig","type":"error"},{"inputs":[],"name":"InvalidProfileId","type":"error"},{"inputs":[],"name":"InvalidQuoteLength","type":"error"},{"inputs":[],"name":"InvalidReportData","type":"error"},{"inputs":[],"name":"InvalidVaultAddr","type":"error"},{"inputs":[],"name":"InvalidVerifier","type":"error"},{"inputs":[],"name":"InvalidZkProof","type":"error"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"},{"internalType":"string","name":"field","type":"string"}],"name":"MeasurementMismatch","type":"error"},{"inputs":[],"name":"NoCandidate","type":"error"},{"inputs":[],"name":"NoStrategy","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"NotOperator","type":"error"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"}],"name":"ProfileInactive","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"proposed","type":"uint256"}],"name":"ProposedEpochTooLow","type":"error"},{"inputs":[],"name":"SignersNotSortedOrUnique","type":"error"},{"inputs":[],"name":"StrategyAlreadyExists","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyCanceled","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyExecuted","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"uint256","name":"readyAt","type":"uint256"},{"internalType":"uint256","name":"nowTs","type":"uint256"}],"name":"TimelockNotReady","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockUnknown","type":"error"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"}],"name":"VaultNotFound","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"}],"name":"AdminUpdateStrategyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"AttestedKeyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldVerifier","type":"address"},{"indexed":true,"internalType":"address","name":"newVerifier","type":"address"}],"name":"AutomataVerifierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"CommitteeThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newEpoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newCheckpointHash","type":"bytes32"}],"name":"EpochIncremented","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"LeaderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"profileId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"MeasurementProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"newMrtd","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newRtmr0","type":"bytes32"}],"name":"MeasurementsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"OperationScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRegistry","type":"address"},{"indexed":true,"internalType":"address","name":"newRegistry","type":"address"}],"name":"RegistryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash1","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash2","type":"bytes32"}],"name":"RestartAmbiguityDetected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"leader","type":"address"},{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"RestartCandidateSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"RestartExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"RestartGatheringStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRiskManager","type":"address"},{"indexed":true,"internalType":"address","name":"newRiskManager","type":"address"}],"name":"RiskManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"targetOpType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"oldDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"TimelockDelayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"indexed":false,"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"}],"name":"VaultAdded","type":"event"},{"inputs":[],"name":"GATHERING_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_ADD_VAULT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_APPOINT_LEADER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_CANCEL_TIMELOCK","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_MANAGE_PROFILE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_REGISTER_STRATEGY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_RESTART","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_AUTOMATA_VERIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_COMMITTEE_THRESHOLD","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_DELAY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_MEASUREMENTS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_REGISTRY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_RISK_MANAGER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_VAULT_ADMINS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_WITHDRAW","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"addVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"adminUpdateStrategies","outputs":[{"internalType":"contract IAdminUpdateStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"appointLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"automataVerifier","outputs":[{"internalType":"contract IAutomataDcapAttestation","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bestCandidate","outputs":[{"internalType":"address","name":"leader","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"cancelTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"committeeThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct CredentialManager.MeasurementProfile","name":"profile","type":"tuple"}],"name":"executeManageProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"}],"name":"executeRegistryContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"}],"name":"executeRiskManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"}],"name":"executeUpdateAutomataVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCommitteeConfig","outputs":[{"internalType":"address[]","name":"members","type":"address[]"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeader","outputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"attestedKey","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getVaults","outputs":[{"components":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"}],"internalType":"struct CredentialManager.Vault[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initiateRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRestartAmbiguous","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestCheckpointHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"measurementProfiles","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProfileId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operatorToAttestedKey","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"operators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"contract IAdminUpdateStrategy","name":"strategy","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"registerAdminUpdateStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"registerAttestedKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registryContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resolveRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restartGatheringDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct CredentialManager.MeasurementProfile","name":"profile","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleManageProfile","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRegistryContract","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRiskManager","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleUpdateAutomataVerifier","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setDepositVaultAdministrators","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"internalType":"bytes","name":"tdxReportBody","type":"bytes"},{"internalType":"bytes","name":"zkProof","type":"bytes"},{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"submitRestartProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockDelayFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockOps","outputs":[{"internalType":"uint64","name":"eta","type":"uint64"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"bytes32","name":"opType","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"updateCommitteeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaults","outputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct CredentialManager.ChainConfig","name":"config","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"contractName":"CredentialManager","deploymentBytecode":{"bytecode":"0x6080604052346105515761479d803803806100198161056d565b92833981019060c0818303126105515780516001600160401b0381116105515781019082601f830112156105515781519161005b61005684610592565b61056d565b9260208085838152019160051b8301019185831161055157602001905b828210610555575050506020810151610093604083016105a9565b926100a0606084016105a9565b60808401519093906001600160401b03811161055157810186601f82011215610551578051906100d261005683610592565b97602060c0818b8681520194028301019181831161055157602001925b8284106104db575050505060a061010691016105a9565b6001600e555f80546001600160a01b03191633179055936001600160a01b0316928315610495576001600160a01b031693841561049557601180546001600160a01b0319166001600160a01b039290921691909117905580519081156104c457821580156104bb575b6104a4575f5b82811061038f575050506040817f7015cf739f6bedf8447b0723aac5b7e28cc2e5551b144f8bb715b9c29768237f926003558151905f82526020820152a160018060a01b0319600954161760095560018060a01b0319600a541617600a556001600e555f5b81518110156102c2576101ed81836105bd565b519081511515806102b6575b6102a757602091600e545f52600d835260405f20600560a0835115159360ff1984541660ff861617845586810151600185015560408101516002850155606081015160038501556080810151600485015501519101557faa1bacadd202709f2df9c31faf4babdbb21a245021c22298bfcdf22861ca12c6600e54938492604051908152a25f198214610293576001809201600e55016101da565b634e487b7160e01b5f52601160045260245ffd5b637262f58f60e01b5f5260045ffd5b506020820151156101f9565b600b6020526202a3007ffc320c8b7cd913048d0600d8f8fbdd9fd65e3dee2c1f3796e3abba8cc47fa047556203f4807f5248b41ce7bdc12ebe0248f44130be972d690f78fe7dbe1a76d984641d9dcfc25562093a807f9b6d9405e2a268edd94615fe7f07c0d5d9dda2152c2e48f4e74379972af1c6188190557fa24d58aaa8deed8b2ff0e63d867e6fe155de046522ed61849f5647e59d04b6ba5f527f8de415b97204654c888cc41215aeac0a76fba4f899a3e239bdee8aedbbab23ef556040516141cb90816105d28239f35b6001600160a01b036103a182846105bd565b511690811561049557815f52600260205260ff60405f20541661048657815f52600260205260405f20600160ff19825416179055600154916801000000000000000083101561047257600183018060015583101561045e5760015f8181527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690940180546001600160a01b03191683179055927fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d9080a201610175565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b630da1c57360e41b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b50906311dcbf3760e31b5f5260045260245260445ffd5b5081831161016f565b826311dcbf3760e31b5f526004525f60245260445ffd5b60c084830312610551576040519060c082016001600160401b03811183821017610472576040528451908115158203610551578260209260c09452828701518382015260408701516040820152606087015160608201526080870151608082015260a087015160a08201528152019301926100ef565b5f80fd5b60208091610562846105a9565b815201910190610078565b6040519190601f01601f191682016001600160401b0381118382101761047257604052565b6001600160401b0381116104725760051b60200190565b51906001600160a01b038216820361055157565b805182101561045e5760209160051b01019056fe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80631276bcc5146103c9578063127f49ad146103c45780631ac4d079146103bf5780631bc12e07146103ba57806324242e77146103b557806326ddc1ba146103b05780632808e92f146103ab578063280cd09d146103a6578063281cbdd4146103a157806328c1f99b1461039c5780632d4ab28d1461039757806331709520146103925780633174b7271461038d578063333bef221461038857806335cfd9eb1461038357806340eedabb1461037e57806347842663146103795780634c051f14146103745780634dd0a0c91461036f5780634e970c8c1461036a57806359d63bcc146103655780635c1ff1f2146103605780635cc791441461035b5780635d3ae390146103565780635f250f69146103515780636583c37a1461034c578063669f6f35146103475780636d70f7ae146103425780636dfb32aa1461033d5780637f0152a81461033857806381392328146103335780638c64ea4a1461032e5780639005474214610329578063900cf0cf1461032457806395c825591461031f5780639d3e015a1461031a5780639ebc068e146103155780639fd7285c14610310578063a6aac5131461030b578063acfacc8614610306578063ae5c8bfb14610301578063b34eb182146102fc578063b5ed8b12146102f7578063b7635fb8146102f2578063be223838146102ed578063c7d06b54146102e8578063cd1d81ff146102e3578063ce0b1302146102de578063d8a0bebf146102d9578063d9be832c146102d4578063e0913aff146102cf578063e28d4906146102ca578063f5b68c67146102c5578063f698da25146102c0578063f851a440146102bb578063fb834493146102b6578063fc0e2ba7146102b1578063fdeabe1f146102ac5763fe5e82400361000e57611f8e565b611e8b565b611e51565b611e27565b611e00565b611dde565b611db7565b611d5d565b611d23565b611d06565b611ccc565b611c5d565b611c13565b611b39565b611ac3565b611a9c565b6119b3565b611996565b6118b4565b6117de565b6117b1565b6116dc565b611591565b611458565b6113f2565b6113d5565b61139b565b6112f9565b611164565b6110eb565b611028565b610fe8565b610fa5565b610f6b565b610f31565b610d89565b610ce1565b610ca7565b610bb6565b610b7c565b610b5f565b610b2a565b610b02565b610ada565b6109a5565b61096b565b61092b565b6108d2565b6108ab565b610883565b61079a565b610772565b610619565b610551565b61047f565b610458565b61041d565b6103ef565b346103eb575f3660031901126103eb57602060ff601754166040519015158152f35b5f80fd5b346103eb575f3660031901126103eb576020601254604051908152f35b6001600160a01b038116036103eb57565b346103eb5760203660031901126103eb5760043561043a8161040c565b60018060a01b03165f526005602052602060405f2054604051908152f35b346103eb575f3660031901126103eb5760206040515f5160206141765f395f51905f528152f35b346103eb5760203660031901126103eb5760043561049c8161040c565b6001600160a01b038116908115610542575f5160206141765f395f51905f526104e06040516020810190858252602081526104d860408261127b565b519020612d59565b6104e981612e65565b600a80546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141365f395f51905f525f80a37f482b97c53e48ffa324a976e2738053e9aff6eee04d8aac63b10e19411d869b825f80a3005b63d92e233d60e01b5f5260045ffd5b346103eb575f3660031901126103eb5760206040517f3f98d537f24f3ae50e4a30e12fbf3e5c35cf6f40f4ce125c82c1b88e3e7cf3df8152f35b9181601f840112156103eb578235916001600160401b0383116103eb576020808501948460051b0101116103eb57565b9060606003198301126103eb576004356105d48161040c565b916024356001600160401b0381116103eb57816105f39160040161058b565b92909291604435906001600160401b0382116103eb576106159160040161058b565b9091565b346103eb57610627366105bb565b91936001600160a01b031691908215610542576106789461066593604051602081019182526020815261065b60408261127b565b5190209485612f93565b5f5160206141165f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141165f395f51905f525f52600b6020527ffc320c8b7cd913048d0600d8f8fbdd9fd65e3dee2c1f3796e3abba8cc47fa0475491821561074c57815f5160206140f65f395f51905f526107415f5160206141165f395f51905f529384600161070e61070260209a42612045565b6001600160401b031690565b835469ffffffffffffffffffff19166001600160401b039190911690811784559201556040519081529081906020820190565b0390a3604051908152f35b6309913ab360e31b5f52600483905260245ffd5b633599e08d60e21b5f5260045260245ffd5b346103eb575f3660031901126103eb576011546040516001600160a01b039091168152602090f35b346103eb576107a8366105bb565b91936001600160a01b031691908215610542576107f9946107e69360405160208101918252602081526107dc60408261127b565b519020948561310c565b5f5160206141565f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141565f395f51905f525f52600b6020527f5585c2bd0ffb4796fa70abc2a0b1f92173aa4b9f7e1b37d256fd2a975c5abcfa5491821561074c57815f5160206140f65f395f51905f526107415f5160206141565f395f51905f529384600161070e61070260209a42612045565b346103eb575f3660031901126103eb57600a546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb5760206040515f5160206141565f395f51905f528152f35b346103eb5760203660031901126103eb576004355f52600c602052608060405f206001815491015460ff604051926001600160401b0381168452818160401c161515602085015260481c16151560408301526060820152f35b346103eb5760403660031901126103eb57600435602435905f52600860205260405f20905f52602052602060018060a01b0360405f205416604051908152f35b346103eb575f3660031901126103eb5760206040517f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd8152f35b346103eb575f3660031901126103eb576012548015610acb57421115610abc576109d86109d460165460ff1690565b1590565b610aad5760175460ff16610a9e57601354610a00906001600160a01b0316613b49565b613b49565b610a0b601554601055565b610a16601454600f55565b610a1f5f601255565b610a345f6013555f6014555f6015555f601655565b600f546010546040805183815260208101929092527f88cac99f10d8167541407023871a1cc0d797dc75e5b23f3f9f54aaf445f5602c91a16006546001600160a01b03167fd7936f419066f72741af39dde15237d9aed55a0d1d9ab0cb3280569b42c3d8f35f80a3005b6363f5b90b60e11b5f5260045ffd5b63dcd4760160e01b5f5260045ffd5b63285f264160e21b5f5260045ffd5b63cbd2c74d60e01b5f5260045ffd5b346103eb575f3660031901126103eb576006546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb576009546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb57604060018060a01b0360065416805f526005602052815f205482519182526020820152f35b346103eb575f3660031901126103eb576020600354604051908152f35b346103eb575f3660031901126103eb5760206040517f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f8152f35b346103eb5760603660031901126103eb576004356024356001600160401b0381116103eb57610be990369060040161058b565b906044356001600160401b0381116103eb57610c0990369060040161058b565b92909184158015610c9c575b610c8257917f7015cf739f6bedf8447b0723aac5b7e28cc2e5551b144f8bb715b9c29768237f949391610c6493604051602081019087825260208152610c5c60408261127b565b51902061320f565b600354610c7082600355565b604080519182526020820192909252a1005b84600154906311dcbf3760e31b5f5260045260245260445ffd5b506001548511610c15565b346103eb575f3660031901126103eb5760206040517fac5d643ec5a18c3c05126c0540540c01e724afd2beab02a045f0f5d791103a158152f35b346103eb575f3660031901126103eb576012544210610d5c57610e104201804211610d5757601255610d1e5f6013555f6014555f6015555f601655565b60ff19601754166017557f3d364c9a6ad0fb8014a11c487ec342f3a0aaf1a55973fc1bb7353ab6824a358f6020601254604051908152a1005b612031565b6301fd8f7b60e41b5f5260045ffd5b6004359060ff821682036103eb57565b359060ff821682036103eb57565b346103eb5760a03660031901126103eb57610da2610d6b565b60243590604435610db28161040c565b6064356001600160401b0381116103eb57610dd190369060040161058b565b9190926084356001600160401b0381116103eb57610df390369060040161058b565b6001600160a01b038416959094919390861561054257610e51610e45610e45610e388b610e2b8960ff165f52600860205260405f2090565b905f5260205260405f2090565b546001600160a01b031690565b6001600160a01b031690565b610f22576040805160ff868116602083019081529282018b90526001600160a01b038a1660608301527f0f05f8598640816bc7963f9e84995cc362736f66a37eaca8293048e25aed4067989097610f0596610ecd959294919390929190610ec581608081015b03601f19810183528261127b565b519020613325565b610ee687610e2b8560ff165f52600860205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b6040516001600160a01b039094168452169180602081015b0390a3005b63c45546f760e01b5f5260045ffd5b346103eb575f3660031901126103eb5760206040517f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d938152f35b346103eb575f3660031901126103eb5760206040517f8b6e6eebcf1e5aa625df96285186591a18b47d82a0e5344612aba13e51bc0e6f8152f35b346103eb575f3660031901126103eb57608060018060a01b036013541660145460155460ff60165416916040519384526020840152604083015215156060820152f35b346103eb5760203660031901126103eb576004356110058161040c565b60018060a01b03165f526002602052602060ff60405f2054166040519015158152f35b346103eb5760203660031901126103eb576004356110458161040c565b6001600160a01b038116908115610542575f5160206141165f395f51905f5261108960405160208101908582526020815261108160408261127b565b519020612d91565b61109281612e65565b600980546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141365f395f51905f525f80a37f62e09f04681da780308095cdff046660f0b1e396888312a767499401693c03e55f80a3005b346103eb5760203660031901126103eb57600435335f52600260205260ff60405f2054161561115157801561054257335f8181526005602052604081208390557fe58dd23bcf790de89fbc05578bcc206ece8cb67dee1cf099fce6ff74d052ff3e9080a3005b633b63649d60e11b5f523360045260245ffd5b346103eb576101403660031901126103eb5761117e610d6b565b6024356044359160a03660631901126103eb57610104356001600160401b0381116103eb576111b190369060040161058b565b9061012435946001600160401b0386116103eb576111d661001896369060040161058b565b959094612254565b634e487b7160e01b5f52603260045260245ffd5b60075481101561120e5760075f5260205f209060021b01905f90565b6111de565b805482101561120e575f5260205f209060021b01905f90565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b0382111761125b57604052565b61122c565b608081019081106001600160401b0382111761125b57604052565b90601f801991011681019081106001600160401b0382111761125b57604052565b604051906112ab60808361127b565b565b906040516112ba81611240565b608060ff808395546001600160401b0381168552818160401c166020860152818160481c166040860152818160501c16606086015260581c1616910152565b346103eb5760203660031901126103eb576004356007548110156103eb57611323610100916111f2565b5061139960ff825416916001810154906113446003600283015492016112ad565b9160405194855260208501526040840152606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565bf35b346103eb575f3660031901126103eb5760206040517fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e628152f35b346103eb575f3660031901126103eb576020600f54604051908152f35b346103eb5760203660031901126103eb576004355f52600d60205260c060405f2060ff81541690600181015490600281015460038201549060056004840154930154936040519515158652602086015260408501526060840152608083015260a0820152f35b346103eb5760603660031901126103eb576004356024356001600160401b0381116103eb5761148b90369060040161058b565b604435916001600160401b0383116103eb576114ae6114d493369060040161058b565b92909160405160208101906114cc81610eb78a859190602083019252565b51902061343b565b6114e6815f52600c60205260405f2090565b80546001600160401b0381161561157d57604081901c60ff166115695760481c60ff1661155557805469ff0000000000000000001916690100000000000000000017815560010154907f4ef6805613a59a1bece0b99a00b945fffadc1bb793c7064706233d30fd438c765f80a3005b632863f91560e21b5f52600482905260245ffd5b633599e08d60e21b5f52600483905260245ffd5b633e426d5160e21b5f52600483905260245ffd5b60803660031901126103eb576024356004356044356001600160401b0381116103eb576115c290369060040161058b565b906064356115e2610e45610e3887610e2b885f52600860205260405f2090565b916001600160a01b038316156116ab575f547fc55043b6a137f66033384e3f6d9b80e72303eab38436f8fdb89899dc87ce53a29490611629906001600160a01b0316610e45565b3303611692575f611640611683938293369161232c565b93945b61164d8989613ca0565b60405161167181610eb78a8a60208401966303a81a5760e11b885260248501612382565b51915af461167d6123c7565b506123f6565b610f1d60405192839283612442565b50505061169d613bec565b6116835f8060035494611643565b635c7f4b4760e11b5f5260045ffd5b6004359061ffff821682036103eb57565b6024359061ffff821682036103eb57565b346103eb5760403660031901126103eb576117066116f86116ba565b6117006116cb565b906125d1565b6040518091602082016020835281518091526020604084019201905f5b818110611731575050500390f35b9193509160206101006001926117a36060885160ff81511684528581015186850152604081015160408501520151606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565b019401910191849392611723565b346103eb575f3660031901126103eb576020604051610e108152f35b60c09060231901126103eb57602490565b346103eb576101203660031901126103eb576004356117fc366117cd565b9060e4356001600160401b0381116103eb5761181c90369060040161058b565b92610104356001600160401b0381116103eb5761183d90369060040161058b565b90823561184981612689565b806118a8575b611899576118959561188595610eb76118766118809660405192839160208301958661269d565b5190209485613551565b613a99565b6040519081529081906020820190565b0390f35b63137ec6d760e11b5f5260045ffd5b5060208301351561184f565b346103eb5760e03660031901126103eb576004356118d1366117cd565b6118f360405160208101906118eb81610eb786888661269d565b519020612dc9565b906118fd82612e65565b821561197c575b7faa1bacadd202709f2df9c31faf4babdbb21a245021c22298bfcdf22861ca12c69161197761196c5f5160206140d65f395f51905f5293865f52600d6020526119508160405f206126ec565b6040519485945f5160206141365f395f51905f525f80a3612693565b151582526020820190565b0390a2005b9150600e545f198114610d575760018101600e5591611904565b346103eb575f3660031901126103eb576020601054604051908152f35b346103eb576119c1366105bb565b91936001600160a01b03169190821561054257611a12946119ff9360405160208101918252602081526119f560408261127b565b5190209485613654565b5f5160206141765f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141765f395f51905f525f52600b6020527f5248b41ce7bdc12ebe0248f44130be972d690f78fe7dbe1a76d984641d9dcfc25491821561074c57815f5160206140f65f395f51905f526107415f5160206141765f395f51905f529384600161070e61070260209a42612045565b346103eb575f3660031901126103eb5760206040515f5160206140d65f395f51905f528152f35b346103eb57611ad1366105bb565b92939091906001600160a01b03168015610542575f80808093611b198888888c476040516020810191888352604082015260408152611b1160608261127b565b519020613757565b4790828215611b30575bf115611b2b57005b61273a565b506108fc611b23565b346103eb5760203660031901126103eb57600435611b568161040c565b6001600160a01b0316801561054257611b8a604051602081019083825260208152611b8260408261127b565b519020612e01565b611b9381612e65565b6011545f5160206141565f395f51905f5290611bb7906001600160a01b0316610e45565b601180546001600160a01b0319166001600160a01b038616179055915f5160206141365f395f51905f525f80a36001600160a01b03167ff6879817b383066906e8355b81d5157ffe8bff151dd1946b33863aeede50ff985f80a3005b346103eb575f3660031901126103eb576020600e54604051908152f35b9181601f840112156103eb578235916001600160401b0383116103eb57602083818601950101116103eb57565b346103eb5760a03660031901126103eb576004356024356001600160401b0381116103eb57611c90903690600401611c30565b9190604435926001600160401b0384116103eb57611cb5610018943690600401611c30565b9160643593611cc38561040c565b6084359561292e565b346103eb575f3660031901126103eb5760206040517ffdc5f96508969628a00bce64abbf1ea989f16e791b70592a3122d67a7792e48c8152f35b346103eb575f3660031901126103eb576020600454604051908152f35b346103eb575f3660031901126103eb5760206040517fa24d58aaa8deed8b2ff0e63d867e6fe155de046522ed61849f5647e59d04b6ba8152f35b346103eb5760203660031901126103eb576004356001548110156103eb5760015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb5760206040515f5160206141165f395f51905f528152f35b346103eb575f3660031901126103eb576020611df8612cc1565b604051908152f35b346103eb575f3660031901126103eb575f546040516001600160a01b039091168152602090f35b346103eb5760203660031901126103eb576004355f52600b602052602060405f2054604051908152f35b346103eb575f3660031901126103eb5760206040517fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a813058152f35b346103eb57611e99366105bb565b6001600160a01b0385165f908152600260205260409020549294939290919060ff1615611f14576001600160a01b0384165f908152600560205260409020541561054257604080516001600160a01b03861660208201908152610018976109fb969093909290611f0c9082908101610eb7565b51902061386d565b633b63649d60e11b5f526001600160a01b03841660045260245ffd5b90602080835192838152019201905f5b818110611f4d5750505090565b82516001600160a01b0316845260209384019390920191600101611f40565b611f8460409295949395606083526060830190611f30565b9460208201520152565b346103eb575f3660031901126103eb5760035460015460405190602082828152019060015f52827fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65f5b838110611ffc575050611ff09061189593038461127b565b60405193849384611f6c565b81546001600160a01b0316855260209094019385925060019182019101611fd8565b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b91908201809211610d5757565b35906001600160401b03821682036103eb57565b60ff6120c2608080936001600160401b0361208082612052565b1686528361209060208301610d7b565b166020870152836120a360408301610d7b565b166040870152836120b660608301610d7b565b16606087015201610d7b565b16910152565b91908260a09103126103eb576040516120e081611240565b608061212c8183956120f181612052565b85526120ff60208201610d7b565b602086015261211060408201610d7b565b604086015261212160608201610d7b565b606086015201610d7b565b910152565b600754600160401b81101561125b5780600161215292016007556007611213565b9190916122395761221f6080606060036112ab9560ff86511660ff198254161781556020860151600182015560408601516002820155019301516121b66001600160401b0382511685906001600160401b03166001600160401b0319825416179055565b602081015184546121fa9160ff60401b1990911660409190911b68ff0000000000000000161760ff60408401511660ff60481b9060481b169060ff60481b19161790565b606082015160ff60501b1990911660509190911b60ff60501b16178455015160ff1690565b815460ff60581b191660589190911b60ff60581b16179055565b61201e565b90815260c0810192916112ab9160200190612066565b95929490958215611899576122cd606494612301937fdcd264bd7d6d022cfcd2ef488637c26dba3344acfaad38a093f1755fe21085f5976040519960208b0160ff87169b8c82528d60408201528960608201526122b4608082018c612066565b61010081526122c56101208261127b565b519020613983565b6122e16122d861129c565b60ff9092168252565b8660208201528260408201526122f736856120c8565b6060820152612131565b6123106040519283928361223e565b0390a3565b6001600160401b03811161125b5760051b60200190565b92919061233881612315565b93612346604051958661127b565b602085838152019160051b81019283116103eb57905b82821061236857505050565b6020809183356123778161040c565b81520191019061235c565b9392916123a79060409260018060a01b03168652606060208701526060860190611f30565b930152565b6001600160401b03811161125b57601f01601f191660200190565b3d156123f1573d906123d8826123ac565b916123e6604051938461127b565b82523d5f602084013e565b606090565b156123fd57565b60405162461bcd60e51b815260206004820152601c60248201527f53747261746567792064656c656761746563616c6c206661696c6564000000006044820152606490fd5b9291906123a7602091604086526040860190611f30565b6124625f612315565b90612470604051928361127b565b5f825281601f196124805f612315565b01905f5b82811061249057505050565b60209060405161249f81611260565b5f81525f838201525f60408201526040516124b981611240565b5f81525f848201525f60408201525f60608201525f6080820152606082015282828501015201612484565b906124ee82612315565b6124fb604051918261127b565b828152809261250c601f1991612315565b01905f5b82811061251c57505050565b60209060405161252b81611260565b5f81525f838201525f604082015260405161254581611240565b5f81525f848201525f60408201525f60608201525f6080820152606082015282828501015201612510565b9061ffff8091169116039061ffff8211610d5757565b805182101561120e5760209160051b010190565b906040516125a781611260565b606061212c6003839560ff81541685526001810154602086015260028101546040860152016112ad565b6007549161ffff8216928084101561267d578061ffff831611612671575b508261ffff82161115612663576126109161260991612570565b61ffff1690565b612619816124e4565b915f5b8281106126295750505090565b8061264761264161263c60019486612045565b6111f2565b5061259a565b6126518287612586565b5261265c8186612586565b500161261c565b50505061266e612459565b90565b61ffff9150165f6125ef565b5050505061266e612459565b801515036103eb57565b3561266e81612689565b90929160a060c09160e0840195845280356126b781612689565b151560208501526020810135604085015260408101356060850152606081013560808501526080810135828501520135910152565b9060a060059180356126fd81612689565b60ff801986541691151516178455602081013560018501556040810135600285015560608101356003850155608081013560048501550135910155565b6040513d5f823e3d90fd5b91906040838203126103eb57825161275c81612689565b926020810151906001600160401b0382116103eb570181601f820112156103eb57805190612789826123ac565b92612797604051948561127b565b828452602083830101116103eb57815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b92906127f19061266e95936060865260608601916127b8565b926001602082015260408185039101526127b8565b9060a8116103eb5760880190602090565b90610168116103eb576101480190602090565b90610198116103eb576101780190602090565b906101c8116103eb576101a80190602090565b906101f8116103eb576101d80190602090565b9061021c116103eb576102080190601490565b9061023c116103eb5761021c0190602090565b90610244116103eb5761023c0190600890565b3590602081106128aa575090565b5f199060200360031b1b1690565b356bffffffffffffffffffffffff198116929190601482106128d8575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b356001600160c01b0319811692919060088210612913575050565b6001600160c01b031960089290920360031b82901b16169150565b9091929495936012548015908115612cb7575b50610acb576001600160a01b0387169586156105425760115461296c906001600160a01b0316610e45565b916001600160a01b03831615612ca8576129a1925f92836040518096819582946302bc2ce760e51b84528c8c600486016127d8565b03925af1908115611b2b575f905f92612c83575b5015612c6557506102488310612c5657612a18906129dc6129d68585612806565b9061289c565b6129e96129d68686612817565b6129f66129d6878761282a565b90612a046129d6888861283d565b92612a126129d68989612850565b94613d62565b83612a5e612a58612a52612a3e612a38612a328888612863565b906128b8565b60601c90565b95612a4c6129d68288612876565b95612889565b906128f8565b60c01c90565b926001600160a01b031603612c47578203612c4757600f54936001600160401b0382169480861115612c285750612a9a6109d460165460ff1690565b612bf65760145480861115612b785750612b4c907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612aeb612adc61129c565b6001600160a01b039093168352565b6020820152836040820152612b036060820160019052565b60609060018060a01b038151166bffffffffffffffffffffffff60a01b6013541617601355602081015160145560408101516015550151151560ff801960165416911617601655565b612b5b60ff1960175416601755565b604080516001600160401b039290921682526020820192909252a2565b929350509214612b87575b5050565b6015548114612b83577fa3f0eabe92ef7bacb81dba904189dc163924ee16379f429441a4117441609fff91612bc4600160ff196017541617601755565b612bf160155492604051938493846040919493926001600160401b03606083019616825260208201520152565b0390a1565b612b5b907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612aeb612adc61129c565b636762eb4960e01b5f526004526001600160401b03821660245260445ffd5b63319c9a2160e21b5f5260045ffd5b632ffd02b360e11b5f5260045ffd5b805115612c7457805190602001fd5b63e1ac453160e01b5f5260045ffd5b9050612ca191503d805f833e612c99818361127b565b810190612745565b905f6129b5565b63baa3de5f60e01b5f5260045ffd5b905042115f612941565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f3d4a1189ec311cad4499197cf097eefb10346f2894cdd7cbbcb2d2a48001c91860408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152612d5360c08261127b565b51902090565b60405160208101915f5160206141765f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206141165f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206140d65f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206141565f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b906040519060208201928352604082015230606082015246608082015260808152612d5360a08261127b565b805f52600c60205260405f209081546001600160401b038116906001600160401b03821615612eef57604081901c60ff166115695760481c60ff16611555576001600160401b0381164210612ec9575050805460ff60401b1916600160401b179055565b63c504f34d60e01b5f526004919091526001600160401b0316602452504260445260645ffd5b82633e426d5160e21b5f5260045260245ffd5b919081101561120e5760051b0190565b3561266e8161040c565b919081101561120e5760051b81013590601e19813603018212156103eb5701908135916001600160401b0383116103eb5760200182360381136103eb579190565b929192612f69826123ac565b91612f77604051938461127b565b8294818452818301116103eb578281602093845f960137010152565b5f54909491929190612fad906001600160a01b0316610e45565b331480613104575b806130fc575b6130e857600354938183036130b75784831080156130df575b6130c657612ff360045480975f5160206141165f395f51905f52613f67565b925f945f5b8781106130195750505050505050506130146112ab9160010190565b600455565b61302c613027828585612f02565b612f12565b966001600160a01b0390811690881611156130b757866130696109d46130628360018060a01b03165f52600260205260405f2090565b5460ff1690565b61309c5761308f6109d4613088613081858a8a612f1c565b3691612f5d565b8984613fe8565b61309c5750600101612ff8565b633b63649d60e11b5f526001600160a01b031660045260245ffd5b630da1c57360e41b5f5260045ffd5b6378f4355360e11b5f526004839052602485905260445ffd5b50848210612fd4565b50505050506112ab61301460045460010190565b508015612fbb565b508115612fb5565b5f54909491929190613126906001600160a01b0316610e45565b331480613207575b806131ff575b6130e857600354938183036130b75784831080156131f6575b6130c65761316c60045480975f5160206141565f395f51905f52613f67565b925f945f5b87811061318d5750505050505050506130146112ab9160010190565b61319b613027828585612f02565b966001600160a01b0390811690881611156130b757866131d16109d46130628360018060a01b03165f52600260205260405f2090565b61309c576131e96109d4613088613081858a8a612f1c565b61309c5750600101613171565b5084821061314d565b508015613134565b50811561312e565b5f54909491929190613229906001600160a01b0316610e45565b33148061331d575b80613315575b6130e857600354938183036130b757848310801561330c575b6130c65761328260045480977fac5d643ec5a18c3c05126c0540540c01e724afd2beab02a045f0f5d791103a15613f67565b925f945f5b8781106132a35750505050505050506130146112ab9160010190565b6132b1613027828585612f02565b966001600160a01b0390811690881611156130b757866132e76109d46130628360018060a01b03165f52600260205260405f2090565b61309c576132ff6109d4613088613081858a8a612f1c565b61309c5750600101613287565b50848210613250565b508015613237565b508115613231565b5f5490949192919061333f906001600160a01b0316610e45565b331480613433575b8061342b575b6130e857600354938183036130b7578483108015613422575b6130c65761339860045480977f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd613f67565b925f945f5b8781106133b95750505050505050506130146112ab9160010190565b6133c7613027828585612f02565b966001600160a01b0390811690881611156130b757866133fd6109d46130628360018060a01b03165f52600260205260405f2090565b61309c576134156109d4613088613081858a8a612f1c565b61309c575060010161339d565b50848210613366565b50801561334d565b508115613347565b5f54909491929190613455906001600160a01b0316610e45565b331480613549575b80613541575b6130e857600354938183036130b7578483108015613538575b6130c6576134ae60045480977fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a81305613f67565b925f945f5b8781106134cf5750505050505050506130146112ab9160010190565b6134dd613027828585612f02565b966001600160a01b0390811690881611156130b757866135136109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761352b6109d4613088613081858a8a612f1c565b61309c57506001016134b3565b5084821061347c565b508015613463565b50811561345d565b5f5490949192919061356b906001600160a01b0316610e45565b33148061364c575b80613644575b6130e857600354938183036130b757848310801561363b575b6130c6576135b160045480975f5160206140d65f395f51905f52613f67565b925f945f5b8781106135d25750505050505050506130146112ab9160010190565b6135e0613027828585612f02565b966001600160a01b0390811690881611156130b757866136166109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761362e6109d4613088613081858a8a612f1c565b61309c57506001016135b6565b50848210613592565b508015613579565b508115613573565b5f5490949192919061366e906001600160a01b0316610e45565b33148061374f575b80613747575b6130e857600354938183036130b757848310801561373e575b6130c6576136b460045480975f5160206141765f395f51905f52613f67565b925f945f5b8781106136d55750505050505050506130146112ab9160010190565b6136e3613027828585612f02565b966001600160a01b0390811690881611156130b757866137196109d46130628360018060a01b03165f52600260205260405f2090565b61309c576137316109d4613088613081858a8a612f1c565b61309c57506001016136b9565b50848210613695565b50801561367c565b508115613676565b5f54909491929190613771906001600160a01b0316610e45565b331480613865575b8061385d575b6130e857600354938183036130b7578483108015613854575b6130c6576137ca60045480977f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d93613f67565b925f945f5b8781106137eb5750505050505050506130146112ab9160010190565b6137f9613027828585612f02565b966001600160a01b0390811690881611156130b7578661382f6109d46130628360018060a01b03165f52600260205260405f2090565b61309c576138476109d4613088613081858a8a612f1c565b61309c57506001016137cf565b50848210613798565b50801561377f565b508115613779565b5f54909491929190613887906001600160a01b0316610e45565b33148061397b575b80613973575b6130e857600354938183036130b757848310801561396a575b6130c6576138e060045480977f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f613f67565b925f945f5b8781106139015750505050505050506130146112ab9160010190565b61390f613027828585612f02565b966001600160a01b0390811690881611156130b757866139456109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761395d6109d4613088613081858a8a612f1c565b61309c57506001016138e5565b508482106138ae565b508015613895565b50811561388f565b5f5490949192919061399d906001600160a01b0316610e45565b331480613a91575b80613a89575b6130e857600354938183036130b7578483108015613a80575b6130c6576139f660045480977fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e62613f67565b925f945f5b878110613a175750505050505050506130146112ab9160010190565b613a25613027828585612f02565b966001600160a01b0390811690881611156130b75786613a5b6109d46130628360018060a01b03165f52600260205260405f2090565b61309c57613a736109d4613088613081858a8a612f1c565b61309c57506001016139fb565b508482106139c4565b5080156139ab565b5081156139a5565b613ab0905f5160206140d65f395f51905f52612e39565b90815f52600c60205260405f2060ff815460401c16611569575f5160206140d65f395f51905f525f52600b6020527f9b6d9405e2a268edd94615fe7f07c0d5d9dda2152c2e48f4e74379972af1c618548015613b37575f5160206140f65f395f51905f526123105f5160206140d65f395f51905f529384600161070e6107028a9742612045565b6309913ab360e31b5f5260045260245ffd5b6001600160a01b0381165f8181526002602052604090205490919060ff1615613bd9576001600160a01b0381165f908152600560205260409020541561054257600680546001600160a01b031916831790556001600160a01b03165f90815260056020526040902054907f2c8c895ef6e3978e12490ffd8cd3b92d4717b223562f851382f5daf74f587b515f80a3565b50633b63649d60e11b5f5260045260245ffd5b600154613bf881612315565b91613c06604051938461127b565b818352601f19613c1583612315565b0136602085013782905f5b83811015613c99577fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68101546001600160a01b03165f9081526005602052604090205490811561054257600191613c93906001600160a01b0316613c848389612586565b6001600160a01b039091169052565b01613c20565b5091509150565b6007545f5b818110613cc55763dfffe2f960e01b5f526004839052602484905260445ffd5b613cd1612641826111f2565b8360ff8251161480613cfa575b613ceb5750600101613ca5565b6040015160601c949350505050565b5084602082015114613cde565b9060405160c081018181106001600160401b0382111761125b5760405260a06005829460ff81541615158452600181015460208501526002810154604085015260038101546060850152600481015460808501520154910152565b93929190613d80613d7b865f52600d60205260405f2090565b613d07565b94613d8e6109d48751151590565b613f555750602085018051156105425751808203613f19575050604084015180151580613f0f575b613ed1575050606083015180151580613ec7575b613e89575050608082015180151580613e7f575b613e4157505060a0015180151580613e37575b613df9575050565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523360d81b608482015260a490fd5b5080821415613df1565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264292a26a91960d91b608482015260a490fd5b5080821415613dde565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523160d81b608482015260a490fd5b5080821415613dca565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264052544d52360dc1b608482015260a490fd5b5080821415613db6565b60405163fef6c5cf60e01b81526004808201929092526024810192909252606060448301526064820152631354951160e21b608482015260a490fd5b6350dfe91360e01b5f5260045260245ffd5b916040519160208301937f4a3d56bf3b5708e5b633d12931f9923b37fde6895d6bd92957bbfa92cd003039855260408401526060830152608082015260808152613fb260a08261127b565b519020613fbd612cc1565b9060405190602082019261190160f01b84526022830152604282015260428152612d5360628261127b565b90915f91906001600160a01b038216156140cd5760405192600484019460248501956044860192853b1561405157509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b9796505090508151806040146140a85760411461406e5750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052614086565b505050505f9056feea4a6847c3f47fe0f98dcfe2e2c074e6cb42f6d74c367b33ae8516f537e775829cc91136b2c7668ecd202c7008f17e818e108b5448a7b7fd48bd2ca6b4aab51fb40912900bb80b6bc5e38d8489266de7299eedb40b03490214410117ef53ff9279883188dbf80e171cf94b3b44b6437b838158b1d3a5df6ccc709eeb7c5217296acb9fef2a4a1ecaa044f4c8979d9f48b0d5be623c860275be31c4cbd34c169cb2d153886d95f8f2d4836fb16c9fac869e1ce9cfc93d919a0f7dfe38439b9771a2646970667358221220d9a3575e6aa98198ed460c72687df8b305209a32fda153cf7302dc50f249d44a64736f6c634300081e0033"},"devdoc":{"details":"This contract acts as the governance layer and the vault registry. It manages the set of authorized operators, enforces quorum consensus for critical updates, and maintains the registry of deposit vaults across different chains. It combines immediate multi-sig actions for operational tasks with timelocked actions for high-risk configuration changes.","errors":{"InsufficientSignatures(uint256,uint256)":[{"params":{"provided":"The number of signatures provided.","required":"The current `committeeThreshold` required."}}],"InvalidCommitteeThreshold(uint256,uint256)":[{"params":{"newThreshold":"The proposed threshold.","operatorCount":"The total number of registered operators."}}],"InvalidDelay(uint256)":[{"params":{"delay":"The provided delay in seconds."}}],"NotOperator(address)":[{"params":{"signer":"The address recovered from the signature."}}],"SignersNotSortedOrUnique()":[{"details":"Signatures must be sorted strictly ascending (A < B) to prevent duplicate counting in O(N)."}],"TimelockAlreadyCanceled(bytes32)":[{"params":{"opId":"The operation hash."}}],"TimelockAlreadyExecuted(bytes32)":[{"params":{"opId":"The operation hash."}}],"TimelockNotReady(bytes32,uint256,uint256)":[{"params":{"nowTs":"The current block timestamp.","opId":"The unique hash of the operation.","readyAt":"The timestamp when the operation becomes executable."}}],"TimelockUnknown(bytes32)":[{"params":{"opId":"The operation hash."}}],"VaultNotFound(uint256,uint256)":[{"params":{"routingId":"The routing ID of the vault.","vmId":"The Chain ID for EVM chains requested."}}]},"kind":"dev","methods":{"addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":{"details":"This list is append-only. New vaults can be added, but existing ones cannot be removed.","params":{"routingId":"The routing ID of the vault.","signatures":"Corresponding signatures.","signers":"Sorted array of signers.","vaultAddr":"The address of the vault (as bytes32).","vmId":"The Chain ID for EVM chains requested."}},"cancelTimelock(bytes32,address[],bytes[])":{"details":"Can be called at any time before execution to prevent a malicious or erroneous update.","params":{"opId":"The hash of the operation to cancel."}},"constructor":{"params":{"initialCommitteeThreshold":"The number of signatures required for valid governance actions.","initialOperators":"The list of addresses that will form the initial governance council.","initialRegistryContract":"The initial Registry Contract address.","initialRiskManager":"The initial Risk Manager address."}},"domainSeparator()":{"returns":{"_0":"The domain separator hash."}},"executeRegistryContract(address)":{"params":{"newRegistry":"The address that was previously scheduled."}},"executeRiskManager(address)":{"params":{"newRiskManager":"The address that was previously scheduled."}},"getCommitteeConfig()":{"details":"Let's operators query for 'k (the committee threshold), n' thresholds and the current committee member list\"."},"getLeader()":{"details":"When querying current leader, then the contract returns the active operator_pubkey and attested_pubkey."},"getVaults(uint16,uint16)":{"details":"The input types are intentionally `uint16` to preserve the function selector `0x9fd7285c` for backward compatibility with existing Rust clients.","params":{"end":"The end index (exclusive).","start":"The start index."},"returns":{"_0":"An array of Vault structs."}},"registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":{"details":"Used to define how the Credential Manager talks to L2s (e.g., via bridges). Only one strategy can be registered per chain.","params":{"routingId":"The routing ID of the vault.","signatures":"Corresponding signatures.","signers":"Sorted array of signers.","strategy":"The address of the strategy contract.","vmId":"The Chain ID for EVM chains requested."}},"registerAttestedKey(bytes32)":{"details":"Maps the attested_pubkey of a new CE joining the quorum.","params":{"newAttestedKey":"The address derived from the TEE's public key."}},"scheduleRegistryContract(address,address[],bytes[])":{"params":{"newRegistry":"The proposed new Registry address."},"returns":{"opId":"The unique hash of the scheduled operation."}},"scheduleRiskManager(address,address[],bytes[])":{"details":"The operation cannot be executed until `TIMELOCK_DELAY` has passed.","params":{"newRiskManager":"The proposed new Risk Manager address."},"returns":{"opId":"The unique hash of the scheduled operation."}},"scheduleUpdateAutomataVerifier(address,address[],bytes[])":{"details":"Operators vote to update the verifier and the update is proposed with a timelocked delay."},"setDepositVaultAdministrators(uint256,uint256,address[],uint256)":{"details":"Admin can set arbitrary administrators/quorum using the debug path. Non-admin calls ignore the provided administrators/quorum and instead sync administrators from operator-attested keys, using the current committee threshold as the quorum.","params":{"newAdministrators":"The list of new admin addresses for that vault.","newWithdrawalQuorum":"The new quorum requirement for that vault.","routingId":"The routing ID of the vault.","vmId":"The Chain ID for EVM chains requested."}},"submitRestartProof(uint256,bytes,bytes,address,bytes32)":{"details":"We compare Epochs. The highest epoch wins.","params":{"checkpointHash":"The state hash being served.","newLeader":"The address claiming leadership.","tdxReportBody":"The 'Public Output' of the ZK Circuit (The TEE Quote Body).","zkProof":"The Groth16 proof bytes."}},"updateCommitteeThreshold(uint256,address[],bytes[])":{"details":"Requires a quorum of the *current* operators to approve.","params":{"newThreshold":"The new minimum number of signatures.","signatures":"Corresponding signatures.","signers":"Sorted array of signers."}}},"stateVariables":{"OP_APPOINT_LEADER":{"details":"Used for appointing a leader in the absence of a leader - for bootstrap or emergency recovery."},"_ACTION_TYPEHASH":{"details":"Generic Action typehash used for all governance signatures. Structure: Action(bytes32 opType, bytes32 paramsHash, uint256 nonce)"},"_EIP712_DOMAIN_TYPEHASH":{"details":"EIP-712 Domain Separator typehash."},"_NAME_HASH":{"details":"EIP-712 name hash for this contract."},"_VERSION_HASH":{"details":"EIP-712 version hash."},"adminUpdateStrategies":{"details":"Used to abstract cross-chain messaging logic (e.g., LayerZero, Optimism Messenger)."},"epoch":{"details":"Incremented on every successful restart."},"governanceNonce":{"details":"Included in every signed hash to strictly order operations and prevent replay attacks."},"latestCheckpointHash":{"details":"New nodes verify this hash against the leader's data to ensure they are on the correct fork."},"leader":{"details":"The leader is responsible for coordinating the clearing engine."},"operatorToAttestedKey":{"details":"Used to verify that a TEE signature belongs to a specific operator."},"operators":{"details":"These keys form the root of trust for the system."},"timelockDelayFor":{"details":"e.g., OP_SET_REGISTRY -> 72 hours."},"vaults":{"details":"This list is strictly append-only; vaults cannot be removed to prevent history modification."}},"title":"CredentialManager","version":1},"methodIdentifiers":{"GATHERING_DURATION()":"0xa6aac513","OP_ADD_VAULT()":"0x90054742","OP_APPOINT_LEADER()":"0x4e970c8c","OP_CANCEL_TIMELOCK()":"0xfc0e2ba7","OP_MANAGE_PROFILE()":"0xb7635fb8","OP_REGISTER_STRATEGY()":"0x333bef22","OP_RESTART()":"0xd8a0bebf","OP_SET_AUTOMATA_VERIFIER()":"0x2d4ab28d","OP_SET_COMMITTEE_THRESHOLD()":"0x5c1ff1f2","OP_SET_DELAY()":"0xe0913aff","OP_SET_MEASUREMENTS()":"0x6583c37a","OP_SET_REGISTRY()":"0x1bc12e07","OP_SET_RISK_MANAGER()":"0xf5b68c67","OP_SET_VAULT_ADMINS()":"0x26ddc1ba","OP_WITHDRAW()":"0x5f250f69","addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":"0x81392328","admin()":"0xf851a440","adminUpdateStrategies(uint256,uint256)":"0x3174b727","appointLeader(address,address[],bytes[])":"0xfdeabe1f","automataVerifier()":"0x280cd09d","bestCandidate()":"0x669f6f35","cancelTimelock(bytes32,address[],bytes[])":"0x9d3e015a","committeeThreshold()":"0x4dd0a0c9","domainSeparator()":"0xf698da25","epoch()":"0x900cf0cf","executeManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32))":"0xae5c8bfb","executeRegistryContract(address)":"0x24242e77","executeRiskManager(address)":"0x6dfb32aa","executeUpdateAutomataVerifier(address)":"0xc7d06b54","getCommitteeConfig()":"0xfe5e8240","getLeader()":"0x4c051f14","getVaults(uint16,uint16)":"0x9fd7285c","governanceNonce()":"0xd9be832c","initiateRestart()":"0x5cc79144","isOperator(address)":"0x6d70f7ae","isRestartAmbiguous()":"0x1276bcc5","latestCheckpointHash()":"0xb34eb182","leader()":"0x40eedabb","measurementProfiles(uint256)":"0x95c82559","nextProfileId()":"0xcd1d81ff","operatorToAttestedKey(address)":"0x1ac4d079","operators(uint256)":"0xe28d4906","registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":"0x5d3ae390","registerAttestedKey(bytes32)":"0x7f0152a8","registryContract()":"0x28c1f99b","resolveRestart()":"0x35cfd9eb","restartGatheringDeadline()":"0x127f49ad","riskManager()":"0x47842663","scheduleManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32),address[],bytes[])":"0xacfacc86","scheduleRegistryContract(address,address[],bytes[])":"0xb5ed8b12","scheduleRiskManager(address,address[],bytes[])":"0x2808e92f","scheduleUpdateAutomataVerifier(address,address[],bytes[])":"0x281cbdd4","setDepositVaultAdministrators(uint256,uint256,address[],uint256)":"0x9ebc068e","submitRestartProof(uint256,bytes,bytes,address,bytes32)":"0xce0b1302","timelockDelayFor(bytes32)":"0xfb834493","timelockOps(bytes32)":"0x31709520","updateCommitteeThreshold(uint256,address[],bytes[])":"0x59d63bcc","vaults(uint256)":"0x8c64ea4a","withdraw(address,address[],bytes[])":"0xbe223838"},"runtimeBytecode":{"bytecode":"0x6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80631276bcc5146103c9578063127f49ad146103c45780631ac4d079146103bf5780631bc12e07146103ba57806324242e77146103b557806326ddc1ba146103b05780632808e92f146103ab578063280cd09d146103a6578063281cbdd4146103a157806328c1f99b1461039c5780632d4ab28d1461039757806331709520146103925780633174b7271461038d578063333bef221461038857806335cfd9eb1461038357806340eedabb1461037e57806347842663146103795780634c051f14146103745780634dd0a0c91461036f5780634e970c8c1461036a57806359d63bcc146103655780635c1ff1f2146103605780635cc791441461035b5780635d3ae390146103565780635f250f69146103515780636583c37a1461034c578063669f6f35146103475780636d70f7ae146103425780636dfb32aa1461033d5780637f0152a81461033857806381392328146103335780638c64ea4a1461032e5780639005474214610329578063900cf0cf1461032457806395c825591461031f5780639d3e015a1461031a5780639ebc068e146103155780639fd7285c14610310578063a6aac5131461030b578063acfacc8614610306578063ae5c8bfb14610301578063b34eb182146102fc578063b5ed8b12146102f7578063b7635fb8146102f2578063be223838146102ed578063c7d06b54146102e8578063cd1d81ff146102e3578063ce0b1302146102de578063d8a0bebf146102d9578063d9be832c146102d4578063e0913aff146102cf578063e28d4906146102ca578063f5b68c67146102c5578063f698da25146102c0578063f851a440146102bb578063fb834493146102b6578063fc0e2ba7146102b1578063fdeabe1f146102ac5763fe5e82400361000e57611f8e565b611e8b565b611e51565b611e27565b611e00565b611dde565b611db7565b611d5d565b611d23565b611d06565b611ccc565b611c5d565b611c13565b611b39565b611ac3565b611a9c565b6119b3565b611996565b6118b4565b6117de565b6117b1565b6116dc565b611591565b611458565b6113f2565b6113d5565b61139b565b6112f9565b611164565b6110eb565b611028565b610fe8565b610fa5565b610f6b565b610f31565b610d89565b610ce1565b610ca7565b610bb6565b610b7c565b610b5f565b610b2a565b610b02565b610ada565b6109a5565b61096b565b61092b565b6108d2565b6108ab565b610883565b61079a565b610772565b610619565b610551565b61047f565b610458565b61041d565b6103ef565b346103eb575f3660031901126103eb57602060ff601754166040519015158152f35b5f80fd5b346103eb575f3660031901126103eb576020601254604051908152f35b6001600160a01b038116036103eb57565b346103eb5760203660031901126103eb5760043561043a8161040c565b60018060a01b03165f526005602052602060405f2054604051908152f35b346103eb575f3660031901126103eb5760206040515f5160206141765f395f51905f528152f35b346103eb5760203660031901126103eb5760043561049c8161040c565b6001600160a01b038116908115610542575f5160206141765f395f51905f526104e06040516020810190858252602081526104d860408261127b565b519020612d59565b6104e981612e65565b600a80546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141365f395f51905f525f80a37f482b97c53e48ffa324a976e2738053e9aff6eee04d8aac63b10e19411d869b825f80a3005b63d92e233d60e01b5f5260045ffd5b346103eb575f3660031901126103eb5760206040517f3f98d537f24f3ae50e4a30e12fbf3e5c35cf6f40f4ce125c82c1b88e3e7cf3df8152f35b9181601f840112156103eb578235916001600160401b0383116103eb576020808501948460051b0101116103eb57565b9060606003198301126103eb576004356105d48161040c565b916024356001600160401b0381116103eb57816105f39160040161058b565b92909291604435906001600160401b0382116103eb576106159160040161058b565b9091565b346103eb57610627366105bb565b91936001600160a01b031691908215610542576106789461066593604051602081019182526020815261065b60408261127b565b5190209485612f93565b5f5160206141165f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141165f395f51905f525f52600b6020527ffc320c8b7cd913048d0600d8f8fbdd9fd65e3dee2c1f3796e3abba8cc47fa0475491821561074c57815f5160206140f65f395f51905f526107415f5160206141165f395f51905f529384600161070e61070260209a42612045565b6001600160401b031690565b835469ffffffffffffffffffff19166001600160401b039190911690811784559201556040519081529081906020820190565b0390a3604051908152f35b6309913ab360e31b5f52600483905260245ffd5b633599e08d60e21b5f5260045260245ffd5b346103eb575f3660031901126103eb576011546040516001600160a01b039091168152602090f35b346103eb576107a8366105bb565b91936001600160a01b031691908215610542576107f9946107e69360405160208101918252602081526107dc60408261127b565b519020948561310c565b5f5160206141565f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141565f395f51905f525f52600b6020527f5585c2bd0ffb4796fa70abc2a0b1f92173aa4b9f7e1b37d256fd2a975c5abcfa5491821561074c57815f5160206140f65f395f51905f526107415f5160206141565f395f51905f529384600161070e61070260209a42612045565b346103eb575f3660031901126103eb57600a546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb5760206040515f5160206141565f395f51905f528152f35b346103eb5760203660031901126103eb576004355f52600c602052608060405f206001815491015460ff604051926001600160401b0381168452818160401c161515602085015260481c16151560408301526060820152f35b346103eb5760403660031901126103eb57600435602435905f52600860205260405f20905f52602052602060018060a01b0360405f205416604051908152f35b346103eb575f3660031901126103eb5760206040517f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd8152f35b346103eb575f3660031901126103eb576012548015610acb57421115610abc576109d86109d460165460ff1690565b1590565b610aad5760175460ff16610a9e57601354610a00906001600160a01b0316613b49565b613b49565b610a0b601554601055565b610a16601454600f55565b610a1f5f601255565b610a345f6013555f6014555f6015555f601655565b600f546010546040805183815260208101929092527f88cac99f10d8167541407023871a1cc0d797dc75e5b23f3f9f54aaf445f5602c91a16006546001600160a01b03167fd7936f419066f72741af39dde15237d9aed55a0d1d9ab0cb3280569b42c3d8f35f80a3005b6363f5b90b60e11b5f5260045ffd5b63dcd4760160e01b5f5260045ffd5b63285f264160e21b5f5260045ffd5b63cbd2c74d60e01b5f5260045ffd5b346103eb575f3660031901126103eb576006546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb576009546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb57604060018060a01b0360065416805f526005602052815f205482519182526020820152f35b346103eb575f3660031901126103eb576020600354604051908152f35b346103eb575f3660031901126103eb5760206040517f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f8152f35b346103eb5760603660031901126103eb576004356024356001600160401b0381116103eb57610be990369060040161058b565b906044356001600160401b0381116103eb57610c0990369060040161058b565b92909184158015610c9c575b610c8257917f7015cf739f6bedf8447b0723aac5b7e28cc2e5551b144f8bb715b9c29768237f949391610c6493604051602081019087825260208152610c5c60408261127b565b51902061320f565b600354610c7082600355565b604080519182526020820192909252a1005b84600154906311dcbf3760e31b5f5260045260245260445ffd5b506001548511610c15565b346103eb575f3660031901126103eb5760206040517fac5d643ec5a18c3c05126c0540540c01e724afd2beab02a045f0f5d791103a158152f35b346103eb575f3660031901126103eb576012544210610d5c57610e104201804211610d5757601255610d1e5f6013555f6014555f6015555f601655565b60ff19601754166017557f3d364c9a6ad0fb8014a11c487ec342f3a0aaf1a55973fc1bb7353ab6824a358f6020601254604051908152a1005b612031565b6301fd8f7b60e41b5f5260045ffd5b6004359060ff821682036103eb57565b359060ff821682036103eb57565b346103eb5760a03660031901126103eb57610da2610d6b565b60243590604435610db28161040c565b6064356001600160401b0381116103eb57610dd190369060040161058b565b9190926084356001600160401b0381116103eb57610df390369060040161058b565b6001600160a01b038416959094919390861561054257610e51610e45610e45610e388b610e2b8960ff165f52600860205260405f2090565b905f5260205260405f2090565b546001600160a01b031690565b6001600160a01b031690565b610f22576040805160ff868116602083019081529282018b90526001600160a01b038a1660608301527f0f05f8598640816bc7963f9e84995cc362736f66a37eaca8293048e25aed4067989097610f0596610ecd959294919390929190610ec581608081015b03601f19810183528261127b565b519020613325565b610ee687610e2b8560ff165f52600860205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b6040516001600160a01b039094168452169180602081015b0390a3005b63c45546f760e01b5f5260045ffd5b346103eb575f3660031901126103eb5760206040517f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d938152f35b346103eb575f3660031901126103eb5760206040517f8b6e6eebcf1e5aa625df96285186591a18b47d82a0e5344612aba13e51bc0e6f8152f35b346103eb575f3660031901126103eb57608060018060a01b036013541660145460155460ff60165416916040519384526020840152604083015215156060820152f35b346103eb5760203660031901126103eb576004356110058161040c565b60018060a01b03165f526002602052602060ff60405f2054166040519015158152f35b346103eb5760203660031901126103eb576004356110458161040c565b6001600160a01b038116908115610542575f5160206141165f395f51905f5261108960405160208101908582526020815261108160408261127b565b519020612d91565b61109281612e65565b600980546001600160a01b031981166001600160a01b0395861617909155909216915f5160206141365f395f51905f525f80a37f62e09f04681da780308095cdff046660f0b1e396888312a767499401693c03e55f80a3005b346103eb5760203660031901126103eb57600435335f52600260205260ff60405f2054161561115157801561054257335f8181526005602052604081208390557fe58dd23bcf790de89fbc05578bcc206ece8cb67dee1cf099fce6ff74d052ff3e9080a3005b633b63649d60e11b5f523360045260245ffd5b346103eb576101403660031901126103eb5761117e610d6b565b6024356044359160a03660631901126103eb57610104356001600160401b0381116103eb576111b190369060040161058b565b9061012435946001600160401b0386116103eb576111d661001896369060040161058b565b959094612254565b634e487b7160e01b5f52603260045260245ffd5b60075481101561120e5760075f5260205f209060021b01905f90565b6111de565b805482101561120e575f5260205f209060021b01905f90565b634e487b7160e01b5f52604160045260245ffd5b60a081019081106001600160401b0382111761125b57604052565b61122c565b608081019081106001600160401b0382111761125b57604052565b90601f801991011681019081106001600160401b0382111761125b57604052565b604051906112ab60808361127b565b565b906040516112ba81611240565b608060ff808395546001600160401b0381168552818160401c166020860152818160481c166040860152818160501c16606086015260581c1616910152565b346103eb5760203660031901126103eb576004356007548110156103eb57611323610100916111f2565b5061139960ff825416916001810154906113446003600283015492016112ad565b9160405194855260208501526040840152606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565bf35b346103eb575f3660031901126103eb5760206040517fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e628152f35b346103eb575f3660031901126103eb576020600f54604051908152f35b346103eb5760203660031901126103eb576004355f52600d60205260c060405f2060ff81541690600181015490600281015460038201549060056004840154930154936040519515158652602086015260408501526060840152608083015260a0820152f35b346103eb5760603660031901126103eb576004356024356001600160401b0381116103eb5761148b90369060040161058b565b604435916001600160401b0383116103eb576114ae6114d493369060040161058b565b92909160405160208101906114cc81610eb78a859190602083019252565b51902061343b565b6114e6815f52600c60205260405f2090565b80546001600160401b0381161561157d57604081901c60ff166115695760481c60ff1661155557805469ff0000000000000000001916690100000000000000000017815560010154907f4ef6805613a59a1bece0b99a00b945fffadc1bb793c7064706233d30fd438c765f80a3005b632863f91560e21b5f52600482905260245ffd5b633599e08d60e21b5f52600483905260245ffd5b633e426d5160e21b5f52600483905260245ffd5b60803660031901126103eb576024356004356044356001600160401b0381116103eb576115c290369060040161058b565b906064356115e2610e45610e3887610e2b885f52600860205260405f2090565b916001600160a01b038316156116ab575f547fc55043b6a137f66033384e3f6d9b80e72303eab38436f8fdb89899dc87ce53a29490611629906001600160a01b0316610e45565b3303611692575f611640611683938293369161232c565b93945b61164d8989613ca0565b60405161167181610eb78a8a60208401966303a81a5760e11b885260248501612382565b51915af461167d6123c7565b506123f6565b610f1d60405192839283612442565b50505061169d613bec565b6116835f8060035494611643565b635c7f4b4760e11b5f5260045ffd5b6004359061ffff821682036103eb57565b6024359061ffff821682036103eb57565b346103eb5760403660031901126103eb576117066116f86116ba565b6117006116cb565b906125d1565b6040518091602082016020835281518091526020604084019201905f5b818110611731575050500390f35b9193509160206101006001926117a36060885160ff81511684528581015186850152604081015160408501520151606083019060ff608080926001600160401b038151168552826020820151166020860152826040820151166040860152826060820151166060860152015116910152565b019401910191849392611723565b346103eb575f3660031901126103eb576020604051610e108152f35b60c09060231901126103eb57602490565b346103eb576101203660031901126103eb576004356117fc366117cd565b9060e4356001600160401b0381116103eb5761181c90369060040161058b565b92610104356001600160401b0381116103eb5761183d90369060040161058b565b90823561184981612689565b806118a8575b611899576118959561188595610eb76118766118809660405192839160208301958661269d565b5190209485613551565b613a99565b6040519081529081906020820190565b0390f35b63137ec6d760e11b5f5260045ffd5b5060208301351561184f565b346103eb5760e03660031901126103eb576004356118d1366117cd565b6118f360405160208101906118eb81610eb786888661269d565b519020612dc9565b906118fd82612e65565b821561197c575b7faa1bacadd202709f2df9c31faf4babdbb21a245021c22298bfcdf22861ca12c69161197761196c5f5160206140d65f395f51905f5293865f52600d6020526119508160405f206126ec565b6040519485945f5160206141365f395f51905f525f80a3612693565b151582526020820190565b0390a2005b9150600e545f198114610d575760018101600e5591611904565b346103eb575f3660031901126103eb576020601054604051908152f35b346103eb576119c1366105bb565b91936001600160a01b03169190821561054257611a12946119ff9360405160208101918252602081526119f560408261127b565b5190209485613654565b5f5160206141765f395f51905f52612e39565b805f52600c60205260405f209060ff825460401c16610760575f5160206141765f395f51905f525f52600b6020527f5248b41ce7bdc12ebe0248f44130be972d690f78fe7dbe1a76d984641d9dcfc25491821561074c57815f5160206140f65f395f51905f526107415f5160206141765f395f51905f529384600161070e61070260209a42612045565b346103eb575f3660031901126103eb5760206040515f5160206140d65f395f51905f528152f35b346103eb57611ad1366105bb565b92939091906001600160a01b03168015610542575f80808093611b198888888c476040516020810191888352604082015260408152611b1160608261127b565b519020613757565b4790828215611b30575bf115611b2b57005b61273a565b506108fc611b23565b346103eb5760203660031901126103eb57600435611b568161040c565b6001600160a01b0316801561054257611b8a604051602081019083825260208152611b8260408261127b565b519020612e01565b611b9381612e65565b6011545f5160206141565f395f51905f5290611bb7906001600160a01b0316610e45565b601180546001600160a01b0319166001600160a01b038616179055915f5160206141365f395f51905f525f80a36001600160a01b03167ff6879817b383066906e8355b81d5157ffe8bff151dd1946b33863aeede50ff985f80a3005b346103eb575f3660031901126103eb576020600e54604051908152f35b9181601f840112156103eb578235916001600160401b0383116103eb57602083818601950101116103eb57565b346103eb5760a03660031901126103eb576004356024356001600160401b0381116103eb57611c90903690600401611c30565b9190604435926001600160401b0384116103eb57611cb5610018943690600401611c30565b9160643593611cc38561040c565b6084359561292e565b346103eb575f3660031901126103eb5760206040517ffdc5f96508969628a00bce64abbf1ea989f16e791b70592a3122d67a7792e48c8152f35b346103eb575f3660031901126103eb576020600454604051908152f35b346103eb575f3660031901126103eb5760206040517fa24d58aaa8deed8b2ff0e63d867e6fe155de046522ed61849f5647e59d04b6ba8152f35b346103eb5760203660031901126103eb576004356001548110156103eb5760015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601546040516001600160a01b039091168152602090f35b346103eb575f3660031901126103eb5760206040515f5160206141165f395f51905f528152f35b346103eb575f3660031901126103eb576020611df8612cc1565b604051908152f35b346103eb575f3660031901126103eb575f546040516001600160a01b039091168152602090f35b346103eb5760203660031901126103eb576004355f52600b602052602060405f2054604051908152f35b346103eb575f3660031901126103eb5760206040517fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a813058152f35b346103eb57611e99366105bb565b6001600160a01b0385165f908152600260205260409020549294939290919060ff1615611f14576001600160a01b0384165f908152600560205260409020541561054257604080516001600160a01b03861660208201908152610018976109fb969093909290611f0c9082908101610eb7565b51902061386d565b633b63649d60e11b5f526001600160a01b03841660045260245ffd5b90602080835192838152019201905f5b818110611f4d5750505090565b82516001600160a01b0316845260209384019390920191600101611f40565b611f8460409295949395606083526060830190611f30565b9460208201520152565b346103eb575f3660031901126103eb5760035460015460405190602082828152019060015f52827fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65f5b838110611ffc575050611ff09061189593038461127b565b60405193849384611f6c565b81546001600160a01b0316855260209094019385925060019182019101611fd8565b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b91908201809211610d5757565b35906001600160401b03821682036103eb57565b60ff6120c2608080936001600160401b0361208082612052565b1686528361209060208301610d7b565b166020870152836120a360408301610d7b565b166040870152836120b660608301610d7b565b16606087015201610d7b565b16910152565b91908260a09103126103eb576040516120e081611240565b608061212c8183956120f181612052565b85526120ff60208201610d7b565b602086015261211060408201610d7b565b604086015261212160608201610d7b565b606086015201610d7b565b910152565b600754600160401b81101561125b5780600161215292016007556007611213565b9190916122395761221f6080606060036112ab9560ff86511660ff198254161781556020860151600182015560408601516002820155019301516121b66001600160401b0382511685906001600160401b03166001600160401b0319825416179055565b602081015184546121fa9160ff60401b1990911660409190911b68ff0000000000000000161760ff60408401511660ff60481b9060481b169060ff60481b19161790565b606082015160ff60501b1990911660509190911b60ff60501b16178455015160ff1690565b815460ff60581b191660589190911b60ff60581b16179055565b61201e565b90815260c0810192916112ab9160200190612066565b95929490958215611899576122cd606494612301937fdcd264bd7d6d022cfcd2ef488637c26dba3344acfaad38a093f1755fe21085f5976040519960208b0160ff87169b8c82528d60408201528960608201526122b4608082018c612066565b61010081526122c56101208261127b565b519020613983565b6122e16122d861129c565b60ff9092168252565b8660208201528260408201526122f736856120c8565b6060820152612131565b6123106040519283928361223e565b0390a3565b6001600160401b03811161125b5760051b60200190565b92919061233881612315565b93612346604051958661127b565b602085838152019160051b81019283116103eb57905b82821061236857505050565b6020809183356123778161040c565b81520191019061235c565b9392916123a79060409260018060a01b03168652606060208701526060860190611f30565b930152565b6001600160401b03811161125b57601f01601f191660200190565b3d156123f1573d906123d8826123ac565b916123e6604051938461127b565b82523d5f602084013e565b606090565b156123fd57565b60405162461bcd60e51b815260206004820152601c60248201527f53747261746567792064656c656761746563616c6c206661696c6564000000006044820152606490fd5b9291906123a7602091604086526040860190611f30565b6124625f612315565b90612470604051928361127b565b5f825281601f196124805f612315565b01905f5b82811061249057505050565b60209060405161249f81611260565b5f81525f838201525f60408201526040516124b981611240565b5f81525f848201525f60408201525f60608201525f6080820152606082015282828501015201612484565b906124ee82612315565b6124fb604051918261127b565b828152809261250c601f1991612315565b01905f5b82811061251c57505050565b60209060405161252b81611260565b5f81525f838201525f604082015260405161254581611240565b5f81525f848201525f60408201525f60608201525f6080820152606082015282828501015201612510565b9061ffff8091169116039061ffff8211610d5757565b805182101561120e5760209160051b010190565b906040516125a781611260565b606061212c6003839560ff81541685526001810154602086015260028101546040860152016112ad565b6007549161ffff8216928084101561267d578061ffff831611612671575b508261ffff82161115612663576126109161260991612570565b61ffff1690565b612619816124e4565b915f5b8281106126295750505090565b8061264761264161263c60019486612045565b6111f2565b5061259a565b6126518287612586565b5261265c8186612586565b500161261c565b50505061266e612459565b90565b61ffff9150165f6125ef565b5050505061266e612459565b801515036103eb57565b3561266e81612689565b90929160a060c09160e0840195845280356126b781612689565b151560208501526020810135604085015260408101356060850152606081013560808501526080810135828501520135910152565b9060a060059180356126fd81612689565b60ff801986541691151516178455602081013560018501556040810135600285015560608101356003850155608081013560048501550135910155565b6040513d5f823e3d90fd5b91906040838203126103eb57825161275c81612689565b926020810151906001600160401b0382116103eb570181601f820112156103eb57805190612789826123ac565b92612797604051948561127b565b828452602083830101116103eb57815f9260208093018386015e8301015290565b908060209392818452848401375f828201840152601f01601f1916010190565b92906127f19061266e95936060865260608601916127b8565b926001602082015260408185039101526127b8565b9060a8116103eb5760880190602090565b90610168116103eb576101480190602090565b90610198116103eb576101780190602090565b906101c8116103eb576101a80190602090565b906101f8116103eb576101d80190602090565b9061021c116103eb576102080190601490565b9061023c116103eb5761021c0190602090565b90610244116103eb5761023c0190600890565b3590602081106128aa575090565b5f199060200360031b1b1690565b356bffffffffffffffffffffffff198116929190601482106128d8575050565b6bffffffffffffffffffffffff1960149290920360031b82901b16169150565b356001600160c01b0319811692919060088210612913575050565b6001600160c01b031960089290920360031b82901b16169150565b9091929495936012548015908115612cb7575b50610acb576001600160a01b0387169586156105425760115461296c906001600160a01b0316610e45565b916001600160a01b03831615612ca8576129a1925f92836040518096819582946302bc2ce760e51b84528c8c600486016127d8565b03925af1908115611b2b575f905f92612c83575b5015612c6557506102488310612c5657612a18906129dc6129d68585612806565b9061289c565b6129e96129d68686612817565b6129f66129d6878761282a565b90612a046129d6888861283d565b92612a126129d68989612850565b94613d62565b83612a5e612a58612a52612a3e612a38612a328888612863565b906128b8565b60601c90565b95612a4c6129d68288612876565b95612889565b906128f8565b60c01c90565b926001600160a01b031603612c47578203612c4757600f54936001600160401b0382169480861115612c285750612a9a6109d460165460ff1690565b612bf65760145480861115612b785750612b4c907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612aeb612adc61129c565b6001600160a01b039093168352565b6020820152836040820152612b036060820160019052565b60609060018060a01b038151166bffffffffffffffffffffffff60a01b6013541617601355602081015160145560408101516015550151151560ff801960165416911617601655565b612b5b60ff1960175416601755565b604080516001600160401b039290921682526020820192909252a2565b929350509214612b87575b5050565b6015548114612b83577fa3f0eabe92ef7bacb81dba904189dc163924ee16379f429441a4117441609fff91612bc4600160ff196017541617601755565b612bf160155492604051938493846040919493926001600160401b03606083019616825260208201520152565b0390a1565b612b5b907fd7f6e74f567cbc509ae5f7854bc05fd2a9b3c014f4aa28788ef99e0d8f2ecba69495612aeb612adc61129c565b636762eb4960e01b5f526004526001600160401b03821660245260445ffd5b63319c9a2160e21b5f5260045ffd5b632ffd02b360e11b5f5260045ffd5b805115612c7457805190602001fd5b63e1ac453160e01b5f5260045ffd5b9050612ca191503d805f833e612c99818361127b565b810190612745565b905f6129b5565b63baa3de5f60e01b5f5260045ffd5b905042115f612941565b60405160208101907f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f82527f3d4a1189ec311cad4499197cf097eefb10346f2894cdd7cbbcb2d2a48001c91860408201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a08152612d5360c08261127b565b51902090565b60405160208101915f5160206141765f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206141165f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206140d65f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b60405160208101915f5160206141565f395f51905f528352604082015230606082015246608082015260808152612d5360a08261127b565b906040519060208201928352604082015230606082015246608082015260808152612d5360a08261127b565b805f52600c60205260405f209081546001600160401b038116906001600160401b03821615612eef57604081901c60ff166115695760481c60ff16611555576001600160401b0381164210612ec9575050805460ff60401b1916600160401b179055565b63c504f34d60e01b5f526004919091526001600160401b0316602452504260445260645ffd5b82633e426d5160e21b5f5260045260245ffd5b919081101561120e5760051b0190565b3561266e8161040c565b919081101561120e5760051b81013590601e19813603018212156103eb5701908135916001600160401b0383116103eb5760200182360381136103eb579190565b929192612f69826123ac565b91612f77604051938461127b565b8294818452818301116103eb578281602093845f960137010152565b5f54909491929190612fad906001600160a01b0316610e45565b331480613104575b806130fc575b6130e857600354938183036130b75784831080156130df575b6130c657612ff360045480975f5160206141165f395f51905f52613f67565b925f945f5b8781106130195750505050505050506130146112ab9160010190565b600455565b61302c613027828585612f02565b612f12565b966001600160a01b0390811690881611156130b757866130696109d46130628360018060a01b03165f52600260205260405f2090565b5460ff1690565b61309c5761308f6109d4613088613081858a8a612f1c565b3691612f5d565b8984613fe8565b61309c5750600101612ff8565b633b63649d60e11b5f526001600160a01b031660045260245ffd5b630da1c57360e41b5f5260045ffd5b6378f4355360e11b5f526004839052602485905260445ffd5b50848210612fd4565b50505050506112ab61301460045460010190565b508015612fbb565b508115612fb5565b5f54909491929190613126906001600160a01b0316610e45565b331480613207575b806131ff575b6130e857600354938183036130b75784831080156131f6575b6130c65761316c60045480975f5160206141565f395f51905f52613f67565b925f945f5b87811061318d5750505050505050506130146112ab9160010190565b61319b613027828585612f02565b966001600160a01b0390811690881611156130b757866131d16109d46130628360018060a01b03165f52600260205260405f2090565b61309c576131e96109d4613088613081858a8a612f1c565b61309c5750600101613171565b5084821061314d565b508015613134565b50811561312e565b5f54909491929190613229906001600160a01b0316610e45565b33148061331d575b80613315575b6130e857600354938183036130b757848310801561330c575b6130c65761328260045480977fac5d643ec5a18c3c05126c0540540c01e724afd2beab02a045f0f5d791103a15613f67565b925f945f5b8781106132a35750505050505050506130146112ab9160010190565b6132b1613027828585612f02565b966001600160a01b0390811690881611156130b757866132e76109d46130628360018060a01b03165f52600260205260405f2090565b61309c576132ff6109d4613088613081858a8a612f1c565b61309c5750600101613287565b50848210613250565b508015613237565b508115613231565b5f5490949192919061333f906001600160a01b0316610e45565b331480613433575b8061342b575b6130e857600354938183036130b7578483108015613422575b6130c65761339860045480977f921db041069361e63fc63658404e32c96548fc5d6a72e7fe763cb3c8b370e3fd613f67565b925f945f5b8781106133b95750505050505050506130146112ab9160010190565b6133c7613027828585612f02565b966001600160a01b0390811690881611156130b757866133fd6109d46130628360018060a01b03165f52600260205260405f2090565b61309c576134156109d4613088613081858a8a612f1c565b61309c575060010161339d565b50848210613366565b50801561334d565b508115613347565b5f54909491929190613455906001600160a01b0316610e45565b331480613549575b80613541575b6130e857600354938183036130b7578483108015613538575b6130c6576134ae60045480977fcb4f435a315262cdbbc1b22d576bc49b5e10e1516491e175d295831ff8a81305613f67565b925f945f5b8781106134cf5750505050505050506130146112ab9160010190565b6134dd613027828585612f02565b966001600160a01b0390811690881611156130b757866135136109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761352b6109d4613088613081858a8a612f1c565b61309c57506001016134b3565b5084821061347c565b508015613463565b50811561345d565b5f5490949192919061356b906001600160a01b0316610e45565b33148061364c575b80613644575b6130e857600354938183036130b757848310801561363b575b6130c6576135b160045480975f5160206140d65f395f51905f52613f67565b925f945f5b8781106135d25750505050505050506130146112ab9160010190565b6135e0613027828585612f02565b966001600160a01b0390811690881611156130b757866136166109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761362e6109d4613088613081858a8a612f1c565b61309c57506001016135b6565b50848210613592565b508015613579565b508115613573565b5f5490949192919061366e906001600160a01b0316610e45565b33148061374f575b80613747575b6130e857600354938183036130b757848310801561373e575b6130c6576136b460045480975f5160206141765f395f51905f52613f67565b925f945f5b8781106136d55750505050505050506130146112ab9160010190565b6136e3613027828585612f02565b966001600160a01b0390811690881611156130b757866137196109d46130628360018060a01b03165f52600260205260405f2090565b61309c576137316109d4613088613081858a8a612f1c565b61309c57506001016136b9565b50848210613695565b50801561367c565b508115613676565b5f54909491929190613771906001600160a01b0316610e45565b331480613865575b8061385d575b6130e857600354938183036130b7578483108015613854575b6130c6576137ca60045480977f2590c13a6bfb59ce1e1dfcbf973cec418117b8426141e0cc31959b3d7bfa2d93613f67565b925f945f5b8781106137eb5750505050505050506130146112ab9160010190565b6137f9613027828585612f02565b966001600160a01b0390811690881611156130b7578661382f6109d46130628360018060a01b03165f52600260205260405f2090565b61309c576138476109d4613088613081858a8a612f1c565b61309c57506001016137cf565b50848210613798565b50801561377f565b508115613779565b5f54909491929190613887906001600160a01b0316610e45565b33148061397b575b80613973575b6130e857600354938183036130b757848310801561396a575b6130c6576138e060045480977f1f9aa1ad5b6acb4043f0654345360b23371878df9b7f4802b13fcb8d3fbb745f613f67565b925f945f5b8781106139015750505050505050506130146112ab9160010190565b61390f613027828585612f02565b966001600160a01b0390811690881611156130b757866139456109d46130628360018060a01b03165f52600260205260405f2090565b61309c5761395d6109d4613088613081858a8a612f1c565b61309c57506001016138e5565b508482106138ae565b508015613895565b50811561388f565b5f5490949192919061399d906001600160a01b0316610e45565b331480613a91575b80613a89575b6130e857600354938183036130b7578483108015613a80575b6130c6576139f660045480977fedb0239d3d518751089b6e176aa9d6d59832b2f29f85556f331dc42619252e62613f67565b925f945f5b878110613a175750505050505050506130146112ab9160010190565b613a25613027828585612f02565b966001600160a01b0390811690881611156130b75786613a5b6109d46130628360018060a01b03165f52600260205260405f2090565b61309c57613a736109d4613088613081858a8a612f1c565b61309c57506001016139fb565b508482106139c4565b5080156139ab565b5081156139a5565b613ab0905f5160206140d65f395f51905f52612e39565b90815f52600c60205260405f2060ff815460401c16611569575f5160206140d65f395f51905f525f52600b6020527f9b6d9405e2a268edd94615fe7f07c0d5d9dda2152c2e48f4e74379972af1c618548015613b37575f5160206140f65f395f51905f526123105f5160206140d65f395f51905f529384600161070e6107028a9742612045565b6309913ab360e31b5f5260045260245ffd5b6001600160a01b0381165f8181526002602052604090205490919060ff1615613bd9576001600160a01b0381165f908152600560205260409020541561054257600680546001600160a01b031916831790556001600160a01b03165f90815260056020526040902054907f2c8c895ef6e3978e12490ffd8cd3b92d4717b223562f851382f5daf74f587b515f80a3565b50633b63649d60e11b5f5260045260245ffd5b600154613bf881612315565b91613c06604051938461127b565b818352601f19613c1583612315565b0136602085013782905f5b83811015613c99577fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68101546001600160a01b03165f9081526005602052604090205490811561054257600191613c93906001600160a01b0316613c848389612586565b6001600160a01b039091169052565b01613c20565b5091509150565b6007545f5b818110613cc55763dfffe2f960e01b5f526004839052602484905260445ffd5b613cd1612641826111f2565b8360ff8251161480613cfa575b613ceb5750600101613ca5565b6040015160601c949350505050565b5084602082015114613cde565b9060405160c081018181106001600160401b0382111761125b5760405260a06005829460ff81541615158452600181015460208501526002810154604085015260038101546060850152600481015460808501520154910152565b93929190613d80613d7b865f52600d60205260405f2090565b613d07565b94613d8e6109d48751151590565b613f555750602085018051156105425751808203613f19575050604084015180151580613f0f575b613ed1575050606083015180151580613ec7575b613e89575050608082015180151580613e7f575b613e4157505060a0015180151580613e37575b613df9575050565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523360d81b608482015260a490fd5b5080821415613df1565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264292a26a91960d91b608482015260a490fd5b5080821415613dde565b60405163fef6c5cf60e01b81526004810191909152602481019190915260606044820152600560648201526452544d523160d81b608482015260a490fd5b5080821415613dca565b60405163fef6c5cf60e01b815260048101919091526024810191909152606060448201526005606482015264052544d52360dc1b608482015260a490fd5b5080821415613db6565b60405163fef6c5cf60e01b81526004808201929092526024810192909252606060448301526064820152631354951160e21b608482015260a490fd5b6350dfe91360e01b5f5260045260245ffd5b916040519160208301937f4a3d56bf3b5708e5b633d12931f9923b37fde6895d6bd92957bbfa92cd003039855260408401526060830152608082015260808152613fb260a08261127b565b519020613fbd612cc1565b9060405190602082019261190160f01b84526022830152604282015260428152612d5360628261127b565b90915f91906001600160a01b038216156140cd5760405192600484019460248501956044860192853b1561405157509186939160209593630b135d3f60e11b8852526040845281518501809260045afa9360443d01915afa9151630b135d3f60e11b1491161690565b9796505090508151806040146140a85760411461406e5750505050565b60209293955060608201515f1a835260408201516060525b5f5201516040526020600160805f825afa511860601b3d11915f606052604052565b506020929395506040820151601b8160ff1c01845260018060ff1b0316606052614086565b505050505f9056feea4a6847c3f47fe0f98dcfe2e2c074e6cb42f6d74c367b33ae8516f537e775829cc91136b2c7668ecd202c7008f17e818e108b5448a7b7fd48bd2ca6b4aab51fb40912900bb80b6bc5e38d8489266de7299eedb40b03490214410117ef53ff9279883188dbf80e171cf94b3b44b6437b838158b1d3a5df6ccc709eeb7c5217296acb9fef2a4a1ecaa044f4c8979d9f48b0d5be623c860275be31c4cbd34c169cb2d153886d95f8f2d4836fb16c9fac869e1ce9cfc93d919a0f7dfe38439b9771a2646970667358221220d9a3575e6aa98198ed460c72687df8b305209a32fda153cf7302dc50f249d44a64736f6c634300081e0033"},"sourceId":"src/CredentialManager.sol","sourcemap":"858:48457:14:-:0;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12563:1;858:48457;-1:-1:-1;858:48457:14;;-1:-1:-1;;;;;;858:48457:14;17144:10;858:48457;;;;-1:-1:-1;;;;;858:48457:14;;17169:32;;17165:58;;-1:-1:-1;;;;;858:48457:14;;17237:37;;17233:63;;17306:68;858:48457;;-1:-1:-1;;;;;;858:48457:14;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;;;;18587:6;;18583:74;;18671:30;;:63;;;;858:48457;18667:156;;-1:-1:-1;18853:5:14;;;;;;858:48457;;;;;19218:55;858:48457;;;;;;-1:-1:-1;858:48457:14;;;;;;19218:55;858:48457;;;;;;17455:32;858:48457;;;17455:32;858:48457;;;;;;;17497:42;858:48457;;;17497:42;858:48457;;12563:1;858:48457;-1:-1:-1;17697:3:14;858:48457;;17665:30;;;;;17746:22;;;;:::i;:::-;;858:48457;;;;;17850:32;;;17697:3;17846:67;;858:48457;;12563:1;858:48457;-1:-1:-1;858:48457:14;17928:19;858:48457;;;-1:-1:-1;858:48457:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18985:10;858:48457;;;;;;;;;;;;;;;;;;;;;;;;17985:50;12563:1;858:48457;;;;;;;;;17985:50;-1:-1:-1;;858:48457:14;;;;;;;;12563:1;858:48457;;17650:13;;858:48457;;;;-1:-1:-1;858:48457:14;17306:68;858:48457;;;-1:-1:-1;858:48457:14;17846:67;17891:22;;;-1:-1:-1;17891:22:14;858:48457;-1:-1:-1;17891:22:14;17850:32;17862:6;858:48457;17862:6;;858:48457;17862:20;17850:32;;17665:30;18114:16;858:48457;;18154:8;858:48457;;18208:8;858:48457;;18264:6;858:48457;;;;9426:25;-1:-1:-1;858:48457:14;;;;;;;;;;;;18860:3;-1:-1:-1;;;;;18892:19:14;;;;:::i;:::-;858:48457;;18929:16;;;18925:42;;858:48457;-1:-1:-1;858:48457:14;18985:10;858:48457;;;;-1:-1:-1;858:48457:14;;;18981:53;;858:48457;-1:-1:-1;858:48457:14;18985:10;858:48457;;;-1:-1:-1;858:48457:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;858:48457:14;;;;;;;;;-1:-1:-1;;;;;;858:48457:14;;;;;;19120:17;;-1:-1:-1;19120:17:14;858:48457;18838:13;;858:48457;;;;-1:-1:-1;858:48457:14;;;;;-1:-1:-1;858:48457:14;;;;;-1:-1:-1;858:48457:14;;;;;-1:-1:-1;858:48457:14;18981:53;19008:26;;;-1:-1:-1;19008:26:14;;-1:-1:-1;19008:26:14;18925:42;17210:13;;;-1:-1:-1;18954:13:14;;-1:-1:-1;18954:13:14;18667:156;18602:55;;;;;-1:-1:-1;18757:55:14;;858:48457;;;;-1:-1:-1;18757:55:14;18671:63;18705:29;;;;18671:63;;18583:74;18602:55;;;;-1:-1:-1;18602:55:14;;858:48457;-1:-1:-1;858:48457:14;;;-1:-1:-1;18602:55:14;858:48457;;;;;;;;;;;;;;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;858:48457:14;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;858:48457:14;;;-1:-1:-1;;;;;858:48457:14;;;;;;;;;;:::o;:::-;-1:-1:-1;;;;;858:48457:14;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;;;858:48457:14;;;;;;:::o;:::-;;;;;;;;;;;;;;;:::o","userdoc":{"errors":{"CannotCancel()":[{"notice":"Thrown when attempting to cancel an operation that cannot be canceled (e.g., already executed)."}],"InsufficientSignatures(uint256,uint256)":[{"notice":"Thrown when the number of valid signatures provided is less than the required threshold."}],"InvalidCommitteeThreshold(uint256,uint256)":[{"notice":"Thrown when attempting to set a quorum threshold that is 0 or greater than the total operators."}],"InvalidDelay(uint256)":[{"notice":"Thrown when a timelock delay is set to 0 (invalid safety margin)."}],"InvalidEpoch(uint256,uint256)":[{"notice":"Thrown when the supplied epoch is invalid"}],"InvalidProfileConfig()":[{"notice":"Thrown when the used profile is configured incorrectly."}],"InvalidProfileId()":[{"notice":"Thrown when the used profile does not exist."}],"InvalidQuoteLength()":[{"notice":"Thrown when a Quote length is invalid."}],"InvalidReportData()":[{"notice":"Thrown when a Quote ReportData does not match params."}],"InvalidVaultAddr()":[{"notice":"Thrown when a Vault address is empty (bytes32(0))."}],"InvalidVerifier()":[{"notice":"Thrown when a Quote verifier is invalid."}],"InvalidZkProof()":[{"notice":"Thrown when the ZK Proof attesting measurements is invalid."}],"MeasurementMismatch(bytes32,bytes32,string)":[{"notice":"Thrown when the measured TEE state does not match the expected state."}],"NoStrategy()":[{"notice":"Thrown when attempting to update vault admins on a chain that has no registered strategy."}],"NotOperator(address)":[{"notice":"Thrown when a signature belongs to an address that is not a registered operator."}],"ProfileInactive(uint256)":[{"notice":"Thrown when the used profile is not active."}],"SignersNotSortedOrUnique()":[{"notice":"Thrown when the provided signatures are not sorted by signer address or contain duplicates."}],"StrategyAlreadyExists()":[{"notice":"Thrown when attempting to register a strategy for a chain that already has one."}],"TimelockAlreadyCanceled(bytes32)":[{"notice":"Thrown when attempting to execute or cancel an operation that has already been canceled."}],"TimelockAlreadyExecuted(bytes32)":[{"notice":"Thrown when attempting to execute or schedule an operation that has already been executed."}],"TimelockNotReady(bytes32,uint256,uint256)":[{"notice":"Thrown when attempting to execute a timelock before the delay has elapsed."}],"TimelockUnknown(bytes32)":[{"notice":"Thrown when attempting to act on a timelock ID that does not exist or was never scheduled."}],"VaultNotFound(uint256,uint256)":[{"notice":"Thrown when a requested vault cannot be found for the specified chain."}],"ZeroAddress()":[{"notice":"Thrown when a critical configuration address (e.g., Risk Manager) is set to address(0)."}]},"events":{"AdminUpdateStrategyRegistered(uint256,uint256,address)":{"notice":"Emitted when a new cross-chain strategy is registered."},"AttestedKeyRegistered(address,bytes32)":{"notice":"Emitted when a new attested key for an operator is registered."},"CommitteeThresholdUpdated(uint256,uint256)":{"notice":"Emitted when the signature threshold is updated."},"DepositVaultAdministratorsUpdated(uint256,address[],uint256)":{"notice":"Emitted when the admin set of a remote vault is updated."},"DepositVaultAdministratorsUpdated(uint256,uint256,address[],uint256)":{"notice":"Emitted when a new cross-chain strategy is registered."},"LeaderUpdated(address,bytes32)":{"notice":"Emitted when the quorum leader is updated."},"MeasurementsUpdated(bytes32,bytes32)":{"notice":"Emitted when the measurements are updated."},"OperatorAdded(address)":{"notice":"Emitted when a new operator is added during initialization."},"VaultAdded(uint256,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8))":{"notice":"Emitted when a new vault is added to the registry."}},"kind":"user","methods":{"addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":{"notice":"Registers a new deposit vault to the system."},"admin()":{"notice":"TEMP Admin path, to be revised later."},"adminUpdateStrategies(uint256,uint256)":{"notice":"Maps a RoutingID to the VMID to the Strategy Contract responsible for sending messages to it."},"appointLeader(address,address[],bytes[])":{"notice":"Manually appoints a leader. Used for bootstrapping or emergency recovery."},"cancelTimelock(bytes32,address[],bytes[])":{"notice":"Cancels a pending timelocked operation."},"committeeThreshold()":{"notice":"The minimum number of signatures required to execute a governance action."},"constructor":{"notice":"Initializes the Credential Manager with the initial operator set and configuration."},"domainSeparator()":{"notice":"Returns the EIP-712 domain separator used for verifying governance signatures."},"epoch()":{"notice":"Tracks the logical era of the TEE state to prevent replay attacks."},"executeRegistryContract(address)":{"notice":"Executes a pending Registry Contract update if the timelock has expired."},"executeRiskManager(address)":{"notice":"Executes a pending Risk Manager update if the timelock has expired."},"executeUpdateAutomataVerifier(address)":{"notice":"Sxecudes a timelocked update for the Automata Verifier address."},"getCommitteeConfig()":{"notice":"Returns the full Committee configuration."},"getLeader()":{"notice":"Returns the current Leader's Operator Address and Attested Key."},"getVaults(uint16,uint16)":{"notice":"Returns a paginated list of registered vaults."},"governanceNonce()":{"notice":"A monotonically increasing nonce for governance actions."},"initiateRestart()":{"notice":"Step 1: Initiates the gathering window if the system is down."},"isOperator(address)":{"notice":"Lookup to check if an address is an operator."},"latestCheckpointHash()":{"notice":"The hash of the system state (inventory) associated with the current epoch."},"leader()":{"notice":"The current active leader (Operator Address)."},"measurementProfiles(uint256)":{"notice":"The current \"Gold Image\" measurements required for valid Quotes. Matches based on profile."},"operatorToAttestedKey(address)":{"notice":"Maps Operator (EOA) -> Attested Key (TEE Address)."},"operators(uint256)":{"notice":"The list of authorized Clearing Engine operator addresses (EOAs)."},"registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":{"notice":"Registers a strategy contract to handle updates for a specific chain."},"registerAttestedKey(bytes32)":{"notice":"Allows an operator to register their TEE's attested key."},"registryContract()":{"notice":"The address of the global Registry Contract used for asset/settler configurations."},"resolveRestart()":{"notice":"Step 3: Finalizes the restart after the window closes."},"riskManager()":{"notice":"The address of the Risk Manager (or multisig) authorized to adjust risk parameters."},"scheduleManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32),address[],bytes[])":{"notice":"Governance proposes adding or updating a measurement profile (e.g., for Phala or GCP)."},"scheduleRegistryContract(address,address[],bytes[])":{"notice":"Schedules a timelocked update for the Registry Contract address."},"scheduleRiskManager(address,address[],bytes[])":{"notice":"Schedules a timelocked update for the Risk Manager address."},"scheduleUpdateAutomataVerifier(address,address[],bytes[])":{"notice":"Schedules a timelocked update for the Automata Verifier."},"setDepositVaultAdministrators(uint256,uint256,address[],uint256)":{"notice":"Updates the administrators or withdrawal quorum for a vault on a remote chain."},"submitRestartProof(uint256,bytes,bytes,address,bytes32)":{"notice":"Restarts the system using a Trustless ZK Proof (Automata / SP1). The contract stores the \"Best\" candidate."},"timelockDelayFor(bytes32)":{"notice":"Configuration mapping for how long specific operations must be delayed."},"timelockOps(bytes32)":{"notice":"Stores the status of individual scheduled operations by their hash ID."},"updateCommitteeThreshold(uint256,address[],bytes[])":{"notice":"Updates the number of signatures required for valid governance actions."},"vaults(uint256)":{"notice":"The registry of all authorized Deposit Vaults."},"withdraw(address,address[],bytes[])":{"notice":"Withdraw funds held by this contract."}},"notice":"The centralized Root of Trust for the TEE Clearing Engine.","version":1}},"DepositVault":{"abi":[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_credentialManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EmptyOrders","type":"error"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAdministrators","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAmountFromExecutor","type":"error"},{"inputs":[{"internalType":"uint256","name":"settlementIndex","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientCallbackReturnForSettlement","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"given","type":"uint256"}],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"MissedQuorum","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCredentialManager","type":"error"},{"inputs":[],"name":"NotExecutor","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"PayloadMismatch","type":"error"},{"inputs":[],"name":"SettlerNotApproved","type":"error"},{"inputs":[],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroWithdrawalQuorum","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"numAdminsAfter","type":"uint256"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[],"name":"AdministratorSetReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldCredentialManager","type":"address"},{"indexed":false,"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"CredentialManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"account","type":"uint64"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"Settled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"WithdrawalQuorumChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[],"name":"SETTLEMENT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"},{"internalType":"address","name":"executor","type":"address"}],"name":"addSettlerExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"administrators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedSettlers","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManagerChangeDelayBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"depositCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct DepositVault.Settlement","name":"order","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"executeAtomicSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct DepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"clearingEngineSignature","type":"bytes"}],"internalType":"struct DepositVault.SignedSettlement[]","name":"requests","type":"tuple[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"executeSquashingSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getApprovedSettlers","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAdministrator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSignatureUse","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingSettlements","outputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct DepositVault.SettlementOrder","name":"settlement","type":"tuple"},{"internalType":"address","name":"target","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct DepositVault.SettlementOrder","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"clearingEngineSignature","type":"bytes"}],"internalType":"struct DepositVault.SignedSettlementOrder[]","name":"orders","type":"tuple[]"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"name":"pullBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"}],"name":"pushBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"removeSettler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"setCredentialManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setDepositorStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"settlementCaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"settlementCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct DepositVault.Withdrawal","name":"withdrawal","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes32","name":"epochHash","type":"bytes32"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"withdrawalCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"DepositVault","deploymentBytecode":{"bytecode":"0x60803460ad57601f6126aa38819003918201601f19168301916001600160401b0383118484101760b157808492604094855283398101031260ad57604b602060458360c5565b920160c5565b6138406006556001600160a01b03909116908115609e576001600160a01b0316908115609e5760018060a01b03195f5416175f5560018060a01b031960015416176001556040516125d190816100d98239f35b63d92e233d60e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820360ad5756fe60806040526004361015610011575f80fd5b5f3560e01c80630a2eb30114611f7c5780630b9b17a614611dc857806313af403514611d7d57806321e6652c14611cd0578063224b93e114611c7457806323c5673114611a125780632b0c1a1e146119ea5780633684f4ac1461193e5780633a87fe4d146119065780633d63ea93146118dc57806341774bfe146117895780634bf0d3311461174c5780637438b9371461171b57806382ff8b1e146116f15780638da5cb5b146116ca5780638dff23051461168557806392698ac6146115cf57806393ea8a7d146115b2578063952df832146112e357806398af9772146112ab578063a33c9d001461128e578063ad9fa8bc14611169578063b1fb79c01461112f578063b24e085a14610902578063d7a99d7a14610669578063d89d151014610627578063d8c8785d1461060a578063d917bdb1146102f4578063d954863c146101c95763f585b64f14610163575f80fd5b346101b65760603660031901126101b65761017c611fa9565b610184611fbf565b5f549091906001600160a01b031633036101ba576001600160a01b038216156101b6576101b49160443591612520565b005b5f80fd5b6330cd747160e01b5f5260045ffd5b346101b65760603660031901126101b6576004356101e5611fbf565b604435335f52600e60205260ff60405f205416156102c2578015610297577f9d677c46e10ba33882144473956fae8d2c52353dcde5aab8230d1bd280cfc3b481610232859330338761244c565b825f52600b60205260405f2054936102646040519283928360209093929193604081019460018060a01b031681520152565b0390a35f52600b60205260405f20805490600182018092116102835755005b634e487b7160e01b5f52601160045260245ffd5b606460405162461bcd60e51b81526020600482015260046024820152635a65726f60e01b6044820152fd5b60405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b6044820152606490fd5b346101b65760a03660031901126101b6576004356001600160401b0381116101b657610324903690600401611fff565b90602435604435916001600160401b0383168093036101b6576064356001600160a01b03811691908281036101b657608435908142116105fb57845f52600960205260405f20865f5260205260405f20546101b65761038233612188565b156105ec57845f52600a60205260405f20865f5260205260405f2054936002549488156105dd575f5b8981106103d9578989895f52600a60205260405f20905f526020526103d560405f209182546121d1565b9055005b6103e4818b8861242a565b916080830135908082036105c857508291908989838e8e8b866bffffffffffffffffffffffff196104148b61220a565b60601b169260208b013597889760408d019d8e6001600160601b03199061043a9061220a565b60601b1690606001359961044f978b9361236a565b8051906020012091610461918d61242a565b60a0810161046e91612242565b9061047892612571565b6001830180841161028357958c5f5260096020528d60405f20905f5260205260405f2093604051926104a98461205c565b60a0883603126101b6576104d9604051936104c385612092565b6104cc8a611fd5565b8552866020860152611fd5565b604084015260608301526080820152815260208101928784528054600160401b8110156105b45761050f9160018201815561202f565b9390936105a1579051805184546001600160a01b03199081166001600160a01b03928316178655602083015160018781019190915560408401516002880180548416918516919091179055606084015160038801556080939093015160048701559251600590950180549093169416939093179055909261059b919087906105969061220a565b612520565b016103ab565b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b6306427aeb60e01b5f5260045260245260445ffd5b63164bb4b560e11b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b630407b05b60e31b5f5260045ffd5b346101b6575f3660031901126101b6576020600f54604051908152f35b346101b65760203660031901126101b657600435600d548110156101b657610650602091612116565b905460405160039290921b1c6001600160a01b03168152f35b346101b657366003190161014081126101b657610100136101b657610104356001600160401b0381116101b6576106a490369060040161215b565b90610124356001600160401b0381116101b6576106c590369060040161215b565b92906084359160a435936001600160401b0385168095036101b65760e435918242116105fb575f85815260036020908152604080832033845260010190915290205460ff16156108f357845f52600a60205260405f20865f5260205260405f20549660c435978089036108dc5750610788906002549561077c6001600160601b031961074f6121de565b60601b16968b8b8b6024359b6001600160601b031961076c6121f4565b60601b168d6064359d8e9361236a565b60208151910120612571565b43600f55845f52600a60205260405f20865f5260205260405f2080549160018301809311610283576020928692556107dd6107c16121de565b604051631f8eac2760e11b8152958694859492600486016123f0565b03815f335af19081156108d1575f9161089f575b5081811061088a57906108317ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c93926108286121f4565b3090339061244c565b61083e82336105966121de565b6108856108496121de565b916108526121f4565b604080516001600160a01b0395861681526020810196909652931692840192909252606083019190915281906080820190565b0390a4005b63d44c3d9d60e01b5f5260045260245260445ffd5b90506020813d6020116108c9575b816108ba602093836120ad565b810103126101b65751866107f1565b3d91506108ad565b6040513d5f823e3d90fd5b88906306427aeb60e01b5f5260045260245260445ffd5b6361968ebb60e11b5f5260045ffd5b346101b65760603660031901126101b6576004356001600160401b0381116101b657610932903690600401611fff565b6024356001600160401b0381116101b657610951903690600401611fff565b9060443582840361112057805f52600760205260ff60405f20541615611111575f90815260036020908152604080832033845260010190915290205460ff16156108f3578260011b83810460021484151715610283576109b08161222b565b906109be60405192836120ad565b8082526109cd601f199161222b565b015f5b8181106110e25750505f915f5b858110610dd457505f5b838110610d1257505f5b838110610cb95750610a028561222b565b93610a1060405195866120ad565b858552601f19610a1f8761222b565b013660208701375f5b868110610bd5575050505f5b828110610afa5785855f5b818110610a4857005b600190610a5f36610a5a8386886122b1565b6122d4565b60808101516001600160401b0360a083015116907ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c60c084015193868060a01b03815116610af160208301519260608a8060a01b03604083015116910151906040519485948590949392606092608083019660018060a01b03168352602083015260018060a01b031660408201520152565b0390a401610a3f565b5f6060610b07838561228f565b51015113610b18575b600101610a34565b6001600160a01b03610b2a828461228f565b5151166060610b39838561228f565b510151905f5f5b828a8a808410610b855750505050828110610b6e575060019291610b67913090339061244c565b9050610b10565b905063d44c3d9d60e01b5f5260045260245260445ffd5b6001600160a01b0391610ba691604091610ba09187916122b1565b0161220a565b1614610bb5575b600101610b40565b90610bcd600191610bc6848b61228f565b51906121d1565b919050610bad565b610be436610a5a838a8c6122b1565b8051602082810151610c22926001600160a01b0316610c0486888a612274565b604051631f8eac2760e11b81529586948594919391600486016123f0565b03815f335af19081156108d1575f91610c88575b50610c41838961228f565b526060610c4e838961228f565b51910190815111610c625750600101610a28565b610c6c828861228f565b519051916359a771d160e01b5f5260045260245260445260645ffd5b90506020813d8211610cb1575b81610ca2602093836120ad565b810103126101b657518a610c36565b3d9150610c95565b805f6060610cc96001948761228f565b51015112610cd8575b016109f1565b610d0d828060a01b03610ceb838761228f565b515116610d056060610cfd858961228f565b5101516123e0565b903390612520565b610cd2565b806020610d216001938661228f565b5101516040610d30838761228f565b5101511015610d7657610d606020610d48838761228f565b5101516040610d57848861228f565b5101519061221e565b6060610d6c838761228f565b5101525b016109e7565b6040610d82828661228f565b5101516020610d91838761228f565b5101511015610d7057610dc0610dbb6040610dac848861228f565b5101516020610d57858961228f565b6123e0565b6060610dcc838761228f565b510152610d70565b610ddf8187896122b1565b610120813603126101b65760405190610df78261205c565b610e0136826122d4565b8252610100810135906001600160401b0382116101b6570136601f820112156101b65780356001600160401b0381116105b45760405191610e4c601f8301601f1916602001846120ad565b81835236602083830101116101b657815f926020809301838601378301015260208201525160808101516001600160401b0360a0830151169160c08101519260e08201519060408301519360018060a01b0385169284519660206060870151960151968242116105fb57835f52600a60205260405f206001600160401b0386165f5260205260405f20548083106110cb57508f918f8b90610f21610f3f96610f2e948a8f8f8f90918d92610f399b600254906001600160601b03199060601b16926001600160601b03199060601b169061236a565b60208151910120946122b1565b610100810190612242565b91612571565b43600f555f52600a6020526001600160401b0360405f2091165f5260205260405f208054906001820180921161028357555f9182805b8a8110611083575b501561103f575b50505f5b878110610ff4575b5015610fa1575b50506001016109dd565b94610fec916001939660405191610fb783612077565b858060a01b031682525f602083015260408201525f6060820152610fdb828761228f565b52610fe6818661228f565b506122a3565b939088610f97565b6001600160a01b038481169061100a838a61228f565b5151161461101a57600101610f88565b60409150611028908761228f565b51016110358282516121d1565b905260018a610f90565b9061107b9298916040519161105383612077565b825260208201525f60408201525f6060820152611070828961228f565b52610fe6818861228f565b958a80610f84565b836001600160a01b03611096838d61228f565b515116146110a657600101610f75565b602091506110b4908a61228f565b51016110c18282516121d1565b905260018d610f7d565b90506306427aeb60e01b5f5260045260245260445ffd5b6020906040516110f181612077565b5f81525f838201525f60408201525f6060820152828286010152016109d0565b63be4ab3c760e01b5f5260045ffd5b631d6e22b960e01b5f5260045ffd5b346101b6575f3660031901126101b65760206040517fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb8152f35b346101b65760403660031901126101b657600435611185611fbf565b5f549091906001600160a01b031633036101ba57805f52600760205260ff60405f20541615611237575b5f52600360205260405f2090600182019160018060a01b0382165f528260205260ff60405f205416156111de57005b8054600160401b8110156105b4576111fb91600182018155612146565b81546001600160a01b0393841660039290921b82811b94901b19169290921790555f90815260209190915260409020805460ff19166001179055005b600454600160401b8110156105b45761127061125a82600185940160045561212e565b819391549060031b91821b915f19901b19161790565b9055805f52600760205260405f20600160ff198254161790556111af565b346101b6575f3660031901126101b6576020600654604051908152f35b346101b65760203660031901126101b6576001600160a01b036112cc611fa9565b165f526008602052602060405f2054604051908152f35b346101b657366003190161010081126101b6576060136101b6576064356084356001600160a01b03811681036101b65760a4359160e4356001600160401b0381116101b657611336903690600401611fff565b9290936005548142116105fb5780851061159c57835f52600c60205260405f20549560443596808803611585575061136d8661222b565b9061137b60405192836120ad565b868252601f1961138a8861222b565b013660208401375f916002546001600160601b03196113a76121de565b60601b16602435966040519160208301937f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba8552604084015260608301528760808301528960a08301528b60c083015260e082015260c4356101008201526001600160601b03198860601b16610120820152610120815261142a610140826120ad565b5190205f5b8981106114d3575b505050509080929394955081106114be575050825f52600c60205260405f2080549060018201809211610283577fc4f5735f1abe60807c07c06560e4a6d7eb655a37442b6a47e3ab1998c9611e2f936114999284925543600f556105966121de565b6114a16121de565b604080516001600160a01b039290921682526020820192909252a3005b6326a15da760e01b5f5260045260245260445ffd5b6114e86114e1828c87612274565b90846124aa565b6001600160a01b0381169081156115765761150290612188565b156115765760015f5b87811061154b575b5061152e575b508585146115295760010161142f565b611437565b94611544919561153e828661228f565b526122a3565b938b611519565b826001600160a01b0361155e838961228f565b51161461156d5760010161150b565b50505f8d611513565b638baa579f60e01b5f5260045ffd5b87906306427aeb60e01b5f5260045260245260445ffd5b846326a15da760e01b5f5260045260245260445ffd5b346101b6575f3660031901126101b6576020600554604051908152f35b346101b6575f3660031901126101b6576040518060206004549283815201809260045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b905f5b81811061166f575050508161162d9103826120ad565b604051918291602083019060208452518091526040830191905f5b818110611656575050500390f35b8251845285945060209384019390920191600101611648565b8254845260209093019260019283019201611617565b346101b65760403660031901126101b65761169e611fe9565b6004355f52600a6020526001600160401b0360405f2091165f52602052602060405f2054604051908152f35b346101b6575f3660031901126101b6575f546040516001600160a01b039091168152602090f35b346101b65760203660031901126101b6576004355f52600c602052602060405f2054604051908152f35b346101b65760203660031901126101b6575f546001600160a01b031633036101ba576002546101b657600435600255005b346101b65760203660031901126101b6576001600160a01b0361176d611fa9565b165f52600e602052602060ff60405f2054166040519015158152f35b346101b65760203660031901126101b6575f54600435906001600160a01b031633036101ba576004545f828152600760205260408120805460ff191690555b818110611853575b50505f52600360205260405f205f60018201905b825481101561182757806117fa60019285612146565b838060a01b0391549060031b1c16828060a01b03165f528260205260405f2060ff198154169055016117e4565b82545f8455838161183457005b5f5260205f20908101905b81811061184857005b5f815560010161183f565b8261185d8261212e565b90549060031b1c14611871576001016117c8565b905f1981019081116102835761125a61188c6118999261212e565b90549060031b1c9261212e565b905560045480156118c8575f19016118b08161212e565b8154905f199060031b1b1916905560045581806117d0565b634e487b7160e01b5f52603160045260245ffd5b346101b65760203660031901126101b6576004355f52600b602052602060405f2054604051908152f35b346101b65760203660031901126101b6576004356004548110156101b65761192f60209161212e565b90549060031b1c604051908152f35b346101b65760603660031901126101b657611957611fe9565b604435906004355f5260096020526001600160401b0360405f2091165f5260205260405f2080548210156101b65760c0916119919161202f565b5061199b816120ce565b6005909101546040805183516001600160a01b039081168252602080860151908301528285015181169282019290925260608085015190820152608093840151938101939093521660a0820152f35b346101b6575f3660031901126101b6576001546040516001600160a01b039091168152602090f35b346101b65760403660031901126101b6576004356001600160401b0381116101b657611a42903690600401611fff565b600154909190602435906001600160a01b03163303611c655760018110611c5657808310611c40575f5b83811015611aa8576001600160a01b03611a8b600583901b850161220a565b1615611a9957600101611a6c565b63d92e233d60e01b5f5260045ffd5b5091906001600160401b0382116105b457600160401b82116105b457600d5482600d55808310611bfc575b50600d5f525f5b828110611bc157837f74e3f7a222a002bb0346144c8442604f86b79a5319301c8b2393dbe33ba3f1ec5f80a1600d545f5b818110611b5657826005549080600555808203611b2457005b7f71847092dda23e5394806b377214ca90449cdd1413463150e7f577ccefea54d89160409182519182526020820152a1005b611b5f81612116565b905460018301929160031b1c6001600160a01b031682821161028357604080516001600160a01b0392909216825260208201939093526001927f723c2b747529ca7f5eb53a74808f4a8b9bf264f0fc450fd904900151da74548a91a101611b0b565b6001906020611bcf8461220a565b930192817fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5015501611ada565b600d5f527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb59081019083015b818110611c355750611ad3565b5f8155600101611c28565b82633e1a6b7d60e21b5f5260045260245260445ffd5b6345f8facb60e11b5f5260045ffd5b6326b672e560e01b5f5260045ffd5b346101b65760403660031901126101b657611c8d611fa9565b602435908115158092036101b6575f546001600160a01b031633036101ba5760018060a01b03165f52600e60205260405f209060ff801983541691161790555f80f35b346101b65760203660031901126101b657611ce9611fa9565b5f546001600160a01b031633036101ba576001600160a01b03168015611a9957611d18600f54600654906121d1565b431015611d6e5760407feb63fb900cbf0301de00619a02ae3f5996820dabc03207c0e0d97046e521d7b99160015490806001600160601b0360a01b83161760015582519160018060a01b031682526020820152a1005b636fed7d8560e01b5f5260045ffd5b346101b65760203660031901126101b657611d96611fa9565b5f54906001600160a01b03821633036101ba576001600160a01b0316908115611a99576001600160a01b031916175f55005b346101b65760403660031901126101b657600435611de4611fe9565b611ded33612188565b156105ec576001600160401b0316905f5b815f52600960205260405f20835f5260205260405f205463ffffffff82161015611f0d5763ffffffff90825f52600960205260405f20845f52602052611e478160405f2061202f565b50611e9060405191611e588361205c565b611e61816120ce565b8084526005909101546001600160a01b039081166020850181905260408301516060909301519230921661244c565b51608080820151825160208085015160408087015160609788015182516001600160a01b0396871681529485019390935293909316928201929092529384015291869186917ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c9190a41663ffffffff811461028357600101611dfe565b505f52600960205260405f20905f5260205260405f208054905f815581611f3057005b81600602916006830403610283575f5260205f20908101905b818110611f5257005b805f600692555f60018201555f60028201555f60038201555f60048201555f600582015501611f49565b346101b65760203660031901126101b6576020611f9f611f9a611fa9565b612188565b6040519015158152f35b600435906001600160a01b03821682036101b657565b602435906001600160a01b03821682036101b657565b35906001600160a01b03821682036101b657565b602435906001600160401b03821682036101b657565b9181601f840112156101b6578235916001600160401b0383116101b6576020808501948460051b0101116101b657565b8054821015612048575f52600660205f20910201905f90565b634e487b7160e01b5f52603260045260245ffd5b604081019081106001600160401b038211176105b457604052565b608081019081106001600160401b038211176105b457604052565b60a081019081106001600160401b038211176105b457604052565b90601f801991011681019081106001600160401b038211176105b457604052565b906040516120db81612092565b82546001600160a01b039081168252600184015460208301526002840154166040820152600383015460608201526004909201546080830152565b600d5481101561204857600d5f5260205f2001905f90565b6004548110156120485760045f5260205f2001905f90565b8054821015612048575f5260205f2001905f90565b9181601f840112156101b6578235916001600160401b0383116101b657602083818601950101116101b657565b600d54905f5b82811061219c575050505f90565b6121a581612116565b905460039190911b1c6001600160a01b03908116908316146121c95760010161218e565b505050600190565b9190820180921161028357565b6004356001600160a01b03811681036101b65790565b6044356001600160a01b03811681036101b65790565b356001600160a01b03811681036101b65790565b9190820391821161028357565b6001600160401b0381116105b45760051b60200190565b903590601e19813603018212156101b657018035906001600160401b0382116101b6576020019181360383136101b657565b908210156120485761228b9160051b810190612242565b9091565b80518210156120485760209160051b010190565b5f1981146102835760010190565b91908110156120485760051b8101359061011e19813603018212156101b6570190565b9190826101009103126101b65760405161010081018181106001600160401b038211176105b457604052809261230981611fd5565b82526020810135602083015261232160408201611fd5565b6040830152606081013560608301526080810135608083015260a08101356001600160401b03811681036101b65760e091829160a085015260c081013560c08501520135910152565b989796959493929190604051997fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208c015260408b015260608a0152608089015260a088015260c087015260e086015261010085015261012084015261014083015261014082526123de610160836120ad565b565b600160ff1b8114610283575f0390565b9284926080959260018060a01b03168552602085015260606040850152816060850152848401375f828201840152601f01601f1916010190565b91908110156120485760051b8101359060be19813603018212156101b6570190565b916040519360605260405260601b602c526323b872dd60601b600c5260205f6064601c82855af1908160015f5114161561248c575b50505f606052604052565b3b153d17101561249d575f80612481565b637939f4245f526004601cfd5b604080515f959490939181146124f5576041146124c657505050565b604080929395508101355f1a60205281375b5f526020604060805f60015afa505f6060523d6060185191604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b03166060529092506124d8565b919060145260345263a9059cbb60601b5f5260205f6044601082855af1908160015f51141615612553575b50505f603452565b3b153d171015612564575f8061254b565b6390b8ec185f526004601cfd5b9061257c92916124aa565b6001600160a01b038116156115765761259490612188565b156115765756fea2646970667358221220ed8c58622d1980bbe08e33449f7238db19ed378c986e4473a49e0f023c0a759464736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{"addSettlerExecutor(bytes32,address)":{"details":"Reverts with `NotOwner`; Only the admin can set the settler executor.","params":{"executor":": The settler's assigned executor address.","settler":": The settler's tplus account key."}},"constructor":{"details":"Reverts with `ZeroAddress()` if `_owner` is null.Reverts with `ZeroAddress()` if `_credentialManager` is null.","params":{"_credentialManager":"The address of the credential manager.","_owner":"The address to set as the owner."}},"deposit(bytes32,address,uint256)":{"details":"Reverts if the amount is 0.","params":{"amount":": The amount of the token to deposit.","tokenAddress":": The address of the token to deposit.","user":": The user whose account will be credited with the deposit."}},"executeAtomicSettlement((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes,bytes)":{"details":"Reverts with `Expired` if the block timestamp is greater than `validUntil`.Reverts with `NotExecutor`; Only the executor can settle.Reverts with `InvalidNonce` if the nonce has already been used.Reverts with `SignatureError` if the signer is not an admin.Reverts with `InsufficientAmountFromExecutor` if the `order.amountIn` is less than what the executor reports","params":{"data":": The data to execute as part of settlement callback.","order":": The settlement order.","signature":": The signature from the t+ clearing engine."}},"executeSquashingSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes[],bytes32)":{"params":{"requests":"List of settlement requests"}},"getApprovedSettlers()":{"returns":{"_0":"An array of addresses (as bytes32) that are currently approved settlers."}},"pullBatchSettlements(((address,uint256,address,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":{"details":"Reverts with `Expired` if the block timestamp is greater than `validUntil`.Reverts if a batch settlement has already started.Reverts with `NotAdmin`; Only an admin can execute the settlement.Reverts with `InvalidNonce` if the nonce has already been used.Reverts with `SignatureError` if the signer is not an admin.","params":{"orders":": The settlement orders.","target":": The target address to send the token to, pull tokens from, and execute callback on.","user":": The t+ user who is executing the settlement.","validUntil":": The timestamp when the settlement signature expires."}},"pushBatchSettlements(bytes32,uint64)":{"details":"Reverts with `NotAdmin`; Only an admin can execute the settlement.","params":{"account":": The account of the t+ user to execute settlement against","user":": The t+ user who is executing the settlement."}},"removeSettler(bytes32)":{"details":"Reverts with `NotOwner`; Only the admin can remove a settler.","params":{"settler":": The settler's tplus account key."}},"setDomainSeparator(bytes32)":{"details":"Reverts with `NotOwner`; Only the admin can set the domain separator.","params":{"domainSeparator":": The value to set."}},"setOwner(address)":{"details":"Reverts with `NotOwner`; Only the owner can set a new owner."},"withdraw((address,uint256,uint256),bytes32,address,uint256,bytes32,bytes[])":{"details":"Reverts with `Expired` if the block timestamp is greater than `validUntil`.Reverts with `InvalidNonce` if the nonce has already been used.Reverts with `SignatureError` if the signer is not an admin.","params":{"signatures":": t+ clearing engine signatures.","target":": The target address to send the token to.","user":": The user whose account will be debited by the withdrawal.","validUntil":": The timestamp when the withdrawal signature expires.","withdrawal":": The withdrawal token and amount."}}},"stateVariables":{"credentialManager":{"details":"In production, this will be an upgradeable proxy"},"owner":{"details":"Should be set to the DStack container shared secret address."},"settlementCaps":{"details":"Currently unused \u2014 implementation pending design finalization."}},"version":1},"methodIdentifiers":{"SETTLEMENT_TYPEHASH()":"0xb1fb79c0","addSettlerExecutor(bytes32,address)":"0xad9fa8bc","administrators(uint256)":"0xd89d1510","approvedSettlers(uint256)":"0x3a87fe4d","canDeposit(address)":"0x4bf0d331","credentialManager()":"0x2b0c1a1e","credentialManagerChangeDelayBlocks()":"0xa33c9d00","deposit(bytes32,address,uint256)":"0xd954863c","depositCounts(bytes32)":"0x3d63ea93","executeAtomicSettlement((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes,bytes)":"0xd7a99d7a","executeSquashingSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes[],bytes32)":"0xb24e085a","getApprovedSettlers()":"0x92698ac6","isAdministrator(address)":"0x0a2eb301","lastSignatureUse()":"0xd8c8785d","owner()":"0x8da5cb5b","ownerWithdrawToken(address,address,uint256)":"0xf585b64f","pendingSettlements(bytes32,uint64,uint256)":"0x3684f4ac","pullBatchSettlements(((address,uint256,address,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":"0xd917bdb1","pushBatchSettlements(bytes32,uint64)":"0x0b9b17a6","removeSettler(bytes32)":"0x41774bfe","setAdministrators(address[],uint256)":"0x23c56731","setCredentialManager(address)":"0x21e6652c","setDepositorStatus(address,bool)":"0x224b93e1","setDomainSeparator(bytes32)":"0x7438b937","setOwner(address)":"0x13af4035","settlementCaps(address)":"0x98af9772","settlementCounts(bytes32,uint64)":"0x8dff2305","withdraw((address,uint256,uint256),bytes32,address,uint256,bytes32,bytes[])":"0x952df832","withdrawalCounts(bytes32)":"0x82ff8b1e","withdrawalQuorum()":"0x93ea8a7d"},"runtimeBytecode":{"bytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c80630a2eb30114611f7c5780630b9b17a614611dc857806313af403514611d7d57806321e6652c14611cd0578063224b93e114611c7457806323c5673114611a125780632b0c1a1e146119ea5780633684f4ac1461193e5780633a87fe4d146119065780633d63ea93146118dc57806341774bfe146117895780634bf0d3311461174c5780637438b9371461171b57806382ff8b1e146116f15780638da5cb5b146116ca5780638dff23051461168557806392698ac6146115cf57806393ea8a7d146115b2578063952df832146112e357806398af9772146112ab578063a33c9d001461128e578063ad9fa8bc14611169578063b1fb79c01461112f578063b24e085a14610902578063d7a99d7a14610669578063d89d151014610627578063d8c8785d1461060a578063d917bdb1146102f4578063d954863c146101c95763f585b64f14610163575f80fd5b346101b65760603660031901126101b65761017c611fa9565b610184611fbf565b5f549091906001600160a01b031633036101ba576001600160a01b038216156101b6576101b49160443591612520565b005b5f80fd5b6330cd747160e01b5f5260045ffd5b346101b65760603660031901126101b6576004356101e5611fbf565b604435335f52600e60205260ff60405f205416156102c2578015610297577f9d677c46e10ba33882144473956fae8d2c52353dcde5aab8230d1bd280cfc3b481610232859330338761244c565b825f52600b60205260405f2054936102646040519283928360209093929193604081019460018060a01b031681520152565b0390a35f52600b60205260405f20805490600182018092116102835755005b634e487b7160e01b5f52601160045260245ffd5b606460405162461bcd60e51b81526020600482015260046024820152635a65726f60e01b6044820152fd5b60405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b6044820152606490fd5b346101b65760a03660031901126101b6576004356001600160401b0381116101b657610324903690600401611fff565b90602435604435916001600160401b0383168093036101b6576064356001600160a01b03811691908281036101b657608435908142116105fb57845f52600960205260405f20865f5260205260405f20546101b65761038233612188565b156105ec57845f52600a60205260405f20865f5260205260405f2054936002549488156105dd575f5b8981106103d9578989895f52600a60205260405f20905f526020526103d560405f209182546121d1565b9055005b6103e4818b8861242a565b916080830135908082036105c857508291908989838e8e8b866bffffffffffffffffffffffff196104148b61220a565b60601b169260208b013597889760408d019d8e6001600160601b03199061043a9061220a565b60601b1690606001359961044f978b9361236a565b8051906020012091610461918d61242a565b60a0810161046e91612242565b9061047892612571565b6001830180841161028357958c5f5260096020528d60405f20905f5260205260405f2093604051926104a98461205c565b60a0883603126101b6576104d9604051936104c385612092565b6104cc8a611fd5565b8552866020860152611fd5565b604084015260608301526080820152815260208101928784528054600160401b8110156105b45761050f9160018201815561202f565b9390936105a1579051805184546001600160a01b03199081166001600160a01b03928316178655602083015160018781019190915560408401516002880180548416918516919091179055606084015160038801556080939093015160048701559251600590950180549093169416939093179055909261059b919087906105969061220a565b612520565b016103ab565b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b6306427aeb60e01b5f5260045260245260445ffd5b63164bb4b560e11b5f5260045ffd5b637bfa4b9f60e01b5f5260045ffd5b630407b05b60e31b5f5260045ffd5b346101b6575f3660031901126101b6576020600f54604051908152f35b346101b65760203660031901126101b657600435600d548110156101b657610650602091612116565b905460405160039290921b1c6001600160a01b03168152f35b346101b657366003190161014081126101b657610100136101b657610104356001600160401b0381116101b6576106a490369060040161215b565b90610124356001600160401b0381116101b6576106c590369060040161215b565b92906084359160a435936001600160401b0385168095036101b65760e435918242116105fb575f85815260036020908152604080832033845260010190915290205460ff16156108f357845f52600a60205260405f20865f5260205260405f20549660c435978089036108dc5750610788906002549561077c6001600160601b031961074f6121de565b60601b16968b8b8b6024359b6001600160601b031961076c6121f4565b60601b168d6064359d8e9361236a565b60208151910120612571565b43600f55845f52600a60205260405f20865f5260205260405f2080549160018301809311610283576020928692556107dd6107c16121de565b604051631f8eac2760e11b8152958694859492600486016123f0565b03815f335af19081156108d1575f9161089f575b5081811061088a57906108317ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c93926108286121f4565b3090339061244c565b61083e82336105966121de565b6108856108496121de565b916108526121f4565b604080516001600160a01b0395861681526020810196909652931692840192909252606083019190915281906080820190565b0390a4005b63d44c3d9d60e01b5f5260045260245260445ffd5b90506020813d6020116108c9575b816108ba602093836120ad565b810103126101b65751866107f1565b3d91506108ad565b6040513d5f823e3d90fd5b88906306427aeb60e01b5f5260045260245260445ffd5b6361968ebb60e11b5f5260045ffd5b346101b65760603660031901126101b6576004356001600160401b0381116101b657610932903690600401611fff565b6024356001600160401b0381116101b657610951903690600401611fff565b9060443582840361112057805f52600760205260ff60405f20541615611111575f90815260036020908152604080832033845260010190915290205460ff16156108f3578260011b83810460021484151715610283576109b08161222b565b906109be60405192836120ad565b8082526109cd601f199161222b565b015f5b8181106110e25750505f915f5b858110610dd457505f5b838110610d1257505f5b838110610cb95750610a028561222b565b93610a1060405195866120ad565b858552601f19610a1f8761222b565b013660208701375f5b868110610bd5575050505f5b828110610afa5785855f5b818110610a4857005b600190610a5f36610a5a8386886122b1565b6122d4565b60808101516001600160401b0360a083015116907ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c60c084015193868060a01b03815116610af160208301519260608a8060a01b03604083015116910151906040519485948590949392606092608083019660018060a01b03168352602083015260018060a01b031660408201520152565b0390a401610a3f565b5f6060610b07838561228f565b51015113610b18575b600101610a34565b6001600160a01b03610b2a828461228f565b5151166060610b39838561228f565b510151905f5f5b828a8a808410610b855750505050828110610b6e575060019291610b67913090339061244c565b9050610b10565b905063d44c3d9d60e01b5f5260045260245260445ffd5b6001600160a01b0391610ba691604091610ba09187916122b1565b0161220a565b1614610bb5575b600101610b40565b90610bcd600191610bc6848b61228f565b51906121d1565b919050610bad565b610be436610a5a838a8c6122b1565b8051602082810151610c22926001600160a01b0316610c0486888a612274565b604051631f8eac2760e11b81529586948594919391600486016123f0565b03815f335af19081156108d1575f91610c88575b50610c41838961228f565b526060610c4e838961228f565b51910190815111610c625750600101610a28565b610c6c828861228f565b519051916359a771d160e01b5f5260045260245260445260645ffd5b90506020813d8211610cb1575b81610ca2602093836120ad565b810103126101b657518a610c36565b3d9150610c95565b805f6060610cc96001948761228f565b51015112610cd8575b016109f1565b610d0d828060a01b03610ceb838761228f565b515116610d056060610cfd858961228f565b5101516123e0565b903390612520565b610cd2565b806020610d216001938661228f565b5101516040610d30838761228f565b5101511015610d7657610d606020610d48838761228f565b5101516040610d57848861228f565b5101519061221e565b6060610d6c838761228f565b5101525b016109e7565b6040610d82828661228f565b5101516020610d91838761228f565b5101511015610d7057610dc0610dbb6040610dac848861228f565b5101516020610d57858961228f565b6123e0565b6060610dcc838761228f565b510152610d70565b610ddf8187896122b1565b610120813603126101b65760405190610df78261205c565b610e0136826122d4565b8252610100810135906001600160401b0382116101b6570136601f820112156101b65780356001600160401b0381116105b45760405191610e4c601f8301601f1916602001846120ad565b81835236602083830101116101b657815f926020809301838601378301015260208201525160808101516001600160401b0360a0830151169160c08101519260e08201519060408301519360018060a01b0385169284519660206060870151960151968242116105fb57835f52600a60205260405f206001600160401b0386165f5260205260405f20548083106110cb57508f918f8b90610f21610f3f96610f2e948a8f8f8f90918d92610f399b600254906001600160601b03199060601b16926001600160601b03199060601b169061236a565b60208151910120946122b1565b610100810190612242565b91612571565b43600f555f52600a6020526001600160401b0360405f2091165f5260205260405f208054906001820180921161028357555f9182805b8a8110611083575b501561103f575b50505f5b878110610ff4575b5015610fa1575b50506001016109dd565b94610fec916001939660405191610fb783612077565b858060a01b031682525f602083015260408201525f6060820152610fdb828761228f565b52610fe6818661228f565b506122a3565b939088610f97565b6001600160a01b038481169061100a838a61228f565b5151161461101a57600101610f88565b60409150611028908761228f565b51016110358282516121d1565b905260018a610f90565b9061107b9298916040519161105383612077565b825260208201525f60408201525f6060820152611070828961228f565b52610fe6818861228f565b958a80610f84565b836001600160a01b03611096838d61228f565b515116146110a657600101610f75565b602091506110b4908a61228f565b51016110c18282516121d1565b905260018d610f7d565b90506306427aeb60e01b5f5260045260245260445ffd5b6020906040516110f181612077565b5f81525f838201525f60408201525f6060820152828286010152016109d0565b63be4ab3c760e01b5f5260045ffd5b631d6e22b960e01b5f5260045ffd5b346101b6575f3660031901126101b65760206040517fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb8152f35b346101b65760403660031901126101b657600435611185611fbf565b5f549091906001600160a01b031633036101ba57805f52600760205260ff60405f20541615611237575b5f52600360205260405f2090600182019160018060a01b0382165f528260205260ff60405f205416156111de57005b8054600160401b8110156105b4576111fb91600182018155612146565b81546001600160a01b0393841660039290921b82811b94901b19169290921790555f90815260209190915260409020805460ff19166001179055005b600454600160401b8110156105b45761127061125a82600185940160045561212e565b819391549060031b91821b915f19901b19161790565b9055805f52600760205260405f20600160ff198254161790556111af565b346101b6575f3660031901126101b6576020600654604051908152f35b346101b65760203660031901126101b6576001600160a01b036112cc611fa9565b165f526008602052602060405f2054604051908152f35b346101b657366003190161010081126101b6576060136101b6576064356084356001600160a01b03811681036101b65760a4359160e4356001600160401b0381116101b657611336903690600401611fff565b9290936005548142116105fb5780851061159c57835f52600c60205260405f20549560443596808803611585575061136d8661222b565b9061137b60405192836120ad565b868252601f1961138a8861222b565b013660208401375f916002546001600160601b03196113a76121de565b60601b16602435966040519160208301937f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba8552604084015260608301528760808301528960a08301528b60c083015260e082015260c4356101008201526001600160601b03198860601b16610120820152610120815261142a610140826120ad565b5190205f5b8981106114d3575b505050509080929394955081106114be575050825f52600c60205260405f2080549060018201809211610283577fc4f5735f1abe60807c07c06560e4a6d7eb655a37442b6a47e3ab1998c9611e2f936114999284925543600f556105966121de565b6114a16121de565b604080516001600160a01b039290921682526020820192909252a3005b6326a15da760e01b5f5260045260245260445ffd5b6114e86114e1828c87612274565b90846124aa565b6001600160a01b0381169081156115765761150290612188565b156115765760015f5b87811061154b575b5061152e575b508585146115295760010161142f565b611437565b94611544919561153e828661228f565b526122a3565b938b611519565b826001600160a01b0361155e838961228f565b51161461156d5760010161150b565b50505f8d611513565b638baa579f60e01b5f5260045ffd5b87906306427aeb60e01b5f5260045260245260445ffd5b846326a15da760e01b5f5260045260245260445ffd5b346101b6575f3660031901126101b6576020600554604051908152f35b346101b6575f3660031901126101b6576040518060206004549283815201809260045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b905f5b81811061166f575050508161162d9103826120ad565b604051918291602083019060208452518091526040830191905f5b818110611656575050500390f35b8251845285945060209384019390920191600101611648565b8254845260209093019260019283019201611617565b346101b65760403660031901126101b65761169e611fe9565b6004355f52600a6020526001600160401b0360405f2091165f52602052602060405f2054604051908152f35b346101b6575f3660031901126101b6575f546040516001600160a01b039091168152602090f35b346101b65760203660031901126101b6576004355f52600c602052602060405f2054604051908152f35b346101b65760203660031901126101b6575f546001600160a01b031633036101ba576002546101b657600435600255005b346101b65760203660031901126101b6576001600160a01b0361176d611fa9565b165f52600e602052602060ff60405f2054166040519015158152f35b346101b65760203660031901126101b6575f54600435906001600160a01b031633036101ba576004545f828152600760205260408120805460ff191690555b818110611853575b50505f52600360205260405f205f60018201905b825481101561182757806117fa60019285612146565b838060a01b0391549060031b1c16828060a01b03165f528260205260405f2060ff198154169055016117e4565b82545f8455838161183457005b5f5260205f20908101905b81811061184857005b5f815560010161183f565b8261185d8261212e565b90549060031b1c14611871576001016117c8565b905f1981019081116102835761125a61188c6118999261212e565b90549060031b1c9261212e565b905560045480156118c8575f19016118b08161212e565b8154905f199060031b1b1916905560045581806117d0565b634e487b7160e01b5f52603160045260245ffd5b346101b65760203660031901126101b6576004355f52600b602052602060405f2054604051908152f35b346101b65760203660031901126101b6576004356004548110156101b65761192f60209161212e565b90549060031b1c604051908152f35b346101b65760603660031901126101b657611957611fe9565b604435906004355f5260096020526001600160401b0360405f2091165f5260205260405f2080548210156101b65760c0916119919161202f565b5061199b816120ce565b6005909101546040805183516001600160a01b039081168252602080860151908301528285015181169282019290925260608085015190820152608093840151938101939093521660a0820152f35b346101b6575f3660031901126101b6576001546040516001600160a01b039091168152602090f35b346101b65760403660031901126101b6576004356001600160401b0381116101b657611a42903690600401611fff565b600154909190602435906001600160a01b03163303611c655760018110611c5657808310611c40575f5b83811015611aa8576001600160a01b03611a8b600583901b850161220a565b1615611a9957600101611a6c565b63d92e233d60e01b5f5260045ffd5b5091906001600160401b0382116105b457600160401b82116105b457600d5482600d55808310611bfc575b50600d5f525f5b828110611bc157837f74e3f7a222a002bb0346144c8442604f86b79a5319301c8b2393dbe33ba3f1ec5f80a1600d545f5b818110611b5657826005549080600555808203611b2457005b7f71847092dda23e5394806b377214ca90449cdd1413463150e7f577ccefea54d89160409182519182526020820152a1005b611b5f81612116565b905460018301929160031b1c6001600160a01b031682821161028357604080516001600160a01b0392909216825260208201939093526001927f723c2b747529ca7f5eb53a74808f4a8b9bf264f0fc450fd904900151da74548a91a101611b0b565b6001906020611bcf8461220a565b930192817fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5015501611ada565b600d5f527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb59081019083015b818110611c355750611ad3565b5f8155600101611c28565b82633e1a6b7d60e21b5f5260045260245260445ffd5b6345f8facb60e11b5f5260045ffd5b6326b672e560e01b5f5260045ffd5b346101b65760403660031901126101b657611c8d611fa9565b602435908115158092036101b6575f546001600160a01b031633036101ba5760018060a01b03165f52600e60205260405f209060ff801983541691161790555f80f35b346101b65760203660031901126101b657611ce9611fa9565b5f546001600160a01b031633036101ba576001600160a01b03168015611a9957611d18600f54600654906121d1565b431015611d6e5760407feb63fb900cbf0301de00619a02ae3f5996820dabc03207c0e0d97046e521d7b99160015490806001600160601b0360a01b83161760015582519160018060a01b031682526020820152a1005b636fed7d8560e01b5f5260045ffd5b346101b65760203660031901126101b657611d96611fa9565b5f54906001600160a01b03821633036101ba576001600160a01b0316908115611a99576001600160a01b031916175f55005b346101b65760403660031901126101b657600435611de4611fe9565b611ded33612188565b156105ec576001600160401b0316905f5b815f52600960205260405f20835f5260205260405f205463ffffffff82161015611f0d5763ffffffff90825f52600960205260405f20845f52602052611e478160405f2061202f565b50611e9060405191611e588361205c565b611e61816120ce565b8084526005909101546001600160a01b039081166020850181905260408301516060909301519230921661244c565b51608080820151825160208085015160408087015160609788015182516001600160a01b0396871681529485019390935293909316928201929092529384015291869186917ff2401a17cb3d1986de3a662a21d4c56a1bcc296682786f78d69805a49be0ba3c9190a41663ffffffff811461028357600101611dfe565b505f52600960205260405f20905f5260205260405f208054905f815581611f3057005b81600602916006830403610283575f5260205f20908101905b818110611f5257005b805f600692555f60018201555f60028201555f60038201555f60048201555f600582015501611f49565b346101b65760203660031901126101b6576020611f9f611f9a611fa9565b612188565b6040519015158152f35b600435906001600160a01b03821682036101b657565b602435906001600160a01b03821682036101b657565b35906001600160a01b03821682036101b657565b602435906001600160401b03821682036101b657565b9181601f840112156101b6578235916001600160401b0383116101b6576020808501948460051b0101116101b657565b8054821015612048575f52600660205f20910201905f90565b634e487b7160e01b5f52603260045260245ffd5b604081019081106001600160401b038211176105b457604052565b608081019081106001600160401b038211176105b457604052565b60a081019081106001600160401b038211176105b457604052565b90601f801991011681019081106001600160401b038211176105b457604052565b906040516120db81612092565b82546001600160a01b039081168252600184015460208301526002840154166040820152600383015460608201526004909201546080830152565b600d5481101561204857600d5f5260205f2001905f90565b6004548110156120485760045f5260205f2001905f90565b8054821015612048575f5260205f2001905f90565b9181601f840112156101b6578235916001600160401b0383116101b657602083818601950101116101b657565b600d54905f5b82811061219c575050505f90565b6121a581612116565b905460039190911b1c6001600160a01b03908116908316146121c95760010161218e565b505050600190565b9190820180921161028357565b6004356001600160a01b03811681036101b65790565b6044356001600160a01b03811681036101b65790565b356001600160a01b03811681036101b65790565b9190820391821161028357565b6001600160401b0381116105b45760051b60200190565b903590601e19813603018212156101b657018035906001600160401b0382116101b6576020019181360383136101b657565b908210156120485761228b9160051b810190612242565b9091565b80518210156120485760209160051b010190565b5f1981146102835760010190565b91908110156120485760051b8101359061011e19813603018212156101b6570190565b9190826101009103126101b65760405161010081018181106001600160401b038211176105b457604052809261230981611fd5565b82526020810135602083015261232160408201611fd5565b6040830152606081013560608301526080810135608083015260a08101356001600160401b03811681036101b65760e091829160a085015260c081013560c08501520135910152565b989796959493929190604051997fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208c015260408b015260608a0152608089015260a088015260c087015260e086015261010085015261012084015261014083015261014082526123de610160836120ad565b565b600160ff1b8114610283575f0390565b9284926080959260018060a01b03168552602085015260606040850152816060850152848401375f828201840152601f01601f1916010190565b91908110156120485760051b8101359060be19813603018212156101b6570190565b916040519360605260405260601b602c526323b872dd60601b600c5260205f6064601c82855af1908160015f5114161561248c575b50505f606052604052565b3b153d17101561249d575f80612481565b637939f4245f526004601cfd5b604080515f959490939181146124f5576041146124c657505050565b604080929395508101355f1a60205281375b5f526020604060805f60015afa505f6060523d6060185191604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b03166060529092506124d8565b919060145260345263a9059cbb60601b5f5260205f6044601082855af1908160015f51141615612553575b50505f603452565b3b153d171015612564575f8061254b565b6390b8ec185f526004601cfd5b9061257c92916124aa565b6001600160a01b038116156115765761259490612188565b156115765756fea2646970667358221220ed8c58622d1980bbe08e33449f7238db19ed378c986e4473a49e0f023c0a759464736f6c634300081e0033"},"sourceId":"src/DepositVault.sol","sourcemap":"325:36146:3:-:0;;;;;;;;;;;;;-1:-1:-1;;325:36146:3;;;;-1:-1:-1;;;;;325:36146:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::i;:::-;1329:5;;325:36146;-1:-1:-1;;;;;325:36146:3;;;;9926:20;;9922:46;;-1:-1:-1;;;;;325:36146:3;;9982:32;;9978:58;;325:36146;;;;;;-1:-1:-1;325:36146:3;;;-1:-1:-1;325:36146:3;;;;;;;10070:38;325:36146;;;10070:38;325:36146;;;;;;;;;;9978:58;9955:13;;;-1:-1:-1;10023:13:3;;-1:-1:-1;10023:13:3;325:36146;-1:-1:-1;325:36146:3;;;;;;-1:-1:-1;325:36146:3;;;;;-1:-1:-1;325:36146:3;;;;-1:-1:-1;;;;;325:36146:3;;;;;;:::o","userdoc":{"errors":{"EmptyOrders()":[{"notice":"Reverts if an order array is empty."}],"Expired()":[{"notice":"Reverts if a signed operation is past its deadline."}],"InsufficientAdministrators(uint256,uint256)":[{"notice":"Reverts if insufficient administrators are provided when setting the administrators"}],"InsufficientAmountFromExecutor(uint256,uint256)":[{"notice":"Reverts if a settlement callback returns an insufficient input token amount"}],"InsufficientCallbackReturnForSettlement(uint256,uint256,uint256)":[{"notice":"Reverts if a settlement callback returns insufficient amount for a specific settlement"}],"InvalidNonce(uint256,uint256)":[{"notice":"Reverts if the nonce used in a transaction is incorrect."}],"InvalidSignature()":[{"notice":"Reverts if the signature provided is invalid."}],"MissedQuorum(uint256,uint256)":[{"notice":"Reverts when an insufficient number of signatures are provided for a withdrawal request"}],"NotAdmin()":[{"notice":"Reverts if the caller is not an admin."}],"NotCredentialManager()":[{"notice":"Reverts if the caller is not the credential manager"}],"NotExecutor()":[{"notice":"Reverts if the caller is not the authorized executor."}],"NotOwner()":[{"notice":"Reverts if the caller is not the owner."}],"PayloadMismatch()":[{"notice":"Reverts if the number of callback data payloads does not match the number of settlement requests"}],"SettlerNotApproved()":[{"notice":"Reverts if the specified settler is not an approved settler on this vault"}],"TooSoon()":[{"notice":"Reverts if an insufficient number of blocks have elapsed since the last signature use"}],"ZeroAddress()":[{"notice":"Reverts when given the zero address."}],"ZeroWithdrawalQuorum()":[{"notice":"Reverts if a new withdrawal quorum value is equal to zero"}]},"events":{"AdminAdded(address,uint256)":{"notice":"Signals that a new administrator has been added to the vault"},"AdministratorSetReset()":{"notice":"Indicates that the set of administrators has been cleared and is now empty"},"CredentialManagerChanged(address,address)":{"notice":"Signals that the credential manager address has changed"},"Deposited(bytes32,uint256,address,uint256)":{"notice":"Signals a deposit."},"Settled(bytes32,uint64,uint256,address,uint256,address,uint256)":{"notice":"Signals a settlement."},"WithdrawalQuorumChanged(uint256,uint256)":{"notice":"Signals that the withdrawal quorum has changed"},"Withdrew(bytes32,uint256,address,uint256)":{"notice":"Signals a withdrawal."}},"kind":"user","methods":{"SETTLEMENT_TYPEHASH()":{"notice":"Makes the signature unambiguous that it is for settlements."},"addSettlerExecutor(bytes32,address)":{"notice":"Sets the settle executor."},"administrators(uint256)":{"notice":"Set of administrators"},"approvedSettlers(uint256)":{"notice":"List of all approved settler IDs."},"constructor":{"notice":"Initializes the contract and sets the owner."},"credentialManager()":{"notice":"The address responsible for adding or removing administrators"},"deposit(bytes32,address,uint256)":{"notice":"Deposits a token into the vault."},"depositCounts(bytes32)":{"notice":"Maps user ID pairs to their deposit count (nonce)."},"executeAtomicSettlement((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes,bytes)":{"notice":"Executes an atomic settlement."},"executeSquashingSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes[],bytes32)":{"notice":"Execute a sequence of settlement requests in a squashing fashion"},"getApprovedSettlers()":{"notice":"Get the array of approved settlers."},"lastSignatureUse()":{"notice":"Block number of latest signature use"},"owner()":{"notice":"The admin approves settlements and withdrawals."},"pendingSettlements(bytes32,uint64,uint256)":{"notice":"Maps (settler ID, account_index) pairs to their queue of pending batch settlements."},"pullBatchSettlements(((address,uint256,address,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":{"notice":"Pulls funds for execution during a settlement batch."},"pushBatchSettlements(bytes32,uint64)":{"notice":"Pushes expected funds from a batch settlement to the deposit vault."},"removeSettler(bytes32)":{"notice":"Removes a settler."},"setDomainSeparator(bytes32)":{"notice":"Sets the domain separators for EIP-712 signatures."},"setOwner(address)":{"notice":"Sets the owner of the vault."},"settlementCaps(address)":{"notice":"Maximum total tokens that can be settled in a single block for each token."},"settlementCounts(bytes32,uint64)":{"notice":"Maps (settler ID, account_index) pairs to their settlement count (nonce)."},"withdraw((address,uint256,uint256),bytes32,address,uint256,bytes32,bytes[])":{"notice":"Withdraws a token from the vault."},"withdrawalCounts(bytes32)":{"notice":"Maps user ID to their withdrawal count (nonce)."},"withdrawalQuorum()":{"notice":"Minimum number of administrator signatures to approve a withdrawal request"}},"version":1}},"IAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"IAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IAdminUpdateStrategy.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IAtomicSettlementCallback":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onAtomicSettlement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"contractName":"IAtomicSettlementCallback","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"onAtomicSettlement(address,uint256,bytes)":"0x3f1d584e"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IAtomicSettlementCallback.sol","sourcemap":"","userdoc":{"kind":"user","methods":{"onAtomicSettlement(address,uint256,bytes)":{"notice":"Computes the minimum expected quantity of `token` that will be received by the deposit vault upon execution of an atomic settlement request"}},"version":1}},"IAutomataDcapAttestation":{"abi":[{"inputs":[{"internalType":"bytes","name":"output","type":"bytes"},{"internalType":"enum IAutomataDcapAttestation.ZkCoProcessorType","name":"zkvm","type":"uint8"},{"internalType":"bytes","name":"proofBytes","type":"bytes"}],"name":"verifyAndAttestWithZKProof","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"errorData","type":"bytes"}],"stateMutability":"nonpayable","type":"function"}],"contractName":"IAutomataDcapAttestation","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"details":"Bindings for the 'AutomataDcapAttestation' contract. Compatible with Automata V3 ZK Coprocessor logic.","kind":"dev","methods":{"verifyAndAttestWithZKProof(bytes,uint8,bytes)":{"params":{"output":"The Public Values (Journal) - effectively the Quote Body.","proofBytes":"The actual (Groth16) proof.","zkvm":"The type of ZKVM used."},"returns":{"errorData":"Error message if failed, or empty if success.","success":"True if valid."}}},"version":1},"methodIdentifiers":{"verifyAndAttestWithZKProof(bytes,uint8,bytes)":"0x57859ce0"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IAutomataDcapAttestation.sol","sourcemap":"","userdoc":{"kind":"user","methods":{"verifyAndAttestWithZKProof(bytes,uint8,bytes)":{"notice":"Verifies a SNARK proof (Groth16) for a TEE Quote."}},"notice":"Interface for Automata's DCAP Attestation Verifier (V3)","version":1}},"ICheckpointer":{"abi":[{"inputs":[],"name":"AlreadySet","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCouncilMultisig","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"name":"Withdrawals","type":"event"},{"inputs":[],"name":"CHECKPOINT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sharedSignature","type":"bytes"},{"internalType":"bytes","name":"leaderSignature","type":"bytes"},{"components":[{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8[]","name":"stateRoot","type":"uint8[]"},{"internalType":"string[]","name":"approvedWithdrawals","type":"string[]"}],"internalType":"struct ICheckpointer.Checkpoint","name":"_checkpoint","type":"tuple"}],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"councilMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setInitialCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"}],"name":"setLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCouncilMultisig","type":"address"}],"name":"setNewCouncilMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stateRoot","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stateRootNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"ICheckpointer","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"CHECKPOINT_TYPEHASH()":"0xe1193e4c","admin()":"0xf851a440","checkpoint(bytes,bytes,(uint256,uint8[],string[]))":"0x8bbb26a3","councilMultisig()":"0x07ddaf53","leader()":"0x40eedabb","setAdmin(address)":"0x704b6c02","setDomainSeparator(bytes32)":"0x7438b937","setInitialCouncilMultisig(address)":"0x3ea987d3","setLeader(address)":"0x4331e8dd","setNewCouncilMultisig(address)":"0x5fa993b2","stateRoot(uint256)":"0xcc2fc845","stateRootNonce()":"0x74ebc7a0"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/ICheckpointer.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"ICredentialManager":{"abi":[{"inputs":[],"name":"AmbiguousState","type":"error"},{"inputs":[],"name":"CannotCancel","type":"error"},{"inputs":[],"name":"GatheringActive","type":"error"},{"inputs":[],"name":"GatheringNotActive","type":"error"},{"inputs":[],"name":"GatheringNotExpired","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientSignatures","type":"error"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"},{"internalType":"uint256","name":"operatorCount","type":"uint256"}],"name":"InvalidCommitteeThreshold","type":"error"},{"inputs":[{"internalType":"uint256","name":"delay","type":"uint256"}],"name":"InvalidDelay","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InvalidEpoch","type":"error"},{"inputs":[],"name":"InvalidProfileConfig","type":"error"},{"inputs":[],"name":"InvalidProfileId","type":"error"},{"inputs":[],"name":"InvalidQuoteLength","type":"error"},{"inputs":[],"name":"InvalidReportData","type":"error"},{"inputs":[],"name":"InvalidVaultAddr","type":"error"},{"inputs":[],"name":"InvalidVerifier","type":"error"},{"inputs":[],"name":"InvalidZkProof","type":"error"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"},{"internalType":"string","name":"field","type":"string"}],"name":"MeasurementMismatch","type":"error"},{"inputs":[],"name":"NoCandidate","type":"error"},{"inputs":[],"name":"NoStrategy","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"NotOperator","type":"error"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"}],"name":"ProfileInactive","type":"error"},{"inputs":[{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"uint256","name":"proposed","type":"uint256"}],"name":"ProposedEpochTooLow","type":"error"},{"inputs":[],"name":"SignersNotSortedOrUnique","type":"error"},{"inputs":[],"name":"StrategyAlreadyExists","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyCanceled","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockAlreadyExecuted","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"uint256","name":"readyAt","type":"uint256"},{"internalType":"uint256","name":"nowTs","type":"uint256"}],"name":"TimelockNotReady","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"name":"TimelockUnknown","type":"error"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"}],"name":"VaultNotFound","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"}],"name":"AdminUpdateStrategyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"AttestedKeyRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldVerifier","type":"address"},{"indexed":true,"internalType":"address","name":"newVerifier","type":"address"}],"name":"AutomataVerifierUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"CommitteeThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"DepositVaultAdministratorsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newEpoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"newCheckpointHash","type":"bytes32"}],"name":"EpochIncremented","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"LeaderUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"profileId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"MeasurementProfileUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"newMrtd","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newRtmr0","type":"bytes32"}],"name":"MeasurementsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"}],"name":"OperationExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"opType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"OperationScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRegistry","type":"address"},{"indexed":true,"internalType":"address","name":"newRegistry","type":"address"}],"name":"RegistryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash1","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"hash2","type":"bytes32"}],"name":"RestartAmbiguityDetected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"leader","type":"address"},{"indexed":false,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"RestartCandidateSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLeader","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"}],"name":"RestartExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"RestartGatheringStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRiskManager","type":"address"},{"indexed":true,"internalType":"address","name":"newRiskManager","type":"address"}],"name":"RiskManagerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"targetOpType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"oldDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"TimelockDelayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"routingId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vmId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"indexed":false,"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"}],"name":"VaultAdded","type":"event"},{"inputs":[],"name":"GATHERING_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_ADD_VAULT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_APPOINT_LEADER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_CANCEL_TIMELOCK","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_MANAGE_PROFILE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_REGISTER_STRATEGY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_RESTART","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_AUTOMATA_VERIFIER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_COMMITTEE_THRESHOLD","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_DELAY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_MEASUREMENTS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_REGISTRY","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_RISK_MANAGER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_SET_VAULT_ADMINS","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OP_WITHDRAW","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddr","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"addVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"adminUpdateStrategies","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"appointLeader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"automataVerifier","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bestCandidate","outputs":[{"internalType":"address","name":"leader","type":"address"},{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"},{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"cancelTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"committeeThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct ICredentialManager.MeasurementProfile","name":"profile","type":"tuple"}],"name":"executeManageProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"}],"name":"executeRegistryContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"}],"name":"executeRiskManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"}],"name":"executeUpdateAutomataVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCommitteeConfig","outputs":[{"internalType":"address[]","name":"members","type":"address[]"},{"internalType":"uint256","name":"k","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeader","outputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"attestedKey","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getVaults","outputs":[{"components":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"}],"internalType":"struct ICredentialManager.Vault[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initiateRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRestartAmbiguous","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestCheckpointHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"leader","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"measurementProfiles","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProfileId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operatorToAttestedKey","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"operators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"address","name":"strategy","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"registerAdminUpdateStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newAttestedKey","type":"bytes32"}],"name":"registerAttestedKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registryContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resolveRestart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restartGatheringDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"components":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bytes32","name":"mrtd","type":"bytes32"},{"internalType":"bytes32","name":"rtmr0","type":"bytes32"},{"internalType":"bytes32","name":"rtmr1","type":"bytes32"},{"internalType":"bytes32","name":"rtmr2","type":"bytes32"},{"internalType":"bytes32","name":"rtmr3","type":"bytes32"}],"internalType":"struct ICredentialManager.MeasurementProfile","name":"profile","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleManageProfile","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistry","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRegistryContract","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRiskManager","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleRiskManager","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newVerifier","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"scheduleUpdateAutomataVerifier","outputs":[{"internalType":"bytes32","name":"opId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"routingId","type":"uint256"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setDepositVaultAdministrators","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"profileId","type":"uint256"},{"internalType":"bytes","name":"tdxReportBody","type":"bytes"},{"internalType":"bytes","name":"zkProof","type":"bytes"},{"internalType":"address","name":"newLeader","type":"address"},{"internalType":"bytes32","name":"checkpointHash","type":"bytes32"}],"name":"submitRestartProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockDelayFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockOps","outputs":[{"internalType":"uint64","name":"eta","type":"uint64"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"bytes32","name":"opType","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"updateCommitteeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vaults","outputs":[{"internalType":"uint8","name":"routingId","type":"uint8"},{"internalType":"uint256","name":"vmId","type":"uint256"},{"internalType":"bytes32","name":"vaultAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"blockTimeMs","type":"uint64"},{"internalType":"uint8","name":"defaultConfirmations","type":"uint8"},{"internalType":"uint8","name":"depositIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"withdrawalIngestConfirmations","type":"uint8"},{"internalType":"uint8","name":"settlementIngestConfirmations","type":"uint8"}],"internalType":"struct ICredentialManager.ChainConfig","name":"config","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"contractName":"ICredentialManager","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"GATHERING_DURATION()":"0xa6aac513","OP_ADD_VAULT()":"0x90054742","OP_APPOINT_LEADER()":"0x4e970c8c","OP_CANCEL_TIMELOCK()":"0xfc0e2ba7","OP_MANAGE_PROFILE()":"0xb7635fb8","OP_REGISTER_STRATEGY()":"0x333bef22","OP_RESTART()":"0xd8a0bebf","OP_SET_AUTOMATA_VERIFIER()":"0x2d4ab28d","OP_SET_COMMITTEE_THRESHOLD()":"0x5c1ff1f2","OP_SET_DELAY()":"0xe0913aff","OP_SET_MEASUREMENTS()":"0x6583c37a","OP_SET_REGISTRY()":"0x1bc12e07","OP_SET_RISK_MANAGER()":"0xf5b68c67","OP_SET_VAULT_ADMINS()":"0x26ddc1ba","OP_WITHDRAW()":"0x5f250f69","addVault(uint8,uint256,bytes32,(uint64,uint8,uint8,uint8,uint8),address[],bytes[])":"0x81392328","admin()":"0xf851a440","adminUpdateStrategies(uint256,uint256)":"0x3174b727","appointLeader(address,address[],bytes[])":"0xfdeabe1f","automataVerifier()":"0x280cd09d","bestCandidate()":"0x669f6f35","cancelTimelock(bytes32,address[],bytes[])":"0x9d3e015a","committeeThreshold()":"0x4dd0a0c9","domainSeparator()":"0xf698da25","epoch()":"0x900cf0cf","executeManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32))":"0xae5c8bfb","executeRegistryContract(address)":"0x24242e77","executeRiskManager(address)":"0x6dfb32aa","executeUpdateAutomataVerifier(address)":"0xc7d06b54","getCommitteeConfig()":"0xfe5e8240","getLeader()":"0x4c051f14","getVaults(uint16,uint16)":"0x9fd7285c","governanceNonce()":"0xd9be832c","initiateRestart()":"0x5cc79144","isOperator(address)":"0x6d70f7ae","isRestartAmbiguous()":"0x1276bcc5","latestCheckpointHash()":"0xb34eb182","leader()":"0x40eedabb","measurementProfiles(uint256)":"0x95c82559","nextProfileId()":"0xcd1d81ff","operatorToAttestedKey(address)":"0x1ac4d079","operators(uint256)":"0xe28d4906","registerAdminUpdateStrategy(uint8,uint256,address,address[],bytes[])":"0x5d3ae390","registerAttestedKey(bytes32)":"0x7f0152a8","registryContract()":"0x28c1f99b","resolveRestart()":"0x35cfd9eb","restartGatheringDeadline()":"0x127f49ad","riskManager()":"0x47842663","scheduleManageProfile(uint256,(bool,bytes32,bytes32,bytes32,bytes32,bytes32),address[],bytes[])":"0xacfacc86","scheduleRegistryContract(address,address[],bytes[])":"0xb5ed8b12","scheduleRiskManager(address,address[],bytes[])":"0x2808e92f","scheduleUpdateAutomataVerifier(address,address[],bytes[])":"0x281cbdd4","setDepositVaultAdministrators(uint256,uint256,address[],uint256)":"0x9ebc068e","submitRestartProof(uint256,bytes,bytes,address,bytes32)":"0xce0b1302","timelockDelayFor(bytes32)":"0xfb834493","timelockOps(bytes32)":"0x31709520","updateCommitteeThreshold(uint256,address[],bytes[])":"0x59d63bcc","vaults(uint256)":"0x8c64ea4a","withdraw(address,address[],bytes[])":"0xbe223838"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/ICredentialManager.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IDepositVault":{"abi":[{"inputs":[],"name":"EmptyOrders","type":"error"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAdministrators","type":"error"},{"inputs":[{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientAmountFromExecutor","type":"error"},{"inputs":[{"internalType":"uint256","name":"settlementIndex","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InsufficientCallbackReturnForSettlement","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"given","type":"uint256"}],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"MissedQuorum","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotCredentialManager","type":"error"},{"inputs":[],"name":"NotExecutor","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"PayloadMismatch","type":"error"},{"inputs":[],"name":"SettlerNotApproved","type":"error"},{"inputs":[],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroWithdrawalQuorum","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"uint256","name":"numAdminsAfter","type":"uint256"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[],"name":"AdministratorSetReset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldCredentialManager","type":"address"},{"indexed":false,"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"CredentialManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint64","name":"account","type":"uint64"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"Settled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"WithdrawalQuorumChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"user","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[],"name":"SETTLEMENT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"},{"internalType":"address","name":"executor","type":"address"}],"name":"addSettlerExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"administrators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedSettlers","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"credentialManagerChangeDelayBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"depositCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct IDepositVault.Settlement","name":"order","type":"tuple"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"executeAtomicSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"internalType":"struct IDepositVault.Settlement","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"clearingEngineSignature","type":"bytes"}],"internalType":"struct IDepositVault.SignedSettlement[]","name":"requests","type":"tuple[]"},{"internalType":"bytes[]","name":"data","type":"bytes[]"},{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"executeSquashingSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getApprovedSettlers","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAdministrator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSignatureUse","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingSettlements","outputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct IDepositVault.SettlementOrder","name":"settlement","type":"tuple"},{"internalType":"address","name":"target","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct IDepositVault.SettlementOrder","name":"settlement","type":"tuple"},{"internalType":"bytes","name":"clearingEngineSignature","type":"bytes"}],"internalType":"struct IDepositVault.SignedSettlementOrder[]","name":"orders","type":"tuple[]"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"name":"pullBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"}],"name":"pushBatchSettlements","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"settler","type":"bytes32"}],"name":"removeSettler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCredentialManager","type":"address"}],"name":"setCredentialManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositor","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setDepositorStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"settlementCaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"settlementCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct IDepositVault.Withdrawal","name":"withdrawal","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes32","name":"epochHash","type":"bytes32"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"withdrawalCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}],"contractName":"IDepositVault","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"SETTLEMENT_TYPEHASH()":"0xb1fb79c0","addSettlerExecutor(bytes32,address)":"0xad9fa8bc","administrators(uint256)":"0xd89d1510","approvedSettlers(uint256)":"0x3a87fe4d","canDeposit(address)":"0x4bf0d331","credentialManager()":"0x2b0c1a1e","credentialManagerChangeDelayBlocks()":"0xa33c9d00","deposit(bytes32,address,uint256)":"0xd954863c","depositCounts(bytes32)":"0x3d63ea93","executeAtomicSettlement((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes,bytes)":"0xd7a99d7a","executeSquashingSettlements(((address,uint256,address,uint256,bytes32,uint64,uint256,uint256),bytes)[],bytes[],bytes32)":"0xb24e085a","getApprovedSettlers()":"0x92698ac6","isAdministrator(address)":"0x0a2eb301","lastSignatureUse()":"0xd8c8785d","owner()":"0x8da5cb5b","ownerWithdrawToken(address,address,uint256)":"0xf585b64f","pendingSettlements(bytes32,uint64,uint256)":"0x3684f4ac","pullBatchSettlements(((address,uint256,address,uint256,uint256),bytes)[],bytes32,uint64,address,uint256)":"0xd917bdb1","pushBatchSettlements(bytes32,uint64)":"0x0b9b17a6","removeSettler(bytes32)":"0x41774bfe","setAdministrators(address[],uint256)":"0x23c56731","setCredentialManager(address)":"0x21e6652c","setDepositorStatus(address,bool)":"0x224b93e1","setDomainSeparator(bytes32)":"0x7438b937","setOwner(address)":"0x13af4035","settlementCaps(address)":"0x98af9772","settlementCounts(bytes32,uint64)":"0x8dff2305","withdraw((address,uint256,uint256),bytes32,address,uint256,bytes32,bytes[])":"0x952df832","withdrawalCounts(bytes32)":"0x82ff8b1e","withdrawalQuorum()":"0x93ea8a7d"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IDepositVault.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IL1CrossDomainMessenger":{"abi":[{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"uint32","name":"_minGasLimit","type":"uint32"}],"name":"sendMessage","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"IL1CrossDomainMessenger","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"sendMessage(address,bytes,uint32)":"0x3dbb202b"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/strategies/OPStackAdminUpdateStrategy.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IRegistry":{"abi":[{"inputs":[],"name":"ChainAlreadyExists","type":"error"},{"inputs":[],"name":"IndexOutOfBounds","type":"error"},{"inputs":[],"name":"InvalidBufferMultiple","type":"error"},{"inputs":[],"name":"InvalidCollateralFactor","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsClamps","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsConfiguration","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsFactors","type":"error"},{"inputs":[],"name":"InvalidInterestKinks","type":"error"},{"inputs":[],"name":"InvalidLiabilityFactor","type":"error"},{"inputs":[],"name":"InvalidMaxFundingRate","type":"error"},{"inputs":[],"name":"InvalidMaxUtilizationRate","type":"error"},{"inputs":[],"name":"InvalidRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUtilizationCap","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"}],"name":"NoPendingRiskParameters","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotRiskManager","type":"error"},{"inputs":[],"name":"RiskManagerNotSet","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"},{"internalType":"uint256","name":"eligibleAt","type":"uint256"}],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct IRegistry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"Max1HrDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct IRegistry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MaxDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct IRegistry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MinWeightChanged","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"}],"name":"applyPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAccount","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct IRegistry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"}],"name":"getAssetData","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct IRegistry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct IRegistry.AssetData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct IRegistry.ChainId","name":"chainId","type":"tuple"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"}],"name":"getAssetIndex","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getAssets","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct IRegistry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct IRegistry.AssetData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"pendingRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters","name":"parameters","type":"tuple"},{"internalType":"uint256","name":"validAfter","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManagerMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskParameterChangeDelaySeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"riskParameters","outputs":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct IRegistry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct IRegistry.AssetData","name":"data","type":"tuple"}],"name":"setAssetData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"account","type":"bytes32"}],"name":"setFeeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct IRegistry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMax1HrDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct IRegistry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMaxDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct IRegistry.ChainId","name":"chain","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMinWeight","type":"uint256"}],"name":"setMinWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"},{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters","name":"parameters","type":"tuple"}],"name":"setPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"multisig","type":"address"}],"name":"setRiskManagerMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct IRegistry.RiskParameters","name":"params","type":"tuple"}],"name":"validateRiskParameters","outputs":[],"stateMutability":"pure","type":"function"}],"contractName":"IRegistry","deploymentBytecode":{"bytecode":"0x"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"admin()":"0xf851a440","applyPendingRiskParameters(uint16)":"0x6cbb0b54","feeAccount()":"0x65e17c9d","getAssetData((uint64,uint64),uint16)":"0x3a076ddd","getAssetIndex((uint64,uint64),bytes32)":"0x698670e3","getAssets(uint16,uint16)":"0x0cb661c7","getRiskParameters(uint16,uint16)":"0xf0fef575","pendingRiskParameters(uint16)":"0xa812e224","riskManagerMultisig()":"0x525ea8b7","riskParameterChangeDelaySeconds()":"0x04cd46f9","riskParameters(uint16)":"0x114bb9c5","setAdmin(address)":"0x704b6c02","setAssetData((uint16,bytes32,(uint64,uint64),uint256,uint256,uint256))":"0xbc67a603","setFeeAccount(bytes32)":"0xe2a0a600","setMax1HrDeposits((uint64,uint64),uint16,uint256)":"0xaf8c8338","setMaxDeposits((uint64,uint64),uint16,uint256)":"0x24919050","setMinWeight((uint64,uint64),uint16,uint256)":"0xa7b7b470","setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0xb4bb0646","setRiskManagerMultisig(address)":"0x4ffcbdfb","validateRiskParameters((uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0x57990261"},"runtimeBytecode":{"bytecode":"0x"},"sourceId":"src/interfaces/IRegistry.sol","sourcemap":"","userdoc":{"kind":"user","methods":{},"version":1}},"IntraChainAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"IntraChainAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x6080806040523460155761017e908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c63075034ae14610027575f80fd5b6060366003190112610144576004356001600160a01b038116908190036101445760243567ffffffffffffffff8111610144573660238201121561014457806004013567ffffffffffffffff8111610144573660248260051b8401011161014457823b15610144579083916323c5673160e01b8352806044840160406004860152526024606484019201905f905b8082106101145750505091815f818195604435602483015203925af18015610109576100df575080f35b905067ffffffffffffffff81116100f557604052005b634e487b7160e01b5f52604160045260245ffd5b6040513d5f823e3d90fd5b9193509183356001600160a01b0381169190829003610144576020816001938293520194019201859392916100b5565b5f80fdfea2646970667358221220c69d8dbf734e631495fa06bb43414b35a41e05f7dee0f399706c5e4bedd6c1f064736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f905f3560e01c63075034ae14610027575f80fd5b6060366003190112610144576004356001600160a01b038116908190036101445760243567ffffffffffffffff8111610144573660238201121561014457806004013567ffffffffffffffff8111610144573660248260051b8401011161014457823b15610144579083916323c5673160e01b8352806044840160406004860152526024606484019201905f905b8082106101145750505091815f818195604435602483015203925af18015610109576100df575080f35b905067ffffffffffffffff81116100f557604052005b634e487b7160e01b5f52604160045260245ffd5b6040513d5f823e3d90fd5b9193509183356001600160a01b0381169190829003610144576020816001938293520194019201859392916100b5565b5f80fdfea2646970667358221220c69d8dbf734e631495fa06bb43414b35a41e05f7dee0f399706c5e4bedd6c1f064736f6c634300081e0033"},"sourceId":"src/strategies/IntraChainAdminUpdateStrategy.sol","sourcemap":"290:322:25:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"notice":"Use this strategy when updating the vault on the same chain as the credential manager.","version":1}},"MockTarget":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onAtomicSettlement","outputs":[],"stateMutability":"nonpayable","type":"function"}],"contractName":"MockTarget","deploymentBytecode":{"bytecode":"0x6080806040523460135760b1908160188239f35b5f80fdfe6004361015600b575f80fd5b5f3560e01c633f1d584e14601d575f80fd5b3460775760603660031901126077576004356001600160a01b0381160360775760443567ffffffffffffffff811160775736602382011215607757806004013567ffffffffffffffff811160775736910160240111607757005b5f80fdfea26469706673582212206cf91bafe3a0f54d58f9735d82a4757234fa3d217135826792ecef05e5d5837c64736f6c634300081c0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"onAtomicSettlement(address,uint256,bytes)":"0x3f1d584e"},"runtimeBytecode":{"bytecode":"0x6004361015600b575f80fd5b5f3560e01c633f1d584e14601d575f80fd5b3460775760603660031901126077576004356001600160a01b0381160360775760443567ffffffffffffffff811160775736602382011215607757806004013567ffffffffffffffff811160775736910160240111607757005b5f80fdfea26469706673582212206cf91bafe3a0f54d58f9735d82a4757234fa3d217135826792ecef05e5d5837c64736f6c634300081c0033"},"sourceId":"src/MockTarget.sol","sourcemap":"149:148:4:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}},"OPStackAdminUpdateStrategy":{"abi":[{"inputs":[{"internalType":"address","name":"l1CrossDomainMessenger","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ZeroMessengerAddress","type":"error"},{"inputs":[],"name":"L1_CROSS_DOMAIN_MESSENGER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"L2_GAS_LIMIT","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address[]","name":"newAdministrators","type":"address[]"},{"internalType":"uint256","name":"newWithdrawalQuorum","type":"uint256"}],"name":"setAdministrators","outputs":[],"stateMutability":"payable","type":"function"}],"contractName":"OPStackAdminUpdateStrategy","deploymentBytecode":{"bytecode":"0x60a034608057601f61033938819003918201601f19168301916001600160401b03831184841017608457808492602094604052833981010312608057516001600160a01b038116808203608057156071576080526040516102a090816100998239608051818181605401526101590152f35b637dc8404d60e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f905f3560e01c908163075034ae146100a4575080635e743ef7146100865763f904facb1461003f575f80fd5b346100835780600319360112610083576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346100835780600319360112610083576020604051622dc6c08152f35b90506060366003190112610200576004356001600160a01b03811690819003610200576024359167ffffffffffffffff831161020057366023840112156102005782600401359267ffffffffffffffff8411610200573660248560051b8301011161020057928160208101946323c5673160e01b8652826064830160406024850152526024608483019101925f905b8082106102045750506101579250604435604483015203601f198101835282610234565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610200575f926084604051809681958294633dbb202b60e01b84526004840152606060248401525180918160648501528484015e8181018301879052622dc6c06044830152601f01601f1916810103019134905af180156101f5576101e7575080f35b6101f391505f90610234565b005b6040513d5f823e3d90fd5b5f80fd5b9092509083356001600160a01b038116919082900361020057602081600193829352019401920184929391610133565b90601f8019910116810190811067ffffffffffffffff82111761025657604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220fdcfda93542236fa6c6acb7164967d4dac5ba9d6a97702bf0e69b659712a22e864736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{"setAdministrators(address,address[],uint256)":{"details":"Sends a cross-domain message from L1 \u2192 L2 using the OP Stack messengerForwards msg.value directly to the L1 messenger","params":{"newAdministrators":"The full administrator set","newWithdrawalQuorum":"The withdrawal quorum","vault":"The L2 vault address"}}},"version":1},"methodIdentifiers":{"L1_CROSS_DOMAIN_MESSENGER()":"0xf904facb","L2_GAS_LIMIT()":"0x5e743ef7","setAdministrators(address,address[],uint256)":"0x075034ae"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f905f3560e01c908163075034ae146100a4575080635e743ef7146100865763f904facb1461003f575f80fd5b346100835780600319360112610083576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b80fd5b50346100835780600319360112610083576020604051622dc6c08152f35b90506060366003190112610200576004356001600160a01b03811690819003610200576024359167ffffffffffffffff831161020057366023840112156102005782600401359267ffffffffffffffff8411610200573660248560051b8301011161020057928160208101946323c5673160e01b8652826064830160406024850152526024608483019101925f905b8082106102045750506101579250604435604483015203601f198101835282610234565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b15610200575f926084604051809681958294633dbb202b60e01b84526004840152606060248401525180918160648501528484015e8181018301879052622dc6c06044830152601f01601f1916810103019134905af180156101f5576101e7575080f35b6101f391505f90610234565b005b6040513d5f823e3d90fd5b5f80fd5b9092509083356001600160a01b038116919082900361020057602081600193829352019401920184929391610133565b90601f8019910116810190811067ffffffffffffffff82111761025657604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220fdcfda93542236fa6c6acb7164967d4dac5ba9d6a97702bf0e69b659712a22e864736f6c634300081e0033"},"sourceId":"src/strategies/OPStackAdminUpdateStrategy.sol","sourcemap":"446:1455:26:-:0;;;;;;;;;;;;;-1:-1:-1;;446:1455:26;;;;-1:-1:-1;;;;;446:1455:26;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;446:1455:26;;;;;;;868:36;864:71;;945:50;;446:1455;;;;;;;;945:50;446:1455;;;;;;;;;;;864:71;913:22;;;-1:-1:-1;913:22:26;;-1:-1:-1;913:22:26;446:1455;-1:-1:-1;446:1455:26;;;;;;-1:-1:-1;446:1455:26;;;;;-1:-1:-1;446:1455:26","userdoc":{"errors":{"ZeroMessengerAddress()":[{"notice":"Reverts if messenger address is zero."}]},"kind":"user","methods":{"L1_CROSS_DOMAIN_MESSENGER()":{"notice":"L1 CrossDomainMessenger."},"L2_GAS_LIMIT()":{"notice":"Conservative gas limit for L2 execution."},"setAdministrators(address,address[],uint256)":{"notice":"Updates the administrator set and withdrawal quorum on an OP Stack L2 vault"}},"notice":"Admin update strategy for OP Stack chains (Optimism, Base, Unichain, etc)","version":1}},"Registry":{"abi":[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ChainAlreadyExists","type":"error"},{"inputs":[],"name":"IndexOutOfBounds","type":"error"},{"inputs":[],"name":"InvalidBufferMultiple","type":"error"},{"inputs":[],"name":"InvalidCollateralFactor","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsClamps","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsConfiguration","type":"error"},{"inputs":[],"name":"InvalidInitialMarginsFactors","type":"error"},{"inputs":[],"name":"InvalidInterestKinks","type":"error"},{"inputs":[],"name":"InvalidLiabilityFactor","type":"error"},{"inputs":[],"name":"InvalidMaxFundingRate","type":"error"},{"inputs":[],"name":"InvalidMaxUtilizationRate","type":"error"},{"inputs":[],"name":"InvalidRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUSDRateInterestKinks","type":"error"},{"inputs":[],"name":"InvalidUtilizationCap","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"}],"name":"NoPendingRiskParameters","type":"error"},{"inputs":[],"name":"NotAdmin","type":"error"},{"inputs":[],"name":"NotRiskManager","type":"error"},{"inputs":[],"name":"RiskManagerNotSet","type":"error"},{"inputs":[{"internalType":"uint16","name":"asset","type":"uint16"},{"internalType":"uint256","name":"eligibleAt","type":"uint256"}],"name":"TooSoon","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"Max1HrDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MaxDepositChanged","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"indexed":false,"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"indexed":false,"internalType":"uint16","name":"index","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"previous","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"current","type":"uint256"}],"name":"MinWeightChanged","type":"event"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"}],"name":"applyPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAccount","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"}],"name":"getAssetData","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct Registry.AssetData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"}],"name":"getAssetIndex","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getAssets","outputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct Registry.AssetData[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"start","type":"uint16"},{"internalType":"uint16","name":"end","type":"uint16"}],"name":"getRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"pendingRiskParameters","outputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters","name":"parameters","type":"tuple"},{"internalType":"uint256","name":"validAfter","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskManagerMultisig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riskParameterChangeDelaySeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"riskParameters","outputs":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"bytes32","name":"assetAddress","type":"bytes32"},{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"},{"internalType":"uint256","name":"max1hrDeposits","type":"uint256"},{"internalType":"uint256","name":"minWeight","type":"uint256"}],"internalType":"struct Registry.AssetData","name":"data","type":"tuple"}],"name":"setAssetData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"account","type":"bytes32"}],"name":"setFeeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMax1HrDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chainId","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMaxDeposit","type":"uint256"}],"name":"setMaxDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint64","name":"routingId","type":"uint64"},{"internalType":"uint64","name":"vmId","type":"uint64"}],"internalType":"struct Registry.ChainId","name":"chain","type":"tuple"},{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"uint256","name":"newMinWeight","type":"uint256"}],"name":"setMinWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"index","type":"uint16"},{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters","name":"parameters","type":"tuple"}],"name":"setPendingRiskParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"multisig","type":"address"}],"name":"setRiskManagerMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"collateralFactor","type":"uint8"},{"internalType":"uint8","name":"liabilityFactor","type":"uint8"},{"internalType":"uint256","name":"maxCollateral","type":"uint256"},{"internalType":"uint256","name":"maxOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxSpotOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxUtilization","type":"uint256"},{"internalType":"bool","name":"isolatedOnly","type":"bool"},{"internalType":"uint256[]","name":"interestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"kinkInterestRates","type":"uint256[]"},{"internalType":"uint256[]","name":"usdInterestKinks","type":"uint256[]"},{"internalType":"uint256[]","name":"usdKinkInterestRates","type":"uint256[]"},{"internalType":"uint256","name":"skewModifier","type":"uint256"},{"internalType":"uint256","name":"skewCliff","type":"uint256"},{"internalType":"int256","name":"baseFundingRate","type":"int256"},{"internalType":"uint256","name":"premiumClamp","type":"uint256"},{"internalType":"uint256[]","name":"initialMarginClamps","type":"uint256[]"},{"internalType":"uint256[]","name":"initialMarginFactors","type":"uint256[]"},{"internalType":"uint256","name":"maxFundingRate","type":"uint256"},{"internalType":"uint256","name":"maxUtilizationRate","type":"uint256"},{"internalType":"uint256","name":"bufferMultiple","type":"uint256"}],"internalType":"struct Registry.RiskParameters","name":"params","type":"tuple"}],"name":"validateRiskParameters","outputs":[],"stateMutability":"pure","type":"function"}],"contractName":"Registry","deploymentBytecode":{"bytecode":"0x608034607657601f6122e038819003918201601f19168301916001600160401b03831184841017607a57808492602094604052833981010312607657516001600160a01b03811690819003607657620151806002555f80546001600160a01b031916919091179055604051612251908161008f8239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816304cd46f91461115d575080630cb661c7146110e4578063114bb9c5146110165780632491905014610f655780633a076ddd14610ec05780634ffcbdfb14610e6d578063525ea8b714610e455780635799026114610e0b57806365e17c9d14610dee578063698670e314610dba5780636cbb0b54146109d5578063704b6c0214610951578063a7b7b47014610858578063a812e22414610801578063af8c83381461074b578063b4bb064614610418578063bc67a603146101ec578063e2a0a600146101b3578063f0fef575146101235763f851a440146100f8575f80fd5b3461011f575f36600319011261011f575f546040516001600160a01b039091168152602090f35b5f80fd5b3461011f57604036600319011261011f5761014d61013f611177565b610147611188565b90611f7c565b6040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061018457505050500390f35b919360019193955060206101a38192603f198a82030186528851611643565b9601920192018594939192610175565b3461011f57602036600319011261011f576001546001600160a01b031633036101de57600435600755005b6206732360e51b5f5260045ffd5b3461011f5760e036600319011261011f5760405161020981611230565b610211611177565b815260208101906024358252604060431936011261011f576040519161023683611215565b6044356001600160401b038116810361011f5783526064356001600160401b038116810361011f5760208401526040820192835260608201916084358352608081019160a435835260a0820160c435815260018060a01b036001541633036101de5761ffff83511660055410610409578151156103fa5761ffff8351165f52600660205260405f20938651966001600160401b036020818a511699015116936001600160401b0389165f528660205260405f206001600160401b0386165f52602052600160405f2001546103eb5760059460018801976001600160401b038954159b165f526020526001600160401b0360405f2091165f5260205261ffff60405f2096511661ffff19875416178655516001860155519561035a8760028701611e68565b516003850155516004840155519101558054600160401b8110156103d75761038791600182018155611844565b9190916103c45761039791611e68565b61039d57005b600554600181018091116103b057600555005b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b6329409fff60e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b634e23d03560e01b5f5260045ffd5b3461011f57604036600319011261011f57610431611177565b6024356001600160401b03811161011f5761045090369060040161130a565b6001549091906001600160a01b031633036101de5761047861ffff6005549216918210611b00565b61048182611b8d565b61048d60025442611796565b906040519261049b84611215565b8352602083019182525f52600360205260405f20915160ff81511683549061ff00602084015160081b169161ffff19161717835560408101516001840155606081015160028401556080810151600384015560a081015160048401556005830160c0820151151560ff801983541691161790556006830160e0820151908151916001600160401b0383116103d7576020906105368484611e28565b01905f5260205f205f5b838110610737575050505060078301610100820151908151916001600160401b0383116103d7576020906105748484611e28565b01905f5260205f205f5b838110610723575050505060088301610120820151908151916001600160401b0383116103d7576020906105b28484611e28565b01905f5260205f205f5b83811061070f575050505060098301610140820151908151916001600160401b0383116103d7576020906105f08484611e28565b01905f5260205f205f5b8381106106fb5750505050610160810151600a840155610180810151600b8401556101a0810151600c8401556101c0810151600d840155600e83016101e0820151908151916001600160401b0383116103d75760209061065a8484611e28565b01905f5260205f205f5b8381106106e75750505050600f8301610200820151908151916001600160401b0383116103d7576020906106988484611e28565b01905f5260205f205f5b8381106106d35761022085015160108801556102408501516011880155610260850151601288015585516013880155005b6001906020845194019381840155016106a2565b600190602084519401938184015501610664565b6001906020845194019381840155016105fa565b6001906020845194019381840155016105bc565b60019060208451940193818401550161057e565b600190602084519401938184015501610540565b3461011f57610759366111ea565b6001549092906001600160a01b031633036101de576107fc7f9b0a62bc173ccdd4228691d9af5cbe894061fb605491498f20216dc69fdcee1e936005546107a661ffff8616918210611b00565b6107af84611b35565b6107bb60208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600401805490839055905194859485611b49565b0390a1005b3461011f57602036600319011261011f5761ffff61081d611177565b165f52600360205261084e60405f206013610837826114ff565b910154604051928392604084526040840190611643565b9060208301520390f35b3461011f57610866366111ea565b6001549092906001600160a01b031633036101de576107fc7f61add8ab6aedaf5e8c15fd0f3b5dc7239de9517bae157dc6f09438d619959a5b936005546108b361ffff8616918210611b00565b805f52600660205260405f206001600160401b036108d086611b35565b165f5260205260405f2060208501906001600160401b036108f083611b35565b165f52602052600560405f200154915f52600660205260405f206001600160401b0361091b87611b35565b165f526020526001600160401b0361093660405f2092611b35565b165f5260205281600560405f20015560405194859485611b49565b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b03811633036109c6578115806109b3575b6109a4576001600160a01b031916175f55005b632b47857560e01b5f5260045ffd5b506001546001600160a01b031615610991565b637bfa4b9f60e01b5f5260045ffd5b3461011f57602036600319011261011f576109ee611177565b610a0161ffff6005549216918210611b00565b805f52600360205260405f20601360405191610a1c83611215565b610a25816114ff565b83520154602082019080825215610da7575142811015610d91575051610a4a81611b8d565b815f52600460205260405f209060ff81511682549061ff00602084015160081b169161ffff19161717825560408101516001830155606081015160028301556080810151600383015560a081015160048301556005820160c0820151151560ff801983541691161790556006820160e0820151908151916001600160401b0383116103d757602090610adc8484611e28565b01905f5260205f205f5b838110610d7d575050505060078201610100820151908151916001600160401b0383116103d757602090610b1a8484611e28565b01905f5260205f205f5b838110610d69575050505060088201610120820151908151916001600160401b0383116103d757602090610b588484611e28565b01905f5260205f205f5b838110610d55575050505060098201610140820151908151916001600160401b0383116103d757602090610b968484611e28565b01905f5260205f205f5b838110610d415750505050610160810151600a830155610180810151600b8301556101a0810151600c8301556101c0810151600d830155600e82016101e0820151908151916001600160401b0383116103d757602090610c008484611e28565b01905f5260205f205f5b838110610d2d5750505050600f8201610200820151908151916001600160401b0383116103d757602090610c3e8484611e28565b01905f5260205f205f5b838110610d195786866012610260886102208101516010850155610240810151601185015501519101555f5260036020525f601360408220828155826001820155826002820155826003820155826004820155826005820155610cad60068201611df8565b610cb960078201611df8565b610cc560088201611df8565b610cd160098201611df8565b82600a82015582600b82015582600c82015582600d820155610cf5600e8201611df8565b610d01600f8201611df8565b82601082015582601182015582601282015501555f80f35b600190602084519401938184015501610c48565b600190602084519401938184015501610c0a565b600190602084519401938184015501610ba0565b600190602084519401938184015501610b62565b600190602084519401938184015501610b24565b600190602084519401938184015501610ae6565b82636bfedefd60e11b5f5260045260245260445ffd5b8263193e674760e21b5f5260045260245ffd5b3461011f5736600319016060811261011f5760401361011f576020610de0604435611d61565b63ffffffff60405191168152f35b3461011f575f36600319011261011f576020600754604051908152f35b3461011f57602036600319011261011f576004356001600160401b03811161011f57610e3e610e4391369060040161130a565b611b8d565b005b3461011f575f36600319011261011f576001546040516001600160a01b039091168152602090f35b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b031633036109c6576bffffffffffffffffffffffff60a01b60015416176001555f80f35b3461011f5736600319016060811261011f5760401361011f5760443561ffff811680910361011f57610ef06117a3565b505f52600660205260405f206004356001600160401b038116810361011f57806001600160401b039150165f5260205260405f206024356001600160401b038116810361011f57806001600160401b039150165f5260205260e0610f5660405f20611881565b610f636040518092611199565bf35b3461011f57610f73366111ea565b6001549092906001600160a01b031633036101de576107fc7f35095f4ef942f9cb4170d9a93adc7fe9ebc8faf2df4a91b87b0dced92784718f93600554610fc061ffff8616918210611b00565b610fc984611b35565b610fd560208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600301805490839055905194859485611b49565b3461011f57602036600319011261011f5761ffff611032611177565b165f5260046020526101c060ff60405f20805490600181015460028201546003830154600484015486600586015416600a86015490600b87015492600c88015494600d8901549660108a015498601260118c01549b01549b60206040519e8f92818116845260081c1691015260408d015260608c015260808b015260a08a0152151560c089015260e08801526101008701526101208601526101408501526101608401526101808301526101a0820152f35b3461011f57604036600319011261011f5761110e611100611177565b611108611188565b906118ed565b6040518091602082016020835281518091526020604084019201905f5b818110611139575050500390f35b91935091602060e08261114f6001948851611199565b01940191019184939261112b565b3461011f575f36600319011261011f576020906002548152f35b6004359061ffff8216820361011f57565b6024359061ffff8216820361011f57565b60a060c09161ffff8151168452602081015160208501526001600160401b03602060408301518281511660408801520151166060850152606081015160808501526080810151828501520151910152565b600319016080811261011f5760401361011f5760049060443561ffff8116810361011f579060643590565b604081019081106001600160401b038211176103d757604052565b60c081019081106001600160401b038211176103d757604052565b61028081019081106001600160401b038211176103d757604052565b90601f801991011681019081106001600160401b038211176103d757604052565b359060ff8216820361011f57565b6001600160401b0381116103d75760051b60200190565b9080601f8301121561011f5781356112c481611296565b926112d26040519485611267565b81845260208085019260051b82010192831161011f57602001905b8282106112fa5750505090565b81358152602091820191016112ed565b9190916102808184031261011f57604051906113258261124b565b819361133082611288565b835261133e60208301611288565b602084015260408201356040840152606082013560608401526080820135608084015260a082013560a084015260c0820135801515810361011f5760c084015260e08201356001600160401b03811161011f578161139d9184016112ad565b60e08401526101008201356001600160401b03811161011f57816113c29184016112ad565b6101008401526101208201356001600160401b03811161011f57816113e89184016112ad565b6101208401526101408201356001600160401b03811161011f578161140e9184016112ad565b6101408401526101608201356101608401526101808201356101808401526101a08201356101a08401526101c08201356101c08401526101e08201356001600160401b03811161011f57816114649184016112ad565b6101e0840152610200820135916001600160401b03831161011f576114906102609392849383016112ad565b6102008501526102208101356102208501526102408101356102408501520135910152565b90604051918281549182825260208201905f5260205f20925f5b8181106114e65750506114e492500383611267565b565b84548352600194850194879450602090930192016114cf565b9060405161150c8161124b565b6102606012829460ff8154818116865260081c166020850152600181015460408501526002810154606085015260038101546080850152600481015460a085015260ff600582015416151560c0850152611568600682016114b5565b60e0850152611579600782016114b5565b61010085015261158b600882016114b5565b61012085015261159d600982016114b5565b610140850152600a810154610160850152600b810154610180850152600c8101546101a0850152600d8101546101c08501526115db600e82016114b5565b6101e08501526115ed600f82016114b5565b610200850152601081015461022085015260118101546102408501520154910152565b90602080835192838152019201905f5b81811061162d5750505090565b8251845260209384019390920191600101611620565b9060ff825116815260ff602083015116602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c0820151151560c08201526102608061174e61173a6116f66116e26116ce6116ba60e08a015161028060e08b01526102808a0190611610565b6101008a01518982036101008b0152611610565b6101208901518882036101208a0152611610565b610140880151878203610140890152611610565b6101608701516101608701526101808701516101808701526101a08701516101a08701526101c08701516101c08701526101e08701518682036101e0880152611610565b610200860151858203610200870152611610565b93610220810151610220850152610240810151610240850152015191015290565b35906001600160401b038216820361011f57565b61ffff1661ffff81146103b05760010190565b919082018092116103b057565b604051906117b082611230565b5f60a0838281528260208201526040516117c981611215565b83815283602082015260408201528260608201528260808201520152565b604051906117f6602083611267565b5f80835282815b82811061180957505050565b6020906118146117a3565b828285010152016117fd565b9061ffff8091169116039061ffff82116103b057565b5f1981146103b05760010190565b8054821015611859575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b80518210156118595760209160051b010190565b9060405161188e81611230565b60a06005829461ffff8154168452600181015460208501526040516118b281611215565b6001600160401b036002830154818116835260401c166020820152604085015260038101546060850152600481015460808501520154910152565b6005545f9290835b61ffff85168281101561192b576119259161191f915f526006602052600160405f20015490611796565b94611783565b936118f5565b5093509193909361ffff81169380851015611ae3578061ffff871611611af4575b5061ffff851694848610611ae35761ffff9161196c919693959496611820565b1661197681611296565b916119846040519384611267565b818352601f1961199383611296565b015f5b818110611ac05750505f905f945f5b61ffff811689811080611ab7575b15611aab575f52600660205260405f209460018601948554995f915b8b831080611aa2575b15611a85578581101580611a7c575b611a04575b6119f86119fe91611836565b92611836565b916119cf565b611a0e8389611844565b50546001600160401b0381166001600160401b03165f528960205260405f209060401c6001600160401b03166001600160401b03165f5260205260405f209a80611a5790611836565b9b611a6190611881565b611a6b828d61186d565b52611a76908b61186d565b506119ec565b508681106119e7565b9b9497509550509750611a9790611783565b9792969390976119a5565b50838b106119d8565b50949750505050505050565b508588106119b3565b602090611ad19896949793986117a3565b82828801015201969195929496611996565b505092505050611af16117e7565b90565b61ffff1694505f61194c565b15611b0757565b60405162461bcd60e51b815260206004820152600660248201526508585cdcd95d60d21b6044820152606490fd5b356001600160401b038116810361011f5790565b9094939261ffff6080936001600160401b03611b78602060a087019a83611b6f8261176f565b1688520161176f565b16602085015216604083015260608201520152565b606460ff82511611611d5257606460ff60208301511611611d4357670de0b6b3a764000060a082015111611d345761047661022082015111611d255761047661024082015111611d1657610260810151620f42408110908115611d09575b50611cfa5760e08101611bfe8151612108565b15611ceb57611c0d9051612180565b15611ceb576101208101611c218151612108565b15611cdc57611c309051612180565b15611cdc57611c436101008201516121b0565b15611ccd57611c566101408201516121b0565b15611cbe576101e0810161020081515192019182515103611caf57611c7b9051612108565b15611ca057611c8a90516121e4565b15611c9157565b637015a03b60e01b5f5260045ffd5b6329f7281b60e21b5f5260045ffd5b63bfa51ee360e01b5f5260045ffd5b635646ba3b60e11b5f5260045ffd5b630adc448560e21b5f5260045ffd5b630376a9ef60e31b5f5260045ffd5b6365c991a560e01b5f5260045ffd5b63adb838cd60e01b5f5260045ffd5b621e84809150115f611beb565b6328be116d60e21b5f5260045ffd5b63076eb25360e11b5f5260045ffd5b63cc15654960e01b5f5260045ffd5b632a7f863d60e21b5f5260045ffd5b6302f22cad60e61b5f5260045ffd5b6004356001600160401b038116810361011f57602435916001600160401b038316830361011f575f6001600160401b038060055494169416905b61ffff811684811015611dea57805f52600660205260405f20865f5260205260405f20835f52602052600160405f2001548414611de15750611ddc90611783565b611d9b565b94505050505090565b50505050505063ffffffff90565b8054905f815581611e07575050565b5f5260205f20908101905b818110611e1d575050565b5f8155600101611e12565b90600160401b81116103d757815491818155828210611e4657505050565b5f5260205f2091820191015b818110611e5d575050565b5f8155600101611e52565b906001600160401b038151166fffffffffffffffff00000000000000006020845493836001600160401b03198616178655015160401b16916fffffffffffffffffffffffffffffffff191617179055565b60405190611ec8602083611267565b5f80835282815b828110611edb57505050565b602090604051611eea8161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828501015201611ecf565b60055461ffff80831694939116808510156120fb578061ffff8316116120f3575b508361ffff8216106120e75761ffff91611fb691611820565b16611fc081611296565b92611fce6040519485611267565b818452601f19611fdd83611296565b015f5b8181106120465750505f5b61ffff811690838210156120405781830161ffff81116103b05761203b9261ffff61203592165f52600460205261202460405f206114ff565b61202e828a61186d565b528761186d565b50611783565b611feb565b50505050565b6020906040516120558161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828901015201611fe0565b50509050611af1611eb9565b90505f611f9d565b5050509050611af1611eb9565b8051905f908215801561216c575b612165575f915b83831061212d5750505050600190565b612137838361186d565b5190620f4240821161215c5781106121545760019092019161211d565b505050505f90565b50505050505f90565b5050505f90565b508051156118595760208101511515612116565b8051801515918261219057505090565b5f19820192509082116103b057620f4240916121ab9161186d565b511490565b8051905f90815b8383106121c75750505050600190565b6121d1838361186d565b51908110612154576001909201916121b7565b8051905f90620f423f5b8383106121fe5750505050600190565b612208838361186d565b51908111612154576001909201916121ee56fea26469706673582212201a0e5b061dbc5669db9937ab714356062c9af05eea7b1d4bb9eeaf0073ef81fe64736f6c634300081e0033"},"devdoc":{"details":"Uses admin and multisig roles to control sensitive operations like asset registration and risk configuration.","kind":"dev","methods":{"applyPendingRiskParameters(uint16)":{"details":"Reverts with `\"!asset\"` if index >= assets.count.Reverts with `NoPendingRiskParameters` if there are no pending risk parameters for the specified assetReverts with `TooSoon` if the pending risk parameters are not yet eligible","params":{"index":"The asset index."}},"constructor":{"details":"Sets the deployer as the initial admin.","params":{"_admin":"The admin controller of the vault."}},"getAssetData((uint64,uint64),uint16)":{"params":{"chainId":"the chain ID to query.","index":"The asset index to query."},"returns":{"_0":"The corresponding AssetData struct."}},"getAssetIndex((uint64,uint64),bytes32)":{"params":{"assetAddress":"The asset address (as bytes32).","chainId":"The chain ID to search."},"returns":{"_0":"The index of the asset, or `type(uint32).max` if not found."}},"getAssets(uint16,uint16)":{"params":{"end":"The end index (not-inclusive).","start":"The start index (inclusive)."},"returns":{"_0":"An array of AssetData structs."}},"getRiskParameters(uint16,uint16)":{"params":{"end":"The end index (not inclusive).","start":"The start index (inclusive)."},"returns":{"_0":"An array of RiskParameters."}},"setAdmin(address)":{"details":"Reverts with `NotAdmin`; Only the admin can set a new admin.The new administrator address is allowed to be the null address. Setting the administrator to this address disables administration of the registry contract.","params":{"newAdmin":"The new admin address."}},"setAssetData((uint16,bytes32,(uint64,uint64),uint256,uint256,uint256))":{"details":"Automatically adds new assets or chain instances if not already present.Reverts with `NotRiskManager`; Only the risk manager can set asset data.","params":{"data":"The chain-specific asset data."}},"setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":{"details":"Reverts with `NotRiskManager`; Only the risk manager can set risk parameters.Reverts with `\"!asset\"` if index >= assets.count.","params":{"index":"The asset index.","parameters":"The risk parameters to set"}},"setRiskManagerMultisig(address)":{"details":"Reverts with `NotAdmin`; Only the admin can set a risk manager.","params":{"multisig":"The new address to set."}}},"title":"Registry","version":1},"methodIdentifiers":{"admin()":"0xf851a440","applyPendingRiskParameters(uint16)":"0x6cbb0b54","feeAccount()":"0x65e17c9d","getAssetData((uint64,uint64),uint16)":"0x3a076ddd","getAssetIndex((uint64,uint64),bytes32)":"0x698670e3","getAssets(uint16,uint16)":"0x0cb661c7","getRiskParameters(uint16,uint16)":"0xf0fef575","pendingRiskParameters(uint16)":"0xa812e224","riskManagerMultisig()":"0x525ea8b7","riskParameterChangeDelaySeconds()":"0x04cd46f9","riskParameters(uint16)":"0x114bb9c5","setAdmin(address)":"0x704b6c02","setAssetData((uint16,bytes32,(uint64,uint64),uint256,uint256,uint256))":"0xbc67a603","setFeeAccount(bytes32)":"0xe2a0a600","setMax1HrDeposits((uint64,uint64),uint16,uint256)":"0xaf8c8338","setMaxDeposits((uint64,uint64),uint16,uint256)":"0x24919050","setMinWeight((uint64,uint64),uint16,uint256)":"0xa7b7b470","setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0xb4bb0646","setRiskManagerMultisig(address)":"0x4ffcbdfb","validateRiskParameters((uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":"0x57990261"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f3560e01c90816304cd46f91461115d575080630cb661c7146110e4578063114bb9c5146110165780632491905014610f655780633a076ddd14610ec05780634ffcbdfb14610e6d578063525ea8b714610e455780635799026114610e0b57806365e17c9d14610dee578063698670e314610dba5780636cbb0b54146109d5578063704b6c0214610951578063a7b7b47014610858578063a812e22414610801578063af8c83381461074b578063b4bb064614610418578063bc67a603146101ec578063e2a0a600146101b3578063f0fef575146101235763f851a440146100f8575f80fd5b3461011f575f36600319011261011f575f546040516001600160a01b039091168152602090f35b5f80fd5b3461011f57604036600319011261011f5761014d61013f611177565b610147611188565b90611f7c565b6040518091602082016020835281518091526040830190602060408260051b8601019301915f905b82821061018457505050500390f35b919360019193955060206101a38192603f198a82030186528851611643565b9601920192018594939192610175565b3461011f57602036600319011261011f576001546001600160a01b031633036101de57600435600755005b6206732360e51b5f5260045ffd5b3461011f5760e036600319011261011f5760405161020981611230565b610211611177565b815260208101906024358252604060431936011261011f576040519161023683611215565b6044356001600160401b038116810361011f5783526064356001600160401b038116810361011f5760208401526040820192835260608201916084358352608081019160a435835260a0820160c435815260018060a01b036001541633036101de5761ffff83511660055410610409578151156103fa5761ffff8351165f52600660205260405f20938651966001600160401b036020818a511699015116936001600160401b0389165f528660205260405f206001600160401b0386165f52602052600160405f2001546103eb5760059460018801976001600160401b038954159b165f526020526001600160401b0360405f2091165f5260205261ffff60405f2096511661ffff19875416178655516001860155519561035a8760028701611e68565b516003850155516004840155519101558054600160401b8110156103d75761038791600182018155611844565b9190916103c45761039791611e68565b61039d57005b600554600181018091116103b057600555005b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f525f60045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b6329409fff60e01b5f5260045ffd5b63d92e233d60e01b5f5260045ffd5b634e23d03560e01b5f5260045ffd5b3461011f57604036600319011261011f57610431611177565b6024356001600160401b03811161011f5761045090369060040161130a565b6001549091906001600160a01b031633036101de5761047861ffff6005549216918210611b00565b61048182611b8d565b61048d60025442611796565b906040519261049b84611215565b8352602083019182525f52600360205260405f20915160ff81511683549061ff00602084015160081b169161ffff19161717835560408101516001840155606081015160028401556080810151600384015560a081015160048401556005830160c0820151151560ff801983541691161790556006830160e0820151908151916001600160401b0383116103d7576020906105368484611e28565b01905f5260205f205f5b838110610737575050505060078301610100820151908151916001600160401b0383116103d7576020906105748484611e28565b01905f5260205f205f5b838110610723575050505060088301610120820151908151916001600160401b0383116103d7576020906105b28484611e28565b01905f5260205f205f5b83811061070f575050505060098301610140820151908151916001600160401b0383116103d7576020906105f08484611e28565b01905f5260205f205f5b8381106106fb5750505050610160810151600a840155610180810151600b8401556101a0810151600c8401556101c0810151600d840155600e83016101e0820151908151916001600160401b0383116103d75760209061065a8484611e28565b01905f5260205f205f5b8381106106e75750505050600f8301610200820151908151916001600160401b0383116103d7576020906106988484611e28565b01905f5260205f205f5b8381106106d35761022085015160108801556102408501516011880155610260850151601288015585516013880155005b6001906020845194019381840155016106a2565b600190602084519401938184015501610664565b6001906020845194019381840155016105fa565b6001906020845194019381840155016105bc565b60019060208451940193818401550161057e565b600190602084519401938184015501610540565b3461011f57610759366111ea565b6001549092906001600160a01b031633036101de576107fc7f9b0a62bc173ccdd4228691d9af5cbe894061fb605491498f20216dc69fdcee1e936005546107a661ffff8616918210611b00565b6107af84611b35565b6107bb60208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600401805490839055905194859485611b49565b0390a1005b3461011f57602036600319011261011f5761ffff61081d611177565b165f52600360205261084e60405f206013610837826114ff565b910154604051928392604084526040840190611643565b9060208301520390f35b3461011f57610866366111ea565b6001549092906001600160a01b031633036101de576107fc7f61add8ab6aedaf5e8c15fd0f3b5dc7239de9517bae157dc6f09438d619959a5b936005546108b361ffff8616918210611b00565b805f52600660205260405f206001600160401b036108d086611b35565b165f5260205260405f2060208501906001600160401b036108f083611b35565b165f52602052600560405f200154915f52600660205260405f206001600160401b0361091b87611b35565b165f526020526001600160401b0361093660405f2092611b35565b165f5260205281600560405f20015560405194859485611b49565b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b03811633036109c6578115806109b3575b6109a4576001600160a01b031916175f55005b632b47857560e01b5f5260045ffd5b506001546001600160a01b031615610991565b637bfa4b9f60e01b5f5260045ffd5b3461011f57602036600319011261011f576109ee611177565b610a0161ffff6005549216918210611b00565b805f52600360205260405f20601360405191610a1c83611215565b610a25816114ff565b83520154602082019080825215610da7575142811015610d91575051610a4a81611b8d565b815f52600460205260405f209060ff81511682549061ff00602084015160081b169161ffff19161717825560408101516001830155606081015160028301556080810151600383015560a081015160048301556005820160c0820151151560ff801983541691161790556006820160e0820151908151916001600160401b0383116103d757602090610adc8484611e28565b01905f5260205f205f5b838110610d7d575050505060078201610100820151908151916001600160401b0383116103d757602090610b1a8484611e28565b01905f5260205f205f5b838110610d69575050505060088201610120820151908151916001600160401b0383116103d757602090610b588484611e28565b01905f5260205f205f5b838110610d55575050505060098201610140820151908151916001600160401b0383116103d757602090610b968484611e28565b01905f5260205f205f5b838110610d415750505050610160810151600a830155610180810151600b8301556101a0810151600c8301556101c0810151600d830155600e82016101e0820151908151916001600160401b0383116103d757602090610c008484611e28565b01905f5260205f205f5b838110610d2d5750505050600f8201610200820151908151916001600160401b0383116103d757602090610c3e8484611e28565b01905f5260205f205f5b838110610d195786866012610260886102208101516010850155610240810151601185015501519101555f5260036020525f601360408220828155826001820155826002820155826003820155826004820155826005820155610cad60068201611df8565b610cb960078201611df8565b610cc560088201611df8565b610cd160098201611df8565b82600a82015582600b82015582600c82015582600d820155610cf5600e8201611df8565b610d01600f8201611df8565b82601082015582601182015582601282015501555f80f35b600190602084519401938184015501610c48565b600190602084519401938184015501610c0a565b600190602084519401938184015501610ba0565b600190602084519401938184015501610b62565b600190602084519401938184015501610b24565b600190602084519401938184015501610ae6565b82636bfedefd60e11b5f5260045260245260445ffd5b8263193e674760e21b5f5260045260245ffd5b3461011f5736600319016060811261011f5760401361011f576020610de0604435611d61565b63ffffffff60405191168152f35b3461011f575f36600319011261011f576020600754604051908152f35b3461011f57602036600319011261011f576004356001600160401b03811161011f57610e3e610e4391369060040161130a565b611b8d565b005b3461011f575f36600319011261011f576001546040516001600160a01b039091168152602090f35b3461011f57602036600319011261011f576004356001600160a01b0381169081900361011f575f546001600160a01b031633036109c6576bffffffffffffffffffffffff60a01b60015416176001555f80f35b3461011f5736600319016060811261011f5760401361011f5760443561ffff811680910361011f57610ef06117a3565b505f52600660205260405f206004356001600160401b038116810361011f57806001600160401b039150165f5260205260405f206024356001600160401b038116810361011f57806001600160401b039150165f5260205260e0610f5660405f20611881565b610f636040518092611199565bf35b3461011f57610f73366111ea565b6001549092906001600160a01b031633036101de576107fc7f35095f4ef942f9cb4170d9a93adc7fe9ebc8faf2df4a91b87b0dced92784718f93600554610fc061ffff8616918210611b00565b610fc984611b35565b610fd560208601611b35565b5f9283526006602090815260408085206001600160401b03948516865282528085209290931684525290819020600301805490839055905194859485611b49565b3461011f57602036600319011261011f5761ffff611032611177565b165f5260046020526101c060ff60405f20805490600181015460028201546003830154600484015486600586015416600a86015490600b87015492600c88015494600d8901549660108a015498601260118c01549b01549b60206040519e8f92818116845260081c1691015260408d015260608c015260808b015260a08a0152151560c089015260e08801526101008701526101208601526101408501526101608401526101808301526101a0820152f35b3461011f57604036600319011261011f5761110e611100611177565b611108611188565b906118ed565b6040518091602082016020835281518091526020604084019201905f5b818110611139575050500390f35b91935091602060e08261114f6001948851611199565b01940191019184939261112b565b3461011f575f36600319011261011f576020906002548152f35b6004359061ffff8216820361011f57565b6024359061ffff8216820361011f57565b60a060c09161ffff8151168452602081015160208501526001600160401b03602060408301518281511660408801520151166060850152606081015160808501526080810151828501520151910152565b600319016080811261011f5760401361011f5760049060443561ffff8116810361011f579060643590565b604081019081106001600160401b038211176103d757604052565b60c081019081106001600160401b038211176103d757604052565b61028081019081106001600160401b038211176103d757604052565b90601f801991011681019081106001600160401b038211176103d757604052565b359060ff8216820361011f57565b6001600160401b0381116103d75760051b60200190565b9080601f8301121561011f5781356112c481611296565b926112d26040519485611267565b81845260208085019260051b82010192831161011f57602001905b8282106112fa5750505090565b81358152602091820191016112ed565b9190916102808184031261011f57604051906113258261124b565b819361133082611288565b835261133e60208301611288565b602084015260408201356040840152606082013560608401526080820135608084015260a082013560a084015260c0820135801515810361011f5760c084015260e08201356001600160401b03811161011f578161139d9184016112ad565b60e08401526101008201356001600160401b03811161011f57816113c29184016112ad565b6101008401526101208201356001600160401b03811161011f57816113e89184016112ad565b6101208401526101408201356001600160401b03811161011f578161140e9184016112ad565b6101408401526101608201356101608401526101808201356101808401526101a08201356101a08401526101c08201356101c08401526101e08201356001600160401b03811161011f57816114649184016112ad565b6101e0840152610200820135916001600160401b03831161011f576114906102609392849383016112ad565b6102008501526102208101356102208501526102408101356102408501520135910152565b90604051918281549182825260208201905f5260205f20925f5b8181106114e65750506114e492500383611267565b565b84548352600194850194879450602090930192016114cf565b9060405161150c8161124b565b6102606012829460ff8154818116865260081c166020850152600181015460408501526002810154606085015260038101546080850152600481015460a085015260ff600582015416151560c0850152611568600682016114b5565b60e0850152611579600782016114b5565b61010085015261158b600882016114b5565b61012085015261159d600982016114b5565b610140850152600a810154610160850152600b810154610180850152600c8101546101a0850152600d8101546101c08501526115db600e82016114b5565b6101e08501526115ed600f82016114b5565b610200850152601081015461022085015260118101546102408501520154910152565b90602080835192838152019201905f5b81811061162d5750505090565b8251845260209384019390920191600101611620565b9060ff825116815260ff602083015116602082015260408201516040820152606082015160608201526080820151608082015260a082015160a082015260c0820151151560c08201526102608061174e61173a6116f66116e26116ce6116ba60e08a015161028060e08b01526102808a0190611610565b6101008a01518982036101008b0152611610565b6101208901518882036101208a0152611610565b610140880151878203610140890152611610565b6101608701516101608701526101808701516101808701526101a08701516101a08701526101c08701516101c08701526101e08701518682036101e0880152611610565b610200860151858203610200870152611610565b93610220810151610220850152610240810151610240850152015191015290565b35906001600160401b038216820361011f57565b61ffff1661ffff81146103b05760010190565b919082018092116103b057565b604051906117b082611230565b5f60a0838281528260208201526040516117c981611215565b83815283602082015260408201528260608201528260808201520152565b604051906117f6602083611267565b5f80835282815b82811061180957505050565b6020906118146117a3565b828285010152016117fd565b9061ffff8091169116039061ffff82116103b057565b5f1981146103b05760010190565b8054821015611859575f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b80518210156118595760209160051b010190565b9060405161188e81611230565b60a06005829461ffff8154168452600181015460208501526040516118b281611215565b6001600160401b036002830154818116835260401c166020820152604085015260038101546060850152600481015460808501520154910152565b6005545f9290835b61ffff85168281101561192b576119259161191f915f526006602052600160405f20015490611796565b94611783565b936118f5565b5093509193909361ffff81169380851015611ae3578061ffff871611611af4575b5061ffff851694848610611ae35761ffff9161196c919693959496611820565b1661197681611296565b916119846040519384611267565b818352601f1961199383611296565b015f5b818110611ac05750505f905f945f5b61ffff811689811080611ab7575b15611aab575f52600660205260405f209460018601948554995f915b8b831080611aa2575b15611a85578581101580611a7c575b611a04575b6119f86119fe91611836565b92611836565b916119cf565b611a0e8389611844565b50546001600160401b0381166001600160401b03165f528960205260405f209060401c6001600160401b03166001600160401b03165f5260205260405f209a80611a5790611836565b9b611a6190611881565b611a6b828d61186d565b52611a76908b61186d565b506119ec565b508681106119e7565b9b9497509550509750611a9790611783565b9792969390976119a5565b50838b106119d8565b50949750505050505050565b508588106119b3565b602090611ad19896949793986117a3565b82828801015201969195929496611996565b505092505050611af16117e7565b90565b61ffff1694505f61194c565b15611b0757565b60405162461bcd60e51b815260206004820152600660248201526508585cdcd95d60d21b6044820152606490fd5b356001600160401b038116810361011f5790565b9094939261ffff6080936001600160401b03611b78602060a087019a83611b6f8261176f565b1688520161176f565b16602085015216604083015260608201520152565b606460ff82511611611d5257606460ff60208301511611611d4357670de0b6b3a764000060a082015111611d345761047661022082015111611d255761047661024082015111611d1657610260810151620f42408110908115611d09575b50611cfa5760e08101611bfe8151612108565b15611ceb57611c0d9051612180565b15611ceb576101208101611c218151612108565b15611cdc57611c309051612180565b15611cdc57611c436101008201516121b0565b15611ccd57611c566101408201516121b0565b15611cbe576101e0810161020081515192019182515103611caf57611c7b9051612108565b15611ca057611c8a90516121e4565b15611c9157565b637015a03b60e01b5f5260045ffd5b6329f7281b60e21b5f5260045ffd5b63bfa51ee360e01b5f5260045ffd5b635646ba3b60e11b5f5260045ffd5b630adc448560e21b5f5260045ffd5b630376a9ef60e31b5f5260045ffd5b6365c991a560e01b5f5260045ffd5b63adb838cd60e01b5f5260045ffd5b621e84809150115f611beb565b6328be116d60e21b5f5260045ffd5b63076eb25360e11b5f5260045ffd5b63cc15654960e01b5f5260045ffd5b632a7f863d60e21b5f5260045ffd5b6302f22cad60e61b5f5260045ffd5b6004356001600160401b038116810361011f57602435916001600160401b038316830361011f575f6001600160401b038060055494169416905b61ffff811684811015611dea57805f52600660205260405f20865f5260205260405f20835f52602052600160405f2001548414611de15750611ddc90611783565b611d9b565b94505050505090565b50505050505063ffffffff90565b8054905f815581611e07575050565b5f5260205f20908101905b818110611e1d575050565b5f8155600101611e12565b90600160401b81116103d757815491818155828210611e4657505050565b5f5260205f2091820191015b818110611e5d575050565b5f8155600101611e52565b906001600160401b038151166fffffffffffffffff00000000000000006020845493836001600160401b03198616178655015160401b16916fffffffffffffffffffffffffffffffff191617179055565b60405190611ec8602083611267565b5f80835282815b828110611edb57505050565b602090604051611eea8161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828501015201611ecf565b60055461ffff80831694939116808510156120fb578061ffff8316116120f3575b508361ffff8216106120e75761ffff91611fb691611820565b16611fc081611296565b92611fce6040519485611267565b818452601f19611fdd83611296565b015f5b8181106120465750505f5b61ffff811690838210156120405781830161ffff81116103b05761203b9261ffff61203592165f52600460205261202460405f206114ff565b61202e828a61186d565b528761186d565b50611783565b611feb565b50505050565b6020906040516120558161124b565b5f81525f838201525f60408201525f60608201525f60808201525f60a08201525f60c0820152606060e08201526060610100820152606061012082015260606101408201525f6101608201525f6101808201525f6101a08201525f6101c082015260606101e082015260606102008201525f6102208201525f6102408201525f61026082015282828901015201611fe0565b50509050611af1611eb9565b90505f611f9d565b5050509050611af1611eb9565b8051905f908215801561216c575b612165575f915b83831061212d5750505050600190565b612137838361186d565b5190620f4240821161215c5781106121545760019092019161211d565b505050505f90565b50505050505f90565b5050505f90565b508051156118595760208101511515612116565b8051801515918261219057505090565b5f19820192509082116103b057620f4240916121ab9161186d565b511490565b8051905f90815b8383106121c75750505050600190565b6121d1838361186d565b51908110612154576001909201916121b7565b8051905f90620f423f5b8383106121fe5750505050600190565b612208838361186d565b51908111612154576001909201916121ee56fea26469706673582212201a0e5b061dbc5669db9937ab714356062c9af05eea7b1d4bb9eeaf0073ef81fe64736f6c634300081e0033"},"sourceId":"src/Registry.sol","sourcemap":"306:22119:16:-:0;;;;;;;;;;;;;-1:-1:-1;;306:22119:16;;;;-1:-1:-1;;;;;306:22119:16;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;306:22119:16;;;;;;;;699:6;;306:22119;-1:-1:-1;306:22119:16;;-1:-1:-1;;;;;;306:22119:16;;;;;;;;;;;;;;;;;-1:-1:-1;306:22119:16;;;;;;-1:-1:-1;306:22119:16;;;;;-1:-1:-1;306:22119:16","userdoc":{"errors":{"ChainAlreadyExists()":[{"notice":"Reverts if adding a chain to an asset that already exists."}],"IndexOutOfBounds()":[{"notice":"Reverts if the asset index is out of bounds."}],"InvalidBufferMultiple()":[{"notice":"Reverts if the buffer multiple value is less than 1% or greater than 2%."}],"InvalidCollateralFactor()":[{"notice":"Reverts if the collateral factor (CF) specified as part of risk parameters is greater than one"}],"InvalidInitialMarginsClamps()":[{"notice":"Reverts if the initial margin clamps specified as part of risk parameters are not increasing or are above 100"}],"InvalidInitialMarginsConfiguration()":[{"notice":"Reverts if the size of the initial margin clamps does not match the size of the initial margin factors (specified as part of risk parameters)"}],"InvalidInitialMarginsFactors()":[{"notice":"Reverts if the initial margin clamps specified as part of risk parameters are not decreasing or are above 100"}],"InvalidInterestKinks()":[{"notice":"Reverts if the interest kinks specified as part of risk parameters are not increasing from 0 to 1"}],"InvalidLiabilityFactor()":[{"notice":"Reverts if the liability factor (LF) specified as part of risk parameters is greater than one"}],"InvalidMaxFundingRate()":[{"notice":"Reverts if the funding rate cap specified as part of risk parameters is greater than ~1000% APR"}],"InvalidMaxUtilizationRate()":[{"notice":"Reverts if the utilization rate cap specified as part of risk parameters is greater than ~1000% APR"}],"InvalidRateInterestKinks()":[{"notice":"Reverts if the interest rates specified as part of risk parameters are not increasing"}],"InvalidUSDInterestKinks()":[{"notice":"Reverts if the USD-denominated interest kinks specified as part of risk parameters are not increasing from 0 to 1"}],"InvalidUSDRateInterestKinks()":[{"notice":"Reverts if the USD-denominated interest rates specified as part of risk parameters are not increasing"}],"InvalidUtilizationCap()":[{"notice":"Reverts if the utilization cap specified as part of risk parameters is greater than one"}],"NoPendingRiskParameters(uint16)":[{"notice":"Reverts if there is are no risk parameters queued for the specified asset"}],"NotAdmin()":[{"notice":"Reverts if caller is not the admin."}],"NotRiskManager()":[{"notice":"Reverts if caller is not the risk manager multisig."}],"RiskManagerNotSet()":[{"notice":"Reverts if the risk manager is not set."}],"TooSoon(uint16,uint256)":[{"notice":"Reverts if the pending risk parameters are not yet eligible for application"}],"ZeroAddress()":[{"notice":"Reverts if an address is zero."}]},"events":{"Max1HrDepositChanged((uint64,uint64),uint16,uint256,uint256)":{"notice":"Signals that the maximum hourly deposit has changed for a given asset"},"MaxDepositChanged((uint64,uint64),uint16,uint256,uint256)":{"notice":"Signals that the maximum deposit has changed for a given asset"},"MinWeightChanged((uint64,uint64),uint16,uint256,uint256)":{"notice":"Signals that the minimum weight has changed for a given asset"}},"kind":"user","methods":{"admin()":{"notice":"Address of the admin; primarily used for initial setup."},"applyPendingRiskParameters(uint16)":{"notice":"Applies the pending risk parameters for the specified asset if they exist."},"constructor":{"notice":"Contract constructor."},"feeAccount()":{"notice":"Account for receiving fees and paying rewards."},"getAssetData((uint64,uint64),uint16)":{"notice":"Retrieves asset data for a specific asset and chain."},"getAssetIndex((uint64,uint64),bytes32)":{"notice":"Returns the asset index for a given chain and address."},"getAssets(uint16,uint16)":{"notice":"Returns all registered asset data across all chains."},"getRiskParameters(uint16,uint16)":{"notice":"Returns the full list of risk parameters for all registered assets."},"pendingRiskParameters(uint16)":{"notice":"Mapping of asset index to new risk parameters to be applied to the registry, but only after they become eligible"},"riskManagerMultisig()":{"notice":"Multisig wallet address responsible for managing risk-related configurations."},"riskParameterChangeDelaySeconds()":{"notice":"Number of seconds to wait before new risk parameters become effective"},"riskParameters(uint16)":{"notice":"Mapping of asset index to associated risk parameters."},"setAdmin(address)":{"notice":"Updates the admin address."},"setAssetData((uint16,bytes32,(uint64,uint64),uint256,uint256,uint256))":{"notice":"Sets or updates asset data for a specific asset index and chain."},"setPendingRiskParameters(uint16,(uint8,uint8,uint256,uint256,uint256,uint256,bool,uint256[],uint256[],uint256[],uint256[],uint256,uint256,int256,uint256,uint256[],uint256[],uint256,uint256,uint256))":{"notice":"Sets pending risk parameters for a specific asset index."},"setRiskManagerMultisig(address)":{"notice":"Updates the risk manager multisig address."}},"notice":"Central registry for managing assets and associated risk parameters across multiple chains.","version":1}},"Settler":{"abi":[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onAtomicSettlement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"contractName":"Settler","deploymentBytecode":{"bytecode":"0x6080806040523460135760c0908160188239f35b5f80fdfe60808060405260043610156011575f80fd5b5f3560e01c633f1d584e146023575f80fd5b3460865760603660031901126086576004356001600160a01b0381160360865760443567ffffffffffffffff811160865736602382011215608657806004013567ffffffffffffffff81116086573691016024011160865780620f424060209252f35b5f80fdfea2646970667358221220a8714c703f33fadc15c70b5e85fe4339baf5c2eadde619da4d23e7a4d23416e264736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"onAtomicSettlement(address,uint256,bytes)":"0x3f1d584e"},"runtimeBytecode":{"bytecode":"0x60808060405260043610156011575f80fd5b5f3560e01c633f1d584e146023575f80fd5b3460865760603660031901126086576004356001600160a01b0381160360865760443567ffffffffffffffff811160865736602382011215608657806004013567ffffffffffffffff81116086573691016024011160865780620f424060209252f35b5f80fdfea2646970667358221220a8714c703f33fadc15c70b5e85fe4339baf5c2eadde619da4d23e7a4d23416e264736f6c634300081e0033"},"sourceId":"src/Settler.sol","sourcemap":"59:173:0:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}},"SigTest":{"abi":[{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"check","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"contractName":"SigTest","deploymentBytecode":{"bytecode":"0x608080604052346015576101c9908161001a8239f35b5f80fdfe60806040526004361015610011575f80fd5b5f3560e01c63197ff59b14610024575f80fd5b346100a35760603660031901126100a3576004356001600160a01b03811681036100a35760443567ffffffffffffffff81116100a357366023820112156100a357806004013567ffffffffffffffff81116100a35736602482840101116100a3576020926024610099930190602435906100a7565b6040519015158152f35b5f80fd5b92939290915f906001600160a01b0383161561018a576040519160048301602484019560448501916064860193873b156101115750936064938a80948a9b9c9460209b9a9998630b135d3f60e11b8a525260408a52523701915afa9051630b135d3f60e11b141690565b99935050939550508060401461015e5760411461012e5750505050565b60408092939496508101355f1a60205281375b5f526020600160805f825afa511860601b3d11915f606052604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b031660605291935090610141565b505f945050505056fea26469706673582212208a106949f349498c2239c8e95c70bad1b3b3e62a5294423000b592793b14c09564736f6c634300081c0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"check(address,bytes32,bytes)":"0x197ff59b"},"runtimeBytecode":{"bytecode":"0x60806040526004361015610011575f80fd5b5f3560e01c63197ff59b14610024575f80fd5b346100a35760603660031901126100a3576004356001600160a01b03811681036100a35760443567ffffffffffffffff81116100a357366023820112156100a357806004013567ffffffffffffffff81116100a35736602482840101116100a3576020926024610099930190602435906100a7565b6040519015158152f35b5f80fd5b92939290915f906001600160a01b0383161561018a576040519160048301602484019560448501916064860193873b156101115750936064938a80948a9b9c9460209b9a9998630b135d3f60e11b8a525260408a52523701915afa9051630b135d3f60e11b141690565b99935050939550508060401461015e5760411461012e5750505050565b60408092939496508101355f1a60205281375b5f526020600160805f825afa511860601b3d11915f606052604052565b5060208082013560ff81901c601b0190915290356040526001600160ff1b031660605291935090610141565b505f945050505056fea26469706673582212208a106949f349498c2239c8e95c70bad1b3b3e62a5294423000b592793b14c09564736f6c634300081c0033"},"sourceId":"src/SigTest.sol","sourcemap":"140:221:1:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}},"SignatureTest":{"abi":[{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct SignatureTest.Settlement","name":"order","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"uint64","name":"account","type":"uint64"},{"internalType":"uint256","name":"validUntil","type":"uint256"}],"name":"getSettlementPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"digest","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"getSigningAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"internalType":"struct SignatureTest.Withdrawal","name":"withdrawal","type":"tuple"},{"internalType":"bytes32","name":"user","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"bytes32","name":"epochHash","type":"bytes32"}],"name":"getWithdrawalPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_domainSeparator","type":"bytes32"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"}],"contractName":"SignatureTest","deploymentBytecode":{"bytecode":"0x608080604052346015576103e4908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c908163035563461461025e5750806336116c161461018b5780637438b937146101735780639e5c3980146100735763f698da2514610053575f80fd5b3461006f575f36600319011261006f5760205f54604051908152f35b5f80fd5b3461006f573660031901610100811261006f5760a01361006f5760c43567ffffffffffffffff811680910361006f575f546bffffffffffffffffffffffff196100ba610362565b60601b16916044356001600160a01b038116810361006f5761016f93604051937fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208601526040850152606084015260243560808401526bffffffffffffffffffffffff199060601b1660a083015260643560c083015260a43560e083015261010082015260843561012082015260e435610140820152610140815261016361016082610378565b60405191829182610338565b0390f35b3461006f57602036600319011261006f576004355f55005b3461006f57366003190160e0811261006f5760601361006f576084356001600160a01b038116810361006f575f5461016f916bffffffffffffffffffffffff196101d3610362565b60601b16604051927f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba602085015260408401526060830152602435608083015260643560a083015260443560c083015260a43560e083015260c4356101008301526bffffffffffffffffffffffff199060601b16610120820152610120815261016361014082610378565b3461006f57604036600319011261006f576004356024359167ffffffffffffffff831161006f573660238401121561006f5782600401359167ffffffffffffffff831161006f5760248401366024858701011161006f576020945f9480604014610310576041146102e057505050505b6040516001600160a01b039091168152f35b604092939450606401355f1a855281375b5f5281604060805f60015afa505f6060523d60601851906040526102ce565b506044013560ff81901c601b01865290356040526001600160ff1b03166060529091506102f1565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b6004356001600160a01b038116810361006f5790565b90601f8019910116810190811067ffffffffffffffff82111761039a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a2f355b36c760bb58250919fd43010925bdca95acc99830f86f5bc7e95898c4064736f6c634300081e0033"},"devdoc":{"kind":"dev","methods":{},"version":1},"methodIdentifiers":{"domainSeparator()":"0xf698da25","getSettlementPayload((address,uint256,address,uint256,uint256),bytes32,uint64,uint256)":"0x9e5c3980","getSigningAddress(bytes32,bytes)":"0x03556346","getWithdrawalPayload((address,uint256,uint256),bytes32,address,uint256,bytes32)":"0x36116c16","setDomainSeparator(bytes32)":"0x7438b937"},"runtimeBytecode":{"bytecode":"0x6080806040526004361015610012575f80fd5b5f3560e01c908163035563461461025e5750806336116c161461018b5780637438b937146101735780639e5c3980146100735763f698da2514610053575f80fd5b3461006f575f36600319011261006f5760205f54604051908152f35b5f80fd5b3461006f573660031901610100811261006f5760a01361006f5760c43567ffffffffffffffff811680910361006f575f546bffffffffffffffffffffffff196100ba610362565b60601b16916044356001600160a01b038116810361006f5761016f93604051937fd5bba88286cccde9162e20a797ff293aac0b11190037e71286b8a5271985e4cb60208601526040850152606084015260243560808401526bffffffffffffffffffffffff199060601b1660a083015260643560c083015260a43560e083015261010082015260843561012082015260e435610140820152610140815261016361016082610378565b60405191829182610338565b0390f35b3461006f57602036600319011261006f576004355f55005b3461006f57366003190160e0811261006f5760601361006f576084356001600160a01b038116810361006f575f5461016f916bffffffffffffffffffffffff196101d3610362565b60601b16604051927f797aea45f9ae7a23c83a831da6478b151bf9c36a60c32d897309fb02a25102ba602085015260408401526060830152602435608083015260643560a083015260443560c083015260a43560e083015260c4356101008301526bffffffffffffffffffffffff199060601b16610120820152610120815261016361014082610378565b3461006f57604036600319011261006f576004356024359167ffffffffffffffff831161006f573660238401121561006f5782600401359167ffffffffffffffff831161006f5760248401366024858701011161006f576020945f9480604014610310576041146102e057505050505b6040516001600160a01b039091168152f35b604092939450606401355f1a855281375b5f5281604060805f60015afa505f6060523d60601851906040526102ce565b506044013560ff81901c601b01865290356040526001600160ff1b03166060529091506102f1565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b6004356001600160a01b038116810361006f5790565b90601f8019910116810190811067ffffffffffffffff82111761039a57604052565b634e487b7160e01b5f52604160045260245ffdfea2646970667358221220a2f355b36c760bb58250919fd43010925bdca95acc99830f86f5bc7e95898c4064736f6c634300081e0033"},"sourceId":"src/SignatureTest.sol","sourcemap":"112:2016:17:-:0;;;;;;;;;;;;;;;;;","userdoc":{"kind":"user","methods":{},"version":1}}},"manifest":"ethpm/3","sources":{"src/Checkpointer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {EfficientHashLib} from \"solady/utils/EfficientHashLib.sol\";\nimport {SignatureCheckerLib} from \"solady/utils/SignatureCheckerLib.sol\";\n\n/**\n * @title Checkpointer\n * @notice Tracks and validates state root checkpoints using EIP-712 signatures from admin and leader nodes.\n * @dev Designed for use in DStack-like distributed settlement systems.\n */\ncontract Checkpointer {\n /**\n * @notice Address with the authority to set initial parameters.\n * @dev Should be set to the DStack app shared secret public key.\n */\n address public admin;\n\n /**\n * @notice Public key of the current designated leader node.\n * @dev Leader is responsible for signing and submitting new checkpoints.\n */\n address public leader;\n\n /**\n * @notice Gnosis Safe address used as the council multisig.\n * @dev Can rotate the leader and self.\n */\n address public councilMultisig;\n\n /**\n * @notice Monotonically increasing nonce for checkpoint submissions.\n * @dev Used to prevent replay attacks and enforce checkpoint ordering.\n */\n uint256 public stateRootNonce;\n\n /// @notice Typehash used for EIP-712 encoding of the Checkpoint struct.\n bytes32 public constant CHECKPOINT_TYPEHASH =\n keccak256(\"Checkpoint(uint256 nonce,uint8[] stateRoot,string[] approvedWithdrawals)\");\n\n /**\n * @notice Emitted when a new list of approved withdrawals is recorded in a checkpoint.\n * @param approvedWithdrawals List of withdrawal IDs approved in the checkpoint.\n */\n event Withdrawals(string[] approvedWithdrawals);\n\n /// @notice Cached domain separator for EIP-712 signature verification.\n bytes32 internal _domainSeparator;\n\n /**\n * @notice The current state root, encoded as a serialized vector.\n * @dev Serialized as `(user, eth_balance, usdc_balance, deposit_nonce, is_mm)` tuples.\n * In production, this may store multiple roots and rotate.\n */\n uint8[] public stateRoot;\n\n /// @notice Reverts if caller is not the admin.\n error NotAdmin();\n\n /// @notice Reverts if a value has already been set.\n error AlreadySet();\n\n /// @notice Reverts if caller is not the current council multisig.\n error NotCouncilMultisig();\n\n /// @notice Reverts if a signature does not match the expected signer or payload.\n error InvalidSignature();\n\n /**\n * @notice Contract constructor.\n * @dev Sets the deployer as the initial admin.\n */\n constructor() {\n admin = msg.sender;\n }\n\n /**\n * @notice Sets the EIP-712 domain separator used for verifying signatures.\n * @param domainSeparator The domain separator to store.\n */\n function setDomainSeparator(bytes32 domainSeparator) external {\n if (msg.sender != admin) revert NotAdmin();\n if (_domainSeparator != 0) revert AlreadySet();\n _domainSeparator = domainSeparator;\n }\n\n /**\n * @notice Transfers admin control to a new address.\n * @param newAdmin The new admin address.\n */\n function setAdmin(address newAdmin) external {\n if (msg.sender != admin) revert NotAdmin();\n require(newAdmin != address(0));\n admin = newAdmin;\n }\n\n /**\n * @notice Sets the initial council multisig address.\n * @param newCouncilMultisig The council's Gnosis Safe address.\n */\n function setInitialCouncilMultisig(address newCouncilMultisig) external {\n if (msg.sender != admin) revert NotAdmin();\n if (councilMultisig != address(0)) revert AlreadySet();\n councilMultisig = newCouncilMultisig;\n }\n\n /**\n * @notice Allows the current council to rotate itself to a new address.\n * @param newCouncilMultisig The new multisig address.\n */\n function setNewCouncilMultisig(address newCouncilMultisig) external {\n if (msg.sender != councilMultisig) revert NotCouncilMultisig();\n councilMultisig = newCouncilMultisig;\n }\n\n /**\n * @notice Sets the leader node address.\n * @dev This should be reviewed depending on the leader rotation mechanism.\n * @param newLeader The address of the new leader node.\n */\n function setLeader(address newLeader) external {\n if (msg.sender != councilMultisig) revert NotCouncilMultisig();\n leader = newLeader;\n }\n\n /**\n * @notice Checkpoint submitted by a node to update the system state.\n * @dev Requires valid EIP-712 signatures from both admin and leader.\n * @param sharedSignature Signature by the admin.\n * @param leaderSignature Signature by the leader.\n * @param _checkpoint The checkpoint payload to commit.\n */\n function checkpoint(\n bytes calldata sharedSignature,\n bytes calldata leaderSignature,\n Checkpoint calldata _checkpoint\n ) external {\n require(_checkpoint.nonce == stateRootNonce); // dev: Nonce mismatch\n\n // Compute the EIP-712 struct hash.\n bytes32 structHash = EfficientHashLib.hash(\n abi.encode(\n CHECKPOINT_TYPEHASH,\n _checkpoint.nonce,\n EfficientHashLib.hash(abi.encodePacked(_checkpoint.stateRoot)),\n hashStringArray(_checkpoint.approvedWithdrawals)\n )\n );\n\n // Check both admin and leader signatures.\n bytes32 digest =\n EfficientHashLib.hash(abi.encodePacked(\"\\x19\\x01\", _domainSeparator, structHash));\n\n if (!SignatureCheckerLib.isValidSignatureNow(admin, digest, sharedSignature)) {\n revert InvalidSignature();\n }\n\n if (!SignatureCheckerLib.isValidSignatureNow(leader, digest, leaderSignature)) {\n revert InvalidSignature();\n }\n\n stateRootNonce++;\n stateRoot = _checkpoint.stateRoot;\n\n emit Withdrawals(_checkpoint.approvedWithdrawals);\n }\n\n /**\n * @notice Internal helper for hashing an array of strings.\n * @dev Each string is hashed individually and packed before final hashing.\n * @param arr The array of strings to hash.\n * @return A single keccak256 hash of the packed array of hashed strings.\n */\n function hashStringArray(string[] memory arr) internal pure returns (bytes32) {\n bytes32[] memory hashedStrings = new bytes32[](arr.length);\n for (uint256 i = 0; i < arr.length; i++) {\n hashedStrings[i] = EfficientHashLib.hash(bytes(arr[i]));\n }\n return EfficientHashLib.hash(abi.encodePacked(hashedStrings));\n }\n\n /**\n * @notice Struct defining a checkpoint message.\n * @dev Checkpoints include the current state root, a nonce, and a list of approved withdrawals.\n */\n struct Checkpoint {\n uint256 nonce;\n uint8[] stateRoot;\n string[] approvedWithdrawals;\n }\n}\n","urls":[]},"src/CredentialManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {SignatureCheckerLib} from \"solady/utils/SignatureCheckerLib.sol\";\nimport {EfficientHashLib} from \"solady/utils/EfficientHashLib.sol\";\nimport {IAdminUpdateStrategy} from \"./interfaces/IAdminUpdateStrategy.sol\";\nimport {IAutomataDcapAttestation} from \"./interfaces/IAutomataDcapAttestation.sol\";\n\n/// @title CredentialManager\n/// @notice The centralized Root of Trust for the TEE Clearing Engine.\n/// @dev This contract acts as the governance layer and the vault registry. It manages the\n/// set of authorized operators, enforces quorum consensus for critical updates, and\n/// maintains the registry of deposit vaults across different chains.\n/// It combines immediate multi-sig actions for operational tasks with timelocked\n/// actions for high-risk configuration changes.\ncontract CredentialManager {\n using SignatureCheckerLib for address;\n\n // =============================================================\n // STRUCTS\n // =============================================================\n\n /// @notice Configuration for a specific chain/vault.\n struct ChainConfig {\n uint64 blockTimeMs;\n // Confs\n uint8 defaultConfirmations;\n uint8 depositIngestConfirmations;\n uint8 withdrawalIngestConfirmations;\n uint8 settlementIngestConfirmations;\n }\n\n /// @notice Represents a deposit vault deployed on a specific chain.\n /// @dev Addresses are stored as bytes32 to support non-EVM chains (e.g., Solana, SVM).\n struct Vault {\n uint8 routingId;\n uint256 vmId; // ChainId for EVM chains.\n /// @notice The address of the vault on that chain (left-aligned or native format).\n bytes32 vaultAddress;\n ChainConfig config;\n }\n\n /// @notice Tracks the lifecycle state of a timelocked operation.\n struct TimelockOp {\n /// @notice The timestamp (seconds since unix epoch) after which the operation can be executed.\n uint64 eta;\n /// @notice True if the operation has already been executed.\n bool executed;\n /// @notice True if the operation was explicitly canceled by the operators.\n bool canceled;\n /// @notice The type hash of the operation (e.g., OP_SET_RISK_MANAGER) for verification.\n bytes32 opType;\n }\n\n /// @notice Defines the expected state of the TEE software.\n struct MeasurementProfile {\n bool active; // Is this profile currently allowed?\n bytes32 mrtd; // Mandatory (Code Identity)\n bytes32 rtmr0; // Optional (Set to 0 to skip check)\n bytes32 rtmr1; // Optional\n bytes32 rtmr2; // Optional\n bytes32 rtmr3; // Optional\n }\n\n struct RestartCandidate {\n address leader;\n uint256 epoch;\n bytes32 checkpointHash;\n bool exists;\n }\n\n // =============================================================\n // ERRORS\n // =============================================================\n\n /// @notice Thrown when a signature belongs to an address that is not a registered operator.\n /// @param signer The address recovered from the signature.\n error NotOperator(address signer);\n\n /// @notice Thrown when the provided signatures are not sorted by signer address or contain duplicates.\n /// @dev Signatures must be sorted strictly ascending (A < B) to prevent duplicate counting in O(N).\n error SignersNotSortedOrUnique();\n\n /// @notice Thrown when the number of valid signatures provided is less than the required threshold.\n /// @param provided The number of signatures provided.\n /// @param required The current `committeeThreshold` required.\n error InsufficientSignatures(uint256 provided, uint256 required);\n\n /// @notice Thrown when attempting to set a quorum threshold that is 0 or greater than the total operators.\n /// @param newThreshold The proposed threshold.\n /// @param operatorCount The total number of registered operators.\n error InvalidCommitteeThreshold(uint256 newThreshold, uint256 operatorCount);\n\n /// @notice Thrown when attempting to execute a timelock before the delay has elapsed.\n /// @param opId The unique hash of the operation.\n /// @param readyAt The timestamp when the operation becomes executable.\n /// @param nowTs The current block timestamp.\n error TimelockNotReady(bytes32 opId, uint256 readyAt, uint256 nowTs);\n\n /// @notice Thrown when attempting to act on a timelock ID that does not exist or was never scheduled.\n /// @param opId The operation hash.\n error TimelockUnknown(bytes32 opId);\n\n /// @notice Thrown when attempting to execute or schedule an operation that has already been executed.\n /// @param opId The operation hash.\n error TimelockAlreadyExecuted(bytes32 opId);\n\n /// @notice Thrown when attempting to execute or cancel an operation that has already been canceled.\n /// @param opId The operation hash.\n error TimelockAlreadyCanceled(bytes32 opId);\n\n /// @notice Thrown when a timelock delay is set to 0 (invalid safety margin).\n /// @param delay The provided delay in seconds.\n error InvalidDelay(uint256 delay);\n\n /// @notice Thrown when attempting to cancel an operation that cannot be canceled (e.g., already executed).\n error CannotCancel();\n\n /// @notice Thrown when a critical configuration address (e.g., Risk Manager) is set to address(0).\n error ZeroAddress();\n\n /// @notice Thrown when a Vault address is empty (bytes32(0)).\n error InvalidVaultAddr();\n\n /// @notice Thrown when attempting to register a strategy for a chain that already has one.\n error StrategyAlreadyExists();\n\n /// @notice Thrown when attempting to update vault admins on a chain that has no registered strategy.\n error NoStrategy();\n\n /// @notice Thrown when a requested vault cannot be found for the specified chain.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n error VaultNotFound(uint256 routingId, uint256 vmId);\n\n /// @notice Thrown when the measured TEE state does not match the expected state.\n error MeasurementMismatch(bytes32 expected, bytes32 actual, string field);\n\n /// @notice Thrown when the ZK Proof attesting measurements is invalid.\n error InvalidZkProof();\n\n /// @notice Thrown when the supplied epoch is invalid\n error InvalidEpoch(uint256 expected, uint256 actual);\n /// @notice Thrown when a Quote ReportData does not match params.\n error InvalidReportData();\n /// @notice Thrown when a Quote length is invalid.\n error InvalidQuoteLength();\n /// @notice Thrown when a Quote verifier is invalid.\n error InvalidVerifier();\n /// @notice Thrown when the used profile is not active.\n error ProfileInactive(uint256 profileId);\n /// @notice Thrown when the used profile does not exist.\n error InvalidProfileId();\n /// @notice Thrown when the used profile is configured incorrectly.\n error InvalidProfileConfig();\n\n // Certificate gathering errors\n error GatheringActive();\n error GatheringNotActive();\n error GatheringNotExpired();\n error AmbiguousState();\n error NoCandidate();\n error ProposedEpochTooLow(uint256 current, uint256 proposed);\n\n // =============================================================\n // CONSTANTS & TYPEHASHES\n // =============================================================\n\n /// @dev EIP-712 Domain Separator typehash.\n bytes32 private constant _EIP712_DOMAIN_TYPEHASH = keccak256(\n \"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"\n );\n\n /// @dev EIP-712 name hash for this contract.\n bytes32 private constant _NAME_HASH = keccak256(\"CredentialManager\");\n\n /// @dev EIP-712 version hash.\n bytes32 private constant _VERSION_HASH = keccak256(\"1\");\n\n /// @dev Generic Action typehash used for all governance signatures.\n /// Structure: Action(bytes32 opType, bytes32 paramsHash, uint256 nonce)\n bytes32 private constant _ACTION_TYPEHASH =\n keccak256(\"Action(bytes32 opType,bytes32 paramsHash,uint256 nonce)\");\n\n /// @dev Used for appointing a leader in the absence of a leader - for bootstrap or emergency recovery.\n bytes32 public constant OP_APPOINT_LEADER = keccak256(\"OP_APPOINT_LEADER\");\n\n // --- Operation Types (for Signature Verification) ---\n\n // Immediate Actions (Executed immediately upon valid quorum)\n bytes32 public constant OP_SET_COMMITTEE_THRESHOLD = keccak256(\"OP_SET_COMMITTEE_THRESHOLD\");\n bytes32 public constant OP_ADD_VAULT = keccak256(\"OP_ADD_VAULT\");\n bytes32 public constant OP_REGISTER_STRATEGY = keccak256(\"OP_REGISTER_ADMIN_UPDATE_STRATEGY\");\n bytes32 public constant OP_SET_VAULT_ADMINS = keccak256(\"OP_SET_DEPOSIT_VAULT_ADMINS\");\n bytes32 public constant OP_CANCEL_TIMELOCK = keccak256(\"OP_CANCEL_TIMELOCK\");\n bytes32 public constant OP_WITHDRAW = keccak256(\"OP_WITHDRAW\");\n\n // Timelocked Actions (Scheduled first, executed later)\n bytes32 public constant OP_SET_RISK_MANAGER = keccak256(\"OP_SET_RISK_MANAGER\");\n bytes32 public constant OP_SET_REGISTRY = keccak256(\"OP_SET_REGISTRY\");\n bytes32 public constant OP_SET_MEASUREMENTS = keccak256(\"OP_SET_MEASUREMENTS\");\n bytes32 public constant OP_SET_DELAY = keccak256(\"OP_SET_DELAY\");\n bytes32 public constant OP_MANAGE_PROFILE = keccak256(\"OP_MANAGE_PROFILE\");\n\n // Restarts\n bytes32 public constant OP_RESTART = keccak256(\"OP_RESTART\");\n bytes32 public constant OP_SET_AUTOMATA_VERIFIER = keccak256(\"OP_SET_AUTOMATA_VERIFIER\");\n\n // Certificate gathering\n uint256 public constant GATHERING_DURATION = 1 hours;\n\n // =============================================================\n // STORAGE\n // =============================================================\n\n // --- Governance State ---\n\n /// @notice TEMP Admin path, to be revised later.\n address public admin;\n\n /// @notice The list of authorized Clearing Engine operator addresses (EOAs).\n /// @dev These keys form the root of trust for the system.\n address[] public operators;\n\n /// @notice Lookup to check if an address is an operator.\n mapping(address => bool) public isOperator;\n\n /// @notice The minimum number of signatures required to execute a governance action.\n uint256 public committeeThreshold;\n\n /// @notice A monotonically increasing nonce for governance actions.\n /// @dev Included in every signed hash to strictly order operations and prevent replay attacks.\n uint256 public governanceNonce;\n\n /// @notice Maps Operator (EOA) -> Attested Key (TEE Address).\n /// @dev Used to verify that a TEE signature belongs to a specific operator.\n mapping(address => bytes32) public operatorToAttestedKey;\n\n /// @notice The current active leader (Operator Address).\n /// @dev The leader is responsible for coordinating the clearing engine.\n address public leader;\n\n // --- Execution State (Vault Registry) ---\n\n /// @notice The registry of all authorized Deposit Vaults.\n /// @dev This list is strictly append-only; vaults cannot be removed to prevent history modification.\n Vault[] public vaults;\n\n /// @notice Maps a RoutingID to the VMID to the Strategy Contract responsible for sending messages to it.\n /// @dev Used to abstract cross-chain messaging logic (e.g., LayerZero, Optimism Messenger).\n mapping(uint256 => mapping(uint256 => IAdminUpdateStrategy)) public adminUpdateStrategies;\n\n // --- Configuration ---\n\n /// @notice The address of the Risk Manager (or multisig) authorized to adjust risk parameters.\n address public riskManager;\n\n /// @notice The address of the global Registry Contract used for asset/settler configurations.\n address public registryContract;\n\n // --- Timelock State ---\n\n /// @notice Configuration mapping for how long specific operations must be delayed.\n /// @dev e.g., OP_SET_REGISTRY -> 72 hours.\n mapping(bytes32 => uint256) public timelockDelayFor;\n\n /// @notice Stores the status of individual scheduled operations by their hash ID.\n mapping(bytes32 => TimelockOp) public timelockOps;\n\n // --- TDX measurements ---\n\n /// @notice The current \"Gold Image\" measurements required for valid Quotes. Matches based on profile.\n mapping(uint256 => MeasurementProfile) public measurementProfiles;\n uint256 public nextProfileId = 1;\n\n // --- Restarts ---\n\n /// @notice Tracks the logical era of the TEE state to prevent replay attacks.\n /// @dev Incremented on every successful restart.\n uint256 public epoch;\n\n /// @notice The hash of the system state (inventory) associated with the current epoch.\n /// @dev New nodes verify this hash against the leader's data to ensure they are on the correct fork.\n bytes32 public latestCheckpointHash;\n\n // ZK Verifier Contract (Automata)\n IAutomataDcapAttestation public automataVerifier;\n\n // --- Certificate gathering ---\n uint256 public restartGatheringDeadline; // 0 = Inactive, >0 = Active\n RestartCandidate public bestCandidate;\n bool public isRestartAmbiguous;\n\n // =============================================================\n // EVENTS\n // =============================================================\n\n /// @notice Emitted when a new operator is added during initialization.\n event OperatorAdded(address indexed operator);\n\n /// @notice Emitted when the signature threshold is updated.\n event CommitteeThresholdUpdated(uint256 oldThreshold, uint256 newThreshold);\n\n /// @notice Emitted when a new vault is added to the registry.\n event VaultAdded(\n uint256 indexed routingId, uint256 indexed vmId, bytes32 vaultAddr, ChainConfig config\n );\n\n /// @notice Emitted when a new cross-chain strategy is registered.\n event DepositVaultAdministratorsUpdated(\n uint256 indexed routingId,\n uint256 indexed vmId,\n address[] newAdministrators,\n uint256 newWithdrawalQuorum\n );\n\n /// @notice Emitted when the admin set of a remote vault is updated.\n event DepositVaultAdministratorsUpdated(\n uint256 indexed chainId, address[] newAdministrators, uint256 newWithdrawalQuorum\n );\n\n /// @notice Emitted when a new cross-chain strategy is registered.\n event AdminUpdateStrategyRegistered(\n uint256 indexed routingId, uint256 indexed vmId, address strategy\n );\n\n /// @notice Emitted when a new attested key for an operator is registered.\n event AttestedKeyRegistered(address indexed operator, bytes32 indexed newAttestedKey);\n\n /// @notice Emitted when the quorum leader is updated.\n event LeaderUpdated(address indexed newLeader, bytes32 indexed newAttestedKey);\n\n // Timelock Events\n event OperationScheduled(bytes32 indexed opId, bytes32 indexed opType, uint256 eta);\n event OperationExecuted(bytes32 indexed opId, bytes32 indexed opType);\n event OperationCanceled(bytes32 indexed opId, bytes32 indexed opType);\n\n event RiskManagerUpdated(address indexed oldRiskManager, address indexed newRiskManager);\n event RegistryUpdated(address indexed oldRegistry, address indexed newRegistry);\n event TimelockDelayUpdated(bytes32 indexed targetOpType, uint256 oldDelay, uint256 newDelay);\n\n // Measurement & Restart Events\n /// @notice Emitted when the measurements are updated.\n event MeasurementsUpdated(bytes32 newMrtd, bytes32 newRtmr0);\n event MeasurementProfileUpdated(uint256 indexed profileId, bool active);\n event EpochIncremented(uint256 newEpoch, bytes32 newCheckpointHash);\n event RestartExecuted(address indexed newLeader, uint256 indexed epoch);\n event AutomataVerifierUpdated(address indexed oldVerifier, address indexed newVerifier);\n\n // Certificate gathering events\n event RestartGatheringStarted(uint256 deadline);\n event RestartCandidateSubmitted(address indexed leader, uint256 epoch, bytes32 checkpointHash);\n event RestartAmbiguityDetected(uint256 epoch, bytes32 hash1, bytes32 hash2);\n\n // =============================================================\n // INITIALIZATION\n // =============================================================\n\n /// @notice Initializes the Credential Manager with the initial operator set and configuration.\n /// @param initialOperators The list of addresses that will form the initial governance council.\n /// @param initialCommitteeThreshold The number of signatures required for valid governance actions.\n /// @param initialRiskManager The initial Risk Manager address.\n /// @param initialRegistryContract The initial Registry Contract address.\n constructor(\n address[] memory initialOperators,\n uint256 initialCommitteeThreshold,\n address initialRiskManager,\n address initialRegistryContract,\n MeasurementProfile[] memory initialMeasurements,\n address initialAutomataVerifier\n ) {\n admin = msg.sender;\n\n if (initialRiskManager == address(0)) revert ZeroAddress();\n if (initialRegistryContract == address(0)) revert ZeroAddress();\n automataVerifier = IAutomataDcapAttestation(initialAutomataVerifier);\n\n _initOperators(initialOperators, initialCommitteeThreshold);\n\n riskManager = initialRiskManager;\n registryContract = initialRegistryContract;\n // Start IDs at 1 so 0 can be used as a null/sentinel value\n nextProfileId = 1;\n\n for (uint256 i = 0; i < initialMeasurements.length; i++) {\n MeasurementProfile memory p = initialMeasurements[i];\n\n // Safety Check: Active profiles must have an MRTD\n if (p.active && p.mrtd == bytes32(0)) revert InvalidProfileConfig();\n\n measurementProfiles[nextProfileId] = p;\n emit MeasurementProfileUpdated(nextProfileId, p.active);\n nextProfileId++;\n }\n\n // Default Timelocks\n timelockDelayFor[OP_SET_RISK_MANAGER] = 48 hours;\n timelockDelayFor[OP_SET_REGISTRY] = 72 hours;\n timelockDelayFor[OP_MANAGE_PROFILE] = 7 days;\n timelockDelayFor[OP_SET_DELAY] = 7 days;\n }\n\n /// @dev Internal helper to process the operator list and set the threshold.\n function _initOperators(address[] memory initialOperators, uint256 initialCommitteeThreshold)\n internal\n {\n uint256 n = initialOperators.length;\n if (n == 0) revert InvalidCommitteeThreshold(initialCommitteeThreshold, 0);\n if (initialCommitteeThreshold == 0 || initialCommitteeThreshold > n) {\n revert InvalidCommitteeThreshold(initialCommitteeThreshold, n);\n }\n\n for (uint256 i = 0; i < n; i++) {\n address op = initialOperators[i];\n if (op == address(0)) revert ZeroAddress();\n if (isOperator[op]) revert SignersNotSortedOrUnique();\n isOperator[op] = true;\n operators.push(op);\n emit OperatorAdded(op);\n }\n committeeThreshold = initialCommitteeThreshold;\n emit CommitteeThresholdUpdated(0, initialCommitteeThreshold);\n }\n\n // =============================================================\n // QUORUM & KEYS\n // =============================================================\n\n /// @notice Allows an operator to register their TEE's attested key.\n /// @dev Maps the attested_pubkey of a new CE joining the quorum.\n /// @param newAttestedKey The address derived from the TEE's public key.\n function registerAttestedKey(bytes32 newAttestedKey) external {\n if (!isOperator[msg.sender]) revert NotOperator(msg.sender);\n if (newAttestedKey == bytes32(0)) revert ZeroAddress();\n\n operatorToAttestedKey[msg.sender] = newAttestedKey;\n emit AttestedKeyRegistered(msg.sender, newAttestedKey);\n }\n\n /// @notice Returns the full Committee configuration.\n /// @dev Let's operators query for 'k (the committee threshold), n' thresholds and the current committee member list\".\n function getCommitteeConfig()\n external\n view\n returns (address[] memory members, uint256 k, uint256 n)\n {\n return (operators, committeeThreshold, operators.length);\n }\n\n /// @notice Returns the current Leader's Operator Address and Attested Key.\n /// @dev When querying current leader, then the contract returns the active operator_pubkey and attested_pubkey.\n function getLeader() external view returns (address operator, bytes32 attestedKey) {\n return (leader, operatorToAttestedKey[leader]);\n }\n\n /// @dev Internal helper to update mappings.\n function _setAttestedKey(address op, bytes32 attKey) internal {\n operatorToAttestedKey[op] = attKey;\n emit AttestedKeyRegistered(op, attKey);\n }\n\n /// @dev Builds the administrator list from operator-attested keys.\n function _getAttestedAdministrators() internal view returns (address[] memory admins) {\n uint256 len = operators.length;\n admins = new address[](len);\n for (uint256 i = 0; i < len; i++) {\n bytes32 attKey = operatorToAttestedKey[operators[i]];\n if (attKey == bytes32(0)) revert ZeroAddress();\n admins[i] = address(uint160(uint256(attKey)));\n }\n }\n\n /// @dev Internal helper to rotate the leader for use in restarts.\n function _updateLeader(address newLeader) internal {\n if (!isOperator[newLeader]) revert NotOperator(newLeader);\n // Check bytes32 zero\n if (operatorToAttestedKey[newLeader] == bytes32(0)) revert ZeroAddress();\n leader = newLeader;\n\n emit LeaderUpdated(newLeader, operatorToAttestedKey[newLeader]);\n }\n\n /// @notice Manually appoints a leader. Used for bootstrapping or emergency recovery.\n function appointLeader(\n address newLeader,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (!isOperator[newLeader]) revert NotOperator(newLeader);\n\n // Leader MUST have a registered key, or they cannot sign Attestations/Checkpoints\n if (operatorToAttestedKey[newLeader] == bytes32(0)) revert ZeroAddress();\n\n bytes32 paramsHash = keccak256(abi.encode(newLeader));\n _requireCommitteeApproval(OP_APPOINT_LEADER, paramsHash, signers, signatures);\n\n _updateLeader(newLeader);\n }\n\n // =============================================================\n // RESTART CERTIFICATION & CERTIFICATE GATHERING\n // =============================================================\n\n /// @notice Step 1: Initiates the gathering window if the system is down.\n function initiateRestart() external {\n if (restartGatheringDeadline > block.timestamp) revert GatheringActive();\n\n // Start 1 hour window\n restartGatheringDeadline = block.timestamp + GATHERING_DURATION;\n\n // Clear previous state\n delete bestCandidate;\n isRestartAmbiguous = false;\n\n emit RestartGatheringStarted(restartGatheringDeadline);\n }\n\n /// @notice Restarts the system using a Trustless ZK Proof (Automata / SP1). The contract stores the \"Best\" candidate.\n /// @dev We compare Epochs. The highest epoch wins.\n /// @param tdxReportBody The 'Public Output' of the ZK Circuit (The TEE Quote Body).\n /// @param zkProof The Groth16 proof bytes.\n /// @param newLeader The address claiming leadership.\n /// @param checkpointHash The state hash being served.\n function submitRestartProof(\n uint256 profileId,\n bytes calldata tdxReportBody,\n bytes calldata zkProof,\n address newLeader,\n bytes32 checkpointHash\n ) external {\n if (restartGatheringDeadline == 0 || block.timestamp > restartGatheringDeadline) {\n revert GatheringNotActive();\n }\n if (newLeader == address(0)) revert ZeroAddress();\n if (address(automataVerifier) == address(0)) revert InvalidVerifier();\n\n // 1. ZK Verification\n // Assert that the 'tdxReportBody' was indeed generated by a genuine Intel TDX hardware\n // running the code logic proved by the ZK circuit.\n (bool success, bytes memory errorData) = automataVerifier.verifyAndAttestWithZKProof(\n tdxReportBody,\n IAutomataDcapAttestation.ZkCoProcessorType.Succinct, // Opinionated: Use SP1\n zkProof\n );\n\n // Handle failure explicitly\n if (!success) {\n // Forward the error from Automata if possible, or generic revert\n if (errorData.length > 0) {\n assembly {\n let retLen := mload(errorData)\n revert(add(32, errorData), retLen)\n }\n } else {\n revert InvalidZkProof();\n }\n }\n\n // 2. Policy Check (The \"Gold Image\")\n // Verify that the Code Hash (MRTD) inside the verified body matches our governance.\n // MRTD is at offset 136. We take the first 32 bytes of the SHA384.\n if (tdxReportBody.length < 584) revert InvalidQuoteLength();\n bytes32 qMrtd = bytes32(tdxReportBody[136:168]);\n\n // RTMRs start at 328. Stride is 48 bytes.\n bytes32 qRtmr0 = bytes32(tdxReportBody[328:360]);\n bytes32 qRtmr1 = bytes32(tdxReportBody[376:408]);\n bytes32 qRtmr2 = bytes32(tdxReportBody[424:456]);\n bytes32 qRtmr3 = bytes32(tdxReportBody[472:504]);\n\n verifyMeasurements(profileId, qMrtd, qRtmr0, qRtmr1, qRtmr2, qRtmr3);\n\n // 3. Identity Binding\n // Verify that the TEE explicitly committed to this Leader and Checkpoint in ReportData.\n // [Leader (20) | Checkpoint (32) | Epoch (8) | ProcessedCount (4)]\n // Total 64 bytes at Offset 520\n // A. Extract Leader (Bytes 520..540)\n address recoveredLeader = address(bytes20(tdxReportBody[520:540]));\n\n // B. Extract Checkpoint (Bytes 540..572)\n bytes32 recoveredCheckpoint = bytes32(tdxReportBody[540:572]);\n\n // C. Extract Epoch (Bytes 572..580)\n // We read 8 bytes, cast to uint64.\n uint64 recoveredEpoch = uint64(bytes8(tdxReportBody[572:580]));\n\n if (recoveredLeader != newLeader) revert InvalidReportData();\n if (recoveredCheckpoint != checkpointHash) revert InvalidReportData();\n\n // 5. Monotonicity Check\n if (recoveredEpoch <= epoch) {\n revert ProposedEpochTooLow(epoch, recoveredEpoch);\n }\n\n // If this is the first valid candidate\n if (!bestCandidate.exists) {\n bestCandidate = RestartCandidate({\n leader: newLeader,\n epoch: recoveredEpoch,\n checkpointHash: checkpointHash,\n exists: true\n });\n emit RestartCandidateSubmitted(newLeader, recoveredEpoch, checkpointHash);\n return;\n }\n\n // If we already have a candidate, COMPARE.\n\n // Case 1: Proposed Epoch is HIGHER -> Replace Best\n if (recoveredEpoch > bestCandidate.epoch) {\n // Strictly better epoch -> Replace\n bestCandidate = RestartCandidate({\n leader: newLeader,\n epoch: recoveredEpoch,\n checkpointHash: checkpointHash,\n exists: true\n });\n isRestartAmbiguous = false;\n emit RestartCandidateSubmitted(newLeader, recoveredEpoch, checkpointHash);\n }\n // Case 2: Proposed Epoch is EQUAL\n else if (recoveredEpoch == bestCandidate.epoch) {\n // If Hash is DIFFERENT -> SPLIT BRAIN\n if (checkpointHash != bestCandidate.checkpointHash) {\n isRestartAmbiguous = true;\n emit RestartAmbiguityDetected(\n recoveredEpoch, bestCandidate.checkpointHash, checkpointHash\n );\n }\n // If Hash is SAME, ignore (duplicate proposal)\n }\n // Case 3: Proposed Epoch is LOWER -> Ignore\n }\n\n /// @notice Step 3: Finalizes the restart after the window closes.\n function resolveRestart() external {\n if (restartGatheringDeadline == 0) revert GatheringNotActive();\n if (block.timestamp <= restartGatheringDeadline) revert GatheringNotExpired();\n\n if (!bestCandidate.exists) revert NoCandidate();\n if (isRestartAmbiguous) revert AmbiguousState();\n\n // Apply State\n _updateLeader(bestCandidate.leader);\n latestCheckpointHash = bestCandidate.checkpointHash;\n epoch = bestCandidate.epoch;\n\n // Reset Gathering\n restartGatheringDeadline = 0;\n delete bestCandidate;\n\n emit EpochIncremented(epoch, latestCheckpointHash);\n emit RestartExecuted(leader, epoch);\n }\n\n // =============================================================\n // GOVERNANCE VERIFICATION\n // =============================================================\n\n /// @notice Returns the EIP-712 domain separator used for verifying governance signatures.\n /// @return The domain separator hash.\n function domainSeparator() public view returns (bytes32) {\n return keccak256(\n abi.encode(\n _EIP712_DOMAIN_TYPEHASH, _NAME_HASH, _VERSION_HASH, block.chainid, address(this)\n )\n );\n }\n\n /// @dev Reconstructs the signed EIP-712 digest for a specific action.\n function _hashAction(bytes32 opType, bytes32 paramsHash, uint256 nonce)\n internal\n view\n returns (bytes32)\n {\n bytes32 structHash = keccak256(abi.encode(_ACTION_TYPEHASH, opType, paramsHash, nonce));\n return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator(), structHash));\n }\n\n /// @notice Verifies that a payload has been signed by a valid quorum of operators.\n /// @dev This is the core access control modifier. It verifies:\n /// 1. Sufficient signatures (k of n).\n /// 2. Signers are valid operators.\n /// 3. Signatures are unique and sorted (to prevent duplicates).\n /// 4. The payload matches the expected operation type and parameters.\n /// 5. Increments the nonce to prevent replay attacks.\n /// @param opType The operation identifier (e.g., OP_ADD_VAULT).\n /// @param paramsHash The keccak256 hash of the abi-encoded parameters.\n /// @param signers An array of operator addresses who signed the payload. Must be sorted ascending.\n /// @param signatures An array of signatures corresponding to the signers.\n function _requireCommitteeApproval(\n bytes32 opType,\n bytes32 paramsHash,\n address[] calldata signers,\n bytes[] calldata signatures\n ) internal {\n // If sender is admin and no signatures provided, skip verification.\n if (msg.sender == admin && signers.length == 0 && signatures.length == 0) {\n // Increment nonce anyway to simulate state change/prevent strict replays\n unchecked {\n governanceNonce++;\n }\n return;\n }\n uint256 q = committeeThreshold;\n if (signers.length != signatures.length) revert SignersNotSortedOrUnique();\n if (signers.length < q || signatures.length < q) {\n revert InsufficientSignatures(signers.length, q);\n }\n\n bytes32 digest = _hashAction(opType, paramsHash, governanceNonce);\n\n address prev = address(0);\n for (uint256 i = 0; i < q; i++) {\n address signer = signers[i];\n // Enforce sorted order to check for duplicates (O(N) vs O(N^2))\n if (signer <= prev) revert SignersNotSortedOrUnique();\n prev = signer;\n\n if (!isOperator[signer]) revert NotOperator(signer);\n\n // Handles EIP-1271 and EOA signatures.\n if (!signer.isValidSignatureNow(digest, signatures[i])) revert NotOperator(signer);\n }\n\n // Increment nonce to invalidate this hash for future use\n unchecked {\n governanceNonce++;\n }\n }\n\n // =============================================================\n // IMMEDIATE ACTIONS\n // =============================================================\n\n /// @notice Updates the number of signatures required for valid governance actions.\n /// @dev Requires a quorum of the *current* operators to approve.\n /// @param newThreshold The new minimum number of signatures.\n /// @param signers Sorted array of signers.\n /// @param signatures Corresponding signatures.\n function updateCommitteeThreshold(\n uint256 newThreshold,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (newThreshold == 0 || newThreshold > operators.length) {\n revert InvalidCommitteeThreshold(newThreshold, operators.length);\n }\n\n bytes32 paramsHash = keccak256(abi.encode(newThreshold));\n _requireCommitteeApproval(OP_SET_COMMITTEE_THRESHOLD, paramsHash, signers, signatures);\n\n uint256 oldThreshold = committeeThreshold;\n committeeThreshold = newThreshold;\n\n emit CommitteeThresholdUpdated(oldThreshold, newThreshold);\n }\n\n /// @notice Registers a new deposit vault to the system.\n /// @dev This list is append-only. New vaults can be added, but existing ones cannot be removed.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n /// @param vaultAddr The address of the vault (as bytes32).\n /// @param signers Sorted array of signers.\n /// @param signatures Corresponding signatures.\n function addVault(\n uint8 routingId,\n uint256 vmId,\n bytes32 vaultAddr,\n ChainConfig calldata config,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (vaultAddr == bytes32(0)) revert InvalidVaultAddr();\n\n bytes32 paramsHash = keccak256(abi.encode(routingId, vmId, vaultAddr, config));\n _requireCommitteeApproval(OP_ADD_VAULT, paramsHash, signers, signatures);\n\n vaults.push(\n Vault({routingId: routingId, vmId: vmId, vaultAddress: vaultAddr, config: config})\n );\n emit VaultAdded(routingId, vmId, vaultAddr, config);\n }\n\n /// @notice Registers a strategy contract to handle updates for a specific chain.\n /// @dev Used to define how the Credential Manager talks to L2s (e.g., via bridges).\n /// Only one strategy can be registered per chain.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n /// @param strategy The address of the strategy contract.\n /// @param signers Sorted array of signers.\n /// @param signatures Corresponding signatures.\n function registerAdminUpdateStrategy(\n uint8 routingId,\n uint256 vmId,\n IAdminUpdateStrategy strategy,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external {\n if (address(strategy) == address(0)) revert ZeroAddress();\n if (address(adminUpdateStrategies[routingId][vmId]) != address(0)) {\n revert StrategyAlreadyExists();\n }\n\n bytes32 paramsHash = keccak256(abi.encode(routingId, vmId, address(strategy)));\n _requireCommitteeApproval(OP_REGISTER_STRATEGY, paramsHash, signers, signatures);\n\n adminUpdateStrategies[routingId][vmId] = strategy;\n emit AdminUpdateStrategyRegistered(routingId, vmId, address(strategy));\n }\n\n /// @notice Updates the administrators or withdrawal quorum for a vault on a remote chain.\n /// @dev Admin can set arbitrary administrators/quorum using the debug path.\n /// Non-admin calls ignore the provided administrators/quorum and instead sync administrators\n /// from operator-attested keys, using the current committee threshold as the quorum.\n /// @param routingId The routing ID of the vault.\n /// @param vmId The Chain ID for EVM chains requested.\n /// @param newAdministrators The list of new admin addresses for that vault.\n /// @param newWithdrawalQuorum The new quorum requirement for that vault.\n function setDepositVaultAdministrators(\n uint256 routingId,\n uint256 vmId,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable {\n IAdminUpdateStrategy strategy = adminUpdateStrategies[routingId][vmId];\n if (address(strategy) == address(0)) revert NoStrategy();\n\n address[] memory admins;\n uint256 withdrawalQuorum;\n if (msg.sender == admin) {\n admins = newAdministrators;\n withdrawalQuorum = newWithdrawalQuorum;\n } else {\n admins = _getAttestedAdministrators();\n withdrawalQuorum = committeeThreshold;\n }\n\n // Delegatecall allows this contract to retain its identity (msg.sender) when calling the bridge.\n (bool ok,) = address(strategy)\n .delegatecall(\n abi.encodeWithSelector(\n strategy.setAdministrators.selector,\n _getVaultAddress(routingId, vmId),\n admins,\n withdrawalQuorum\n )\n );\n require(ok, \"Strategy delegatecall failed\");\n emit DepositVaultAdministratorsUpdated(routingId, vmId, admins, withdrawalQuorum);\n }\n\n /// @notice Withdraw funds held by this contract.\n function withdraw(address account, address[] calldata signers, bytes[] calldata signatures)\n external\n {\n if (account == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(account, address(this).balance));\n _requireCommitteeApproval(OP_WITHDRAW, paramsHash, signers, signatures);\n payable(account).transfer(address(this).balance);\n }\n\n // =============================================================\n // VIEW HELPERS\n // =============================================================\n\n /// @notice Returns a paginated list of registered vaults.\n /// @dev The input types are intentionally `uint16` to preserve the function selector\n /// `0x9fd7285c` for backward compatibility with existing Rust clients.\n /// @param start The start index.\n /// @param end The end index (exclusive).\n /// @return An array of Vault structs.\n function getVaults(uint16 start, uint16 end) external view returns (Vault[] memory) {\n uint256 count = vaults.length;\n if (start >= count) return new Vault[](0);\n if (end > count) end = uint16(count);\n if (end <= start) return new Vault[](0);\n\n uint256 len = uint256(end - start);\n Vault[] memory out = new Vault[](len);\n for (uint256 i = 0; i < len; i++) {\n out[i] = vaults[uint256(start) + i];\n }\n return out;\n }\n\n function _getVaultAddress(uint256 routingId, uint256 vmId) internal view returns (address) {\n uint256 len = vaults.length;\n for (uint256 i; i < len; ++i) {\n Vault memory vault = vaults[i];\n if (vault.routingId == routingId && vault.vmId == vmId) {\n // Convert bytes32 to address (assuming left-aligned or standard encoding).\n // Shifts right 96 bits to recover the 160-bit address if it was stored left-aligned.\n return address(uint160(uint256(vault.vaultAddress >> 96)));\n }\n }\n revert VaultNotFound(routingId, vmId);\n }\n\n // =============================================================\n // TIMELOCKED ACTIONS\n // =============================================================\n\n /// @notice Schedules a timelocked update for the Risk Manager address.\n /// @dev The operation cannot be executed until `TIMELOCK_DELAY` has passed.\n /// @param newRiskManager The proposed new Risk Manager address.\n /// @return opId The unique hash of the scheduled operation.\n function scheduleRiskManager(\n address newRiskManager,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n if (newRiskManager == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRiskManager));\n _requireCommitteeApproval(OP_SET_RISK_MANAGER, paramsHash, signers, signatures);\n opId = _schedule(OP_SET_RISK_MANAGER, paramsHash);\n }\n\n /// @notice Executes a pending Risk Manager update if the timelock has expired.\n /// @param newRiskManager The address that was previously scheduled.\n function executeRiskManager(address newRiskManager) external {\n if (newRiskManager == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRiskManager));\n bytes32 opId = _opId(OP_SET_RISK_MANAGER, paramsHash);\n\n _executeTimelock(opId);\n\n address old = riskManager;\n riskManager = newRiskManager;\n emit OperationExecuted(opId, OP_SET_RISK_MANAGER);\n emit RiskManagerUpdated(old, newRiskManager);\n }\n\n /// @notice Schedules a timelocked update for the Registry Contract address.\n /// @param newRegistry The proposed new Registry address.\n /// @return opId The unique hash of the scheduled operation.\n function scheduleRegistryContract(\n address newRegistry,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n if (newRegistry == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRegistry));\n _requireCommitteeApproval(OP_SET_REGISTRY, paramsHash, signers, signatures);\n opId = _schedule(OP_SET_REGISTRY, paramsHash);\n }\n\n /// @notice Executes a pending Registry Contract update if the timelock has expired.\n /// @param newRegistry The address that was previously scheduled.\n function executeRegistryContract(address newRegistry) external {\n if (newRegistry == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newRegistry));\n bytes32 opId = _opId(OP_SET_REGISTRY, paramsHash);\n\n _executeTimelock(opId);\n\n address old = registryContract;\n registryContract = newRegistry;\n emit OperationExecuted(opId, OP_SET_REGISTRY);\n emit RegistryUpdated(old, newRegistry);\n }\n\n // Timelocked measurement actions\n\n /// @notice Validates measurements against a specific approved Profile.\n /// @dev Supports \"Partial Matching\": If the Profile has bytes32(0) for an RTMR,\n /// skips checking that specific register (accommodating different provider patterns).\n function verifyMeasurements(\n uint256 profileId,\n bytes32 checkMrtd,\n bytes32 checkRtmr0,\n bytes32 checkRtmr1,\n bytes32 checkRtmr2,\n bytes32 checkRtmr3\n ) internal view {\n MeasurementProfile memory profile = measurementProfiles[profileId];\n\n if (!profile.active) revert ProfileInactive(profileId);\n if (profile.mrtd == bytes32(0)) revert ZeroAddress();\n\n // MRTD is always mandatory\n if (checkMrtd != profile.mrtd) revert MeasurementMismatch(profile.mrtd, checkMrtd, \"MRTD\");\n\n // RTMRs are conditional based on the Profile configuration\n if (profile.rtmr0 != bytes32(0) && checkRtmr0 != profile.rtmr0) {\n revert MeasurementMismatch(profile.rtmr0, checkRtmr0, \"RTMR0\");\n }\n\n if (profile.rtmr1 != bytes32(0) && checkRtmr1 != profile.rtmr1) {\n revert MeasurementMismatch(profile.rtmr1, checkRtmr1, \"RTMR1\");\n }\n\n if (profile.rtmr2 != bytes32(0) && checkRtmr2 != profile.rtmr2) {\n revert MeasurementMismatch(profile.rtmr2, checkRtmr2, \"RTMR2\");\n }\n\n if (profile.rtmr3 != bytes32(0) && checkRtmr3 != profile.rtmr3) {\n revert MeasurementMismatch(profile.rtmr3, checkRtmr3, \"RTMR3\");\n }\n }\n\n /// @notice Governance proposes adding or updating a measurement profile (e.g., for Phala or GCP).\n function scheduleManageProfile(\n uint256 profileId,\n MeasurementProfile calldata profile,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n // Anti-Bricking: MRTD must never be zero if activating\n if (profile.active && profile.mrtd == bytes32(0)) revert InvalidVaultAddr();\n\n bytes32 paramsHash = keccak256(abi.encode(profileId, profile));\n _requireCommitteeApproval(OP_MANAGE_PROFILE, paramsHash, signers, signatures);\n opId = _schedule(OP_MANAGE_PROFILE, paramsHash);\n }\n\n function executeManageProfile(uint256 profileId, MeasurementProfile calldata profile) external {\n bytes32 paramsHash = keccak256(abi.encode(profileId, profile));\n bytes32 opId = _opId(OP_MANAGE_PROFILE, paramsHash);\n\n _executeTimelock(opId);\n\n // Auto-increment ID if adding a new one with ID 0\n uint256 idToUpdate = profileId;\n if (idToUpdate == 0) {\n idToUpdate = nextProfileId++;\n }\n\n measurementProfiles[idToUpdate] = profile;\n emit OperationExecuted(opId, OP_MANAGE_PROFILE);\n emit MeasurementProfileUpdated(idToUpdate, profile.active);\n }\n\n /// @notice Sxecudes a timelocked update for the Automata Verifier address.\n function executeUpdateAutomataVerifier(address newVerifier) external {\n if (newVerifier == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newVerifier));\n bytes32 opId = _opId(OP_SET_AUTOMATA_VERIFIER, paramsHash);\n _executeTimelock(opId);\n\n address old = address(automataVerifier);\n automataVerifier = IAutomataDcapAttestation(newVerifier);\n\n emit OperationExecuted(opId, OP_SET_AUTOMATA_VERIFIER);\n emit AutomataVerifierUpdated(old, newVerifier);\n }\n\n /// @notice Schedules a timelocked update for the Automata Verifier.\n /// @dev Operators vote to update the verifier and the update is proposed with a timelocked delay.\n function scheduleUpdateAutomataVerifier(\n address newVerifier,\n address[] calldata signers,\n bytes[] calldata signatures\n ) external returns (bytes32 opId) {\n if (newVerifier == address(0)) revert ZeroAddress();\n bytes32 paramsHash = keccak256(abi.encode(newVerifier));\n _requireCommitteeApproval(OP_SET_AUTOMATA_VERIFIER, paramsHash, signers, signatures);\n opId = _schedule(OP_SET_AUTOMATA_VERIFIER, paramsHash);\n }\n\n // Timelock cancellation\n\n /// @notice Cancels a pending timelocked operation.\n /// @dev Can be called at any time before execution to prevent a malicious or erroneous update.\n /// @param opId The hash of the operation to cancel.\n function cancelTimelock(bytes32 opId, address[] calldata signers, bytes[] calldata signatures)\n external\n {\n bytes32 paramsHash = keccak256(abi.encode(opId));\n _requireCommitteeApproval(OP_CANCEL_TIMELOCK, paramsHash, signers, signatures);\n\n TimelockOp storage op = timelockOps[opId];\n if (op.eta == 0) revert TimelockUnknown(opId);\n if (op.executed) revert TimelockAlreadyExecuted(opId);\n if (op.canceled) revert TimelockAlreadyCanceled(opId);\n\n op.canceled = true;\n emit OperationCanceled(opId, op.opType);\n }\n\n // =============================================================\n // TIMELOCK INTERNAL LOGIC\n // =============================================================\n\n /// @dev Deterministically generates the operation ID hash.\n function _opId(bytes32 opType, bytes32 paramsHash) internal view returns (bytes32) {\n return keccak256(abi.encode(opType, paramsHash, address(this), block.chainid));\n }\n\n /// @dev Internal helper to schedule an operation.\n function _schedule(bytes32 opType, bytes32 paramsHash) internal returns (bytes32 opId) {\n opId = _opId(opType, paramsHash);\n TimelockOp storage op = timelockOps[opId];\n if (op.executed) revert TimelockAlreadyExecuted(opId);\n\n uint256 delay = timelockDelayFor[opType];\n if (delay == 0) revert InvalidDelay(delay);\n\n uint64 eta = uint64(block.timestamp + delay);\n op.eta = eta;\n op.executed = false;\n op.canceled = false;\n op.opType = opType;\n emit OperationScheduled(opId, opType, eta);\n }\n\n /// @dev Internal helper to validate if an operation is ready for execution.\n function _executeTimelock(bytes32 opId) internal {\n TimelockOp storage op = timelockOps[opId];\n if (op.eta == 0) revert TimelockUnknown(opId);\n if (op.executed) revert TimelockAlreadyExecuted(opId);\n if (op.canceled) revert TimelockAlreadyCanceled(opId);\n if (block.timestamp < op.eta) revert TimelockNotReady(opId, op.eta, block.timestamp);\n op.executed = true;\n }\n\n /// @notice Allows the contract to receive ETH (needed for strategies that require fees).\n receive() external payable {}\n}\n","urls":[]},"src/DepositVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {SafeTransferLib} from \"solady/utils/SafeTransferLib.sol\";\nimport {EfficientHashLib} from \"solady/utils/EfficientHashLib.sol\";\nimport {ECDSA} from \"solady/utils/ECDSA.sol\";\nimport {IAtomicSettlementCallback} from \"./interfaces/IAtomicSettlementCallback.sol\";\n\ncontract DepositVault {\n /**\n * @notice The admin approves settlements and withdrawals.\n * @dev Should be set to the DStack container shared secret address.\n */\n address public owner;\n\n /**\n * @notice The address responsible for adding or removing administrators\n * @dev In production, this will be an upgradeable proxy\n */\n address public credentialManager;\n\n /// @notice Domain separator used for signature verification. It should include the routing ID, the vm ID, this\n /// vault address, and the settlement schema version.\n bytes32 internal _domainSeparator;\n\n /// @notice Maps settler IDs to their executor addresses.\n mapping(bytes32 => SettlerInfo) settlerExecutorMap;\n\n /// @notice List of all approved settler IDs.\n bytes32[] public approvedSettlers;\n\n /// @notice Minimum number of administrator signatures to approve a withdrawal request\n uint256 public withdrawalQuorum;\n\n uint256 public credentialManagerChangeDelayBlocks = 14400;\n\n /// @notice Tracks which settler IDs have been approved.\n mapping(bytes32 => bool) internal settlerIsApproved;\n\n /**\n * @notice Maximum total tokens that can be settled in a single block for each token.\n * @dev Currently unused \u2014 implementation pending design finalization.\n */\n mapping(address => uint256) public settlementCaps;\n\n /// @notice Maps (settler ID, account_index) pairs to their queue of pending batch settlements.\n mapping(bytes32 => mapping(uint64 => PendingSettlement[])) public pendingSettlements;\n\n /// @notice Maps (settler ID, account_index) pairs to their settlement count (nonce).\n mapping(bytes32 => mapping(uint64 => uint256)) public settlementCounts;\n\n /// @notice Maps user ID pairs to their deposit count (nonce).\n mapping(bytes32 => uint256) public depositCounts;\n\n /// @notice Maps user ID to their withdrawal count (nonce).\n mapping(bytes32 => uint256) public withdrawalCounts;\n\n /// @notice Set of administrators\n address[] public administrators;\n\n // TODO: Delete before official production.\n mapping(address => bool) public canDeposit;\n\n /// @notice Block number of latest signature use\n uint256 public lastSignatureUse;\n\n /**\n * Makes the signature unambiguous that it is for settlements.\n */\n bytes32 public constant SETTLEMENT_TYPEHASH = keccak256(\"SettlementApprovalV1\");\n\n /**\n * Makes the signature unambiguous that it is for withdrawals.\n */\n bytes32 constant WITHDRAWAL_TYPEHASH = keccak256(\"WithdrawalApprovalV1\");\n\n /// @notice Request for settlement\n /// @dev Used for all forms of settlement supported by the t+ vault\n struct Settlement {\n /// @notice Address of the token to be sent OUT from the vault\n address tokenOut;\n /// @notice Quantity of the output token to be sent OUT from the vault\n uint256 amountOut;\n /// @notice Address of the token to be sent IN to the vault\n address tokenIn;\n /// @notice Quantity of the input token to be sent IN from the vault\n uint256 amountIn;\n /// @notice Unique identifier of the user being settled\n bytes32 user;\n /// @notice Account index of the user being settled\n uint64 account;\n /// @notice Settlement nonce for this request\n uint256 nonce;\n /// @notice Timestamp at which this request is valid until (i.e.,\n /// immediately after this time this request is considered\n /// expired)\n uint256 validUntil;\n }\n\n /// @notice Request for settlement\n /// @dev Used for all forms of settlement supported by the t+ vault\n struct SettlementOrder {\n /// @notice Address of the token to be sent OUT from the vault\n address tokenOut;\n /// @notice Quantity of the output token to be sent OUT from the vault\n uint256 amountOut;\n /// @notice Address of the token to be sent IN to the vault\n address tokenIn;\n /// @notice Quantity of the input token to be sent IN from the vault\n uint256 amountIn;\n /// @notice Settlement nonce for this request\n uint256 nonce;\n }\n\n /// @notice A settlement request with associated signatures\n struct SignedSettlement {\n /// @notice Settlement request\n Settlement settlement;\n /// @notice Signature from the t+ Clearing Engine (CE)\n bytes clearingEngineSignature;\n }\n\n /// @notice A settlement request with associated signatures\n struct SignedSettlementOrder {\n /// @notice Settlement request\n SettlementOrder settlement;\n /// @notice Signature from the t+ Clearing Engine (CE)\n bytes clearingEngineSignature;\n }\n\n /**\n * @notice Stores pending settlements for a given (user ID, account_index) pair when batch settlement is used.\n * @dev Target is the address expected to execute the settlement.\n */\n struct PendingSettlement {\n SettlementOrder settlement;\n address target;\n }\n\n /// @notice Records a withdrawal.\n struct Withdrawal {\n address tokenAddress;\n uint256 amount;\n uint256 nonce;\n }\n\n /// @notice Information about a settler account.\n struct SettlerInfo {\n address[] executors;\n mapping(address => bool) isExecutor;\n }\n\n /// @notice Balance of a token for squashing purposes\n struct TokenSquashingBalance {\n /// @notice Address of the token that this balance represents\n address token;\n /// @notice Total quantity of tokens that the vault needs to receive\n uint256 input;\n /// @notice Total quantity of tokens that the vault needs to send\n uint256 output;\n /// @notice Net quantity of tokens that the vault needs to receive\n /// (i.e., negative implies sending more tokens out than the\n /// vault is receiving)\n int256 netAmount;\n }\n\n /// @notice Signals a settlement.\n event Settled(\n bytes32 indexed user,\n uint64 indexed account,\n uint256 indexed nonce,\n address tokenOut,\n uint256 amountOut,\n address tokenIn,\n uint256 amountIn\n );\n\n /// @notice Indicates that the set of administrators has been cleared and is now empty\n event AdministratorSetReset();\n\n /// @notice Signals that the withdrawal quorum has changed\n event WithdrawalQuorumChanged(uint256 previous, uint256 current);\n\n /// @notice Signals that the credential manager address has changed\n event CredentialManagerChanged(address oldCredentialManager, address newCredentialManager);\n\n /// @notice Signals that a new administrator has been added to the vault\n event AdminAdded(address newAdmin, uint256 numAdminsAfter);\n\n /// @notice Signals a deposit.\n event Deposited(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n\n /// @notice Signals a withdrawal.\n event Withdrew(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n\n /// @notice Reverts if the caller is not the owner.\n error NotOwner();\n\n /// @notice Reverts if the specified settler is not an approved settler on\n /// this vault\n error SettlerNotApproved();\n\n /// @notice Reverts if the number of callback data payloads does not match\n /// the number of settlement requests\n error PayloadMismatch();\n\n /// @notice Reverts if a settlement callback returns an insufficient input token amount\n error InsufficientAmountFromExecutor(uint256 actual, uint256 required);\n\n /// @notice Reverts if a settlement callback returns insufficient amount for a specific settlement\n error InsufficientCallbackReturnForSettlement(\n uint256 settlementIndex, uint256 actual, uint256 required\n );\n\n /// @notice Reverts if an insufficient number of blocks have elapsed since the last signature use\n error TooSoon();\n\n /// @notice Reverts if the caller is not the credential manager\n error NotCredentialManager();\n\n /// @notice Reverts if a new withdrawal quorum value is equal to zero\n error ZeroWithdrawalQuorum();\n\n /// @notice Reverts if insufficient administrators are provided when setting the administrators\n error InsufficientAdministrators(uint256 actual, uint256 required);\n\n /// @notice Reverts if the caller is not an admin.\n error NotAdmin();\n\n /// @notice Reverts if the caller is not the authorized executor.\n error NotExecutor();\n\n /// @notice Reverts if a signed operation is past its deadline.\n error Expired();\n\n /// @notice Reverts if the nonce used in a transaction is incorrect.\n error InvalidNonce(uint256 expected, uint256 given);\n\n /// @notice Reverts if the signature provided is invalid.\n error InvalidSignature();\n\n /// @notice Reverts if an order array is empty.\n error EmptyOrders();\n\n /// @notice Reverts when given the zero address.\n error ZeroAddress();\n\n /// @notice Reverts when an insufficient number of signatures are provided for a withdrawal request\n error MissedQuorum(uint256 provided, uint256 required);\n\n /**\n * @notice Initializes the contract and sets the owner.\n * @param _owner The address to set as the owner.\n * @param _credentialManager The address of the credential manager.\n * @dev Reverts with `ZeroAddress()` if `_owner` is null.\n * @dev Reverts with `ZeroAddress()` if `_credentialManager` is null.\n */\n constructor(address _owner, address _credentialManager) {\n if (_owner == address(0)) revert ZeroAddress();\n if (_credentialManager == address(0)) revert ZeroAddress();\n owner = _owner;\n credentialManager = _credentialManager;\n }\n\n function isAdministrator(address account) public view returns (bool) {\n for (uint256 i = 0; i < administrators.length; i++) {\n if (administrators[i] == account) return true;\n }\n\n return false;\n }\n\n /**\n * @notice Sets the owner of the vault.\n * @dev Reverts with `NotOwner`; Only the owner can set a new owner.\n */\n function setOwner(address newOwner) external {\n if (msg.sender != owner) revert NotOwner();\n if (newOwner == address(0)) revert ZeroAddress();\n owner = newOwner;\n }\n\n function setCredentialManager(address newCredentialManager) external {\n if (msg.sender != owner) revert NotOwner();\n if (newCredentialManager == address(0)) revert ZeroAddress();\n /* TODO(jmcph4): check against `latestApproval`! */\n if (block.number >= lastSignatureUse + credentialManagerChangeDelayBlocks) {\n revert TooSoon();\n }\n address oldCredentialManager = credentialManager;\n credentialManager = newCredentialManager;\n emit CredentialManagerChanged(oldCredentialManager, newCredentialManager);\n }\n\n function setAdministrators(address[] calldata newAdministrators, uint256 newWithdrawalQuorum)\n external\n {\n if (msg.sender != credentialManager) revert NotCredentialManager();\n if (newWithdrawalQuorum < 1) revert ZeroWithdrawalQuorum();\n if (newAdministrators.length < newWithdrawalQuorum) {\n revert InsufficientAdministrators(newAdministrators.length, newWithdrawalQuorum);\n }\n\n // It's critical there are no zero-addresses; otherwise, errored signatures may mistakenly pass.\n for (uint256 i = 0; i < newAdministrators.length; i++) {\n if (newAdministrators[i] == address(0)) revert ZeroAddress();\n }\n\n administrators = newAdministrators;\n emit AdministratorSetReset();\n\n for (uint256 i = 0; i < administrators.length; i++) {\n address currAdmin = administrators[i];\n emit AdminAdded(currAdmin, i + 1);\n }\n\n uint256 oldWithdrawalQuorum = withdrawalQuorum;\n withdrawalQuorum = newWithdrawalQuorum;\n if (oldWithdrawalQuorum != newWithdrawalQuorum) {\n emit WithdrawalQuorumChanged(oldWithdrawalQuorum, newWithdrawalQuorum);\n }\n }\n\n /**\n * @notice Sets the domain separators for EIP-712 signatures.\n * @param domainSeparator: The value to set.\n * @dev Reverts with `NotOwner`; Only the admin can set the domain separator.\n */\n function setDomainSeparator(bytes32 domainSeparator) external {\n if (msg.sender != owner) revert NotOwner();\n require(_domainSeparator == 0); // dev: Already set.\n _domainSeparator = domainSeparator;\n }\n\n /**\n * @notice Sets the settle executor.\n * @param settler: The settler's tplus account key.\n * @param executor: The settler's assigned executor address.\n * @dev Reverts with `NotOwner`; Only the admin can set the settler executor.\n */\n function addSettlerExecutor(bytes32 settler, address executor) external {\n if (msg.sender != owner) revert NotOwner();\n\n if (!settlerIsApproved[settler]) {\n approvedSettlers.push(settler);\n settlerIsApproved[settler] = true;\n }\n\n SettlerInfo storage data = settlerExecutorMap[settler];\n if (!data.isExecutor[executor]) {\n data.executors.push(executor);\n data.isExecutor[executor] = true;\n }\n }\n\n /**\n * @notice Removes a settler.\n * @param settler: The settler's tplus account key.\n * @dev Reverts with `NotOwner`; Only the admin can remove a settler.\n */\n function removeSettler(bytes32 settler) external {\n if (msg.sender != owner) revert NotOwner();\n uint256 length = approvedSettlers.length;\n\n settlerIsApproved[settler] = false;\n\n for (uint256 i = 0; i < length; i++) {\n if (approvedSettlers[i] == settler) {\n // Move last element to this spot and pop the last element.\n approvedSettlers[i] = approvedSettlers[length - 1];\n approvedSettlers.pop();\n break;\n }\n }\n\n // Remove all executors.\n SettlerInfo storage info = settlerExecutorMap[settler];\n for (uint256 i = 0; i < info.executors.length; i++) {\n address exec = info.executors[i];\n info.isExecutor[exec] = false;\n }\n delete info.executors;\n }\n\n /**\n * @notice Deposits a token into the vault.\n * @param user: The user whose account will be credited with the deposit.\n * @param tokenAddress: The address of the token to deposit.\n * @param amount: The amount of the token to deposit.\n * @dev Reverts if the amount is 0.\n */\n function deposit(bytes32 user, address tokenAddress, uint256 amount) external {\n require(canDeposit[msg.sender], \"!depositor\");\n require(amount != 0, \"Zero\");\n\n // Move tokens from the target user to this vault.\n SafeTransferLib.safeTransferFrom(tokenAddress, msg.sender, address(this), amount);\n\n emit Deposited(user, depositCounts[user], tokenAddress, amount);\n depositCounts[user] += 1;\n }\n\n // TODO: Delete this method and notion of approved-depositor before official production.\n function setDepositorStatus(address depositor, bool allowed) external {\n if (msg.sender != owner) revert NotOwner();\n canDeposit[depositor] = allowed;\n }\n\n /**\n * @notice Executes an atomic settlement.\n * @param order: The settlement order.\n * @param data: The data to execute as part of settlement callback.\n * @param signature: The signature from the t+ clearing engine.\n * @dev Reverts with `Expired` if the block timestamp is greater than `validUntil`.\n * @dev Reverts with `NotExecutor`; Only the executor can settle.\n * @dev Reverts with `InvalidNonce` if the nonce has already been used.\n * @dev Reverts with `SignatureError` if the signer is not an admin.\n * @dev Reverts with `InsufficientAmountFromExecutor` if the `order.amountIn` is less than what the executor reports\n */\n function executeAtomicSettlement(\n Settlement calldata order,\n bytes calldata data,\n bytes calldata signature\n ) external {\n bytes32 user = order.user;\n uint64 account = order.account;\n uint256 validUntil = order.validUntil;\n\n if (block.timestamp > validUntil) revert Expired();\n if (!settlerExecutorMap[user].isExecutor[msg.sender]) revert NotExecutor();\n\n uint256 expectedNonce = settlementCounts[user][account];\n if (order.nonce != expectedNonce) revert InvalidNonce(expectedNonce, order.nonce);\n\n bytes32 digest = keccak256(\n bytes.concat(\n SETTLEMENT_TYPEHASH,\n _domainSeparator,\n bytes32(uint256(uint160(order.tokenOut)) << 96),\n bytes32(order.amountOut),\n bytes32(uint256(uint160(order.tokenIn)) << 96),\n bytes32(order.amountIn),\n user,\n bytes32(uint256(uint160(account))),\n bytes32(order.nonce),\n bytes32(validUntil)\n )\n );\n\n // Check the signature and record latest signature usage if it's valid\n checkApproval(digest, signature);\n lastSignatureUse = block.number;\n\n // Ensure to bump the nonce _before_ the callback to avoid signature replay.\n settlementCounts[user][account] += 1;\n\n // Invoke callback on the executor\n uint256 expectedAmountIn = IAtomicSettlementCallback(msg.sender)\n .onAtomicSettlement(order.tokenOut, order.amountOut, data);\n if (expectedAmountIn < order.amountIn) {\n revert InsufficientAmountFromExecutor(expectedAmountIn, order.amountIn);\n }\n\n // Transfer tokens IN from the executor\n SafeTransferLib.safeTransferFrom(order.tokenIn, msg.sender, address(this), expectedAmountIn);\n\n // Transfer tokens OUT to the executor\n SafeTransferLib.safeTransfer(order.tokenOut, msg.sender, order.amountOut);\n\n emit Settled(\n user,\n account,\n order.nonce,\n order.tokenOut,\n order.amountOut,\n order.tokenIn,\n order.amountIn\n );\n }\n\n /// @notice Execute a sequence of settlement requests in a squashing fashion\n /// @param requests List of settlement requests\n function executeSquashingSettlements(\n SignedSettlement[] calldata requests,\n bytes[] calldata data,\n bytes32 settler\n ) external {\n address caller = msg.sender;\n uint256 numRequests = requests.length;\n uint256 numDataPayloads = data.length;\n if (numRequests != numDataPayloads) revert PayloadMismatch();\n\n /**\n * SAFETY(jmcph4): Check that settler is approved\n *\n * This prevents unauthorised settlers from executing settlements.\n */\n if (!settlerIsApproved[settler]) revert SettlerNotApproved();\n\n /**\n * SAFETY(jmcph4): Check that the caller is an assigned executor for this settler\n *\n * This prevents unauthorised execution of valid settlement requests.\n */\n if (!settlerExecutorMap[settler].isExecutor[caller]) revert NotExecutor();\n\n // Allocate token balances for netting off\n TokenSquashingBalance[] memory balances = new TokenSquashingBalance[](numRequests * 2);\n uint256 numUniqueTokens = 0;\n\n for (uint256 i = 0; i < numRequests; i++) {\n SignedSettlement memory currRequest = requests[i];\n bytes32 user = currRequest.settlement.user;\n uint64 account = currRequest.settlement.account;\n uint256 actualNonce = currRequest.settlement.nonce;\n uint256 validUntil = currRequest.settlement.validUntil;\n address tokenIn = currRequest.settlement.tokenIn;\n address tokenOut = currRequest.settlement.tokenOut;\n uint256 amountIn = currRequest.settlement.amountIn; /* TODO(jmcph4): callback */\n uint256 amountOut = currRequest.settlement.amountOut;\n\n /**\n * SAFETY(jmcph4): Check expiry\n *\n * This prevents stale settlement requests from being executed.\n */\n if (block.timestamp > validUntil) revert Expired();\n\n /**\n * SAFETY(jmcph4): Check nonce\n *\n * This prevents replay attacks on settlement requests.\n */\n uint256 expectedNonce = settlementCounts[user][account];\n if (actualNonce < expectedNonce) revert InvalidNonce(expectedNonce, actualNonce);\n\n bytes32 digest = keccak256(\n bytes.concat(\n SETTLEMENT_TYPEHASH,\n _domainSeparator,\n bytes32(uint256(uint160(tokenOut)) << 96),\n bytes32(amountOut),\n bytes32(uint256(uint160(tokenIn)) << 96),\n bytes32(amountIn),\n user,\n bytes32(uint256(uint160(account))),\n bytes32(actualNonce),\n bytes32(validUntil)\n )\n );\n\n /**\n * SAFETY(jmcph4): Verify t+ Clearing Engine (CE) signature\n *\n * This prevents unauthorised settlements.\n */\n checkApproval(digest, requests[i].clearingEngineSignature); /* TODO(jmcph4): horrific calldata load */\n lastSignatureUse = block.number;\n\n /**\n * SAFETY(jmcph4): Increment settlement nonce prior to invoking the\n * callback\n *\n * This prevents replay attacks (reentrant or otherwise) on\n * settlement requests.\n */\n settlementCounts[user][account] += 1;\n\n // Apply this request to running net token balances\n bool inputFound = false;\n bool outputFound = false;\n for (uint256 j = 0; j < numUniqueTokens; j++) {\n if (balances[j].token == tokenIn) {\n balances[j].input += amountIn;\n inputFound = true;\n break;\n }\n }\n\n if (!inputFound) {\n balances[numUniqueTokens] = TokenSquashingBalance(tokenIn, amountIn, 0, 0);\n numUniqueTokens++;\n }\n\n for (uint256 j = 0; j < numUniqueTokens; j++) {\n if (balances[j].token == tokenOut) {\n balances[j].output += amountOut;\n outputFound = true;\n break;\n }\n }\n\n if (!outputFound) {\n balances[numUniqueTokens] = TokenSquashingBalance(tokenOut, 0, amountOut, 0);\n numUniqueTokens++;\n }\n }\n\n // Net off each token balance\n for (uint256 i = 0; i < numUniqueTokens; i++) {\n if (balances[i].input > balances[i].output) {\n balances[i].netAmount = int256(balances[i].input - balances[i].output);\n } else if (balances[i].output > balances[i].input) {\n balances[i].netAmount = -int256(balances[i].output - balances[i].input);\n }\n }\n\n // Push funds out from the vault and into the executor\n for (uint256 i = 0; i < numUniqueTokens; i++) {\n // Negative net amount implies that we must push funds out from the vault\n if (balances[i].netAmount < 0) {\n // Transfer tokens OUT to the executor\n SafeTransferLib.safeTransfer(\n balances[i].token, caller, uint256(-balances[i].netAmount)\n );\n }\n }\n\n // Call callbacks and record return values\n uint256[] memory callbackReturns = new uint256[](numRequests);\n\n for (uint256 i = 0; i < numRequests; i++) {\n Settlement memory request = requests[i].settlement;\n\n /**\n * SAFETY(jmcph4): Record callback return value\n *\n * The executor reports how much of tokenIn it will provide for this\n * specific settlement. Pass the per-settlement amountOut, not the net.\n * These values will be validated against requirements before pulling funds.\n */\n callbackReturns[i] = IAtomicSettlementCallback(msg.sender)\n .onAtomicSettlement(request.tokenOut, request.amountOut, data[i]);\n\n /**\n * SAFETY(jmcph4): Validate per-settlement callback return\n *\n * Ensure the executor commits to provide at least the promised amountIn\n * for THIS specific settlement. This prevents cross-settlement subsidization\n * where an executor could shortchange one user while overpaying another.\n */\n if (callbackReturns[i] < request.amountIn) {\n revert InsufficientCallbackReturnForSettlement(\n i, callbackReturns[i], request.amountIn\n );\n }\n }\n\n // Validate callback returns and pull funds\n for (uint256 i = 0; i < numUniqueTokens; i++) {\n // Only process tokens that need to be pulled (positive net amount)\n if (balances[i].netAmount > 0) {\n address token = balances[i].token;\n uint256 requiredAmount = uint256(balances[i].netAmount);\n\n /**\n * SAFETY(jmcph4): Sum callback returns by token\n *\n * Calculate total amount the executor has committed to provide\n * for this token across all settlements.\n */\n uint256 totalCallbackAmount = 0;\n for (uint256 j = 0; j < numRequests; j++) {\n if (requests[j].settlement.tokenIn == token) {\n totalCallbackAmount += callbackReturns[j];\n }\n }\n\n /**\n * SAFETY(jmcph4): Validate executor commitment\n *\n * Ensure the executor has committed to provide at least the\n * required net amount for this token.\n */\n if (totalCallbackAmount < requiredAmount) {\n revert InsufficientAmountFromExecutor(totalCallbackAmount, requiredAmount);\n }\n\n // Transfer tokens IN from the executor\n SafeTransferLib.safeTransferFrom(token, caller, address(this), requiredAmount);\n }\n }\n\n // Emit settlement events\n for (uint256 i = 0; i < numRequests; i++) {\n Settlement memory request = requests[i].settlement;\n\n /**\n * SAFETY(jmcph4): Emit per-settlement amounts\n *\n * Events must reflect the actual per-settlement amounts, not the netted\n * amounts. This ensures proper accounting and allows off-chain systems\n * to correctly track what each user received.\n */\n emit Settled(\n request.user,\n request.account,\n request.nonce,\n request.tokenOut,\n request.amountOut,\n request.tokenIn,\n request.amountIn\n );\n }\n }\n\n /**\n * @notice Pulls funds for execution during a settlement batch.\n * @param orders: The settlement orders.\n * @param user: The t+ user who is executing the settlement.\n * @param target: The target address to send the token to, pull tokens from, and execute callback on.\n * @param validUntil: The timestamp when the settlement signature expires.\n * @dev Reverts with `Expired` if the block timestamp is greater than `validUntil`.\n * @dev Reverts if a batch settlement has already started.\n * @dev Reverts with `NotAdmin`; Only an admin can execute the settlement.\n * @dev Reverts with `InvalidNonce` if the nonce has already been used.\n * @dev Reverts with `SignatureError` if the signer is not an admin.\n */\n function pullBatchSettlements(\n SignedSettlementOrder[] calldata orders,\n bytes32 user,\n uint64 account,\n address target,\n uint256 validUntil\n ) external {\n if (block.timestamp > validUntil) revert Expired();\n require(pendingSettlements[user][account].length == 0);\n if (!isAdministrator(msg.sender)) revert NotAdmin();\n\n uint256 expectedNonce = settlementCounts[user][account];\n bytes32 domainSeparator = _domainSeparator;\n uint256 ordersLength = orders.length;\n if (ordersLength == 0) revert EmptyOrders();\n\n for (uint256 i = 0; i < ordersLength; ++i) {\n SettlementOrder calldata s = orders[i].settlement;\n\n uint256 nonce = s.nonce;\n if (nonce != expectedNonce) revert InvalidNonce(expectedNonce, nonce);\n\n bytes32 digest = keccak256(\n bytes.concat(\n SETTLEMENT_TYPEHASH,\n domainSeparator,\n bytes32(uint256(uint160(s.tokenOut)) << 96),\n bytes32(s.amountOut),\n bytes32(uint256(uint160(s.tokenIn)) << 96),\n bytes32(s.amountIn),\n user,\n bytes32(uint256(uint160(account))),\n bytes32(s.nonce),\n bytes32(validUntil)\n )\n );\n\n checkApproval(digest, orders[i].clearingEngineSignature);\n expectedNonce = nonce + 1;\n\n pendingSettlements[user][account].push(\n PendingSettlement({settlement: s, target: target})\n );\n SafeTransferLib.safeTransfer(s.tokenOut, target, s.amountOut);\n }\n\n settlementCounts[user][account] += ordersLength;\n }\n\n /**\n * @notice Pushes expected funds from a batch settlement to the deposit vault.\n * @param user: The t+ user who is executing the settlement.\n * @param account: The account of the t+ user to execute settlement against\n * @dev Reverts with `NotAdmin`; Only an admin can execute the settlement.\n */\n function pushBatchSettlements(bytes32 user, uint64 account) external {\n if (!isAdministrator(msg.sender)) revert NotAdmin();\n\n for (uint32 i = 0; i < pendingSettlements[user][account].length; i++) {\n PendingSettlement memory pendingSettlement = pendingSettlements[user][account][i];\n\n SafeTransferLib.safeTransferFrom(\n pendingSettlement.settlement.tokenIn,\n pendingSettlement.target,\n address(this),\n pendingSettlement.settlement.amountIn\n );\n emit Settled(\n user,\n account,\n pendingSettlement.settlement.nonce,\n pendingSettlement.settlement.tokenOut,\n pendingSettlement.settlement.amountOut,\n pendingSettlement.settlement.tokenIn,\n pendingSettlement.settlement.amountIn\n );\n }\n delete pendingSettlements[user][account];\n }\n\n /**\n * @notice Withdraws a token from the vault.\n * @param withdrawal: The withdrawal token and amount.\n * @param user: The user whose account will be debited by the withdrawal.\n * @param target: The target address to send the token to.\n * @param validUntil: The timestamp when the withdrawal signature expires.\n * @param signatures: t+ clearing engine signatures.\n * @dev Reverts with `Expired` if the block timestamp is greater than `validUntil`.\n * @dev Reverts with `InvalidNonce` if the nonce has already been used.\n * @dev Reverts with `SignatureError` if the signer is not an admin.\n */\n function withdraw(\n Withdrawal calldata withdrawal,\n bytes32 user,\n address target,\n uint256 validUntil,\n bytes32 epochHash,\n bytes[] calldata signatures\n ) external {\n /* PERF(jmcph4): cache storage variable to the stack */\n uint256 quorum = withdrawalQuorum;\n if (block.timestamp > validUntil) revert Expired();\n if (signatures.length < withdrawalQuorum) {\n revert MissedQuorum(signatures.length, quorum);\n }\n\n uint256 expectedNonce = withdrawalCounts[user];\n if (withdrawal.nonce != expectedNonce) {\n revert InvalidNonce(expectedNonce, withdrawal.nonce);\n }\n\n /**\n * BEGIN SIGNATURE CHECKS *************************\n */\n\n // Set of administrators that have provided signatures for this withdrawal\n address[] memory seenAdmins = new address[](signatures.length);\n uint256 numSeenAdmins = 0;\n\n // PERF(jmcph4): No need to recompute inside the loop body\n bytes32 digest = keccak256(\n bytes.concat(\n WITHDRAWAL_TYPEHASH,\n _domainSeparator,\n bytes32(uint256(uint160((withdrawal.tokenAddress))) << 96),\n bytes32(withdrawal.amount),\n user,\n bytes32(withdrawal.nonce),\n bytes32(validUntil),\n bytes32(epochHash),\n bytes32(uint256(uint160(target)) << 96)\n )\n );\n\n for (uint256 i = 0; i < signatures.length; i++) {\n /* Verify the signature.\n *\n * This determines whether the digest is really signed by the provided\n * signature and computes the signer's address.\n */\n address signer = ECDSA.tryRecoverCalldata(digest, signatures[i]);\n if (signer == address(0)) revert InvalidSignature();\n\n // Check that the recovered signer is in fact an administrator\n if (!isAdministrator(signer)) revert InvalidSignature();\n\n /* Check that this administrator is unique. Without this step, a\n * single admin could provide `k` signatures where `k == withdrawalQuorum`\n * and we'd happily approve the withdrawal.\n */\n bool isCurrentSignerUnique = true;\n for (uint256 j = 0; j < numSeenAdmins; j++) {\n if (seenAdmins[j] == signer) {\n isCurrentSignerUnique = false;\n break;\n }\n }\n if (isCurrentSignerUnique) {\n seenAdmins[numSeenAdmins] = signer;\n numSeenAdmins++;\n }\n if (numSeenAdmins == quorum) break;\n }\n\n if (numSeenAdmins < quorum) revert MissedQuorum(numSeenAdmins, quorum);\n\n /**\n * END SIGNATURE CHECKS *************************\n */\n\n // SAFETY(jmcph4): Purposely bump the nonce as close to signature verification as possible, to alleviate callback concerns.\n withdrawalCounts[user] += 1;\n\n // Record latest signature usage\n lastSignatureUse = block.number;\n\n SafeTransferLib.safeTransfer(withdrawal.tokenAddress, target, withdrawal.amount);\n emit Withdrew(user, withdrawal.nonce, withdrawal.tokenAddress, withdrawal.amount);\n }\n\n /**\n * @notice Get the array of approved settlers.\n * @return An array of addresses (as bytes32) that are currently approved settlers.\n */\n function getApprovedSettlers() external view returns (bytes32[] memory) {\n return approvedSettlers;\n }\n\n // TODO: Delete this method before official production.\n function ownerWithdrawToken(address token, address to, uint256 amount) external {\n if (msg.sender != owner) revert NotOwner();\n require(to != address(0));\n SafeTransferLib.safeTransfer(token, to, amount);\n }\n\n function checkApproval(bytes32 digest, bytes calldata signature) internal view {\n address signer = ECDSA.tryRecoverCalldata(digest, signature);\n if (signer == address(0)) revert InvalidSignature();\n if (!isAdministrator(signer)) revert InvalidSignature();\n }\n}\n","urls":[]},"src/Registry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @title Registry\n * @notice Central registry for managing assets and associated risk parameters across multiple chains.\n * @dev Uses admin and multisig roles to control sensitive operations like asset registration and risk configuration.\n */\ncontract Registry {\n /// @notice Address of the admin; primarily used for initial setup.\n address public admin;\n\n /// @notice Multisig wallet address responsible for managing risk-related configurations.\n address public riskManagerMultisig;\n\n /// @notice Number of seconds to wait before new risk parameters become effective\n uint256 public riskParameterChangeDelaySeconds = 1 days;\n\n /// @notice Mapping of asset index to new risk parameters to be applied to the registry, but only after they become eligible\n mapping(uint16 => PendingRiskParameters) public pendingRiskParameters;\n\n /// @notice Mapping of asset index to associated risk parameters.\n mapping(uint16 => RiskParameters) public riskParameters;\n\n /// @notice Registry of all registered assets and associated chain data.\n AssetRegistry assets;\n\n /// @notice Account for receiving fees and paying rewards.\n bytes32 public feeAccount;\n\n /// @notice Signals that the maximum deposit has changed for a given asset\n event MaxDepositChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n\n /// @notice Signals that the maximum hourly deposit has changed for a given asset\n event Max1HrDepositChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n\n /// @notice Signals that the minimum weight has changed for a given asset\n event MinWeightChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n\n /// @notice Defines risk-related configuration parameters for an asset.\n struct RiskParameters {\n /// @notice Percentage of asset value that can be counted as collateral (e.g., 90 = 90%).\n uint8 collateralFactor;\n\n /// @notice Percentage multiplier applied to liabilities for risk calculations (e.g., 90 = 90%).\n uint8 liabilityFactor;\n\n /// @notice Maximum allowable collateral amount for this asset. May be unenforced on-chain.\n uint256 maxCollateral;\n\n /// @notice Maximum total open interest allowed for derivatives positions.\n uint256 maxOpenInterest;\n\n /// @notice Maximum open interest allowed for spot positions.\n uint256 maxSpotOpenInterest;\n\n /// @notice Maximum allowed utilization ratio of available liquidity.\n uint256 maxUtilization;\n\n /// @notice If true, asset can only be used in isolated margin mode.\n bool isolatedOnly;\n\n /// @notice Utilization points where the interest rate curve slope changes, scaled in 1/100th of a basis point.\n uint256[] interestKinks;\n\n /// @notice Interest rates corresponding to `interestKinks`, scaled in 1/100th of a basis point.\n uint256[] kinkInterestRates;\n\n /// @notice USD-denominated utilization kink points, scaled in 1/100th of a basis point.\n uint256[] usdInterestKinks;\n\n /// @notice USD-denominated interest rates corresponding to `usdInterestKinks`, scaled in 1/100th of a basis point.\n uint256[] usdKinkInterestRates;\n\n /// @notice Multiplier applied to skew-based pricing adjustments, scaled in 1/100th of a basis point.\n uint256 skewModifier;\n\n /// @notice Skew threshold at which maximum skew adjustment applies, scaled in 1/100th of a basis point.\n uint256 skewCliff;\n\n /// @notice Base funding rate applied regardless of skew direction, scaled in 1/100th of a basis point.\n int256 baseFundingRate;\n\n /// @notice Maximum allowed premium adjustment, scaled in 1/100th of a basis point.\n uint256 premiumClamp;\n\n /// @notice Maximum premium impact applied during initial margin calculation, scaled in 1/100th of a basis point.\n uint256[] initialMarginClamps;\n\n /// @notice Multipliers applied to position size when calculating initial margin, scaled in 1/100th of a basis point.\n uint256[] initialMarginFactors;\n\n /// @notice Maximum absolute funding rate allowed, scaled in 1/100th of a basis point.\n uint256 maxFundingRate;\n\n /// @notice Maximum interest rate applied at full utilization, scaled in 1/100th of a basis point.\n uint256 maxUtilizationRate;\n\n /// @notice Additional safety buffer multiplier applied to risk calculations, scaled in 1/100th of a basis point.\n uint256 bufferMultiple;\n }\n\n struct PendingRiskParameters {\n RiskParameters parameters;\n uint256 validAfter;\n }\n\n /**\n * @notice Struct for managing a list of registered assets.\n * @dev Assets are stored by index and can span multiple chains.\n */\n struct AssetRegistry {\n uint256 count; // Total number of assets.\n mapping(uint16 => Asset) registry; // Mapping from index to asset struct.\n }\n\n /**\n * @notice Struct for identifying a chain.\n */\n struct ChainId {\n // The routing ID e.g. 0=EVM style chains.\n uint64 routingId;\n\n // e.g. EVM chainId.\n uint64 vmId;\n }\n\n /**\n * @notice Struct representing an asset across multiple chains.\n */\n struct Asset {\n mapping(uint64 => mapping(uint64 => AssetData)) data; // Routing ID => Chain ID => AssetData.\n ChainId[] chains; // List of all known chain IDs for this asset.\n }\n\n /**\n * @notice Chain-specific metadata for an asset.\n * @dev Uses bytes32 for `assetAddress` to support non-EVM chains like Solana.\n */\n struct AssetData {\n uint16 index;\n bytes32 assetAddress;\n ChainId chainId;\n uint256 maxDeposits; // Cap on deposits (collateral cap).\n uint256 max1hrDeposits; // Cap on fungible deposits over one hour\n uint256 minWeight; // Raw weight value (not percentage)\n }\n\n /// @notice Reverts if caller is not the admin.\n error NotAdmin();\n\n /// @notice Reverts if there is are no risk parameters queued for the specified asset\n error NoPendingRiskParameters(uint16 asset);\n\n /// @notice Reverts if the pending risk parameters are not yet eligible for application\n error TooSoon(uint16 asset, uint256 eligibleAt);\n\n /// @notice Reverts if caller is not the risk manager multisig.\n error NotRiskManager();\n\n /// @notice Reverts if the asset index is out of bounds.\n error IndexOutOfBounds();\n\n /// @notice Reverts if the collateral factor (CF) specified as part of risk parameters is greater than one\n error InvalidCollateralFactor();\n\n /// @notice Reverts if the liability factor (LF) specified as part of risk parameters is greater than one\n error InvalidLiabilityFactor();\n\n /// @notice Reverts if the utilization cap specified as part of risk parameters is greater than one\n error InvalidUtilizationCap();\n\n /// @notice Reverts if the funding rate cap specified as part of risk parameters is greater than ~1000% APR\n error InvalidMaxFundingRate();\n\n /// @notice Reverts if the utilization rate cap specified as part of risk parameters is greater than ~1000% APR\n error InvalidMaxUtilizationRate();\n\n /// @notice Reverts if the buffer multiple value is less than 1% or greater than 2%.\n error InvalidBufferMultiple();\n\n /// @notice Reverts if the interest kinks specified as part of risk parameters are not increasing from 0 to 1\n error InvalidInterestKinks();\n\n /// @notice Reverts if the interest rates specified as part of risk parameters are not increasing\n error InvalidRateInterestKinks();\n\n /// @notice Reverts if the USD-denominated interest kinks specified as part of risk parameters are not increasing from 0 to 1\n error InvalidUSDInterestKinks();\n\n /// @notice Reverts if the USD-denominated interest rates specified as part of risk parameters are not increasing\n error InvalidUSDRateInterestKinks();\n\n /// @notice Reverts if the size of the initial margin clamps does not match the size of the initial margin factors (specified as part of risk parameters)\n error InvalidInitialMarginsConfiguration();\n\n /// @notice Reverts if the initial margin clamps specified as part of risk parameters are not increasing or are above 100\n error InvalidInitialMarginsClamps();\n\n /// @notice Reverts if the initial margin clamps specified as part of risk parameters are not decreasing or are above 100\n error InvalidInitialMarginsFactors();\n\n /// @notice Reverts if adding a chain to an asset that already exists.\n error ChainAlreadyExists();\n\n /// @notice Reverts if an address is zero.\n error ZeroAddress();\n\n /// @notice Reverts if the risk manager is not set.\n error RiskManagerNotSet();\n\n /**\n * @notice Contract constructor.\n * @param _admin The admin controller of the vault.\n * @dev Sets the deployer as the initial admin.\n */\n constructor(address _admin) {\n admin = _admin;\n }\n\n /**\n * @notice Updates the risk manager multisig address.\n * @param multisig The new address to set.\n * @dev Reverts with `NotAdmin`; Only the admin can set a risk manager.\n */\n function setRiskManagerMultisig(address multisig) external {\n if (msg.sender != admin) revert NotAdmin();\n riskManagerMultisig = multisig;\n }\n\n /**\n * @notice Updates the admin address.\n * @param newAdmin The new admin address.\n * @dev Reverts with `NotAdmin`; Only the admin can set a new admin.\n * @dev The new administrator address is allowed to be the null address.\n * Setting the administrator to this address disables administration\n * of the registry contract.\n */\n function setAdmin(address newAdmin) external {\n if (msg.sender != admin) revert NotAdmin();\n if (newAdmin == address(0) && riskManagerMultisig == address(0)) {\n revert RiskManagerNotSet();\n }\n admin = newAdmin;\n }\n\n /**\n * @notice Sets or updates asset data for a specific asset index and chain.\n * @dev Automatically adds new assets or chain instances if not already present.\n * @param data The chain-specific asset data.\n * @dev Reverts with `NotRiskManager`; Only the risk manager can set asset data.\n */\n function setAssetData(AssetData memory data) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n if (data.index > assets.count) revert IndexOutOfBounds();\n\n // Prevent registering asset with zero-address. Zero-address means that asset\n // has not yet been set on a chain, where is this case it has.\n if (data.assetAddress == bytes32(0)) revert ZeroAddress();\n\n Asset storage reg = assets.registry[data.index];\n\n uint64 routingId = data.chainId.routingId;\n uint64 vmId = data.chainId.vmId;\n\n // Cannot edit the chain or address when already set.\n if (reg.data[routingId][vmId].assetAddress != bytes32(0)) {\n revert ChainAlreadyExists();\n }\n\n bool isNewAsset = reg.chains.length == 0;\n reg.data[routingId][vmId] = data;\n reg.chains.push(data.chainId);\n\n if (isNewAsset) {\n assets.count += 1;\n }\n }\n\n function setMaxDeposits(ChainId calldata chainId, uint16 index, uint256 newMaxDeposit)\n external\n {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n\n uint64 routingId = chainId.routingId;\n uint64 vmId = chainId.vmId;\n\n uint256 oldMaxDeposit = assets.registry[index].data[routingId][vmId].maxDeposits;\n assets.registry[index].data[routingId][vmId].maxDeposits = newMaxDeposit;\n emit MaxDepositChanged(chainId, index, oldMaxDeposit, newMaxDeposit);\n }\n\n function setMax1HrDeposits(ChainId calldata chainId, uint16 index, uint256 newMaxDeposit)\n external\n {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n\n uint64 routingId = chainId.routingId;\n uint64 vmId = chainId.vmId;\n\n uint256 oldMaxDeposit = assets.registry[index].data[routingId][vmId].max1hrDeposits;\n assets.registry[index].data[routingId][vmId].max1hrDeposits = newMaxDeposit;\n emit Max1HrDepositChanged(chainId, index, oldMaxDeposit, newMaxDeposit);\n }\n\n function setMinWeight(ChainId calldata chain, uint16 index, uint256 newMinWeight) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n uint256 oldMinWeight = assets.registry[index].data[chain.routingId][chain.vmId].minWeight;\n assets.registry[index].data[chain.routingId][chain.vmId].minWeight = newMinWeight;\n emit MinWeightChanged(chain, index, oldMinWeight, newMinWeight);\n }\n\n /**\n * @notice Retrieves asset data for a specific asset and chain.\n * @param chainId the chain ID to query.\n * @param index The asset index to query.\n * @return The corresponding AssetData struct.\n */\n function getAssetData(ChainId calldata chainId, uint16 index)\n external\n view\n returns (AssetData memory)\n {\n return assets.registry[index].data[chainId.routingId][chainId.vmId];\n }\n\n /**\n * @notice Returns all registered asset data across all chains.\n * @return An array of AssetData structs.\n * @param start The start index (inclusive).\n * @param end The end index (not-inclusive).\n */\n function getAssets(uint16 start, uint16 end) external view returns (AssetData[] memory) {\n // First, compute the total flattened entries\n uint256 totalEntries = 0;\n for (uint16 i = 0; i < assets.count; i++) {\n totalEntries += assets.registry[i].chains.length;\n }\n\n // Return empty array if start >= totalEntries\n if (start >= totalEntries) {\n return new AssetData[](0);\n }\n\n if (end > totalEntries) {\n // casting to 'uint16' is safe because we won't ever that many assets.\n // forge-lint: disable-next-line(unsafe-typecast)\n end = uint16(totalEntries);\n }\n\n if (end < start) {\n return new AssetData[](0);\n }\n\n uint16 length = end - start;\n AssetData[] memory result = new AssetData[](length);\n\n uint256 r = 0;\n uint256 resIdx = 0;\n\n for (uint16 i = 0; i < assets.count && resIdx < length; ++i) {\n Asset storage asset = assets.registry[i];\n uint256 chainsLen = asset.chains.length;\n\n for (uint256 c = 0; c < chainsLen && resIdx < length; ++c) {\n if (r >= start && r < end) {\n ChainId storage chain = asset.chains[c];\n result[resIdx++] = asset.data[chain.routingId][chain.vmId];\n }\n\n ++r;\n }\n }\n\n return result;\n }\n\n /**\n * @notice Returns the asset index for a given chain and address.\n * @param chainId The chain ID to search.\n * @param assetAddress The asset address (as bytes32).\n * @return The index of the asset, or `type(uint32).max` if not found.\n */\n function getAssetIndex(ChainId calldata chainId, bytes32 assetAddress)\n external\n view\n returns (uint32)\n {\n uint64 routingId = chainId.routingId;\n uint64 vmId = chainId.vmId;\n\n for (uint16 i = 0; i < assets.count; i++) {\n if (assetAddress == assets.registry[i].data[routingId][vmId].assetAddress) {\n return i;\n }\n }\n return type(uint32).max;\n }\n\n /**\n * @notice Sets pending risk parameters for a specific asset index.\n * @param index The asset index.\n * @param parameters The risk parameters to set\n * @dev Reverts with `NotRiskManager`; Only the risk manager can set risk parameters.\n * @dev Reverts with `\"!asset\"` if index >= assets.count.\n */\n function setPendingRiskParameters(uint16 index, RiskParameters memory parameters) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n require(index < assets.count, \"!asset\");\n validateRiskParameters(parameters);\n PendingRiskParameters memory pendingParams = PendingRiskParameters({\n parameters: parameters, validAfter: block.timestamp + riskParameterChangeDelaySeconds\n });\n pendingRiskParameters[index] = pendingParams;\n }\n\n /**\n * @notice Applies the pending risk parameters for the specified asset if they exist.\n * @param index The asset index.\n * @dev Reverts with `\"!asset\"` if index >= assets.count.\n * @dev Reverts with `NoPendingRiskParameters` if there are no pending risk parameters for the specified asset\n * @dev Reverts with `TooSoon` if the pending risk parameters are not yet eligible\n */\n function applyPendingRiskParameters(uint16 index) external {\n require(index < assets.count, \"!asset\");\n PendingRiskParameters memory pendingParams = pendingRiskParameters[index];\n if (pendingParams.validAfter == 0) revert NoPendingRiskParameters(index);\n if (pendingParams.validAfter >= block.timestamp) {\n revert TooSoon(index, pendingParams.validAfter);\n }\n RiskParameters memory params = pendingParams.parameters;\n validateRiskParameters(params);\n riskParameters[index] = params;\n delete pendingRiskParameters[index];\n }\n\n function validateRiskParameters(RiskParameters memory params) public pure {\n if (params.collateralFactor > 1e2) revert InvalidCollateralFactor();\n if (params.liabilityFactor > 1e2) revert InvalidLiabilityFactor();\n if (params.maxUtilization > 1e18) revert InvalidUtilizationCap();\n if (params.maxFundingRate > 1142) revert InvalidMaxFundingRate();\n if (params.maxUtilizationRate > 1142) revert InvalidMaxUtilizationRate();\n\n uint256 bufferMultiple = params.bufferMultiple;\n if (bufferMultiple < 1e6 || bufferMultiple > 2e6) revert InvalidBufferMultiple();\n\n if (!validateStartAtZeroIsAlwaysBelowOneAndIncreases(params.interestKinks)) {\n revert InvalidInterestKinks();\n }\n if (!validateLastIsOne(params.interestKinks)) revert InvalidInterestKinks();\n if (!validateStartAtZeroIsAlwaysBelowOneAndIncreases(params.usdInterestKinks)) {\n revert InvalidUSDInterestKinks();\n }\n if (!validateLastIsOne(params.usdInterestKinks)) revert InvalidUSDInterestKinks();\n\n if (!validateIncreases(params.kinkInterestRates)) {\n revert InvalidRateInterestKinks();\n }\n if (!validateIncreases(params.usdKinkInterestRates)) {\n revert InvalidUSDRateInterestKinks();\n }\n\n if (params.initialMarginClamps.length != params.initialMarginFactors.length) {\n revert InvalidInitialMarginsConfiguration();\n }\n if (!validateStartAtZeroIsAlwaysBelowOneAndIncreases(params.initialMarginClamps)) {\n revert InvalidInitialMarginsClamps();\n }\n if (!validateIMFactors(params.initialMarginFactors)) revert InvalidInitialMarginsFactors();\n }\n\n /**\n * @notice Last point should be (1_000_000)\n */\n function validateLastIsOne(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n return len != 0 && xs[len - 1] == 1_000_000;\n }\n\n /**\n * @notice Validate that a series of values is increasing\n */\n function validateIncreases(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n uint256 prev = 0;\n\n for (uint256 i; i < len; ++i) {\n uint256 cur = xs[i];\n if (cur < prev) return false;\n prev = cur;\n }\n\n return true;\n }\n\n /**\n * @notice IM clamps must always increase and be <= 1 (1_000_000), and first point must be 0\n */\n function validateStartAtZeroIsAlwaysBelowOneAndIncreases(uint256[] memory xs)\n internal\n pure\n returns (bool)\n {\n uint256 len = xs.length;\n uint256 prev = 0;\n\n if (len == 0 || xs[0] != 0) {\n return false;\n }\n\n for (uint256 i; i < len; ++i) {\n uint256 cur = xs[i];\n if (cur > 1_000_000) return false;\n if (cur < prev) return false;\n prev = cur;\n }\n\n return true;\n }\n\n /**\n * @notice IM factors must always decreases and be < 1 (1_000_000)\n */\n function validateIMFactors(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n uint256 prev = 999_999;\n\n for (uint256 i; i < len; ++i) {\n uint256 cur = xs[i];\n if (cur > prev) return false;\n prev = cur;\n }\n\n return true;\n }\n\n function sumIsOne(uint256[] memory xs) internal pure returns (bool) {\n uint256 len = xs.length;\n uint256 sum;\n\n for (uint256 i; i < len; ++i) {\n sum += xs[i];\n if (sum > 1e6) return false;\n }\n\n return sum == 1e6;\n }\n\n /**\n * @notice Returns the full list of risk parameters for all registered assets.\n * @return An array of RiskParameters.\n * @param start The start index (inclusive).\n * @param end The end index (not inclusive).\n */\n function getRiskParameters(uint16 start, uint16 end)\n external\n view\n returns (RiskParameters[] memory)\n {\n uint16 count = uint16(assets.count);\n\n if (start >= count) {\n return new RiskParameters[](0);\n }\n\n if (end > count) {\n end = count;\n }\n\n if (end < start) {\n return new RiskParameters[](0);\n }\n\n uint256 length = end - start;\n RiskParameters[] memory result = new RiskParameters[](length);\n\n for (uint16 i = 0; i < length; ++i) {\n result[i] = riskParameters[start + i];\n }\n\n return result;\n }\n\n function setFeeAccount(bytes32 account) external {\n if (msg.sender != riskManagerMultisig) revert NotRiskManager();\n feeAccount = account;\n }\n}\n","urls":[]},"src/interfaces/IAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IAdminUpdateStrategy {\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable;\n}\n","urls":[]},"src/interfaces/IAtomicSettlementCallback.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IAtomicSettlementCallback {\n /// @notice Computes the minimum expected quantity of `token` that will be\n /// received by the deposit vault upon execution of an atomic\n /// settlement request\n function onAtomicSettlement(address token, uint256 amount, bytes calldata data)\n external\n returns (uint256);\n}\n","urls":[]},"src/interfaces/IAutomataDcapAttestation.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @notice Interface for Automata's DCAP Attestation Verifier (V3)\n/// @dev Bindings for the 'AutomataDcapAttestation' contract.\n/// Compatible with Automata V3 ZK Coprocessor logic.\ninterface IAutomataDcapAttestation {\n // Enum definition from Automata's library\n enum ZkCoProcessorType {\n RiscZero,\n Succinct // SP1\n }\n\n /// @notice Verifies a SNARK proof (Groth16) for a TEE Quote.\n /// @param output The Public Values (Journal) - effectively the Quote Body.\n /// @param zkvm The type of ZKVM used.\n /// @param proofBytes The actual (Groth16) proof.\n /// @return success True if valid.\n /// @return errorData Error message if failed, or empty if success.\n function verifyAndAttestWithZKProof(\n bytes calldata output,\n ZkCoProcessorType zkvm,\n bytes calldata proofBytes\n ) external returns (bool success, bytes memory errorData);\n}\n","urls":[]},"src/interfaces/ICheckpointer.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface ICheckpointer {\n struct Checkpoint {\n uint256 nonce;\n uint8[] stateRoot;\n string[] approvedWithdrawals;\n }\n\n error AlreadySet();\n error InvalidSignature();\n error NotAdmin();\n error NotCouncilMultisig();\n\n event Withdrawals(string[] approvedWithdrawals);\n\n function CHECKPOINT_TYPEHASH() external view returns (bytes32);\n function admin() external view returns (address);\n function checkpoint(\n bytes memory sharedSignature,\n bytes memory leaderSignature,\n Checkpoint memory _checkpoint\n ) external;\n function councilMultisig() external view returns (address);\n function leader() external view returns (address);\n function setAdmin(address newAdmin) external;\n function setDomainSeparator(bytes32 domainSeparator) external;\n function setInitialCouncilMultisig(address newCouncilMultisig) external;\n function setLeader(address newLeader) external;\n function setNewCouncilMultisig(address newCouncilMultisig) external;\n function stateRoot(uint256) external view returns (uint8);\n function stateRootNonce() external view returns (uint256);\n}\n","urls":[]},"src/interfaces/ICredentialManager.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface ICredentialManager {\n struct ChainConfig {\n uint64 blockTimeMs;\n uint8 defaultConfirmations;\n uint8 depositIngestConfirmations;\n uint8 withdrawalIngestConfirmations;\n uint8 settlementIngestConfirmations;\n }\n\n struct MeasurementProfile {\n bool active;\n bytes32 mrtd;\n bytes32 rtmr0;\n bytes32 rtmr1;\n bytes32 rtmr2;\n bytes32 rtmr3;\n }\n\n struct Vault {\n uint8 routingId;\n uint256 vmId;\n bytes32 vaultAddress;\n ChainConfig config;\n }\n\n error AmbiguousState();\n error CannotCancel();\n error GatheringActive();\n error GatheringNotActive();\n error GatheringNotExpired();\n error InsufficientSignatures(uint256 provided, uint256 required);\n error InvalidCommitteeThreshold(uint256 newThreshold, uint256 operatorCount);\n error InvalidDelay(uint256 delay);\n error InvalidEpoch(uint256 expected, uint256 actual);\n error InvalidProfileConfig();\n error InvalidProfileId();\n error InvalidQuoteLength();\n error InvalidReportData();\n error InvalidVaultAddr();\n error InvalidVerifier();\n error InvalidZkProof();\n error MeasurementMismatch(bytes32 expected, bytes32 actual, string field);\n error NoCandidate();\n error NoStrategy();\n error NotOperator(address signer);\n error ProfileInactive(uint256 profileId);\n error ProposedEpochTooLow(uint256 current, uint256 proposed);\n error SignersNotSortedOrUnique();\n error StrategyAlreadyExists();\n error TimelockAlreadyCanceled(bytes32 opId);\n error TimelockAlreadyExecuted(bytes32 opId);\n error TimelockNotReady(bytes32 opId, uint256 readyAt, uint256 nowTs);\n error TimelockUnknown(bytes32 opId);\n error VaultNotFound(uint256 routingId, uint256 vmId);\n error ZeroAddress();\n\n event AdminUpdateStrategyRegistered(\n uint256 indexed routingId, uint256 indexed vmId, address strategy\n );\n event AttestedKeyRegistered(address indexed operator, bytes32 indexed newAttestedKey);\n event AutomataVerifierUpdated(address indexed oldVerifier, address indexed newVerifier);\n event CommitteeThresholdUpdated(uint256 oldThreshold, uint256 newThreshold);\n event DepositVaultAdministratorsUpdated(\n uint256 indexed routingId,\n uint256 indexed vmId,\n address[] newAdministrators,\n uint256 newWithdrawalQuorum\n );\n event DepositVaultAdministratorsUpdated(\n uint256 indexed chainId, address[] newAdministrators, uint256 newWithdrawalQuorum\n );\n event EpochIncremented(uint256 newEpoch, bytes32 newCheckpointHash);\n event LeaderUpdated(address indexed newLeader, bytes32 indexed newAttestedKey);\n event MeasurementProfileUpdated(uint256 indexed profileId, bool active);\n event MeasurementsUpdated(bytes32 newMrtd, bytes32 newRtmr0);\n event OperationCanceled(bytes32 indexed opId, bytes32 indexed opType);\n event OperationExecuted(bytes32 indexed opId, bytes32 indexed opType);\n event OperationScheduled(bytes32 indexed opId, bytes32 indexed opType, uint256 eta);\n event OperatorAdded(address indexed operator);\n event RegistryUpdated(address indexed oldRegistry, address indexed newRegistry);\n event RestartAmbiguityDetected(uint256 epoch, bytes32 hash1, bytes32 hash2);\n event RestartCandidateSubmitted(address indexed leader, uint256 epoch, bytes32 checkpointHash);\n event RestartExecuted(address indexed newLeader, uint256 indexed epoch);\n event RestartGatheringStarted(uint256 deadline);\n event RiskManagerUpdated(address indexed oldRiskManager, address indexed newRiskManager);\n event TimelockDelayUpdated(bytes32 indexed targetOpType, uint256 oldDelay, uint256 newDelay);\n event VaultAdded(\n uint256 indexed routingId, uint256 indexed vmId, bytes32 vaultAddr, ChainConfig config\n );\n\n receive() external payable;\n\n function GATHERING_DURATION() external view returns (uint256);\n function OP_ADD_VAULT() external view returns (bytes32);\n function OP_APPOINT_LEADER() external view returns (bytes32);\n function OP_CANCEL_TIMELOCK() external view returns (bytes32);\n function OP_MANAGE_PROFILE() external view returns (bytes32);\n function OP_REGISTER_STRATEGY() external view returns (bytes32);\n function OP_RESTART() external view returns (bytes32);\n function OP_SET_AUTOMATA_VERIFIER() external view returns (bytes32);\n function OP_SET_COMMITTEE_THRESHOLD() external view returns (bytes32);\n function OP_SET_DELAY() external view returns (bytes32);\n function OP_SET_MEASUREMENTS() external view returns (bytes32);\n function OP_SET_REGISTRY() external view returns (bytes32);\n function OP_SET_RISK_MANAGER() external view returns (bytes32);\n function OP_SET_VAULT_ADMINS() external view returns (bytes32);\n function OP_WITHDRAW() external view returns (bytes32);\n function addVault(\n uint8 routingId,\n uint256 vmId,\n bytes32 vaultAddr,\n ChainConfig memory config,\n address[] memory signers,\n bytes[] memory signatures\n ) external;\n function admin() external view returns (address);\n function adminUpdateStrategies(uint256, uint256) external view returns (address);\n function appointLeader(address newLeader, address[] memory signers, bytes[] memory signatures)\n external;\n function automataVerifier() external view returns (address);\n function bestCandidate()\n external\n view\n returns (address leader, uint256 epoch, bytes32 checkpointHash, bool exists);\n function cancelTimelock(bytes32 opId, address[] memory signers, bytes[] memory signatures)\n external;\n function committeeThreshold() external view returns (uint256);\n function domainSeparator() external view returns (bytes32);\n function epoch() external view returns (uint256);\n function executeManageProfile(uint256 profileId, MeasurementProfile memory profile) external;\n function executeRegistryContract(address newRegistry) external;\n function executeRiskManager(address newRiskManager) external;\n function executeUpdateAutomataVerifier(address newVerifier) external;\n function getCommitteeConfig()\n external\n view\n returns (address[] memory members, uint256 k, uint256 n);\n function getLeader() external view returns (address operator, bytes32 attestedKey);\n function getVaults(uint16 start, uint16 end) external view returns (Vault[] memory);\n function governanceNonce() external view returns (uint256);\n function initiateRestart() external;\n function isOperator(address) external view returns (bool);\n function isRestartAmbiguous() external view returns (bool);\n function latestCheckpointHash() external view returns (bytes32);\n function leader() external view returns (address);\n function measurementProfiles(uint256)\n external\n view\n returns (\n bool active,\n bytes32 mrtd,\n bytes32 rtmr0,\n bytes32 rtmr1,\n bytes32 rtmr2,\n bytes32 rtmr3\n );\n function nextProfileId() external view returns (uint256);\n function operatorToAttestedKey(address) external view returns (bytes32);\n function operators(uint256) external view returns (address);\n function registerAdminUpdateStrategy(\n uint8 routingId,\n uint256 vmId,\n address strategy,\n address[] memory signers,\n bytes[] memory signatures\n ) external;\n function registerAttestedKey(bytes32 newAttestedKey) external;\n function registryContract() external view returns (address);\n function resolveRestart() external;\n function restartGatheringDeadline() external view returns (uint256);\n function riskManager() external view returns (address);\n function scheduleManageProfile(\n uint256 profileId,\n MeasurementProfile memory profile,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function scheduleRegistryContract(\n address newRegistry,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function scheduleRiskManager(\n address newRiskManager,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function scheduleUpdateAutomataVerifier(\n address newVerifier,\n address[] memory signers,\n bytes[] memory signatures\n ) external returns (bytes32 opId);\n function setDepositVaultAdministrators(\n uint256 routingId,\n uint256 vmId,\n address[] memory newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable;\n function submitRestartProof(\n uint256 profileId,\n bytes memory tdxReportBody,\n bytes memory zkProof,\n address newLeader,\n bytes32 checkpointHash\n ) external;\n function timelockDelayFor(bytes32) external view returns (uint256);\n function timelockOps(bytes32)\n external\n view\n returns (uint64 eta, bool executed, bool canceled, bytes32 opType);\n function updateCommitteeThreshold(\n uint256 newThreshold,\n address[] memory signers,\n bytes[] memory signatures\n ) external;\n function vaults(uint256)\n external\n view\n returns (uint8 routingId, uint256 vmId, bytes32 vaultAddress, ChainConfig memory config);\n function withdraw(address account, address[] memory signers, bytes[] memory signatures) external;\n}\n","urls":[]},"src/interfaces/IDepositVault.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IDepositVault {\n struct Settlement {\n address tokenOut;\n uint256 amountOut;\n address tokenIn;\n uint256 amountIn;\n bytes32 user;\n uint64 account;\n uint256 nonce;\n uint256 validUntil;\n }\n\n struct SettlementOrder {\n address tokenOut;\n uint256 amountOut;\n address tokenIn;\n uint256 amountIn;\n uint256 nonce;\n }\n\n struct SignedSettlement {\n Settlement settlement;\n bytes clearingEngineSignature;\n }\n\n struct SignedSettlementOrder {\n SettlementOrder settlement;\n bytes clearingEngineSignature;\n }\n\n struct Withdrawal {\n address tokenAddress;\n uint256 amount;\n uint256 nonce;\n }\n\n error EmptyOrders();\n error Expired();\n error InsufficientAdministrators(uint256 actual, uint256 required);\n error InsufficientAmountFromExecutor(uint256 actual, uint256 required);\n error InsufficientCallbackReturnForSettlement(\n uint256 settlementIndex, uint256 actual, uint256 required\n );\n error InvalidNonce(uint256 expected, uint256 given);\n error InvalidSignature();\n error MissedQuorum(uint256 provided, uint256 required);\n error NotAdmin();\n error NotCredentialManager();\n error NotExecutor();\n error NotOwner();\n error PayloadMismatch();\n error SettlerNotApproved();\n error TooSoon();\n error ZeroAddress();\n error ZeroWithdrawalQuorum();\n\n event AdminAdded(address newAdmin, uint256 numAdminsAfter);\n event AdministratorSetReset();\n event CredentialManagerChanged(address oldCredentialManager, address newCredentialManager);\n event Deposited(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n event Settled(\n bytes32 indexed user,\n uint64 indexed account,\n uint256 indexed nonce,\n address tokenOut,\n uint256 amountOut,\n address tokenIn,\n uint256 amountIn\n );\n event WithdrawalQuorumChanged(uint256 previous, uint256 current);\n event Withdrew(\n bytes32 indexed user, uint256 indexed nonce, address tokenAddress, uint256 amount\n );\n\n function SETTLEMENT_TYPEHASH() external view returns (bytes32);\n function addSettlerExecutor(bytes32 settler, address executor) external;\n function administrators(uint256) external view returns (address);\n function approvedSettlers(uint256) external view returns (bytes32);\n function canDeposit(address) external view returns (bool);\n function credentialManager() external view returns (address);\n function credentialManagerChangeDelayBlocks() external view returns (uint256);\n function deposit(bytes32 user, address tokenAddress, uint256 amount) external;\n function depositCounts(bytes32) external view returns (uint256);\n function executeAtomicSettlement(\n Settlement memory order,\n bytes memory data,\n bytes memory signature\n ) external;\n function executeSquashingSettlements(\n SignedSettlement[] memory requests,\n bytes[] memory data,\n bytes32 settler\n ) external;\n function getApprovedSettlers() external view returns (bytes32[] memory);\n function isAdministrator(address account) external view returns (bool);\n function lastSignatureUse() external view returns (uint256);\n function owner() external view returns (address);\n function ownerWithdrawToken(address token, address to, uint256 amount) external;\n function pendingSettlements(bytes32, uint64, uint256)\n external\n view\n returns (SettlementOrder memory settlement, address target);\n function pullBatchSettlements(\n SignedSettlementOrder[] memory orders,\n bytes32 user,\n uint64 account,\n address target,\n uint256 validUntil\n ) external;\n function pushBatchSettlements(bytes32 user, uint64 account) external;\n function removeSettler(bytes32 settler) external;\n function setAdministrators(address[] memory newAdministrators, uint256 newWithdrawalQuorum)\n external;\n function setCredentialManager(address newCredentialManager) external;\n function setDepositorStatus(address depositor, bool allowed) external;\n function setDomainSeparator(bytes32 domainSeparator) external;\n function setOwner(address newOwner) external;\n function settlementCaps(address) external view returns (uint256);\n function settlementCounts(bytes32, uint64) external view returns (uint256);\n function withdraw(\n Withdrawal memory withdrawal,\n bytes32 user,\n address target,\n uint256 validUntil,\n bytes32 epochHash,\n bytes[] memory signatures\n ) external;\n function withdrawalCounts(bytes32) external view returns (uint256);\n function withdrawalQuorum() external view returns (uint256);\n}\n","urls":[]},"src/interfaces/IRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IRegistry {\n struct AssetData {\n uint16 index;\n bytes32 assetAddress;\n ChainId chainId;\n uint256 maxDeposits;\n uint256 max1hrDeposits;\n uint256 minWeight;\n }\n\n struct ChainId {\n uint64 routingId;\n uint64 vmId;\n }\n\n struct RiskParameters {\n uint8 collateralFactor;\n uint8 liabilityFactor;\n uint256 maxCollateral;\n uint256 maxOpenInterest;\n uint256 maxSpotOpenInterest;\n uint256 maxUtilization;\n bool isolatedOnly;\n uint256[] interestKinks;\n uint256[] kinkInterestRates;\n uint256[] usdInterestKinks;\n uint256[] usdKinkInterestRates;\n uint256 skewModifier;\n uint256 skewCliff;\n int256 baseFundingRate;\n uint256 premiumClamp;\n uint256[] initialMarginClamps;\n uint256[] initialMarginFactors;\n uint256 maxFundingRate;\n uint256 maxUtilizationRate;\n uint256 bufferMultiple;\n }\n\n error ChainAlreadyExists();\n error IndexOutOfBounds();\n error InvalidBufferMultiple();\n error InvalidCollateralFactor();\n error InvalidInitialMarginsClamps();\n error InvalidInitialMarginsConfiguration();\n error InvalidInitialMarginsFactors();\n error InvalidInterestKinks();\n error InvalidLiabilityFactor();\n error InvalidMaxFundingRate();\n error InvalidMaxUtilizationRate();\n error InvalidRateInterestKinks();\n error InvalidUSDInterestKinks();\n error InvalidUSDRateInterestKinks();\n error InvalidUtilizationCap();\n error NoPendingRiskParameters(uint16 asset);\n error NotAdmin();\n error NotRiskManager();\n error RiskManagerNotSet();\n error TooSoon(uint16 asset, uint256 eligibleAt);\n error ZeroAddress();\n\n event Max1HrDepositChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n event MaxDepositChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n event MinWeightChanged(ChainId chain, uint16 index, uint256 previous, uint256 current);\n\n function admin() external view returns (address);\n function applyPendingRiskParameters(uint16 index) external;\n function feeAccount() external view returns (bytes32);\n function getAssetData(ChainId memory chainId, uint16 index)\n external\n view\n returns (AssetData memory);\n function getAssetIndex(ChainId memory chainId, bytes32 assetAddress)\n external\n view\n returns (uint32);\n function getAssets(uint16 start, uint16 end) external view returns (AssetData[] memory);\n function getRiskParameters(uint16 start, uint16 end)\n external\n view\n returns (RiskParameters[] memory);\n function pendingRiskParameters(uint16)\n external\n view\n returns (RiskParameters memory parameters, uint256 validAfter);\n function riskManagerMultisig() external view returns (address);\n function riskParameterChangeDelaySeconds() external view returns (uint256);\n function riskParameters(uint16)\n external\n view\n returns (\n uint8 collateralFactor,\n uint8 liabilityFactor,\n uint256 maxCollateral,\n uint256 maxOpenInterest,\n uint256 maxSpotOpenInterest,\n uint256 maxUtilization,\n bool isolatedOnly,\n uint256 skewModifier,\n uint256 skewCliff,\n int256 baseFundingRate,\n uint256 premiumClamp,\n uint256 maxFundingRate,\n uint256 maxUtilizationRate,\n uint256 bufferMultiple\n );\n function setAdmin(address newAdmin) external;\n function setAssetData(AssetData memory data) external;\n function setFeeAccount(bytes32 account) external;\n function setMax1HrDeposits(ChainId memory chainId, uint16 index, uint256 newMaxDeposit) external;\n function setMaxDeposits(ChainId memory chainId, uint16 index, uint256 newMaxDeposit) external;\n function setMinWeight(ChainId memory chain, uint16 index, uint256 newMinWeight) external;\n function setPendingRiskParameters(uint16 index, RiskParameters memory parameters) external;\n function setRiskManagerMultisig(address multisig) external;\n function validateRiskParameters(RiskParameters memory params) external pure;\n}\n","urls":[]},"src/strategies/ArbitrumOneAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {IInbox} from \"nitro-contracts/bridge/IInbox.sol\";\nimport {IDepositVault} from \"../interfaces/IDepositVault.sol\";\nimport {IAdminUpdateStrategy} from \"../interfaces/IAdminUpdateStrategy.sol\";\n\ncontract ArbitrumOneAdminUpdateStrategy is IAdminUpdateStrategy {\n address public constant INBOX = 0x4Dbd4fc535Ac27206064B68FfCf827b0A60BAB3f;\n\n uint256 constant MAX_SUBMISSION_COST = 0.02 ether;\n uint256 constant GAS_LIMIT = 3_000_000;\n uint256 constant MAX_FEE_PER_GAS = 5 gwei;\n\n /// @notice Reverts if not enough value was sent to the update method.\n error InsufficientMsgValue(uint256 actual, uint256 expected);\n\n /**\n * @notice Updates the administrator set and withdrawal quorum on a vault via a retryable ticket.\n * @dev This function forwards a cross-chain call to the target `vault` using Arbitrum's\n * retryable ticket mechanism. The credential manager must supply sufficient `msg.value` to cover\n * the maximum submission cost and gas fees for execution on the destination chain.\n *\n * @param vault The address of the vault contract whose administrators will be updated.\n * @param newAdministrators The complete list of administrator addresses to set on the vault.\n * @param newWithdrawalQuorum The new quorum required for withdrawals.\n *\n * @dev Reverts with {InsufficientMsgValue} if `msg.value` is less than\n * `MAX_SUBMISSION_COST + GAS_LIMIT * MAX_FEE_PER_GAS`.\n */\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable override {\n uint256 expectedValue =\n MAX_SUBMISSION_COST + GAS_LIMIT * MAX_FEE_PER_GAS;\n uint256 actualValue = msg.value;\n\n if (actualValue < expectedValue) {\n revert InsufficientMsgValue(actualValue, expectedValue);\n }\n\n bytes memory callData = abi.encodeWithSelector(\n IDepositVault.setAdministrators.selector, newAdministrators, newWithdrawalQuorum\n );\n\n IInbox inbox = IInbox(address(INBOX));\n inbox.createRetryableTicket{value: msg.value}(\n vault,\n 0,\n MAX_SUBMISSION_COST,\n msg.sender,\n msg.sender,\n GAS_LIMIT,\n MAX_FEE_PER_GAS,\n callData\n );\n }\n}\n","urls":[]},"src/strategies/IntraChainAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {IAdminUpdateStrategy} from \"../interfaces/IAdminUpdateStrategy.sol\";\nimport {IDepositVault} from \"../interfaces/IDepositVault.sol\";\n\n/// Use this strategy when updating the vault on the same chain as the credential manager.\ncontract IntraChainAdminUpdateStrategy is IAdminUpdateStrategy {\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable {\n IDepositVault(vault).setAdministrators(newAdministrators, newWithdrawalQuorum);\n }\n}\n","urls":[]},"src/strategies/OPStackAdminUpdateStrategy.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\nimport {IDepositVault} from \"../interfaces/IDepositVault.sol\";\nimport {IAdminUpdateStrategy} from \"../interfaces/IAdminUpdateStrategy.sol\";\n\ninterface IL1CrossDomainMessenger {\n function sendMessage(address _target, bytes calldata _message, uint32 _minGasLimit)\n external\n payable;\n}\n\n/// @notice Admin update strategy for OP Stack chains (Optimism, Base, Unichain, etc)\ncontract OPStackAdminUpdateStrategy is IAdminUpdateStrategy {\n /// @notice L1 CrossDomainMessenger.\n address public immutable L1_CROSS_DOMAIN_MESSENGER;\n\n /// @notice Conservative gas limit for L2 execution.\n uint32 public constant L2_GAS_LIMIT = 3_000_000;\n\n /// @notice Reverts if messenger address is zero.\n error ZeroMessengerAddress();\n\n constructor(address l1CrossDomainMessenger) {\n if (l1CrossDomainMessenger == address(0)) revert ZeroMessengerAddress();\n L1_CROSS_DOMAIN_MESSENGER = l1CrossDomainMessenger;\n }\n\n /**\n * @notice Updates the administrator set and withdrawal quorum on an OP Stack L2 vault\n * @dev Sends a cross-domain message from L1 \u2192 L2 using the OP Stack messenger\n * @dev Forwards msg.value directly to the L1 messenger\n *\n * @param vault The L2 vault address\n * @param newAdministrators The full administrator set\n * @param newWithdrawalQuorum The withdrawal quorum\n */\n function setAdministrators(\n address vault,\n address[] calldata newAdministrators,\n uint256 newWithdrawalQuorum\n ) external payable override {\n bytes memory callData = abi.encodeWithSelector(\n IDepositVault.setAdministrators.selector, newAdministrators, newWithdrawalQuorum\n );\n\n IL1CrossDomainMessenger(L1_CROSS_DOMAIN_MESSENGER).sendMessage{value: msg.value}(\n vault, callData, L2_GAS_LIMIT\n );\n }\n}\n","urls":[]}}} \ No newline at end of file From 9d49864cf1e4ae5974975f252a1aa64baf583117 Mon Sep 17 00:00:00 2001 From: antazoey Date: Mon, 9 Mar 2026 14:35:11 -0500 Subject: [PATCH 3/3] update execute atomic settlement call --- tplus/evm/contracts.py | 7 +------ tplus/evm/managers/settle.py | 6 +++--- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/tplus/evm/contracts.py b/tplus/evm/contracts.py index 406bf17..0f31b7d 100644 --- a/tplus/evm/contracts.py +++ b/tplus/evm/contracts.py @@ -508,17 +508,12 @@ def deposit( def execute_atomic_settlement( self, settlement: dict, - user: UserPublicKey, - sub_account: int, - expiry: int, data: HexBytes, signature: HexBytes, **tx_kwargs, ) -> "ReceiptAPI": try: - return self.contract.executeAtomicSettlement( - settlement, user, sub_account, expiry, data, signature, **tx_kwargs - ) + return self.contract.executeAtomicSettlement(settlement, data, signature, **tx_kwargs) except Exception as err: err_id = getattr(err, "message", "") if erc20_err_name := _decode_erc20_error(getattr(err, "message", f"{err}")): diff --git a/tplus/evm/managers/settle.py b/tplus/evm/managers/settle.py index 78ecb9d..1589aab 100644 --- a/tplus/evm/managers/settle.py +++ b/tplus/evm/managers/settle.py @@ -329,11 +329,11 @@ async def execute_settlement( "amountIn": settlement_info.amount_in.amount, "tokenOut": token_out_address, "amountOut": settlement_info.amount_out.amount, + "user": HexBytes(user.public_key), + "account": user.sub_account, "nonce": nonce, + "validUntil": expiry, }, - HexBytes(user.public_key), - user.sub_account, - expiry, "", HexBytes(approval.inner.signature), **kwargs,