// Pulled from https://github.com/ethereum-optimism/optimism/blob/4d13f0afe8869faf7bba45d8339998525ebc5161/packages/contracts-bedrock/contracts/libraries/trie/MerkleTrie.sol // as this is the last version of Optimism's Merkle Trie library that supports nonexistence proofs; support was removed // in the next commit for some version. // Copyright 2020-2021 Optimism // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* Library Imports */ import { MerkleTrie } from "./MerkleTrie.sol"; /** * @title SecureMerkleTrie * @notice SecureMerkleTrie is a thin wrapper around the MerkleTrie library that hashes the input * keys. Ethereum's state trie hashes input keys before storing them. */ library SecureMerkleTrie { /** * @notice Verifies a proof that a given key/value pair is present in the Merkle trie. * * @param _key Key of the node to search for, as a hex string. * @param _value Value of the node to search for, as a hex string. * @param _proof Merkle trie inclusion proof for the desired node. Unlike traditional Merkle * trees, this proof is executed top-down and consists of a list of RLP-encoded * nodes that make a path down to the target node. * @param _root Known root of the Merkle trie. Used to verify that the included proof is * correctly constructed. * * @return Whether or not the proof is valid. */ function verifyInclusionProof( bytes memory _key, bytes memory _value, bytes[] memory _proof, bytes32 _root ) internal pure returns (bool) { bytes memory key = _getSecureKey(_key); return MerkleTrie.verifyInclusionProof(key, _value, _proof, _root); } /** * @notice Retrieves the value associated with a given key. * * @param _key Key to search for, as hex bytes. * @param _proof Merkle trie inclusion proof for the key. * @param _root Known root of the Merkle trie. * * @return Whether or not the key exists. * @return Value of the key if it exists. */ function get( bytes memory _key, bytes[] memory _proof, bytes32 _root ) internal pure returns (bool, bytes memory) { bytes memory key = _getSecureKey(_key); return MerkleTrie.get(key, _proof, _root); } /** * @notice Computes the hashed version of the input key. * * @param _key Key to hash. * * @return Hashed version of the key. */ function _getSecureKey(bytes memory _key) private pure returns (bytes memory) { return abi.encodePacked(keccak256(_key)); } }