diff --git a/explorer/.env.dev b/explorer/.env.dev index e926401f04..bbd5797e40 100644 --- a/explorer/.env.dev +++ b/explorer/.env.dev @@ -14,6 +14,9 @@ DB_HOST=localhost # Config file ALIGNED_CONFIG_FILE="../contracts/script/output/devnet/alignedlayer_deployment_output.json" +ALIGNED_PROOF_AGG_CONFIG_FILE="../contracts/script/output/devnet/proof_aggregation_service_deployment_output.json" +## Don't use public nodes as blob data can be retrieved from them +BEACON_CLIENT="" # Debug DEBUG_ERRORS=true diff --git a/explorer/.env.example b/explorer/.env.example index 7df20261cd..bc4fe87614 100644 --- a/explorer/.env.example +++ b/explorer/.env.example @@ -14,6 +14,9 @@ DB_HOST= # Config file ALIGNED_CONFIG_FILE="" +ALIGNED_PROOF_AGG_CONFIG_FILE="" +## Don't use public nodes as blob data can be retrieved from them +BEACON_CLIENT="" # Debug DEBUG_ERRORS= diff --git a/explorer/ecto_setup_db.sh b/explorer/ecto_setup_db.sh index 73fbf77395..42ca0a2bb1 100755 --- a/explorer/ecto_setup_db.sh +++ b/explorer/ecto_setup_db.sh @@ -10,6 +10,8 @@ export DB_USER=$DB_USER export DB_PASS=$DB_PASS export DB_HOST=$DB_HOST export ALIGNED_CONFIG_FILE=$ALIGNED_CONFIG_FILE +export ALIGNED_PROOF_AGG_CONFIG_FILE=$ALIGNED_PROOF_AGG_CONFIG_FILE +export BEACON_CLIENT=$BEACON_CLIENT mix deps.get diff --git a/explorer/lib/abi/AlignedProofAggregationService.json b/explorer/lib/abi/AlignedProofAggregationService.json new file mode 100644 index 0000000000..87a1d5f566 --- /dev/null +++ b/explorer/lib/abi/AlignedProofAggregationService.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"VERIFIER_MOCK_ADDRESS","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"aggregatedProofs","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"alignedAggregatorAddress","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"newOwner","type":"address","internalType":"address"},{"name":"_alignedAggregatorAddress","type":"address","internalType":"address"},{"name":"_sp1VerifierAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"proxiableUUID","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"sp1VerifierAddress","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeTo","inputs":[{"name":"newImplementation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"upgradeToAndCall","inputs":[{"name":"newImplementation","type":"address","internalType":"address"},{"name":"data","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"verify","inputs":[{"name":"blobVersionedHash","type":"bytes32","internalType":"bytes32"},{"name":"sp1ProgramVKey","type":"bytes32","internalType":"bytes32"},{"name":"sp1PublicValues","type":"bytes","internalType":"bytes"},{"name":"sp1ProofBytes","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"AdminChanged","inputs":[{"name":"previousAdmin","type":"address","indexed":false,"internalType":"address"},{"name":"newAdmin","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"AggregatedProofVerified","inputs":[{"name":"merkleRoot","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"blobVersionedHash","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"BeaconUpgraded","inputs":[{"name":"beacon","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Upgraded","inputs":[{"name":"implementation","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"OnlyAlignedAggregator","inputs":[{"name":"sender","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e2565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100e0576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051611116610119600039600081816102530152818161029c0152818161033b0152818161037b015261040e01526111166000f3fe6080604052600436106100a75760003560e01c8063715018a611610064578063715018a6146101a157806383501b21146101b65780638da5cb5b146101cb578063c0c53b8b146101e9578063f2fde38b14610209578063fc2b42711461022957600080fd5b806327d3bc9a146100ac578063294e3ccb146100f15780633659cfe6146101295780634c46688c1461014b5780634f1ef2861461016b57806352d1902d1461017e575b600080fd5b3480156100b857600080fd5b506100dc6100c7366004610c91565b60c96020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156100fd57600080fd5b5060ca54610111906001600160a01b031681565b6040516001600160a01b0390911681526020016100e8565b34801561013557600080fd5b50610149610144366004610cc6565b610249565b005b34801561015757600080fd5b5060cb54610111906001600160a01b031681565b610149610179366004610cf7565b610331565b34801561018a57600080fd5b50610193610401565b6040519081526020016100e8565b3480156101ad57600080fd5b506101496104b4565b3480156101c257600080fd5b5061011160ff81565b3480156101d757600080fd5b506033546001600160a01b0316610111565b3480156101f557600080fd5b50610149610204366004610db9565b6104c8565b34801561021557600080fd5b50610149610224366004610cc6565b61061d565b34801561023557600080fd5b50610149610244366004610e45565b610693565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361029a5760405162461bcd60e51b815260040161029190610ec8565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102e360008051602061109a833981519152546001600160a01b031690565b6001600160a01b0316146103095760405162461bcd60e51b815260040161029190610f14565b610312816107b2565b6040805160008082526020820190925261032e918391906107ba565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036103795760405162461bcd60e51b815260040161029190610ec8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166103c260008051602061109a833981519152546001600160a01b031690565b6001600160a01b0316146103e85760405162461bcd60e51b815260040161029190610f14565b6103f1826107b2565b6103fd828260016107ba565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104a15760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610291565b5060008051602061109a83398151915290565b6104bc61092a565b6104c66000610984565b565b600054610100900460ff16158080156104e85750600054600160ff909116105b806105025750303b158015610502575060005460ff166001145b6105655760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610291565b6000805460ff191660011790558015610588576000805461ff0019166101001790555b6105906109d6565b610598610a05565b6105a184610984565b60cb80546001600160a01b038086166001600160a01b03199283161790925560ca8054928516929091169190911790558015610617576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b61062561092a565b6001600160a01b03811661068a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610291565b61032e81610984565b60cb546001600160a01b031633146106c05760405163921f325560e01b8152336004820152602401610291565b60006106ce84860186610c91565b90506106e660ca546001600160a01b031660ff141590565b156107545760ca5460405163020a49e360e51b81526001600160a01b03909116906341493c60906107239089908990899089908990600401610f89565b60006040518083038186803b15801561073b57600080fd5b505afa15801561074f573d6000803e3d6000fd5b505050505b600081815260c9602052604090819020805460ff191660011790555181907ffe3e9e971000ab9c80c7e06aba2933aae5419d0e44693e3046913e9e58053f62906107a1908a815260200190565b60405180910390a250505050505050565b61032e61092a565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156107f2576107ed83610a2c565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561084c575060408051601f3d908101601f1916820190925261084991810190610fc2565b60015b6108af5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610291565b60008051602061109a833981519152811461091e5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610291565b506107ed838383610ac8565b6033546001600160a01b031633146104c65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610291565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166109fd5760405162461bcd60e51b815260040161029190610fdb565b6104c6610aed565b600054610100900460ff166104c65760405162461bcd60e51b815260040161029190610fdb565b6001600160a01b0381163b610a995760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610291565b60008051602061109a83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610ad183610b1d565b600082511180610ade5750805b156107ed576106178383610b5d565b600054610100900460ff16610b145760405162461bcd60e51b815260040161029190610fdb565b6104c633610984565b610b2681610a2c565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b610bc55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610291565b600080846001600160a01b031684604051610be0919061104a565b600060405180830381855af49150503d8060008114610c1b576040519150601f19603f3d011682016040523d82523d6000602084013e610c20565b606091505b5091509150610c4882826040518060600160405280602781526020016110ba60279139610c51565b95945050505050565b60608315610c60575081610c8a565b825115610c705782518084602001fd5b8160405162461bcd60e51b81526004016102919190611066565b9392505050565b600060208284031215610ca357600080fd5b5035919050565b80356001600160a01b0381168114610cc157600080fd5b919050565b600060208284031215610cd857600080fd5b610c8a82610caa565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610d0a57600080fd5b610d1383610caa565b9150602083013567ffffffffffffffff80821115610d3057600080fd5b818501915085601f830112610d4457600080fd5b813581811115610d5657610d56610ce1565b604051601f8201601f19908116603f01168101908382118183101715610d7e57610d7e610ce1565b81604052828152886020848701011115610d9757600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600080600060608486031215610dce57600080fd5b610dd784610caa565b9250610de560208501610caa565b9150610df360408501610caa565b90509250925092565b60008083601f840112610e0e57600080fd5b50813567ffffffffffffffff811115610e2657600080fd5b602083019150836020828501011115610e3e57600080fd5b9250929050565b60008060008060008060808789031215610e5e57600080fd5b8635955060208701359450604087013567ffffffffffffffff80821115610e8457600080fd5b610e908a838b01610dfc565b90965094506060890135915080821115610ea957600080fd5b50610eb689828a01610dfc565b979a9699509497509295939492505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b858152606060208201526000610fa3606083018688610f60565b8281036040840152610fb6818587610f60565b98975050505050505050565b600060208284031215610fd457600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015611041578181015183820152602001611029565b50506000910152565b6000825161105c818460208701611026565b9190910192915050565b6020815260008251806020840152611085816040850160208701611026565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ef3ac35a93e0bc422c32ddc5626edbb3121458d2f45c80dcb960589ffea6d6b764736f6c63430008180033","sourceMap":"506:2562:10:-:0;;;1332:4:5;1289:48;;1548:53:10;;;;;;;;;-1:-1:-1;1572:22:10;:20;:22::i;:::-;506:2562;;5388:279:4;5456:13;;;;;;;5455:14;5447:66;;;;-1:-1:-1;;;5447:66:4;;216:2:12;5447:66:4;;;198:21:12;255:2;235:18;;;228:30;294:34;274:18;;;267:62;-1:-1:-1;;;345:18:12;;;338:37;392:19;;5447:66:4;;;;;;;;5527:12;;5542:15;5527:12;;;:30;5523:138;;;5573:12;:30;;-1:-1:-1;;5573:30:4;5588:15;5573:30;;;;;;5622:28;;564:36:12;;;5622:28:4;;552:2:12;537:18;5622:28:4;;;;;;;5523:138;5388:279::o;422:184:12:-;506:2562:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x6080604052600436106100a75760003560e01c8063715018a611610064578063715018a6146101a157806383501b21146101b65780638da5cb5b146101cb578063c0c53b8b146101e9578063f2fde38b14610209578063fc2b42711461022957600080fd5b806327d3bc9a146100ac578063294e3ccb146100f15780633659cfe6146101295780634c46688c1461014b5780634f1ef2861461016b57806352d1902d1461017e575b600080fd5b3480156100b857600080fd5b506100dc6100c7366004610c91565b60c96020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156100fd57600080fd5b5060ca54610111906001600160a01b031681565b6040516001600160a01b0390911681526020016100e8565b34801561013557600080fd5b50610149610144366004610cc6565b610249565b005b34801561015757600080fd5b5060cb54610111906001600160a01b031681565b610149610179366004610cf7565b610331565b34801561018a57600080fd5b50610193610401565b6040519081526020016100e8565b3480156101ad57600080fd5b506101496104b4565b3480156101c257600080fd5b5061011160ff81565b3480156101d757600080fd5b506033546001600160a01b0316610111565b3480156101f557600080fd5b50610149610204366004610db9565b6104c8565b34801561021557600080fd5b50610149610224366004610cc6565b61061d565b34801561023557600080fd5b50610149610244366004610e45565b610693565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361029a5760405162461bcd60e51b815260040161029190610ec8565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102e360008051602061109a833981519152546001600160a01b031690565b6001600160a01b0316146103095760405162461bcd60e51b815260040161029190610f14565b610312816107b2565b6040805160008082526020820190925261032e918391906107ba565b50565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036103795760405162461bcd60e51b815260040161029190610ec8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166103c260008051602061109a833981519152546001600160a01b031690565b6001600160a01b0316146103e85760405162461bcd60e51b815260040161029190610f14565b6103f1826107b2565b6103fd828260016107ba565b5050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104a15760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610291565b5060008051602061109a83398151915290565b6104bc61092a565b6104c66000610984565b565b600054610100900460ff16158080156104e85750600054600160ff909116105b806105025750303b158015610502575060005460ff166001145b6105655760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610291565b6000805460ff191660011790558015610588576000805461ff0019166101001790555b6105906109d6565b610598610a05565b6105a184610984565b60cb80546001600160a01b038086166001600160a01b03199283161790925560ca8054928516929091169190911790558015610617576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b61062561092a565b6001600160a01b03811661068a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610291565b61032e81610984565b60cb546001600160a01b031633146106c05760405163921f325560e01b8152336004820152602401610291565b60006106ce84860186610c91565b90506106e660ca546001600160a01b031660ff141590565b156107545760ca5460405163020a49e360e51b81526001600160a01b03909116906341493c60906107239089908990899089908990600401610f89565b60006040518083038186803b15801561073b57600080fd5b505afa15801561074f573d6000803e3d6000fd5b505050505b600081815260c9602052604090819020805460ff191660011790555181907ffe3e9e971000ab9c80c7e06aba2933aae5419d0e44693e3046913e9e58053f62906107a1908a815260200190565b60405180910390a250505050505050565b61032e61092a565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156107f2576107ed83610a2c565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561084c575060408051601f3d908101601f1916820190925261084991810190610fc2565b60015b6108af5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610291565b60008051602061109a833981519152811461091e5760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610291565b506107ed838383610ac8565b6033546001600160a01b031633146104c65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610291565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166109fd5760405162461bcd60e51b815260040161029190610fdb565b6104c6610aed565b600054610100900460ff166104c65760405162461bcd60e51b815260040161029190610fdb565b6001600160a01b0381163b610a995760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610291565b60008051602061109a83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b610ad183610b1d565b600082511180610ade5750805b156107ed576106178383610b5d565b600054610100900460ff16610b145760405162461bcd60e51b815260040161029190610fdb565b6104c633610984565b610b2681610a2c565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b610bc55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610291565b600080846001600160a01b031684604051610be0919061104a565b600060405180830381855af49150503d8060008114610c1b576040519150601f19603f3d011682016040523d82523d6000602084013e610c20565b606091505b5091509150610c4882826040518060600160405280602781526020016110ba60279139610c51565b95945050505050565b60608315610c60575081610c8a565b825115610c705782518084602001fd5b8160405162461bcd60e51b81526004016102919190611066565b9392505050565b600060208284031215610ca357600080fd5b5035919050565b80356001600160a01b0381168114610cc157600080fd5b919050565b600060208284031215610cd857600080fd5b610c8a82610caa565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610d0a57600080fd5b610d1383610caa565b9150602083013567ffffffffffffffff80821115610d3057600080fd5b818501915085601f830112610d4457600080fd5b813581811115610d5657610d56610ce1565b604051601f8201601f19908116603f01168101908382118183101715610d7e57610d7e610ce1565b81604052828152886020848701011115610d9757600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b600080600060608486031215610dce57600080fd5b610dd784610caa565b9250610de560208501610caa565b9150610df360408501610caa565b90509250925092565b60008083601f840112610e0e57600080fd5b50813567ffffffffffffffff811115610e2657600080fd5b602083019150836020828501011115610e3e57600080fd5b9250929050565b60008060008060008060808789031215610e5e57600080fd5b8635955060208701359450604087013567ffffffffffffffff80821115610e8457600080fd5b610e908a838b01610dfc565b90965094506060890135915080821115610ea957600080fd5b50610eb689828a01610dfc565b979a9699509497509295939492505050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b858152606060208201526000610fa3606083018688610f60565b8281036040840152610fb6818587610f60565b98975050505050505050565b600060208284031215610fd457600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60005b83811015611041578181015183820152602001611029565b50506000910152565b6000825161105c818460208701611026565b9190910192915050565b6020815260008251806020840152611085816040850160208701611026565b601f01601f1916919091016040019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220ef3ac35a93e0bc422c32ddc5626edbb3121458d2f45c80dcb960589ffea6d6b764736f6c63430008180033","sourceMap":"506:2562:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;733:48;;;;;;;;;;-1:-1:-1;733:48:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;364:14:12;;357:22;339:41;;327:2;312:18;733:48:10;;;;;;;;1171:33;;;;;;;;;;-1:-1:-1;1171:33:10;;;;-1:-1:-1;;;;;1171:33:10;;;;;;-1:-1:-1;;;;;555:32:12;;;537:51;;525:2;510:18;1171:33:10;391:203:12;3315:197:5;;;;;;;;;;-1:-1:-1;3315:197:5;;;;;:::i;:::-;;:::i;:::-;;1298:39:10;;;;;;;;;;-1:-1:-1;1298:39:10;;;;-1:-1:-1;;;;;1298:39:10;;;3761:222:5;;;;;;:::i;:::-;;:::i;3004:131::-;;;;;;;;;;;;;:::i;:::-;;;2246:25:12;;;2234:2;2219:18;3004:131:5;2100:177:12;2071:101:0;;;;;;;;;;;;;:::i;1480:61:10:-;;;;;;;;;;;;1536:4;1480:61;;1441:85:0;;;;;;;;;;-1:-1:-1;1513:6:0;;-1:-1:-1;;;;;1513:6:0;1441:85;;1607:358:10;;;;;;;;;;-1:-1:-1;1607:358:10;;;;;:::i;:::-;;:::i;2321:198:0:-;;;;;;;;;;-1:-1:-1;2321:198:0;;;;;:::i;:::-;;:::i;1971:621:10:-;;;;;;;;;;-1:-1:-1;1971:621:10;;;;;:::i;:::-;;:::i;3315:197:5:-;-1:-1:-1;;;;;1898:6:5;1881:23;1889:4;1881:23;1873:80;;;;-1:-1:-1;;;1873:80:5;;;;;;;:::i;:::-;;;;;;;;;1995:6;-1:-1:-1;;;;;1971:30:5;:20;-1:-1:-1;;;;;;;;;;;1642:65:2;-1:-1:-1;;;;;1642:65:2;;1563:151;1971:20:5;-1:-1:-1;;;;;1971:30:5;;1963:87;;;;-1:-1:-1;;;1963:87:5;;;;;;;:::i;:::-;3398:36:::1;3416:17;3398;:36::i;:::-;3485:12;::::0;;3495:1:::1;3485:12:::0;;;::::1;::::0;::::1;::::0;;;3444:61:::1;::::0;3466:17;;3485:12;3444:21:::1;:61::i;:::-;3315:197:::0;:::o;3761:222::-;-1:-1:-1;;;;;1898:6:5;1881:23;1889:4;1881:23;1873:80;;;;-1:-1:-1;;;1873:80:5;;;;;;;:::i;:::-;1995:6;-1:-1:-1;;;;;1971:30:5;:20;-1:-1:-1;;;;;;;;;;;1642:65:2;-1:-1:-1;;;;;1642:65:2;;1563:151;1971:20:5;-1:-1:-1;;;;;1971:30:5;;1963:87;;;;-1:-1:-1;;;1963:87:5;;;;;;;:::i;:::-;3878:36:::1;3896:17;3878;:36::i;:::-;3924:52;3946:17;3965:4;3971;3924:21;:52::i;:::-;3761:222:::0;;:::o;3004:131::-;3082:7;2324:4;-1:-1:-1;;;;;2333:6:5;2316:23;;2308:92;;;;-1:-1:-1;;;2308:92:5;;4860:2:12;2308:92:5;;;4842:21:12;4899:2;4879:18;;;4872:30;4938:34;4918:18;;;4911:62;5009:26;4989:18;;;4982:54;5053:19;;2308:92:5;4658:420:12;2308:92:5;-1:-1:-1;;;;;;;;;;;;3004:131:5;:::o;2071:101:0:-;1334:13;:11;:13::i;:::-;2135:30:::1;2162:1;2135:18;:30::i;:::-;2071:101::o:0;1607:358:10:-;3111:19:4;3134:13;;;;;;3133:14;;3179:34;;;;-1:-1:-1;3197:12:4;;3212:1;3197:12;;;;:16;3179:34;3178:108;;;-1:-1:-1;3258:4:4;1476:19:6;:23;;;3219:66:4;;-1:-1:-1;3268:12:4;;;;;:17;3219:66;3157:201;;;;-1:-1:-1;;;3157:201:4;;5285:2:12;3157:201:4;;;5267:21:12;5324:2;5304:18;;;5297:30;5363:34;5343:18;;;5336:62;-1:-1:-1;;;5414:18:12;;;5407:44;5468:19;;3157:201:4;5083:410:12;3157:201:4;3368:12;:16;;-1:-1:-1;;3368:16:4;3383:1;3368:16;;;3394:65;;;;3428:13;:20;;-1:-1:-1;;3428:20:4;;;;;3394:65;1758:16:10::1;:14;:16::i;:::-;1784:24;:22;:24::i;:::-;1818:28;1837:8;1818:18;:28::i;:::-;1856:24;:52:::0;;-1:-1:-1;;;;;1856:52:10;;::::1;-1:-1:-1::0;;;;;;1856:52:10;;::::1;;::::0;;;1918:18:::1;:40:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;3479:99:4;;;;3529:5;3513:21;;-1:-1:-1;;3513:21:4;;;3553:14;;-1:-1:-1;5650:36:12;;3553:14:4;;5638:2:12;5623:18;3553:14:4;;;;;;;3479:99;3101:483;1607:358:10;;;:::o;2321:198:0:-;1334:13;:11;:13::i;:::-;-1:-1:-1;;;;;2409:22:0;::::1;2401:73;;;::::0;-1:-1:-1;;;2401:73:0;;5899:2:12;2401:73:0::1;::::0;::::1;5881:21:12::0;5938:2;5918:18;;;5911:30;5977:34;5957:18;;;5950:62;-1:-1:-1;;;6028:18:12;;;6021:36;6074:19;;2401:73:0::1;5697:402:12::0;2401:73:0::1;2484:28;2503:8;2484:18;:28::i;1971:621:10:-:0;2958:24;;-1:-1:-1;;;;;2958:24:10;2944:10;:38;2940:109;;3005:33;;-1:-1:-1;;;3005:33:10;;3027:10;3005:33;;;537:51:12;510:18;;3005:33:10;391:203:12;2940:109:10;2178:18:::1;2200:38;::::0;;::::1;2211:15:::0;2200:38:::1;:::i;:::-;2177:61;;2328:24;2678:18:::0;;-1:-1:-1;;;;;2678:18:10;1536:4;2678:43;;;2598:130;2328:24:::1;2324:147;;;2381:18;::::0;2368:92:::1;::::0;-1:-1:-1;;;2368:92:10;;-1:-1:-1;;;;;2381:18:10;;::::1;::::0;2368:44:::1;::::0;:92:::1;::::0;2413:14;;2429:15;;;;2446:13;;;;2368:92:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;2324:147;2481:28;::::0;;;:16:::1;:28;::::0;;;;;;:35;;-1:-1:-1;;2481:35:10::1;2512:4;2481:35;::::0;;2531:54;2498:10;;2531:54:::1;::::0;::::1;::::0;2567:17;2246:25:12;;2234:2;2219:18;;2100:177;2531:54:10::1;;;;;;;;2167:425;1971:621:::0;;;;;;:::o;2734:157::-;1334:13:0;:11;:13::i;2938:974:2:-;951:66;3384:59;;;3380:526;;;3459:37;3478:17;3459:18;:37::i;:::-;2938:974;;;:::o;3380:526::-;3560:17;-1:-1:-1;;;;;3531:61:2;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3531:63:2;;;;;;;;-1:-1:-1;;3531:63:2;;;;;;;;;;;;:::i;:::-;;;3527:302;;3758:56;;-1:-1:-1;;;3758:56:2;;7273:2:12;3758:56:2;;;7255:21:12;7312:2;7292:18;;;7285:30;7351:34;7331:18;;;7324:62;-1:-1:-1;;;7402:18:12;;;7395:44;7456:19;;3758:56:2;7071:410:12;3527:302:2;-1:-1:-1;;;;;;;;;;;3644:28:2;;3636:82;;;;-1:-1:-1;;;3636:82:2;;7688:2:12;3636:82:2;;;7670:21:12;7727:2;7707:18;;;7700:30;7766:34;7746:18;;;7739:62;-1:-1:-1;;;7817:18:12;;;7810:39;7866:19;;3636:82:2;7486:405:12;3636:82:2;3595:138;3842:53;3860:17;3879:4;3885:9;3842:17;:53::i;1599:130:0:-;1513:6;;-1:-1:-1;;;;;1513:6:0;929:10:7;1662:23:0;1654:68;;;;-1:-1:-1;;;1654:68:0;;8098:2:12;1654:68:0;;;8080:21:12;;;8117:18;;;8110:30;8176:34;8156:18;;;8149:62;8228:18;;1654:68:0;7896:356:12;2673:187:0;2765:6;;;-1:-1:-1;;;;;2781:17:0;;;-1:-1:-1;;;;;;2781:17:0;;;;;;;2813:40;;2765:6;;;2781:17;2765:6;;2813:40;;2746:16;;2813:40;2736:124;2673:187;:::o;1003:95::-;4910:13:4;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:4;;;;;;;:::i;:::-;1065:26:0::1;:24;:26::i;1042:67:5:-:0;4910:13:4;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:4;;;;;;;:::i;1805:281:2:-;-1:-1:-1;;;;;1476:19:6;;;1878:106:2;;;;-1:-1:-1;;;1878:106:2;;8871:2:12;1878:106:2;;;8853:21:12;8910:2;8890:18;;;8883:30;8949:34;8929:18;;;8922:62;-1:-1:-1;;;9000:18:12;;;8993:43;9053:19;;1878:106:2;8669:409:12;1878:106:2;-1:-1:-1;;;;;;;;;;;1994:85:2;;-1:-1:-1;;;;;;1994:85:2;-1:-1:-1;;;;;1994:85:2;;;;;;;;;;1805:281::o;2478:288::-;2616:29;2627:17;2616:10;:29::i;:::-;2673:1;2659:4;:11;:15;:28;;;;2678:9;2659:28;2655:105;;;2703:46;2725:17;2744:4;2703:21;:46::i;1104:111:0:-;4910:13:4;;;;;;;4902:69;;;;-1:-1:-1;;;4902:69:4;;;;;;;:::i;:::-;1176:32:0::1;929:10:7::0;1176:18:0::1;:32::i;2192:152:2:-:0;2258:37;2277:17;2258:18;:37::i;:::-;2310:27;;-1:-1:-1;;;;;2310:27:2;;;;;;;;2192:152;:::o;7088:455::-;7171:12;-1:-1:-1;;;;;1476:19:6;;;7195:88:2;;;;-1:-1:-1;;;7195:88:2;;9285:2:12;7195:88:2;;;9267:21:12;9324:2;9304:18;;;9297:30;9363:34;9343:18;;;9336:62;-1:-1:-1;;;9414:18:12;;;9407:36;9460:19;;7195:88:2;9083:402:12;7195:88:2;7354:12;7368:23;7395:6;-1:-1:-1;;;;;7395:19:2;7415:4;7395:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7353:67;;;;7437:99;7473:7;7482:10;7437:99;;;;;;;;;;;;;;;;;:35;:99::i;:::-;7430:106;7088:455;-1:-1:-1;;;;;7088:455:2:o;6622:742:6:-;6768:12;6796:7;6792:566;;;-1:-1:-1;6826:10:6;6819:17;;6792:566;6937:17;;:21;6933:415;;7181:10;7175:17;7241:15;7228:10;7224:2;7220:19;7213:44;6933:415;7320:12;7313:20;;-1:-1:-1;;;7313:20:6;;;;;;;;:::i;6933:415::-;6622:742;;;;;:::o;14:180:12:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:12;;14:180;-1:-1:-1;14:180:12:o;599:173::-;667:20;;-1:-1:-1;;;;;716:31:12;;706:42;;696:70;;762:1;759;752:12;696:70;599:173;;;:::o;777:186::-;836:6;889:2;877:9;868:7;864:23;860:32;857:52;;;905:1;902;895:12;857:52;928:29;947:9;928:29;:::i;968:127::-;1029:10;1024:3;1020:20;1017:1;1010:31;1060:4;1057:1;1050:15;1084:4;1081:1;1074:15;1100:995;1177:6;1185;1238:2;1226:9;1217:7;1213:23;1209:32;1206:52;;;1254:1;1251;1244:12;1206:52;1277:29;1296:9;1277:29;:::i;:::-;1267:39;;1357:2;1346:9;1342:18;1329:32;1380:18;1421:2;1413:6;1410:14;1407:34;;;1437:1;1434;1427:12;1407:34;1475:6;1464:9;1460:22;1450:32;;1520:7;1513:4;1509:2;1505:13;1501:27;1491:55;;1542:1;1539;1532:12;1491:55;1578:2;1565:16;1600:2;1596;1593:10;1590:36;;;1606:18;;:::i;:::-;1681:2;1675:9;1649:2;1735:13;;-1:-1:-1;;1731:22:12;;;1755:2;1727:31;1723:40;1711:53;;;1779:18;;;1799:22;;;1776:46;1773:72;;;1825:18;;:::i;:::-;1865:10;1861:2;1854:22;1900:2;1892:6;1885:18;1940:7;1935:2;1930;1926;1922:11;1918:20;1915:33;1912:53;;;1961:1;1958;1951:12;1912:53;2017:2;2012;2008;2004:11;1999:2;1991:6;1987:15;1974:46;2062:1;2057:2;2052;2044:6;2040:15;2036:24;2029:35;2083:6;2073:16;;;;;;;1100:995;;;;;:::o;2282:334::-;2359:6;2367;2375;2428:2;2416:9;2407:7;2403:23;2399:32;2396:52;;;2444:1;2441;2434:12;2396:52;2467:29;2486:9;2467:29;:::i;:::-;2457:39;;2515:38;2549:2;2538:9;2534:18;2515:38;:::i;:::-;2505:48;;2572:38;2606:2;2595:9;2591:18;2572:38;:::i;:::-;2562:48;;2282:334;;;;;:::o;2621:347::-;2672:8;2682:6;2736:3;2729:4;2721:6;2717:17;2713:27;2703:55;;2754:1;2751;2744:12;2703:55;-1:-1:-1;2777:20:12;;2820:18;2809:30;;2806:50;;;2852:1;2849;2842:12;2806:50;2889:4;2881:6;2877:17;2865:29;;2941:3;2934:4;2925:6;2917;2913:19;2909:30;2906:39;2903:59;;;2958:1;2955;2948:12;2903:59;2621:347;;;;;:::o;2973:854::-;3081:6;3089;3097;3105;3113;3121;3174:3;3162:9;3153:7;3149:23;3145:33;3142:53;;;3191:1;3188;3181:12;3142:53;3227:9;3214:23;3204:33;;3284:2;3273:9;3269:18;3256:32;3246:42;;3339:2;3328:9;3324:18;3311:32;3362:18;3403:2;3395:6;3392:14;3389:34;;;3419:1;3416;3409:12;3389:34;3458:58;3508:7;3499:6;3488:9;3484:22;3458:58;:::i;:::-;3535:8;;-1:-1:-1;3432:84:12;-1:-1:-1;3623:2:12;3608:18;;3595:32;;-1:-1:-1;3639:16:12;;;3636:36;;;3668:1;3665;3658:12;3636:36;;3707:60;3759:7;3748:8;3737:9;3733:24;3707:60;:::i;:::-;2973:854;;;;-1:-1:-1;2973:854:12;;-1:-1:-1;2973:854:12;;3786:8;;2973:854;-1:-1:-1;;;2973:854:12:o;3832:408::-;4034:2;4016:21;;;4073:2;4053:18;;;4046:30;4112:34;4107:2;4092:18;;4085:62;-1:-1:-1;;;4178:2:12;4163:18;;4156:42;4230:3;4215:19;;3832:408::o;4245:::-;4447:2;4429:21;;;4486:2;4466:18;;;4459:30;4525:34;4520:2;4505:18;;4498:62;-1:-1:-1;;;4591:2:12;4576:18;;4569:42;4643:3;4628:19;;4245:408::o;6104:266::-;6192:6;6187:3;6180:19;6244:6;6237:5;6230:4;6225:3;6221:14;6208:43;-1:-1:-1;6296:1:12;6271:16;;;6289:4;6267:27;;;6260:38;;;;6352:2;6331:15;;;-1:-1:-1;;6327:29:12;6318:39;;;6314:50;;6104:266::o;6375:502::-;6616:6;6605:9;6598:25;6659:2;6654;6643:9;6639:18;6632:30;6579:4;6685:61;6742:2;6731:9;6727:18;6719:6;6711;6685:61;:::i;:::-;6794:9;6786:6;6782:22;6777:2;6766:9;6762:18;6755:50;6822:49;6864:6;6856;6848;6822:49;:::i;:::-;6814:57;6375:502;-1:-1:-1;;;;;;;;6375:502:12:o;6882:184::-;6952:6;7005:2;6993:9;6984:7;6980:23;6976:32;6973:52;;;7021:1;7018;7011:12;6973:52;-1:-1:-1;7044:16:12;;6882:184;-1:-1:-1;6882:184:12:o;8257:407::-;8459:2;8441:21;;;8498:2;8478:18;;;8471:30;8537:34;8532:2;8517:18;;8510:62;-1:-1:-1;;;8603:2:12;8588:18;;8581:41;8654:3;8639:19;;8257:407::o;9490:250::-;9575:1;9585:113;9599:6;9596:1;9593:13;9585:113;;;9675:11;;;9669:18;9656:11;;;9649:39;9621:2;9614:10;9585:113;;;-1:-1:-1;;9732:1:12;9714:16;;9707:27;9490:250::o;9745:287::-;9874:3;9912:6;9906:13;9928:66;9987:6;9982:3;9975:4;9967:6;9963:17;9928:66;:::i;:::-;10010:16;;;;;9745:287;-1:-1:-1;;9745:287:12:o;10037:396::-;10186:2;10175:9;10168:21;10149:4;10218:6;10212:13;10261:6;10256:2;10245:9;10241:18;10234:34;10277:79;10349:6;10344:2;10333:9;10329:18;10324:2;10316:6;10312:15;10277:79;:::i;:::-;10417:2;10396:15;-1:-1:-1;;10392:29:12;10377:45;;;;10424:2;10373:54;;10037:396;-1:-1:-1;;10037:396:12:o","linkReferences":{},"immutableReferences":{"702":[{"start":595,"length":32},{"start":668,"length":32},{"start":827,"length":32},{"start":891,"length":32},{"start":1038,"length":32}]}},"methodIdentifiers":{"VERIFIER_MOCK_ADDRESS()":"83501b21","aggregatedProofs(bytes32)":"27d3bc9a","alignedAggregatorAddress()":"4c46688c","initialize(address,address,address)":"c0c53b8b","owner()":"8da5cb5b","proxiableUUID()":"52d1902d","renounceOwnership()":"715018a6","sp1VerifierAddress()":"294e3ccb","transferOwnership(address)":"f2fde38b","upgradeTo(address)":"3659cfe6","upgradeToAndCall(address,bytes)":"4f1ef286","verify(bytes32,bytes32,bytes,bytes)":"fc2b4271"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.24+commit.e11b9ed9\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"OnlyAlignedAggregator\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"blobVersionedHash\",\"type\":\"bytes32\"}],\"name\":\"AggregatedProofVerified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"VERIFIER_MOCK_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"aggregatedProofs\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"alignedAggregatorAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_alignedAggregatorAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sp1VerifierAddress\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sp1VerifierAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"blobVersionedHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"sp1ProgramVKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"sp1PublicValues\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sp1ProofBytes\",\"type\":\"bytes\"}],\"name\":\"verify\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is upgraded.\"},\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate that the this implementation remains valid after an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"},\"verify(bytes32,bytes32,bytes,bytes)\":{\"details\":\"This function is called by the aligned proof aggregator after collecting the proofs and aggregating them to be verified on-chain. We expect the blobTransactionHash to be called before\",\"params\":{\"blobVersionedHash\":\"the versioned hash of the blob transaction that contains the leaves that compose the merkle root.\",\"sp1ProgramVKey\":\"Public verifying key\",\"sp1ProofBytes\":\"Groth16 proof\",\"sp1PublicValues\":\"Values used to perform the execution\"}}},\"stateVariables\":{\"sp1VerifierAddress\":{\"details\":\"This can either be a specific SP1Verifier for a specific version, or the SP1VerifierGateway which can be used to verify proofs for any version of SP1. For the list of supported verifiers on each chain, see: https://docs.succinct.xyz/onchain-verification/contract-addresses\"}},\"version\":1},\"userdoc\":{\"events\":{\"AggregatedProofVerified(bytes32,bytes32)\":{\"notice\":\"event that gets emitted after a successful aggregated proof verification\"}},\"kind\":\"user\",\"methods\":{\"VERIFIER_MOCK_ADDRESS()\":{\"notice\":\"whether we are in dev mode or not if the sp1 verifier address is set to this address, then we skip verification\"},\"aggregatedProofs(bytes32)\":{\"notice\":\"Map the merkle root to a boolean to indicate it was verified\"},\"alignedAggregatorAddress()\":{\"notice\":\"The address of the Wallet that is allowed to call the verify function.\"},\"sp1VerifierAddress()\":{\"notice\":\"The address of the SP1 verifier contract.\"},\"verify(bytes32,bytes32,bytes,bytes)\":{\"notice\":\"Method to verify an aggregated proof from aligned\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/core/AlignedProofAggregationService.sol\":\"AlignedProofAggregationService\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":@openzeppelin-upgrades/contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/\",\":@sp1-contracts/=lib/sp1-contracts/contracts/src/\",\":ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/\",\":eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/\",\":eigenlayer-middleware/=lib/eigenlayer-middleware/src/\",\":eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/\",\":sp1-contracts/=lib/sp1-contracts/contracts/\"]},\"sources\":{\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a\",\"dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/draft-IERC1822Upgradeable.sol\":{\"keccak256\":\"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://496bd9b3df2455d571018c09f0c6badd29713fdeb907c6aa09d8d28cb603f053\",\"dweb:/ipfs/QmXdJDyYs6WMwMh21dez2BYPxhSUaUYFMDtVNcn2cgFR79\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol\":{\"keccak256\":\"0x315887e846f1e5f8d8fa535a229d318bb9290aaa69485117f1ee8a9a6b3be823\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://29dda00da6d269685b555e710e4abf1c3eb6d00c15b888a7880a2f8dd3c4fdc2\",\"dweb:/ipfs/QmSqcjtdECygtT1Gy7uEo42x8542srpgGEeKKHfcnQqXgn\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/proxy/beacon/IBeaconUpgradeable.sol\":{\"keccak256\":\"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4dbfe1a3b3b3fb64294ce41fd2ad362e7b7012208117864f42c1a67620a6d5c1\",\"dweb:/ipfs/QmVMU5tWt7zBQMmf5cpMX8UMHV86T3kFeTxBTBjFqVWfoJ\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x6e36e9b4b71de699c2f3f0d4e4d1aa0b35da99a26e8d5b91ef09ba234b4ef270\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://abfa467c53a0d60b4d09bf04aa952b1d1d44e5766fcc053aace078d7859b8419\",\"dweb:/ipfs/QmebVTZpyNxYfKYTuLMywzEJTdc1Ca8ME4xm3kR9gQgToG\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/StorageSlotUpgradeable.sol\":{\"keccak256\":\"0x09864aea84f01e39313375b5610c73a3c1c68abbdc51e5ccdd25ff977fdadf9a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://aedb48081190fa828d243529ce25c708202c7d4ccfe99f0e4ecd6bc0cfcd03f3\",\"dweb:/ipfs/QmWyiDQHPZA56iqsAwTmiJoxvNeRQLUVr4gTfzpdpXivpo\"]},\"lib/sp1-contracts/contracts/src/ISP1Verifier.sol\":{\"keccak256\":\"0x9e3ba64860bea920772dcf16be7946de2a2900d80bd51e9c0771184138f4f4d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0ec7230ca1fdd74edc6ab597d80bb345282aed3f0db4788ed96b4cc373ff46a3\",\"dweb:/ipfs/QmXPuSS5gzxMhFKWr1gsxBVu6WHh53ZZEvWkGgzrkM6Y7Q\"]},\"src/core/AlignedProofAggregationService.sol\":{\"keccak256\":\"0xb717bca806e3531be8d4512ab3bd9b699865defec9e40dcc197076d0359fac3a\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://db696a7b65946c85726906e36c7cb359b7f5af9bf819a29a34d26b99037e8f04\",\"dweb:/ipfs/QmPpeDLMYqVWdHEuU3yfGbJ4WUSJyb1bcQnYABFc1LaEbD\"]},\"src/core/IAlignedProofAggregationService.sol\":{\"keccak256\":\"0xe589d4753957ea2e224148fc01869d4ef08555ee39c78c33a0b896ef19e5c14a\",\"urls\":[\"bzz-raw://e05672de9007e7df6aecc70dff6d96dda5ae80a31aa48eb409552447785dc3a2\",\"dweb:/ipfs/QmQZoVcpcFGdA2vFBxB9Eg5aAKja37qs2fUBUNtLkR9Nuo\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.24+commit.e11b9ed9"},"language":"Solidity","output":{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"type":"error","name":"OnlyAlignedAggregator"},{"inputs":[{"internalType":"address","name":"previousAdmin","type":"address","indexed":false},{"internalType":"address","name":"newAdmin","type":"address","indexed":false}],"type":"event","name":"AdminChanged","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32","indexed":true},{"internalType":"bytes32","name":"blobVersionedHash","type":"bytes32","indexed":false}],"type":"event","name":"AggregatedProofVerified","anonymous":false},{"inputs":[{"internalType":"address","name":"beacon","type":"address","indexed":true}],"type":"event","name":"BeaconUpgraded","anonymous":false},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"implementation","type":"address","indexed":true}],"type":"event","name":"Upgraded","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"VERIFIER_MOCK_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function","name":"aggregatedProofs","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"alignedAggregatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"address","name":"_alignedAggregatorAddress","type":"address"},{"internalType":"address","name":"_sp1VerifierAddress","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[],"stateMutability":"view","type":"function","name":"sp1VerifierAddress","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"upgradeTo"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"payable","type":"function","name":"upgradeToAndCall"},{"inputs":[{"internalType":"bytes32","name":"blobVersionedHash","type":"bytes32"},{"internalType":"bytes32","name":"sp1ProgramVKey","type":"bytes32"},{"internalType":"bytes","name":"sp1PublicValues","type":"bytes"},{"internalType":"bytes","name":"sp1ProofBytes","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"verify"}],"devdoc":{"kind":"dev","methods":{"owner()":{"details":"Returns the address of the current owner."},"proxiableUUID()":{"details":"Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate that the this implementation remains valid after an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"upgradeTo(address)":{"details":"Upgrade the implementation of the proxy to `newImplementation`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"upgradeToAndCall(address,bytes)":{"details":"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event."},"verify(bytes32,bytes32,bytes,bytes)":{"details":"This function is called by the aligned proof aggregator after collecting the proofs and aggregating them to be verified on-chain. We expect the blobTransactionHash to be called before","params":{"blobVersionedHash":"the versioned hash of the blob transaction that contains the leaves that compose the merkle root.","sp1ProgramVKey":"Public verifying key","sp1ProofBytes":"Groth16 proof","sp1PublicValues":"Values used to perform the execution"}}},"version":1},"userdoc":{"kind":"user","methods":{"VERIFIER_MOCK_ADDRESS()":{"notice":"whether we are in dev mode or not if the sp1 verifier address is set to this address, then we skip verification"},"aggregatedProofs(bytes32)":{"notice":"Map the merkle root to a boolean to indicate it was verified"},"alignedAggregatorAddress()":{"notice":"The address of the Wallet that is allowed to call the verify function."},"sp1VerifierAddress()":{"notice":"The address of the SP1 verifier contract."},"verify(bytes32,bytes32,bytes,bytes)":{"notice":"Method to verify an aggregated proof from aligned"}},"version":1}},"settings":{"remappings":["@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","@openzeppelin-upgrades/contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/","@sp1-contracts/=lib/sp1-contracts/contracts/src/","ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/","eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/","eigenlayer-middleware/=lib/eigenlayer-middleware/src/","eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/openzeppelin-contracts/","openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/","sp1-contracts/=lib/sp1-contracts/contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/core/AlignedProofAggregationService.sol":"AlignedProofAggregationService"},"evmVersion":"paris","libraries":{}},"sources":{"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol":{"keccak256":"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888","urls":["bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a","dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/interfaces/draft-IERC1822Upgradeable.sol":{"keccak256":"0x77c89f893e403efc6929ba842b7ccf6534d4ffe03afe31670b4a528c0ad78c0f","urls":["bzz-raw://496bd9b3df2455d571018c09f0c6badd29713fdeb907c6aa09d8d28cb603f053","dweb:/ipfs/QmXdJDyYs6WMwMh21dez2BYPxhSUaUYFMDtVNcn2cgFR79"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol":{"keccak256":"0x315887e846f1e5f8d8fa535a229d318bb9290aaa69485117f1ee8a9a6b3be823","urls":["bzz-raw://29dda00da6d269685b555e710e4abf1c3eb6d00c15b888a7880a2f8dd3c4fdc2","dweb:/ipfs/QmSqcjtdECygtT1Gy7uEo42x8542srpgGEeKKHfcnQqXgn"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/proxy/beacon/IBeaconUpgradeable.sol":{"keccak256":"0x24b86ac8c005b8c654fbf6ac34a5a4f61580d7273541e83e013e89d66fbf0908","urls":["bzz-raw://4dbfe1a3b3b3fb64294ce41fd2ad362e7b7012208117864f42c1a67620a6d5c1","dweb:/ipfs/QmVMU5tWt7zBQMmf5cpMX8UMHV86T3kFeTxBTBjFqVWfoJ"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e","urls":["bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497","dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol":{"keccak256":"0x6e36e9b4b71de699c2f3f0d4e4d1aa0b35da99a26e8d5b91ef09ba234b4ef270","urls":["bzz-raw://abfa467c53a0d60b4d09bf04aa952b1d1d44e5766fcc053aace078d7859b8419","dweb:/ipfs/QmebVTZpyNxYfKYTuLMywzEJTdc1Ca8ME4xm3kR9gQgToG"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3","urls":["bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4","dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"keccak256":"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149","urls":["bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c","dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/StorageSlotUpgradeable.sol":{"keccak256":"0x09864aea84f01e39313375b5610c73a3c1c68abbdc51e5ccdd25ff977fdadf9a","urls":["bzz-raw://aedb48081190fa828d243529ce25c708202c7d4ccfe99f0e4ecd6bc0cfcd03f3","dweb:/ipfs/QmWyiDQHPZA56iqsAwTmiJoxvNeRQLUVr4gTfzpdpXivpo"],"license":"MIT"},"lib/sp1-contracts/contracts/src/ISP1Verifier.sol":{"keccak256":"0x9e3ba64860bea920772dcf16be7946de2a2900d80bd51e9c0771184138f4f4d3","urls":["bzz-raw://0ec7230ca1fdd74edc6ab597d80bb345282aed3f0db4788ed96b4cc373ff46a3","dweb:/ipfs/QmXPuSS5gzxMhFKWr1gsxBVu6WHh53ZZEvWkGgzrkM6Y7Q"],"license":"MIT"},"src/core/AlignedProofAggregationService.sol":{"keccak256":"0xb717bca806e3531be8d4512ab3bd9b699865defec9e40dcc197076d0359fac3a","urls":["bzz-raw://db696a7b65946c85726906e36c7cb359b7f5af9bf819a29a34d26b99037e8f04","dweb:/ipfs/QmPpeDLMYqVWdHEuU3yfGbJ4WUSJyb1bcQnYABFc1LaEbD"],"license":"UNLICENSED"},"src/core/IAlignedProofAggregationService.sol":{"keccak256":"0xe589d4753957ea2e224148fc01869d4ef08555ee39c78c33a0b896ef19e5c14a","urls":["bzz-raw://e05672de9007e7df6aecc70dff6d96dda5ae80a31aa48eb409552447785dc3a2","dweb:/ipfs/QmQZoVcpcFGdA2vFBxB9Eg5aAKja37qs2fUBUNtLkR9Nuo"],"license":null}},"version":1},"id":10} \ No newline at end of file diff --git a/explorer/lib/explorer/beacon_client.ex b/explorer/lib/explorer/beacon_client.ex new file mode 100644 index 0000000000..754e5b481e --- /dev/null +++ b/explorer/lib/explorer/beacon_client.ex @@ -0,0 +1,78 @@ +defmodule Explorer.BeaconClient do + require Logger + @beacon_url System.get_env("BEACON_CLIENT") + # See https://eips.ethereum.org/EIPS/eip-4844#parameters + @versioned_hash_version_kzg 0x01 + + def fetch_blob_by_versioned_hash!(slot, blob_versioned_hash) do + {:ok, blobs} = get_block_blobs(slot) + data = Map.get(blobs, "data") + + Enum.find(data, fn blob -> + get_blob_versioned_hash(blob) == blob_versioned_hash + end) + end + + def get_blob_versioned_hash(blob) do + kzg_commitment = String.replace(Map.get(blob, "kzg_commitment"), "0x", "") + kzg_commitment = Base.decode16!(kzg_commitment, case: :mixed) + hash = Explorer.Utils.sha256_hash_raw(kzg_commitment) + # See https://eips.ethereum.org/EIPS/eip-4844#helpers + <<_first::8, rest::binary>> = hash + raw = <<@versioned_hash_version_kzg::8>> <> rest + "0x" <> Base.encode16(raw, case: :lower) + end + + def get_block_slot(beacon_block) do + String.to_integer( + beacon_block + |> Map.get("data") + |> Map.get("header") + |> Map.get("message") + |> Map.get("slot") + ) + end + + def get_block_header_by_hash(block_hash) do + beacon_get("/eth/v1/beacon/headers/#{block_hash}") + end + + def get_block_header_by_parent_hash(parent_block_hash) do + case beacon_get("/eth/v1/beacon/headers?parent_root=#{parent_block_hash}") do + {:ok, header} -> + data = header["data"] |> Enum.at(0) + + {:ok, %{header | "data" => data}} + + other -> + other + end + end + + def get_block_blobs(slot) do + beacon_get("/eth/v1/beacon/blob_sidecars/#{slot}") + end + + defp beacon_get(method) do + headers = [{"Content-Type", "application/json"}] + request = Finch.build(:get, "#{@beacon_url}#{method}", headers) + response = Finch.request(request, Explorer.Finch) + + case response do + {:ok, %Finch.Response{status: 200, body: body}} -> + case Jason.decode(body) do + {:ok, decoded_body} -> + {:ok, decoded_body} + + {:error, _} -> + {:error, :invalid_json} + end + + {:ok, %Finch.Response{status: status}} -> + {:error, status} + + {:error, reason} -> + {:error, reason} + end + end +end diff --git a/explorer/lib/explorer/contract_managers/aligned_proof_aggregation_service.ex b/explorer/lib/explorer/contract_managers/aligned_proof_aggregation_service.ex new file mode 100644 index 0000000000..4040370a2c --- /dev/null +++ b/explorer/lib/explorer/contract_managers/aligned_proof_aggregation_service.ex @@ -0,0 +1,136 @@ +defmodule AlignedProofAggregationService do + require Logger + + @aligned_config_file System.get_env("ALIGNED_PROOF_AGG_CONFIG_FILE") + + config_file_path = + case @aligned_config_file do + nil -> raise("ALIGNED_PROOF_AGG_CONFIG_FILE not set in .env") + file -> file + end + + {status, config_json_string} = File.read(config_file_path) + + case status do + :ok -> + Logger.debug("Aligned deployment file read successfully") + + :error -> + raise( + "Config file not read successfully, make sure your .env is correctly created, and make sure Eigenlayer config file is correctly stored" + ) + end + + @contract_address Jason.decode!(config_json_string) + |> Map.get("addresses") + |> Map.get("alignedProofAggregationService") + + use Ethers.Contract, + abi_file: "lib/abi/AlignedProofAggregationService.json", + default_address: @contract_address + + def get_address() do + @contract_address + end + + def get_aggregated_proof_event(%{from_block: fromBlock, to_block: toBlock}) do + events = + AlignedProofAggregationService.EventFilters.aggregated_proof_verified(nil) + |> Ethers.get_logs(fromBlock: fromBlock, toBlock: toBlock) + + case events do + {:ok, []} -> + {:ok, []} + + {:ok, list} -> + {:ok, + Enum.map(list, fn x -> + data = x |> Map.get(:data) + topics_raw = x |> Map.get(:topics_raw) + block_number = x |> Map.get(:block_number) + tx_hash = x |> Map.get(:transaction_hash) + + %{ + merkle_root: + topics_raw + |> Enum.at(1), + blob_versioned_hash: "0x" <> Base.encode16(data |> Enum.at(0), case: :lower), + block_number: block_number, + block_timestamp: get_block_timestamp(block_number), + tx_hash: tx_hash + } + end)} + + {:error, reason} -> + {:error, reason} + end + end + + def get_block_timestamp(block_number) do + case Ethers.Utils.get_block_timestamp(block_number) do + {:ok, timestamp} -> DateTime.from_unix!(timestamp) + {:error, error} -> raise("Error fetching block timestamp: #{error}") + end + end + + def get_blob_data!(aggregated_proof) do + {:ok, block} = + Explorer.EthClient.get_block_by_number( + Explorer.Utils.decimal_to_hex(aggregated_proof.block_number) + ) + + parent_beacon_block_hash = Map.get(block, "parentBeaconBlockRoot") + + {:ok, beacon_block} = + Explorer.BeaconClient.get_block_header_by_parent_hash(parent_beacon_block_hash) + + slot = Explorer.BeaconClient.get_block_slot(beacon_block) + + data = + Explorer.BeaconClient.fetch_blob_by_versioned_hash!( + slot, + aggregated_proof.blob_versioned_hash + ) + + Map.get(data, "blob") + end + + @doc """ + Decodes blob data represented as an ASCII charlist. + """ + def decode_blob(blob_data), do: decode_blob(blob_data, [[]], 0, 0, 0) + + defp decode_blob([], acc, _current_count, _total_count, _i), do: acc + + defp decode_blob([head | tail], acc, current_count, total_count, i) do + # Every 64 characters (or 32 bytes) there is a 00 for padding + should_skip = rem(total_count, 64) == 0 + + case should_skip do + true -> + [_head | tail] = tail + decode_blob(tail, acc, current_count, total_count + 2, i) + + false -> + acc = List.update_at(acc, i, fn chunk -> chunk ++ [head] end) + + case current_count + 1 < 64 do + true -> + decode_blob(tail, acc, current_count + 1, total_count + 1, i) + + false -> + current_blob = Enum.at(acc, i) + # 48 is 0 in ascii + is_all_zeroes = Enum.all?(current_blob, fn x -> x == 48 end) + + ## If the hash is all zeroed, then there are no more hashes in the blob + if is_all_zeroes do + # Drop last limiter zeroed element + Enum.drop(acc, -1) + else + decode_blob(tail, acc ++ [[]], 0, total_count + 1, i + 1) + end + end + end + end +end diff --git a/explorer/lib/explorer/eth_client.ex b/explorer/lib/explorer/eth_client.ex new file mode 100644 index 0000000000..61756e01ac --- /dev/null +++ b/explorer/lib/explorer/eth_client.ex @@ -0,0 +1,30 @@ +defmodule Explorer.EthClient do + require Logger + @rpc_url System.get_env("RPC_URL") + + def get_block_by_number(block_number) do + eth_send("eth_getBlockByNumber", [block_number, false]) + end + + defp eth_send(method, params, id \\ 1) do + headers = [{"Content-Type", "application/json"}] + body = Jason.encode!(%{jsonrpc: "2.0", method: method, params: params, id: id}) + request = Finch.build(:post, @rpc_url, headers, body) + response = Finch.request(request, Explorer.Finch, []) + + case response do + {:ok, %Finch.Response{status: 200, body: body}} -> + case Jason.decode(body) do + {:ok, %{error: error} = _} -> {:error, error.message} + {:ok, body} -> {:ok, Map.get(body, "result")} + {:error, _} -> {:error, :invalid_json} + end + + {:ok, %Finch.Response{status: status}} -> + {:error, status} + + {:error, reason} -> + {:error, reason} + end + end +end diff --git a/explorer/lib/explorer/models/aggregated_proofs.ex b/explorer/lib/explorer/models/aggregated_proofs.ex new file mode 100644 index 0000000000..ae60e3bc54 --- /dev/null +++ b/explorer/lib/explorer/models/aggregated_proofs.ex @@ -0,0 +1,62 @@ +defmodule AggregatedProofs do + require Logger + use Ecto.Schema + import Ecto.Changeset + + @primary_key {:id, :binary_id, autogenerate: true} + schema "aggregated_proofs" do + field(:merkle_root, :string) + field(:blob_versioned_hash, :string) + field(:block_number, :integer) + field(:block_timestamp, :utc_datetime) + field(:tx_hash, :string) + field(:number_of_proofs, :integer) + + has_many(:proofs_agg_mode, AggregationModeProof, + foreign_key: :agg_proof_id, + references: :id + ) + + timestamps() + end + + @doc """ + Creates a changeset based on the given `attrs`. + """ + def changeset(aggregated_proof, attrs) do + aggregated_proof + |> cast(attrs, [ + :id, + :merkle_root, + :blob_versioned_hash, + :block_number, + :block_timestamp, + :tx_hash, + :number_of_proofs + ]) + |> validate_required([ + :merkle_root, + :blob_versioned_hash, + :block_number, + :block_timestamp, + :tx_hash, + :number_of_proofs + ]) + |> unique_constraint(:id) + end + + def insert_or_update(agg_proof) do + changeset = AggregatedProofs.changeset(%AggregatedProofs{}, agg_proof) + + case Explorer.Repo.get_by(AggregatedProofs, block_number: agg_proof.block_number) do + nil -> + Explorer.Repo.insert(changeset) + + existing_agg_proof -> + "Updating aggregated proof" |> Logger.debug() + + Ecto.Changeset.change(existing_agg_proof, changeset.changes) + |> Explorer.Repo.update() + end + end +end diff --git a/explorer/lib/explorer/models/aggregation_mode_proof.ex b/explorer/lib/explorer/models/aggregation_mode_proof.ex new file mode 100644 index 0000000000..d23aa62283 --- /dev/null +++ b/explorer/lib/explorer/models/aggregation_mode_proof.ex @@ -0,0 +1,50 @@ +defmodule AggregationModeProof do + require Logger + use Ecto.Schema + import Ecto.Changeset + + # Different from proofs.ex (we could use the same but the hashes are constructed different) + @primary_key {:id, :id, autogenerate: true} + schema "proofs_agg_mode" do + field(:agg_proof_id, :binary_id) + field(:proof_hash, :string) + field(:index, :integer) + + belongs_to(:aggregated_proof, AggregatedProof, + define_field: false, + foreign_key: :agg_proof_id, + references: :id, + type: :binary_id + ) + + timestamps() + end + + def changeset(proof, attrs) do + proof + |> cast(attrs, [:agg_proof_id, :proof_hash, :index]) + |> validate_required([:agg_proof_id, :proof_hash, :index]) + end + + def insert_or_update(proof) do + changeset = + AggregationModeProof.changeset(%AggregationModeProof{}, proof) + + case( + Explorer.Repo.get_by(AggregationModeProof, + agg_proof_id: proof.agg_proof_id, + proof_hash: proof.proof_hash, + index: proof.index + ) + ) do + nil -> + Explorer.Repo.insert(changeset) + + existing_proof -> + "Updating single aggregated proof" |> Logger.debug() + + Ecto.Changeset.change(existing_proof, changeset.changes) + |> Explorer.Repo.update() + end + end +end diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex index 54f1accc1c..077519a46c 100644 --- a/explorer/lib/explorer/periodically.ex +++ b/explorer/lib/explorer/periodically.ex @@ -16,9 +16,15 @@ defmodule Explorer.Periodically do one_second = 1000 seconds_in_an_hour = 60 * 60 - :timer.send_interval(one_second * 60, :next_batch_progress) # every minute - :timer.send_interval(one_second * 12, :batches) # every 12 seconds, once per block - :timer.send_interval(one_second * seconds_in_an_hour, :restakings) # every 1 hour + # every minute + :timer.send_interval(one_second * 60, :next_batch_progress) + # every 12 seconds, once per block + :timer.send_interval(one_second * 12, :batches) + # every 1 hour + :timer.send_interval(one_second * seconds_in_an_hour, :restakings) + + # Fetch new aggregated proofs every 1 minute + :timer.send_interval(one_second * 60, :aggregated_proofs) end # Reads and process last blocks for operators and restaking changes @@ -37,13 +43,14 @@ defmodule Explorer.Periodically do def handle_info(:next_batch_progress, state) do Logger.debug("handling block progress timer") - remaining_time = ExplorerWeb.Helpers.get_next_scheduled_batch_remaining_time() + remaining_time = ExplorerWeb.Helpers.get_next_scheduled_batch_remaining_time() + PubSub.broadcast(Explorer.PubSub, "update_views", %{ next_scheduled_batch_remaining_time_percentage: ExplorerWeb.Helpers.get_next_scheduled_batch_remaining_time_percentage(remaining_time), next_scheduled_batch_remaining_time: remaining_time - }) - + }) + {:noreply, state} end @@ -68,6 +75,71 @@ defmodule Explorer.Periodically do {:noreply, %{state | batches_count: new_count}} end + def handle_info(:aggregated_proofs, state) do + # This task runs every hour + # We read a bit more than 300 blocks (1hr) to make sure we don't lose any event + read_block_qty = 310 + latest_block_number = AlignedLayerServiceManager.get_latest_block_number() + read_from_block = max(0, latest_block_number - read_block_qty) + + Task.start(fn -> process_aggregated_proofs(read_from_block, latest_block_number) end) + + {:noreply, state} + end + + def process_aggregated_proofs(from_block, to_block) do + "Processing aggregated proofs from #{from_block} to #{to_block}" |> Logger.debug() + + {:ok, proofs} = + AlignedProofAggregationService.get_aggregated_proof_event(%{ + from_block: from_block, + to_block: to_block + }) + + blob_data = + proofs + |> Enum.map(&AlignedProofAggregationService.get_blob_data!/1) + + proof_hashes = + blob_data + |> Enum.map(fn x -> + AlignedProofAggregationService.decode_blob( + to_charlist(String.replace_prefix(x, "0x", "")) + ) + end) + + # Store aggregated proofs to db + proofs = + proofs + |> Enum.zip(proof_hashes) + |> Enum.map(fn {agg_proof, hashes} -> + agg_proof = + agg_proof + |> Map.merge(%{number_of_proofs: length(hashes)}) + + {:ok, %{id: id}} = AggregatedProofs.insert_or_update(agg_proof) + + Map.merge(agg_proof, %{id: id}) + end) + + # Store each individual proof + proofs + |> Enum.zip(proof_hashes) + |> Enum.each(fn {agg_proof, hashes} -> + hashes + |> Enum.with_index() + |> Enum.each(fn {hash, index} -> + AggregationModeProof.insert_or_update(%{ + agg_proof_id: agg_proof.id, + proof_hash: "0x" <> List.to_string(hash), + index: index + }) + end) + end) + + "Done processing aggregated proofs from #{from_block} to #{to_block}" |> Logger.debug() + end + def process_batches(fromBlock, toBlock) do "Processing from block #{fromBlock} to block #{toBlock}..." |> Logger.debug() @@ -108,6 +180,7 @@ defmodule Explorer.Periodically do else {:error, reason} -> Logger.error("Error processing batch #{batch.merkle_root}. Error: #{inspect(reason)}") + # no changes in DB nil -> nil diff --git a/explorer/lib/explorer/utils.ex b/explorer/lib/explorer/utils.ex new file mode 100644 index 0000000000..4f3c1fd7db --- /dev/null +++ b/explorer/lib/explorer/utils.ex @@ -0,0 +1,15 @@ +defmodule Explorer.Utils do + def sha256_hash(data) do + ## Base 16 encoder needed as crypto.hash returns raw bytes + :crypto.hash(:sha256, data) |> Base.encode16(case: :lower) + end + + ## Returns hash raw bytes + def sha256_hash_raw(data) do + :crypto.hash(:sha256, data) + end + + def decimal_to_hex(number) do + "0x#{Integer.to_string(number, 16)}" + end +end diff --git a/explorer/mix.lock b/explorer/mix.lock index 17f684b6a1..35210e9d11 100644 --- a/explorer/mix.lock +++ b/explorer/mix.lock @@ -4,6 +4,7 @@ "castore": {:hex, :castore, "1.0.8", "dedcf20ea746694647f883590b82d9e96014057aff1d44d03ec90f36a5c0dc6e", [:mix], [], "hexpm", "0b2b66d2ee742cb1d9cb8c8be3b43c3a70ee8651f37b75a8b982e036752983f1"}, "cbor": {:hex, :cbor, "1.0.1", "39511158e8ea5a57c1fcb9639aaa7efde67129678fee49ebbda780f6f24959b0", [:mix], [], "hexpm", "5431acbe7a7908f17f6a9cd43311002836a34a8ab01876918d8cfb709cd8b6a2"}, "certifi": {:hex, :certifi, "2.12.0", "2d1cca2ec95f59643862af91f001478c9863c2ac9cb6e2f89780bfd8de987329", [:rebar3], [], "hexpm", "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"}, + "cors_plug": {:hex, :cors_plug, "3.0.3", "7c3ac52b39624bc616db2e937c282f3f623f25f8d550068b6710e58d04a0e330", [:mix], [{:plug, "~> 1.13", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "3f2d759e8c272ed3835fab2ef11b46bddab8c1ab9528167bd463b6452edf830d"}, "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm", "ce708e5f094b9cd4e8f2be4f00d2f4250c4095be93f8cd6d018c753894885430"}, @@ -23,7 +24,7 @@ "floki": {:hex, :floki, "0.36.2", "a7da0193538c93f937714a6704369711998a51a6164a222d710ebd54020aa7a3", [:mix], [], "hexpm", "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"}, "gettext": {:hex, :gettext, "0.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"}, "hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~> 2.12.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"}, - "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized"]}, + "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized", depth: 1]}, "hpax": {:hex, :hpax, "0.2.0", "5a58219adcb75977b2edce5eb22051de9362f08236220c9e859a47111c194ff5", [:mix], [], "hexpm", "bea06558cdae85bed075e6c036993d43cd54d447f76d8190a8db0dc5893fa2f1"}, "httpoison": {:hex, :httpoison, "2.2.1", "87b7ed6d95db0389f7df02779644171d7319d319178f6680438167d7b69b1f3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "51364e6d2f429d80e14fe4b5f8e39719cacd03eb3f9a9286e61e216feac2d2df"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, diff --git a/explorer/priv/repo/migrations/20250407002009_create_aggregated_proofs.exs b/explorer/priv/repo/migrations/20250407002009_create_aggregated_proofs.exs new file mode 100644 index 0000000000..22a8362881 --- /dev/null +++ b/explorer/priv/repo/migrations/20250407002009_create_aggregated_proofs.exs @@ -0,0 +1,33 @@ +defmodule Explorer.Repo.Migrations.CreateAggregatedProofs do + use Ecto.Migration + + def change do + create table(:aggregated_proofs, primary_key: false) do + add(:id, :binary_id, primary_key: true) + add(:merkle_root, :string) + add(:tx_hash, :string) + add(:blob_versioned_hash, :string) + add(:number_of_proofs, :integer) + add(:block_number, :integer) + add(:block_timestamp, :utc_datetime) + + timestamps() + end + + create table(:proofs_agg_mode) do + add( + :agg_proof_id, + references(:aggregated_proofs, + column: :id, + type: :binary_id, + on_delete: :delete_all + ) + ) + + add(:proof_hash, :string) + add(:index, :integer) + + timestamps() + end + end +end diff --git a/explorer/start.sh b/explorer/start.sh index 91469d1a45..d2cd8206b7 100755 --- a/explorer/start.sh +++ b/explorer/start.sh @@ -18,6 +18,8 @@ env_vars=( "BATCH_TTL_MINUTES" "SCHEDULED_BATCH_INTERVAL_MINUTES" "LATEST_RELEASE" + "ALIGNED_PROOF_AGG_CONFIG_FILE" + "BEACON_CLIENT" ) for var in "${env_vars[@]}"; do