diff --git a/packages/backend/discovery/_templates/opstack/SystemConfig/shape/SystemConfig_v2_3_0_beta_5.sol b/packages/backend/discovery/_templates/opstack/SystemConfig/shape/SystemConfig_v2_3_0_beta_5.sol
new file mode 100644
index 00000000000..1ac878635d7
--- /dev/null
+++ b/packages/backend/discovery/_templates/opstack/SystemConfig/shape/SystemConfig_v2_3_0_beta_5.sol
@@ -0,0 +1,2240 @@
+// SPDX-License-Identifier: Unknown
+pragma solidity 0.8.15;
+
+library Constants {
+ /// @notice Special address to be used as the tx origin for gas estimation calls in the
+ /// OptimismPortal and CrossDomainMessenger calls. You only need to use this address if
+ /// the minimum gas limit specified by the user is not actually enough to execute the
+ /// given message and you're attempting to estimate the actual necessary gas limit. We
+ /// use address(1) because it's the ecrecover precompile and therefore guaranteed to
+ /// never have any code on any EVM chain.
+ address internal constant ESTIMATION_ADDRESS = address(1);
+
+ /// @notice Value used for the L2 sender storage slot in both the OptimismPortal and the
+ /// CrossDomainMessenger contracts before an actual sender is set. This value is
+ /// non-zero to reduce the gas cost of message passing transactions.
+ address internal constant DEFAULT_L2_SENDER = 0x000000000000000000000000000000000000dEaD;
+
+ /// @notice The storage slot that holds the address of a proxy implementation.
+ /// @dev `bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)`
+ bytes32 internal constant PROXY_IMPLEMENTATION_ADDRESS =
+ 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
+
+ /// @notice The storage slot that holds the address of the owner.
+ /// @dev `bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)`
+ bytes32 internal constant PROXY_OWNER_ADDRESS = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
+
+ /// @notice The address that represents ether when dealing with ERC20 token addresses.
+ address internal constant ETHER = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
+
+ /// @notice The address that represents the system caller responsible for L1 attributes
+ /// transactions.
+ address internal constant DEPOSITOR_ACCOUNT = 0xDeaDDEaDDeAdDeAdDEAdDEaddeAddEAdDEAd0001;
+
+ /// @notice Returns the default values for the ResourceConfig. These are the recommended values
+ /// for a production network.
+ function DEFAULT_RESOURCE_CONFIG() internal pure returns (IResourceMetering.ResourceConfig memory) {
+ IResourceMetering.ResourceConfig memory config = IResourceMetering.ResourceConfig({
+ maxResourceLimit: 20_000_000,
+ elasticityMultiplier: 10,
+ baseFeeMaxChangeDenominator: 8,
+ minimumBaseFee: 1 gwei,
+ systemTxMaxGas: 1_000_000,
+ maximumBaseFee: type(uint128).max
+ });
+ return config;
+ }
+}
+
+library LibString {
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
+ /* CUSTOM ERRORS */
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
+
+ /// @dev The length of the output is too small to contain all the hex digits.
+ error HexLengthInsufficient();
+
+ /// @dev The length of the string is more than 32 bytes.
+ error TooBigForSmallString();
+
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
+ /* CONSTANTS */
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
+
+ /// @dev The constant returned when the `search` is not found in the string.
+ uint256 internal constant NOT_FOUND = type(uint256).max;
+
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
+ /* DECIMAL OPERATIONS */
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
+
+ /// @dev Returns the base 10 decimal representation of `value`.
+ function toString(uint256 value) internal pure returns (string memory str) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
+ // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
+ // We will need 1 word for the trailing zeros padding, 1 word for the length,
+ // and 3 words for a maximum of 78 digits.
+ str := add(mload(0x40), 0x80)
+ // Update the free memory pointer to allocate.
+ mstore(0x40, add(str, 0x20))
+ // Zeroize the slot after the string.
+ mstore(str, 0)
+
+ // Cache the end of the memory to calculate the length later.
+ let end := str
+
+ let w := not(0) // Tsk.
+ // We write the string from rightmost digit to leftmost digit.
+ // The following is essentially a do-while loop that also handles the zero case.
+ for { let temp := value } 1 {} {
+ str := add(str, w) // `sub(str, 1)`.
+ // Write the character to the pointer.
+ // The ASCII index of the '0' character is 48.
+ mstore8(str, add(48, mod(temp, 10)))
+ // Keep dividing `temp` until zero.
+ temp := div(temp, 10)
+ if iszero(temp) { break }
+ }
+
+ let length := sub(end, str)
+ // Move the pointer 32 bytes leftwards to make room for the length.
+ str := sub(str, 0x20)
+ // Store the length.
+ mstore(str, length)
+ }
+ }
+
+ /// @dev Returns the base 10 decimal representation of `value`.
+ function toString(int256 value) internal pure returns (string memory str) {
+ if (value >= 0) {
+ return toString(uint256(value));
+ }
+ unchecked {
+ str = toString(uint256(-value));
+ }
+ /// @solidity memory-safe-assembly
+ assembly {
+ // We still have some spare memory space on the left,
+ // as we have allocated 3 words (96 bytes) for up to 78 digits.
+ let length := mload(str) // Load the string length.
+ mstore(str, 0x2d) // Store the '-' character.
+ str := sub(str, 1) // Move back the string pointer by a byte.
+ mstore(str, add(length, 1)) // Update the string length.
+ }
+ }
+
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
+ /* HEXADECIMAL OPERATIONS */
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
+
+ /// @dev Returns the hexadecimal representation of `value`,
+ /// left-padded to an input length of `length` bytes.
+ /// The output is prefixed with "0x" encoded using 2 hexadecimal digits per byte,
+ /// giving a total length of `length * 2 + 2` bytes.
+ /// Reverts if `length` is too small for the output to contain all the digits.
+ function toHexString(uint256 value, uint256 length) internal pure returns (string memory str) {
+ str = toHexStringNoPrefix(value, length);
+ /// @solidity memory-safe-assembly
+ assembly {
+ let strLength := add(mload(str), 2) // Compute the length.
+ mstore(str, 0x3078) // Write the "0x" prefix.
+ str := sub(str, 2) // Move the pointer.
+ mstore(str, strLength) // Write the length.
+ }
+ }
+
+ /// @dev Returns the hexadecimal representation of `value`,
+ /// left-padded to an input length of `length` bytes.
+ /// The output is prefixed with "0x" encoded using 2 hexadecimal digits per byte,
+ /// giving a total length of `length * 2` bytes.
+ /// Reverts if `length` is too small for the output to contain all the digits.
+ function toHexStringNoPrefix(uint256 value, uint256 length)
+ internal
+ pure
+ returns (string memory str)
+ {
+ /// @solidity memory-safe-assembly
+ assembly {
+ // We need 0x20 bytes for the trailing zeros padding, `length * 2` bytes
+ // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length.
+ // We add 0x20 to the total and round down to a multiple of 0x20.
+ // (0x20 + 0x20 + 0x02 + 0x20) = 0x62.
+ str := add(mload(0x40), and(add(shl(1, length), 0x42), not(0x1f)))
+ // Allocate the memory.
+ mstore(0x40, add(str, 0x20))
+ // Zeroize the slot after the string.
+ mstore(str, 0)
+
+ // Cache the end to calculate the length later.
+ let end := str
+ // Store "0123456789abcdef" in scratch space.
+ mstore(0x0f, 0x30313233343536373839616263646566)
+
+ let start := sub(str, add(length, length))
+ let w := not(1) // Tsk.
+ let temp := value
+ // We write the string from rightmost digit to leftmost digit.
+ // The following is essentially a do-while loop that also handles the zero case.
+ for {} 1 {} {
+ str := add(str, w) // `sub(str, 2)`.
+ mstore8(add(str, 1), mload(and(temp, 15)))
+ mstore8(str, mload(and(shr(4, temp), 15)))
+ temp := shr(8, temp)
+ if iszero(xor(str, start)) { break }
+ }
+
+ if temp {
+ mstore(0x00, 0x2194895a) // `HexLengthInsufficient()`.
+ revert(0x1c, 0x04)
+ }
+
+ // Compute the string's length.
+ let strLength := sub(end, str)
+ // Move the pointer and write the length.
+ str := sub(str, 0x20)
+ mstore(str, strLength)
+ }
+ }
+
+ /// @dev Returns the hexadecimal representation of `value`.
+ /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte.
+ /// As address are 20 bytes long, the output will left-padded to have
+ /// a length of `20 * 2 + 2` bytes.
+ function toHexString(uint256 value) internal pure returns (string memory str) {
+ str = toHexStringNoPrefix(value);
+ /// @solidity memory-safe-assembly
+ assembly {
+ let strLength := add(mload(str), 2) // Compute the length.
+ mstore(str, 0x3078) // Write the "0x" prefix.
+ str := sub(str, 2) // Move the pointer.
+ mstore(str, strLength) // Write the length.
+ }
+ }
+
+ /// @dev Returns the hexadecimal representation of `value`.
+ /// The output is prefixed with "0x".
+ /// The output excludes leading "0" from the `toHexString` output.
+ /// `0x00: "0x0", 0x01: "0x1", 0x12: "0x12", 0x123: "0x123"`.
+ function toMinimalHexString(uint256 value) internal pure returns (string memory str) {
+ str = toHexStringNoPrefix(value);
+ /// @solidity memory-safe-assembly
+ assembly {
+ let o := eq(byte(0, mload(add(str, 0x20))), 0x30) // Whether leading zero is present.
+ let strLength := add(mload(str), 2) // Compute the length.
+ mstore(add(str, o), 0x3078) // Write the "0x" prefix, accounting for leading zero.
+ str := sub(add(str, o), 2) // Move the pointer, accounting for leading zero.
+ mstore(str, sub(strLength, o)) // Write the length, accounting for leading zero.
+ }
+ }
+
+ /// @dev Returns the hexadecimal representation of `value`.
+ /// The output excludes leading "0" from the `toHexStringNoPrefix` output.
+ /// `0x00: "0", 0x01: "1", 0x12: "12", 0x123: "123"`.
+ function toMinimalHexStringNoPrefix(uint256 value) internal pure returns (string memory str) {
+ str = toHexStringNoPrefix(value);
+ /// @solidity memory-safe-assembly
+ assembly {
+ let o := eq(byte(0, mload(add(str, 0x20))), 0x30) // Whether leading zero is present.
+ let strLength := mload(str) // Get the length.
+ str := add(str, o) // Move the pointer, accounting for leading zero.
+ mstore(str, sub(strLength, o)) // Write the length, accounting for leading zero.
+ }
+ }
+
+ /// @dev Returns the hexadecimal representation of `value`.
+ /// The output is encoded using 2 hexadecimal digits per byte.
+ /// As address are 20 bytes long, the output will left-padded to have
+ /// a length of `20 * 2` bytes.
+ function toHexStringNoPrefix(uint256 value) internal pure returns (string memory str) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,
+ // 0x02 bytes for the prefix, and 0x40 bytes for the digits.
+ // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0.
+ str := add(mload(0x40), 0x80)
+ // Allocate the memory.
+ mstore(0x40, add(str, 0x20))
+ // Zeroize the slot after the string.
+ mstore(str, 0)
+
+ // Cache the end to calculate the length later.
+ let end := str
+ // Store "0123456789abcdef" in scratch space.
+ mstore(0x0f, 0x30313233343536373839616263646566)
+
+ let w := not(1) // Tsk.
+ // We write the string from rightmost digit to leftmost digit.
+ // The following is essentially a do-while loop that also handles the zero case.
+ for { let temp := value } 1 {} {
+ str := add(str, w) // `sub(str, 2)`.
+ mstore8(add(str, 1), mload(and(temp, 15)))
+ mstore8(str, mload(and(shr(4, temp), 15)))
+ temp := shr(8, temp)
+ if iszero(temp) { break }
+ }
+
+ // Compute the string's length.
+ let strLength := sub(end, str)
+ // Move the pointer and write the length.
+ str := sub(str, 0x20)
+ mstore(str, strLength)
+ }
+ }
+
+ /// @dev Returns the hexadecimal representation of `value`.
+ /// The output is prefixed with "0x", encoded using 2 hexadecimal digits per byte,
+ /// and the alphabets are capitalized conditionally according to
+ /// https://eips.ethereum.org/EIPS/eip-55
+ function toHexStringChecksummed(address value) internal pure returns (string memory str) {
+ str = toHexString(value);
+ /// @solidity memory-safe-assembly
+ assembly {
+ let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...`
+ let o := add(str, 0x22)
+ let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... `
+ let t := shl(240, 136) // `0b10001000 << 240`
+ for { let i := 0 } 1 {} {
+ mstore(add(i, i), mul(t, byte(i, hashed)))
+ i := add(i, 1)
+ if eq(i, 20) { break }
+ }
+ mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask)))))
+ o := add(o, 0x20)
+ mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask)))))
+ }
+ }
+
+ /// @dev Returns the hexadecimal representation of `value`.
+ /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte.
+ function toHexString(address value) internal pure returns (string memory str) {
+ str = toHexStringNoPrefix(value);
+ /// @solidity memory-safe-assembly
+ assembly {
+ let strLength := add(mload(str), 2) // Compute the length.
+ mstore(str, 0x3078) // Write the "0x" prefix.
+ str := sub(str, 2) // Move the pointer.
+ mstore(str, strLength) // Write the length.
+ }
+ }
+
+ /// @dev Returns the hexadecimal representation of `value`.
+ /// The output is encoded using 2 hexadecimal digits per byte.
+ function toHexStringNoPrefix(address value) internal pure returns (string memory str) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ str := mload(0x40)
+
+ // Allocate the memory.
+ // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length,
+ // 0x02 bytes for the prefix, and 0x28 bytes for the digits.
+ // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80.
+ mstore(0x40, add(str, 0x80))
+
+ // Store "0123456789abcdef" in scratch space.
+ mstore(0x0f, 0x30313233343536373839616263646566)
+
+ str := add(str, 2)
+ mstore(str, 40)
+
+ let o := add(str, 0x20)
+ mstore(add(o, 40), 0)
+
+ value := shl(96, value)
+
+ // We write the string from rightmost digit to leftmost digit.
+ // The following is essentially a do-while loop that also handles the zero case.
+ for { let i := 0 } 1 {} {
+ let p := add(o, add(i, i))
+ let temp := byte(i, value)
+ mstore8(add(p, 1), mload(and(temp, 15)))
+ mstore8(p, mload(shr(4, temp)))
+ i := add(i, 1)
+ if eq(i, 20) { break }
+ }
+ }
+ }
+
+ /// @dev Returns the hex encoded string from the raw bytes.
+ /// The output is encoded using 2 hexadecimal digits per byte.
+ function toHexString(bytes memory raw) internal pure returns (string memory str) {
+ str = toHexStringNoPrefix(raw);
+ /// @solidity memory-safe-assembly
+ assembly {
+ let strLength := add(mload(str), 2) // Compute the length.
+ mstore(str, 0x3078) // Write the "0x" prefix.
+ str := sub(str, 2) // Move the pointer.
+ mstore(str, strLength) // Write the length.
+ }
+ }
+
+ /// @dev Returns the hex encoded string from the raw bytes.
+ /// The output is encoded using 2 hexadecimal digits per byte.
+ function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory str) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ let length := mload(raw)
+ str := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix.
+ mstore(str, add(length, length)) // Store the length of the output.
+
+ // Store "0123456789abcdef" in scratch space.
+ mstore(0x0f, 0x30313233343536373839616263646566)
+
+ let o := add(str, 0x20)
+ let end := add(raw, length)
+
+ for {} iszero(eq(raw, end)) {} {
+ raw := add(raw, 1)
+ mstore8(add(o, 1), mload(and(mload(raw), 15)))
+ mstore8(o, mload(and(shr(4, mload(raw)), 15)))
+ o := add(o, 2)
+ }
+ mstore(o, 0) // Zeroize the slot after the string.
+ mstore(0x40, add(o, 0x20)) // Allocate the memory.
+ }
+ }
+
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
+ /* RUNE STRING OPERATIONS */
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
+
+ /// @dev Returns the number of UTF characters in the string.
+ function runeCount(string memory s) internal pure returns (uint256 result) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ if mload(s) {
+ mstore(0x00, div(not(0), 255))
+ mstore(0x20, 0x0202020202020202020202020202020202020202020202020303030304040506)
+ let o := add(s, 0x20)
+ let end := add(o, mload(s))
+ for { result := 1 } 1 { result := add(result, 1) } {
+ o := add(o, byte(0, mload(shr(250, mload(o)))))
+ if iszero(lt(o, end)) { break }
+ }
+ }
+ }
+ }
+
+ /// @dev Returns if this string is a 7-bit ASCII string.
+ /// (i.e. all characters codes are in [0..127])
+ function is7BitASCII(string memory s) internal pure returns (bool result) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ let mask := shl(7, div(not(0), 255))
+ result := 1
+ let n := mload(s)
+ if n {
+ let o := add(s, 0x20)
+ let end := add(o, n)
+ let last := mload(end)
+ mstore(end, 0)
+ for {} 1 {} {
+ if and(mask, mload(o)) {
+ result := 0
+ break
+ }
+ o := add(o, 0x20)
+ if iszero(lt(o, end)) { break }
+ }
+ mstore(end, last)
+ }
+ }
+ }
+
+ /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
+ /* BYTE STRING OPERATIONS */
+ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/
+
+ // For performance and bytecode compactness, byte string operations are restricted
+ // to 7-bit ASCII strings. All offsets are byte offsets, not UTF character offsets.
+ // Usage of byte string operations on charsets with runes spanning two or more bytes
+ // can lead to undefined behavior.
+
+ /// @dev Returns `subject` all occurrences of `search` replaced with `replacement`.
+ function replace(string memory subject, string memory search, string memory replacement)
+ internal
+ pure
+ returns (string memory result)
+ {
+ /// @solidity memory-safe-assembly
+ assembly {
+ let subjectLength := mload(subject)
+ let searchLength := mload(search)
+ let replacementLength := mload(replacement)
+
+ subject := add(subject, 0x20)
+ search := add(search, 0x20)
+ replacement := add(replacement, 0x20)
+ result := add(mload(0x40), 0x20)
+
+ let subjectEnd := add(subject, subjectLength)
+ if iszero(gt(searchLength, subjectLength)) {
+ let subjectSearchEnd := add(sub(subjectEnd, searchLength), 1)
+ let h := 0
+ if iszero(lt(searchLength, 0x20)) { h := keccak256(search, searchLength) }
+ let m := shl(3, sub(0x20, and(searchLength, 0x1f)))
+ let s := mload(search)
+ for {} 1 {} {
+ let t := mload(subject)
+ // Whether the first `searchLength % 32` bytes of
+ // `subject` and `search` matches.
+ if iszero(shr(m, xor(t, s))) {
+ if h {
+ if iszero(eq(keccak256(subject, searchLength), h)) {
+ mstore(result, t)
+ result := add(result, 1)
+ subject := add(subject, 1)
+ if iszero(lt(subject, subjectSearchEnd)) { break }
+ continue
+ }
+ }
+ // Copy the `replacement` one word at a time.
+ for { let o := 0 } 1 {} {
+ mstore(add(result, o), mload(add(replacement, o)))
+ o := add(o, 0x20)
+ if iszero(lt(o, replacementLength)) { break }
+ }
+ result := add(result, replacementLength)
+ subject := add(subject, searchLength)
+ if searchLength {
+ if iszero(lt(subject, subjectSearchEnd)) { break }
+ continue
+ }
+ }
+ mstore(result, t)
+ result := add(result, 1)
+ subject := add(subject, 1)
+ if iszero(lt(subject, subjectSearchEnd)) { break }
+ }
+ }
+
+ let resultRemainder := result
+ result := add(mload(0x40), 0x20)
+ let k := add(sub(resultRemainder, result), sub(subjectEnd, subject))
+ // Copy the rest of the string one word at a time.
+ for {} lt(subject, subjectEnd) {} {
+ mstore(resultRemainder, mload(subject))
+ resultRemainder := add(resultRemainder, 0x20)
+ subject := add(subject, 0x20)
+ }
+ result := sub(result, 0x20)
+ let last := add(add(result, 0x20), k) // Zeroize the slot after the string.
+ mstore(last, 0)
+ mstore(0x40, add(last, 0x20)) // Allocate the memory.
+ mstore(result, k) // Store the length.
+ }
+ }
+
+ /// @dev Returns the byte index of the first location of `search` in `subject`,
+ /// searching from left to right, starting from `from`.
+ /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found.
+ function indexOf(string memory subject, string memory search, uint256 from)
+ internal
+ pure
+ returns (uint256 result)
+ {
+ /// @solidity memory-safe-assembly
+ assembly {
+ for { let subjectLength := mload(subject) } 1 {} {
+ if iszero(mload(search)) {
+ if iszero(gt(from, subjectLength)) {
+ result := from
+ break
+ }
+ result := subjectLength
+ break
+ }
+ let searchLength := mload(search)
+ let subjectStart := add(subject, 0x20)
+
+ result := not(0) // Initialize to `NOT_FOUND`.
+
+ subject := add(subjectStart, from)
+ let end := add(sub(add(subjectStart, subjectLength), searchLength), 1)
+
+ let m := shl(3, sub(0x20, and(searchLength, 0x1f)))
+ let s := mload(add(search, 0x20))
+
+ if iszero(and(lt(subject, end), lt(from, subjectLength))) { break }
+
+ if iszero(lt(searchLength, 0x20)) {
+ for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} {
+ if iszero(shr(m, xor(mload(subject), s))) {
+ if eq(keccak256(subject, searchLength), h) {
+ result := sub(subject, subjectStart)
+ break
+ }
+ }
+ subject := add(subject, 1)
+ if iszero(lt(subject, end)) { break }
+ }
+ break
+ }
+ for {} 1 {} {
+ if iszero(shr(m, xor(mload(subject), s))) {
+ result := sub(subject, subjectStart)
+ break
+ }
+ subject := add(subject, 1)
+ if iszero(lt(subject, end)) { break }
+ }
+ break
+ }
+ }
+ }
+
+ /// @dev Returns the byte index of the first location of `search` in `subject`,
+ /// searching from left to right.
+ /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found.
+ function indexOf(string memory subject, string memory search)
+ internal
+ pure
+ returns (uint256 result)
+ {
+ result = indexOf(subject, search, 0);
+ }
+
+ /// @dev Returns the byte index of the first location of `search` in `subject`,
+ /// searching from right to left, starting from `from`.
+ /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found.
+ function lastIndexOf(string memory subject, string memory search, uint256 from)
+ internal
+ pure
+ returns (uint256 result)
+ {
+ /// @solidity memory-safe-assembly
+ assembly {
+ for {} 1 {} {
+ result := not(0) // Initialize to `NOT_FOUND`.
+ let searchLength := mload(search)
+ if gt(searchLength, mload(subject)) { break }
+ let w := result
+
+ let fromMax := sub(mload(subject), searchLength)
+ if iszero(gt(fromMax, from)) { from := fromMax }
+
+ let end := add(add(subject, 0x20), w)
+ subject := add(add(subject, 0x20), from)
+ if iszero(gt(subject, end)) { break }
+ // As this function is not too often used,
+ // we shall simply use keccak256 for smaller bytecode size.
+ for { let h := keccak256(add(search, 0x20), searchLength) } 1 {} {
+ if eq(keccak256(subject, searchLength), h) {
+ result := sub(subject, add(end, 1))
+ break
+ }
+ subject := add(subject, w) // `sub(subject, 1)`.
+ if iszero(gt(subject, end)) { break }
+ }
+ break
+ }
+ }
+ }
+
+ /// @dev Returns the byte index of the first location of `search` in `subject`,
+ /// searching from right to left.
+ /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `search` is not found.
+ function lastIndexOf(string memory subject, string memory search)
+ internal
+ pure
+ returns (uint256 result)
+ {
+ result = lastIndexOf(subject, search, uint256(int256(-1)));
+ }
+
+ /// @dev Returns true if `search` is found in `subject`, false otherwise.
+ function contains(string memory subject, string memory search) internal pure returns (bool) {
+ return indexOf(subject, search) != NOT_FOUND;
+ }
+
+ /// @dev Returns whether `subject` starts with `search`.
+ function startsWith(string memory subject, string memory search)
+ internal
+ pure
+ returns (bool result)
+ {
+ /// @solidity memory-safe-assembly
+ assembly {
+ let searchLength := mload(search)
+ // Just using keccak256 directly is actually cheaper.
+ // forgefmt: disable-next-item
+ result := and(
+ iszero(gt(searchLength, mload(subject))),
+ eq(
+ keccak256(add(subject, 0x20), searchLength),
+ keccak256(add(search, 0x20), searchLength)
+ )
+ )
+ }
+ }
+
+ /// @dev Returns whether `subject` ends with `search`.
+ function endsWith(string memory subject, string memory search)
+ internal
+ pure
+ returns (bool result)
+ {
+ /// @solidity memory-safe-assembly
+ assembly {
+ let searchLength := mload(search)
+ let subjectLength := mload(subject)
+ // Whether `search` is not longer than `subject`.
+ let withinRange := iszero(gt(searchLength, subjectLength))
+ // Just using keccak256 directly is actually cheaper.
+ // forgefmt: disable-next-item
+ result := and(
+ withinRange,
+ eq(
+ keccak256(
+ // `subject + 0x20 + max(subjectLength - searchLength, 0)`.
+ add(add(subject, 0x20), mul(withinRange, sub(subjectLength, searchLength))),
+ searchLength
+ ),
+ keccak256(add(search, 0x20), searchLength)
+ )
+ )
+ }
+ }
+
+ /// @dev Returns `subject` repeated `times`.
+ function repeat(string memory subject, uint256 times)
+ internal
+ pure
+ returns (string memory result)
+ {
+ /// @solidity memory-safe-assembly
+ assembly {
+ let subjectLength := mload(subject)
+ if iszero(or(iszero(times), iszero(subjectLength))) {
+ subject := add(subject, 0x20)
+ result := mload(0x40)
+ let output := add(result, 0x20)
+ for {} 1 {} {
+ // Copy the `subject` one word at a time.
+ for { let o := 0 } 1 {} {
+ mstore(add(output, o), mload(add(subject, o)))
+ o := add(o, 0x20)
+ if iszero(lt(o, subjectLength)) { break }
+ }
+ output := add(output, subjectLength)
+ times := sub(times, 1)
+ if iszero(times) { break }
+ }
+ mstore(output, 0) // Zeroize the slot after the string.
+ let resultLength := sub(output, add(result, 0x20))
+ mstore(result, resultLength) // Store the length.
+ // Allocate the memory.
+ mstore(0x40, add(result, add(resultLength, 0x20)))
+ }
+ }
+ }
+
+ /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive).
+ /// `start` and `end` are byte offsets.
+ function slice(string memory subject, uint256 start, uint256 end)
+ internal
+ pure
+ returns (string memory result)
+ {
+ /// @solidity memory-safe-assembly
+ assembly {
+ let subjectLength := mload(subject)
+ if iszero(gt(subjectLength, end)) { end := subjectLength }
+ if iszero(gt(subjectLength, start)) { start := subjectLength }
+ if lt(start, end) {
+ result := mload(0x40)
+ let resultLength := sub(end, start)
+ mstore(result, resultLength)
+ subject := add(subject, start)
+ let w := not(0x1f)
+ // Copy the `subject` one word at a time, backwards.
+ for { let o := and(add(resultLength, 0x1f), w) } 1 {} {
+ mstore(add(result, o), mload(add(subject, o)))
+ o := add(o, w) // `sub(o, 0x20)`.
+ if iszero(o) { break }
+ }
+ // Zeroize the slot after the string.
+ mstore(add(add(result, 0x20), resultLength), 0)
+ // Allocate memory for the length and the bytes,
+ // rounded up to a multiple of 32.
+ mstore(0x40, add(result, and(add(resultLength, 0x3f), w)))
+ }
+ }
+ }
+
+ /// @dev Returns a copy of `subject` sliced from `start` to the end of the string.
+ /// `start` is a byte offset.
+ function slice(string memory subject, uint256 start)
+ internal
+ pure
+ returns (string memory result)
+ {
+ result = slice(subject, start, uint256(int256(-1)));
+ }
+
+ /// @dev Returns all the indices of `search` in `subject`.
+ /// The indices are byte offsets.
+ function indicesOf(string memory subject, string memory search)
+ internal
+ pure
+ returns (uint256[] memory result)
+ {
+ /// @solidity memory-safe-assembly
+ assembly {
+ let subjectLength := mload(subject)
+ let searchLength := mload(search)
+
+ if iszero(gt(searchLength, subjectLength)) {
+ subject := add(subject, 0x20)
+ search := add(search, 0x20)
+ result := add(mload(0x40), 0x20)
+
+ let subjectStart := subject
+ let subjectSearchEnd := add(sub(add(subject, subjectLength), searchLength), 1)
+ let h := 0
+ if iszero(lt(searchLength, 0x20)) { h := keccak256(search, searchLength) }
+ let m := shl(3, sub(0x20, and(searchLength, 0x1f)))
+ let s := mload(search)
+ for {} 1 {} {
+ let t := mload(subject)
+ // Whether the first `searchLength % 32` bytes of
+ // `subject` and `search` matches.
+ if iszero(shr(m, xor(t, s))) {
+ if h {
+ if iszero(eq(keccak256(subject, searchLength), h)) {
+ subject := add(subject, 1)
+ if iszero(lt(subject, subjectSearchEnd)) { break }
+ continue
+ }
+ }
+ // Append to `result`.
+ mstore(result, sub(subject, subjectStart))
+ result := add(result, 0x20)
+ // Advance `subject` by `searchLength`.
+ subject := add(subject, searchLength)
+ if searchLength {
+ if iszero(lt(subject, subjectSearchEnd)) { break }
+ continue
+ }
+ }
+ subject := add(subject, 1)
+ if iszero(lt(subject, subjectSearchEnd)) { break }
+ }
+ let resultEnd := result
+ // Assign `result` to the free memory pointer.
+ result := mload(0x40)
+ // Store the length of `result`.
+ mstore(result, shr(5, sub(resultEnd, add(result, 0x20))))
+ // Allocate memory for result.
+ // We allocate one more word, so this array can be recycled for {split}.
+ mstore(0x40, add(resultEnd, 0x20))
+ }
+ }
+ }
+
+ /// @dev Returns a arrays of strings based on the `delimiter` inside of the `subject` string.
+ function split(string memory subject, string memory delimiter)
+ internal
+ pure
+ returns (string[] memory result)
+ {
+ uint256[] memory indices = indicesOf(subject, delimiter);
+ /// @solidity memory-safe-assembly
+ assembly {
+ let w := not(0x1f)
+ let indexPtr := add(indices, 0x20)
+ let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1)))
+ mstore(add(indicesEnd, w), mload(subject))
+ mstore(indices, add(mload(indices), 1))
+ let prevIndex := 0
+ for {} 1 {} {
+ let index := mload(indexPtr)
+ mstore(indexPtr, 0x60)
+ if iszero(eq(index, prevIndex)) {
+ let element := mload(0x40)
+ let elementLength := sub(index, prevIndex)
+ mstore(element, elementLength)
+ // Copy the `subject` one word at a time, backwards.
+ for { let o := and(add(elementLength, 0x1f), w) } 1 {} {
+ mstore(add(element, o), mload(add(add(subject, prevIndex), o)))
+ o := add(o, w) // `sub(o, 0x20)`.
+ if iszero(o) { break }
+ }
+ // Zeroize the slot after the string.
+ mstore(add(add(element, 0x20), elementLength), 0)
+ // Allocate memory for the length and the bytes,
+ // rounded up to a multiple of 32.
+ mstore(0x40, add(element, and(add(elementLength, 0x3f), w)))
+ // Store the `element` into the array.
+ mstore(indexPtr, element)
+ }
+ prevIndex := add(index, mload(delimiter))
+ indexPtr := add(indexPtr, 0x20)
+ if iszero(lt(indexPtr, indicesEnd)) { break }
+ }
+ result := indices
+ if iszero(mload(delimiter)) {
+ result := add(indices, 0x20)
+ mstore(result, sub(mload(indices), 2))
+ }
+ }
+ }
+
+ /// @dev Returns a concatenated string of `a` and `b`.
+ /// Cheaper than `string.concat()` and does not de-align the free memory pointer.
+ function concat(string memory a, string memory b)
+ internal
+ pure
+ returns (string memory result)
+ {
+ /// @solidity memory-safe-assembly
+ assembly {
+ let w := not(0x1f)
+ result := mload(0x40)
+ let aLength := mload(a)
+ // Copy `a` one word at a time, backwards.
+ for { let o := and(add(aLength, 0x20), w) } 1 {} {
+ mstore(add(result, o), mload(add(a, o)))
+ o := add(o, w) // `sub(o, 0x20)`.
+ if iszero(o) { break }
+ }
+ let bLength := mload(b)
+ let output := add(result, aLength)
+ // Copy `b` one word at a time, backwards.
+ for { let o := and(add(bLength, 0x20), w) } 1 {} {
+ mstore(add(output, o), mload(add(b, o)))
+ o := add(o, w) // `sub(o, 0x20)`.
+ if iszero(o) { break }
+ }
+ let totalLength := add(aLength, bLength)
+ let last := add(add(result, 0x20), totalLength)
+ // Zeroize the slot after the string.
+ mstore(last, 0)
+ // Stores the length.
+ mstore(result, totalLength)
+ // Allocate memory for the length and the bytes,
+ // rounded up to a multiple of 32.
+ mstore(0x40, and(add(last, 0x1f), w))
+ }
+ }
+
+ /// @dev Returns a copy of the string in either lowercase or UPPERCASE.
+ /// WARNING! This function is only compatible with 7-bit ASCII strings.
+ function toCase(string memory subject, bool toUpper)
+ internal
+ pure
+ returns (string memory result)
+ {
+ /// @solidity memory-safe-assembly
+ assembly {
+ let length := mload(subject)
+ if length {
+ result := add(mload(0x40), 0x20)
+ subject := add(subject, 1)
+ let flags := shl(add(70, shl(5, toUpper)), 0x3ffffff)
+ let w := not(0)
+ for { let o := length } 1 {} {
+ o := add(o, w)
+ let b := and(0xff, mload(add(subject, o)))
+ mstore8(add(result, o), xor(b, and(shr(b, flags), 0x20)))
+ if iszero(o) { break }
+ }
+ result := mload(0x40)
+ mstore(result, length) // Store the length.
+ let last := add(add(result, 0x20), length)
+ mstore(last, 0) // Zeroize the slot after the string.
+ mstore(0x40, add(last, 0x20)) // Allocate the memory.
+ }
+ }
+ }
+
+ /// @dev Returns a string from a small bytes32 string.
+ /// `s` must be null-terminated, or behavior will be undefined.
+ function fromSmallString(bytes32 s) internal pure returns (string memory result) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ result := mload(0x40)
+ let n := 0
+ for {} byte(n, s) { n := add(n, 1) } {} // Scan for '\0'.
+ mstore(result, n)
+ let o := add(result, 0x20)
+ mstore(o, s)
+ mstore(add(o, n), 0)
+ mstore(0x40, add(result, 0x40))
+ }
+ }
+
+ /// @dev Returns the small string, with all bytes after the first null byte zeroized.
+ function normalizeSmallString(bytes32 s) internal pure returns (bytes32 result) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ for {} byte(result, s) { result := add(result, 1) } {} // Scan for '\0'.
+ mstore(0x00, s)
+ mstore(result, 0x00)
+ result := mload(0x00)
+ }
+ }
+
+ /// @dev Returns the string as a normalized null-terminated small string.
+ function toSmallString(string memory s) internal pure returns (bytes32 result) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ result := mload(s)
+ if iszero(lt(result, 33)) {
+ mstore(0x00, 0xec92f9a3) // `TooBigForSmallString()`.
+ revert(0x1c, 0x04)
+ }
+ result := shl(shl(3, sub(32, result)), mload(add(s, result)))
+ }
+ }
+
+ /// @dev Returns a lowercased copy of the string.
+ /// WARNING! This function is only compatible with 7-bit ASCII strings.
+ function lower(string memory subject) internal pure returns (string memory result) {
+ result = toCase(subject, false);
+ }
+
+ /// @dev Returns an UPPERCASED copy of the string.
+ /// WARNING! This function is only compatible with 7-bit ASCII strings.
+ function upper(string memory subject) internal pure returns (string memory result) {
+ result = toCase(subject, true);
+ }
+
+ /// @dev Escapes the string to be used within HTML tags.
+ function escapeHTML(string memory s) internal pure returns (string memory result) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ let end := add(s, mload(s))
+ result := add(mload(0x40), 0x20)
+ // Store the bytes of the packed offsets and strides into the scratch space.
+ // `packed = (stride << 5) | offset`. Max offset is 20. Max stride is 6.
+ mstore(0x1f, 0x900094)
+ mstore(0x08, 0xc0000000a6ab)
+ // Store ""&'<>" into the scratch space.
+ mstore(0x00, shl(64, 0x2671756f743b26616d703b262333393b266c743b2667743b))
+ for {} iszero(eq(s, end)) {} {
+ s := add(s, 1)
+ let c := and(mload(s), 0xff)
+ // Not in `["\"","'","&","<",">"]`.
+ if iszero(and(shl(c, 1), 0x500000c400000000)) {
+ mstore8(result, c)
+ result := add(result, 1)
+ continue
+ }
+ let t := shr(248, mload(c))
+ mstore(result, mload(and(t, 0x1f)))
+ result := add(result, shr(5, t))
+ }
+ let last := result
+ mstore(last, 0) // Zeroize the slot after the string.
+ result := mload(0x40)
+ mstore(result, sub(last, add(result, 0x20))) // Store the length.
+ mstore(0x40, add(last, 0x20)) // Allocate the memory.
+ }
+ }
+
+ /// @dev Escapes the string to be used within double-quotes in a JSON.
+ /// If `addDoubleQuotes` is true, the result will be enclosed in double-quotes.
+ function escapeJSON(string memory s, bool addDoubleQuotes)
+ internal
+ pure
+ returns (string memory result)
+ {
+ /// @solidity memory-safe-assembly
+ assembly {
+ let end := add(s, mload(s))
+ result := add(mload(0x40), 0x20)
+ if addDoubleQuotes {
+ mstore8(result, 34)
+ result := add(1, result)
+ }
+ // Store "\\u0000" in scratch space.
+ // Store "0123456789abcdef" in scratch space.
+ // Also, store `{0x08:"b", 0x09:"t", 0x0a:"n", 0x0c:"f", 0x0d:"r"}`.
+ // into the scratch space.
+ mstore(0x15, 0x5c75303030303031323334353637383961626364656662746e006672)
+ // Bitmask for detecting `["\"","\\"]`.
+ let e := or(shl(0x22, 1), shl(0x5c, 1))
+ for {} iszero(eq(s, end)) {} {
+ s := add(s, 1)
+ let c := and(mload(s), 0xff)
+ if iszero(lt(c, 0x20)) {
+ if iszero(and(shl(c, 1), e)) {
+ // Not in `["\"","\\"]`.
+ mstore8(result, c)
+ result := add(result, 1)
+ continue
+ }
+ mstore8(result, 0x5c) // "\\".
+ mstore8(add(result, 1), c)
+ result := add(result, 2)
+ continue
+ }
+ if iszero(and(shl(c, 1), 0x3700)) {
+ // Not in `["\b","\t","\n","\f","\d"]`.
+ mstore8(0x1d, mload(shr(4, c))) // Hex value.
+ mstore8(0x1e, mload(and(c, 15))) // Hex value.
+ mstore(result, mload(0x19)) // "\\u00XX".
+ result := add(result, 6)
+ continue
+ }
+ mstore8(result, 0x5c) // "\\".
+ mstore8(add(result, 1), mload(add(c, 8)))
+ result := add(result, 2)
+ }
+ if addDoubleQuotes {
+ mstore8(result, 34)
+ result := add(1, result)
+ }
+ let last := result
+ mstore(last, 0) // Zeroize the slot after the string.
+ result := mload(0x40)
+ mstore(result, sub(last, add(result, 0x20))) // Store the length.
+ mstore(0x40, add(last, 0x20)) // Allocate the memory.
+ }
+ }
+
+ /// @dev Escapes the string to be used within double-quotes in a JSON.
+ function escapeJSON(string memory s) internal pure returns (string memory result) {
+ result = escapeJSON(s, false);
+ }
+
+ /// @dev Returns whether `a` equals `b`.
+ function eq(string memory a, string memory b) internal pure returns (bool result) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b)))
+ }
+ }
+
+ /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small string.
+ function eqs(string memory a, bytes32 b) internal pure returns (bool result) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ // These should be evaluated on compile time, as far as possible.
+ let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`.
+ let x := not(or(m, or(b, add(m, and(b, m)))))
+ let r := shl(7, iszero(iszero(shr(128, x))))
+ r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x))))))
+ r := or(r, shl(5, lt(0xffffffff, shr(r, x))))
+ r := or(r, shl(4, lt(0xffff, shr(r, x))))
+ r := or(r, shl(3, lt(0xff, shr(r, x))))
+ // forgefmt: disable-next-item
+ result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))),
+ xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20)))))
+ }
+ }
+
+ /// @dev Packs a single string with its length into a single word.
+ /// Returns `bytes32(0)` if the length is zero or greater than 31.
+ function packOne(string memory a) internal pure returns (bytes32 result) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ // We don't need to zero right pad the string,
+ // since this is our own custom non-standard packing scheme.
+ result :=
+ mul(
+ // Load the length and the bytes.
+ mload(add(a, 0x1f)),
+ // `length != 0 && length < 32`. Abuses underflow.
+ // Assumes that the length is valid and within the block gas limit.
+ lt(sub(mload(a), 1), 0x1f)
+ )
+ }
+ }
+
+ /// @dev Unpacks a string packed using {packOne}.
+ /// Returns the empty string if `packed` is `bytes32(0)`.
+ /// If `packed` is not an output of {packOne}, the output behavior is undefined.
+ function unpackOne(bytes32 packed) internal pure returns (string memory result) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ // Grab the free memory pointer.
+ result := mload(0x40)
+ // Allocate 2 words (1 for the length, 1 for the bytes).
+ mstore(0x40, add(result, 0x40))
+ // Zeroize the length slot.
+ mstore(result, 0)
+ // Store the length and bytes.
+ mstore(add(result, 0x1f), packed)
+ // Right pad with zeroes.
+ mstore(add(add(result, 0x20), mload(result)), 0)
+ }
+ }
+
+ /// @dev Packs two strings with their lengths into a single word.
+ /// Returns `bytes32(0)` if combined length is zero or greater than 30.
+ function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) {
+ /// @solidity memory-safe-assembly
+ assembly {
+ let aLength := mload(a)
+ // We don't need to zero right pad the strings,
+ // since this is our own custom non-standard packing scheme.
+ result :=
+ mul(
+ // Load the length and the bytes of `a` and `b`.
+ or(
+ shl(shl(3, sub(0x1f, aLength)), mload(add(a, aLength))),
+ mload(sub(add(b, 0x1e), aLength))
+ ),
+ // `totalLength != 0 && totalLength < 31`. Abuses underflow.
+ // Assumes that the lengths are valid and within the block gas limit.
+ lt(sub(add(aLength, mload(b)), 1), 0x1e)
+ )
+ }
+ }
+
+ /// @dev Unpacks strings packed using {packTwo}.
+ /// Returns the empty strings if `packed` is `bytes32(0)`.
+ /// If `packed` is not an output of {packTwo}, the output behavior is undefined.
+ function unpackTwo(bytes32 packed)
+ internal
+ pure
+ returns (string memory resultA, string memory resultB)
+ {
+ /// @solidity memory-safe-assembly
+ assembly {
+ // Grab the free memory pointer.
+ resultA := mload(0x40)
+ resultB := add(resultA, 0x40)
+ // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words.
+ mstore(0x40, add(resultB, 0x40))
+ // Zeroize the length slots.
+ mstore(resultA, 0)
+ mstore(resultB, 0)
+ // Store the lengths and bytes.
+ mstore(add(resultA, 0x1f), packed)
+ mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA))))
+ // Right pad with zeroes.
+ mstore(add(add(resultA, 0x20), mload(resultA)), 0)
+ mstore(add(add(resultB, 0x20), mload(resultB)), 0)
+ }
+ }
+
+ /// @dev Directly returns `a` without copying.
+ function directReturn(string memory a) internal pure {
+ assembly {
+ // Assumes that the string does not start from the scratch space.
+ let retStart := sub(a, 0x20)
+ let retSize := add(mload(a), 0x40)
+ // Right pad with zeroes. Just in case the string is produced
+ // by a method that doesn't zero right pad.
+ mstore(add(retStart, retSize), 0)
+ // Store the return offset.
+ mstore(retStart, 0x20)
+ // End the transaction, returning the string.
+ return(retStart, retSize)
+ }
+ }
+}
+
+library GasPayingToken {
+ /// @notice The storage slot that contains the address and decimals of the gas paying token
+ bytes32 internal constant GAS_PAYING_TOKEN_SLOT = bytes32(uint256(keccak256("opstack.gaspayingtoken")) - 1);
+
+ /// @notice The storage slot that contains the ERC20 `name()` of the gas paying token
+ bytes32 internal constant GAS_PAYING_TOKEN_NAME_SLOT = bytes32(uint256(keccak256("opstack.gaspayingtokenname")) - 1);
+
+ /// @notice the storage slot that contains the ERC20 `symbol()` of the gas paying token
+ bytes32 internal constant GAS_PAYING_TOKEN_SYMBOL_SLOT =
+ bytes32(uint256(keccak256("opstack.gaspayingtokensymbol")) - 1);
+
+ /// @notice Reads the gas paying token and its decimals from the magic
+ /// storage slot. If nothing is set in storage, then the ether
+ /// address is returned instead.
+ function getToken() internal view returns (address addr_, uint8 decimals_) {
+ bytes32 slot = Storage.getBytes32(GAS_PAYING_TOKEN_SLOT);
+ addr_ = address(uint160(uint256(slot) & uint256(type(uint160).max)));
+ if (addr_ == address(0)) {
+ addr_ = Constants.ETHER;
+ decimals_ = 18;
+ } else {
+ decimals_ = uint8(uint256(slot) >> 160);
+ }
+ }
+
+ /// @notice Reads the gas paying token's name from the magic storage slot.
+ /// If nothing is set in storage, then the ether name, 'Ether', is returned instead.
+ function getName() internal view returns (string memory name_) {
+ (address addr,) = getToken();
+ if (addr == Constants.ETHER) {
+ name_ = "Ether";
+ } else {
+ name_ = LibString.fromSmallString(Storage.getBytes32(GAS_PAYING_TOKEN_NAME_SLOT));
+ }
+ }
+
+ /// @notice Reads the gas paying token's symbol from the magic storage slot.
+ /// If nothing is set in storage, then the ether symbol, 'ETH', is returned instead.
+ function getSymbol() internal view returns (string memory symbol_) {
+ (address addr,) = getToken();
+ if (addr == Constants.ETHER) {
+ symbol_ = "ETH";
+ } else {
+ symbol_ = LibString.fromSmallString(Storage.getBytes32(GAS_PAYING_TOKEN_SYMBOL_SLOT));
+ }
+ }
+
+ /// @notice Writes the gas paying token, its decimals, name and symbol to the magic storage slot.
+ function set(address _token, uint8 _decimals, bytes32 _name, bytes32 _symbol) internal {
+ Storage.setBytes32(GAS_PAYING_TOKEN_SLOT, bytes32(uint256(_decimals) << 160 | uint256(uint160(_token))));
+ Storage.setBytes32(GAS_PAYING_TOKEN_NAME_SLOT, _name);
+ Storage.setBytes32(GAS_PAYING_TOKEN_SYMBOL_SLOT, _symbol);
+ }
+
+ /// @notice Maps a string to a normalized null-terminated small string.
+ function sanitize(string memory _str) internal pure returns (bytes32) {
+ require(bytes(_str).length <= 32, "GasPayingToken: string cannot be greater than 32 bytes");
+
+ return LibString.toSmallString(_str);
+ }
+}
+
+library Storage {
+ /// @notice Returns an address stored in an arbitrary storage slot.
+ /// These storage slots decouple the storage layout from
+ /// solc's automation.
+ /// @param _slot The storage slot to retrieve the address from.
+ function getAddress(bytes32 _slot) internal view returns (address addr_) {
+ assembly {
+ addr_ := sload(_slot)
+ }
+ }
+
+ /// @notice Stores an address in an arbitrary storage slot, `_slot`.
+ /// @param _slot The storage slot to store the address in.
+ /// @param _address The protocol version to store
+ /// @dev WARNING! This function must be used cautiously, as it allows for overwriting addresses
+ /// in arbitrary storage slots.
+ function setAddress(bytes32 _slot, address _address) internal {
+ assembly {
+ sstore(_slot, _address)
+ }
+ }
+
+ /// @notice Returns a uint256 stored in an arbitrary storage slot.
+ /// These storage slots decouple the storage layout from
+ /// solc's automation.
+ /// @param _slot The storage slot to retrieve the address from.
+ function getUint(bytes32 _slot) internal view returns (uint256 value_) {
+ assembly {
+ value_ := sload(_slot)
+ }
+ }
+
+ /// @notice Stores a value in an arbitrary storage slot, `_slot`.
+ /// @param _slot The storage slot to store the address in.
+ /// @param _value The protocol version to store
+ /// @dev WARNING! This function must be used cautiously, as it allows for overwriting values
+ /// in arbitrary storage slots.
+ function setUint(bytes32 _slot, uint256 _value) internal {
+ assembly {
+ sstore(_slot, _value)
+ }
+ }
+
+ /// @notice Returns a bytes32 stored in an arbitrary storage slot.
+ /// These storage slots decouple the storage layout from
+ /// solc's automation.
+ /// @param _slot The storage slot to retrieve the address from.
+ function getBytes32(bytes32 _slot) internal view returns (bytes32 value_) {
+ assembly {
+ value_ := sload(_slot)
+ }
+ }
+
+ /// @notice Stores a bytes32 value in an arbitrary storage slot, `_slot`.
+ /// @param _slot The storage slot to store the address in.
+ /// @param _value The bytes32 value to store.
+ /// @dev WARNING! This function must be used cautiously, as it allows for overwriting values
+ /// in arbitrary storage slots.
+ function setBytes32(bytes32 _slot, bytes32 _value) internal {
+ assembly {
+ sstore(_slot, _value)
+ }
+ }
+
+ /// @notice Stores a bool value in an arbitrary storage slot, `_slot`.
+ /// @param _slot The storage slot to store the bool in.
+ /// @param _value The bool value to store
+ /// @dev WARNING! This function must be used cautiously, as it allows for overwriting values
+ /// in arbitrary storage slots.
+ function setBool(bytes32 _slot, bool _value) internal {
+ assembly {
+ sstore(_slot, _value)
+ }
+ }
+
+ /// @notice Returns a bool stored in an arbitrary storage slot.
+ /// @param _slot The storage slot to retrieve the bool from.
+ function getBool(bytes32 _slot) internal view returns (bool value_) {
+ assembly {
+ value_ := sload(_slot)
+ }
+ }
+}
+
+interface IGasToken {
+ /// @notice Getter for the ERC20 token address that is used to pay for gas and its decimals.
+ function gasPayingToken() external view returns (address, uint8);
+ /// @notice Returns the gas token name.
+ function gasPayingTokenName() external view returns (string memory);
+ /// @notice Returns the gas token symbol.
+ function gasPayingTokenSymbol() external view returns (string memory);
+ /// @notice Returns true if the network uses a custom gas token.
+ function isCustomGasToken() external view returns (bool);
+}
+
+interface ISemver {
+ /// @notice Getter for the semantic version of the contract. This is not
+ /// meant to be used onchain but instead meant to be used by offchain
+ /// tooling.
+ /// @return Semver contract version as a string.
+ function version() external view returns (string memory);
+}
+
+library AddressUpgradeable {
+ /**
+ * @dev Returns true if `account` is a contract.
+ *
+ * [IMPORTANT]
+ * ====
+ * It is unsafe to assume that an address for which this function returns
+ * false is an externally-owned account (EOA) and not a contract.
+ *
+ * Among others, `isContract` will return false for the following
+ * types of addresses:
+ *
+ * - an externally-owned account
+ * - a contract in construction
+ * - an address where a contract will be created
+ * - an address where a contract lived, but was destroyed
+ * ====
+ *
+ * [IMPORTANT]
+ * ====
+ * You shouldn't rely on `isContract` to protect against flash loan attacks!
+ *
+ * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
+ * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
+ * constructor.
+ * ====
+ */
+ function isContract(address account) internal view returns (bool) {
+ // This method relies on extcodesize/address.code.length, which returns 0
+ // for contracts in construction, since the code is only stored at the end
+ // of the constructor execution.
+
+ return account.code.length > 0;
+ }
+
+ /**
+ * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
+ * `recipient`, forwarding all available gas and reverting on errors.
+ *
+ * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
+ * of certain opcodes, possibly making contracts go over the 2300 gas limit
+ * imposed by `transfer`, making them unable to receive funds via
+ * `transfer`. {sendValue} removes this limitation.
+ *
+ * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
+ *
+ * IMPORTANT: because control is transferred to `recipient`, care must be
+ * taken to not create reentrancy vulnerabilities. Consider using
+ * {ReentrancyGuard} or the
+ * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
+ */
+ function sendValue(address payable recipient, uint256 amount) internal {
+ require(address(this).balance >= amount, "Address: insufficient balance");
+
+ (bool success, ) = recipient.call{value: amount}("");
+ require(success, "Address: unable to send value, recipient may have reverted");
+ }
+
+ /**
+ * @dev Performs a Solidity function call using a low level `call`. A
+ * plain `call` is an unsafe replacement for a function call: use this
+ * function instead.
+ *
+ * If `target` reverts with a revert reason, it is bubbled up by this
+ * function (like regular Solidity function calls).
+ *
+ * Returns the raw returned data. To convert to the expected return value,
+ * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
+ *
+ * Requirements:
+ *
+ * - `target` must be a contract.
+ * - calling `target` with `data` must not revert.
+ *
+ * _Available since v3.1._
+ */
+ function functionCall(address target, bytes memory data) internal returns (bytes memory) {
+ return functionCall(target, data, "Address: low-level call failed");
+ }
+
+ /**
+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
+ * `errorMessage` as a fallback revert reason when `target` reverts.
+ *
+ * _Available since v3.1._
+ */
+ function functionCall(
+ address target,
+ bytes memory data,
+ string memory errorMessage
+ ) internal returns (bytes memory) {
+ return functionCallWithValue(target, data, 0, errorMessage);
+ }
+
+ /**
+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
+ * but also transferring `value` wei to `target`.
+ *
+ * Requirements:
+ *
+ * - the calling contract must have an ETH balance of at least `value`.
+ * - the called Solidity function must be `payable`.
+ *
+ * _Available since v3.1._
+ */
+ function functionCallWithValue(
+ address target,
+ bytes memory data,
+ uint256 value
+ ) internal returns (bytes memory) {
+ return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
+ }
+
+ /**
+ * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
+ * with `errorMessage` as a fallback revert reason when `target` reverts.
+ *
+ * _Available since v3.1._
+ */
+ function functionCallWithValue(
+ address target,
+ bytes memory data,
+ uint256 value,
+ string memory errorMessage
+ ) internal returns (bytes memory) {
+ require(address(this).balance >= value, "Address: insufficient balance for call");
+ require(isContract(target), "Address: call to non-contract");
+
+ (bool success, bytes memory returndata) = target.call{value: value}(data);
+ return verifyCallResult(success, returndata, errorMessage);
+ }
+
+ /**
+ * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
+ * but performing a static call.
+ *
+ * _Available since v3.3._
+ */
+ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
+ return functionStaticCall(target, data, "Address: low-level static call failed");
+ }
+
+ /**
+ * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
+ * but performing a static call.
+ *
+ * _Available since v3.3._
+ */
+ function functionStaticCall(
+ address target,
+ bytes memory data,
+ string memory errorMessage
+ ) internal view returns (bytes memory) {
+ require(isContract(target), "Address: static call to non-contract");
+
+ (bool success, bytes memory returndata) = target.staticcall(data);
+ return verifyCallResult(success, returndata, errorMessage);
+ }
+
+ /**
+ * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
+ * revert reason using the provided one.
+ *
+ * _Available since v4.3._
+ */
+ function verifyCallResult(
+ bool success,
+ bytes memory returndata,
+ string memory errorMessage
+ ) internal pure returns (bytes memory) {
+ if (success) {
+ return returndata;
+ } else {
+ // Look for revert reason and bubble it up if present
+ if (returndata.length > 0) {
+ // The easiest way to bubble the revert reason is using memory via assembly
+ /// @solidity memory-safe-assembly
+ assembly {
+ let returndata_size := mload(returndata)
+ revert(add(32, returndata), returndata_size)
+ }
+ } else {
+ revert(errorMessage);
+ }
+ }
+ }
+}
+
+abstract contract Initializable {
+ /**
+ * @dev Indicates that the contract has been initialized.
+ * @custom:oz-retyped-from bool
+ */
+ uint8 private _initialized;
+
+ /**
+ * @dev Indicates that the contract is in the process of being initialized.
+ */
+ bool private _initializing;
+
+ /**
+ * @dev Triggered when the contract has been initialized or reinitialized.
+ */
+ event Initialized(uint8 version);
+
+ /**
+ * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
+ * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.
+ */
+ modifier initializer() {
+ bool isTopLevelCall = !_initializing;
+ require(
+ (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
+ "Initializable: contract is already initialized"
+ );
+ _initialized = 1;
+ if (isTopLevelCall) {
+ _initializing = true;
+ }
+ _;
+ if (isTopLevelCall) {
+ _initializing = false;
+ emit Initialized(1);
+ }
+ }
+
+ /**
+ * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
+ * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
+ * used to initialize parent contracts.
+ *
+ * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original
+ * initialization step. This is essential to configure modules that are added through upgrades and that require
+ * initialization.
+ *
+ * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
+ * a contract, executing them in the right order is up to the developer or operator.
+ */
+ modifier reinitializer(uint8 version) {
+ require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
+ _initialized = version;
+ _initializing = true;
+ _;
+ _initializing = false;
+ emit Initialized(version);
+ }
+
+ /**
+ * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
+ * {initializer} and {reinitializer} modifiers, directly or indirectly.
+ */
+ modifier onlyInitializing() {
+ require(_initializing, "Initializable: contract is not initializing");
+ _;
+ }
+
+ /**
+ * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
+ * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
+ * to any version. It is recommended to use this to lock implementation contracts that are designed to be called
+ * through proxies.
+ */
+ function _disableInitializers() internal virtual {
+ require(!_initializing, "Initializable: contract is initializing");
+ if (_initialized < type(uint8).max) {
+ _initialized = type(uint8).max;
+ emit Initialized(type(uint8).max);
+ }
+ }
+}
+
+abstract contract ContextUpgradeable is Initializable {
+ function __Context_init() internal onlyInitializing {
+ }
+
+ function __Context_init_unchained() internal onlyInitializing {
+ }
+ function _msgSender() internal view virtual returns (address) {
+ return msg.sender;
+ }
+
+ function _msgData() internal view virtual returns (bytes calldata) {
+ return msg.data;
+ }
+
+ /**
+ * @dev This empty reserved space is put in place to allow future versions to add new
+ * variables without shifting down storage in the inheritance chain.
+ * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
+ */
+ uint256[50] private __gap;
+}
+
+abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
+ address private _owner;
+
+ event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
+
+ /**
+ * @dev Initializes the contract setting the deployer as the initial owner.
+ */
+ function __Ownable_init() internal onlyInitializing {
+ __Ownable_init_unchained();
+ }
+
+ function __Ownable_init_unchained() internal onlyInitializing {
+ _transferOwnership(_msgSender());
+ }
+
+ /**
+ * @dev Throws if called by any account other than the owner.
+ */
+ modifier onlyOwner() {
+ _checkOwner();
+ _;
+ }
+
+ /**
+ * @dev Returns the address of the current owner.
+ */
+ function owner() public view virtual returns (address) {
+ return _owner;
+ }
+
+ /**
+ * @dev Throws if the sender is not the owner.
+ */
+ function _checkOwner() internal view virtual {
+ require(owner() == _msgSender(), "Ownable: caller is not the owner");
+ }
+
+ /**
+ * @dev 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.
+ */
+ function renounceOwnership() public virtual onlyOwner {
+ _transferOwnership(address(0));
+ }
+
+ /**
+ * @dev Transfers ownership of the contract to a new account (`newOwner`).
+ * Can only be called by the current owner.
+ */
+ function transferOwnership(address newOwner) public virtual onlyOwner {
+ require(newOwner != address(0), "Ownable: new owner is the zero address");
+ _transferOwnership(newOwner);
+ }
+
+ /**
+ * @dev Transfers ownership of the contract to a new account (`newOwner`).
+ * Internal function without access restriction.
+ */
+ function _transferOwnership(address newOwner) internal virtual {
+ address oldOwner = _owner;
+ _owner = newOwner;
+ emit OwnershipTransferred(oldOwner, newOwner);
+ }
+
+ /**
+ * @dev This empty reserved space is put in place to allow future versions to add new
+ * variables without shifting down storage in the inheritance chain.
+ * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
+ */
+ uint256[49] private __gap;
+}
+
+contract SystemConfig is OwnableUpgradeable, ISemver, IGasToken {
+ /// @notice Enum representing different types of updates.
+ /// @custom:value BATCHER Represents an update to the batcher hash.
+ /// @custom:value FEE_SCALARS Represents an update to l1 data fee scalars.
+ /// @custom:value GAS_LIMIT Represents an update to gas limit on L2.
+ /// @custom:value UNSAFE_BLOCK_SIGNER Represents an update to the signer key for unsafe
+ /// block distrubution.
+ enum UpdateType {
+ BATCHER,
+ FEE_SCALARS,
+ GAS_LIMIT,
+ UNSAFE_BLOCK_SIGNER,
+ EIP_1559_PARAMS
+ }
+
+ /// @notice Struct representing the addresses of L1 system contracts. These should be the
+ /// contracts that users interact with (not implementations for proxied contracts)
+ /// and are network specific.
+ struct Addresses {
+ address l1CrossDomainMessenger;
+ address l1ERC721Bridge;
+ address l1StandardBridge;
+ address disputeGameFactory;
+ address optimismPortal;
+ address optimismMintableERC20Factory;
+ address gasPayingToken;
+ }
+
+ /// @notice Version identifier, used for upgrades.
+ uint256 public constant VERSION = 0;
+
+ /// @notice Storage slot that the unsafe block signer is stored at.
+ /// Storing it at this deterministic storage slot allows for decoupling the storage
+ /// layout from the way that `solc` lays out storage. The `op-node` uses a storage
+ /// proof to fetch this value.
+ /// @dev NOTE: this value will be migrated to another storage slot in a future version.
+ /// User input should not be placed in storage in this contract until this migration
+ /// happens. It is unlikely that keccak second preimage resistance will be broken,
+ /// but it is better to be safe than sorry.
+ bytes32 public constant UNSAFE_BLOCK_SIGNER_SLOT = keccak256("systemconfig.unsafeblocksigner");
+
+ /// @notice Storage slot that the L1CrossDomainMessenger address is stored at.
+ bytes32 public constant L1_CROSS_DOMAIN_MESSENGER_SLOT =
+ bytes32(uint256(keccak256("systemconfig.l1crossdomainmessenger")) - 1);
+
+ /// @notice Storage slot that the L1ERC721Bridge address is stored at.
+ bytes32 public constant L1_ERC_721_BRIDGE_SLOT = bytes32(uint256(keccak256("systemconfig.l1erc721bridge")) - 1);
+
+ /// @notice Storage slot that the L1StandardBridge address is stored at.
+ bytes32 public constant L1_STANDARD_BRIDGE_SLOT = bytes32(uint256(keccak256("systemconfig.l1standardbridge")) - 1);
+
+ /// @notice Storage slot that the OptimismPortal address is stored at.
+ bytes32 public constant OPTIMISM_PORTAL_SLOT = bytes32(uint256(keccak256("systemconfig.optimismportal")) - 1);
+
+ /// @notice Storage slot that the OptimismMintableERC20Factory address is stored at.
+ bytes32 public constant OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT =
+ bytes32(uint256(keccak256("systemconfig.optimismmintableerc20factory")) - 1);
+
+ /// @notice Storage slot that the batch inbox address is stored at.
+ bytes32 public constant BATCH_INBOX_SLOT = bytes32(uint256(keccak256("systemconfig.batchinbox")) - 1);
+
+ /// @notice Storage slot for block at which the op-node can start searching for logs from.
+ bytes32 public constant START_BLOCK_SLOT = bytes32(uint256(keccak256("systemconfig.startBlock")) - 1);
+
+ /// @notice Storage slot for the DisputeGameFactory address.
+ bytes32 public constant DISPUTE_GAME_FACTORY_SLOT =
+ bytes32(uint256(keccak256("systemconfig.disputegamefactory")) - 1);
+
+ /// @notice The number of decimals that the gas paying token has.
+ uint8 internal constant GAS_PAYING_TOKEN_DECIMALS = 18;
+
+ /// @notice The maximum gas limit that can be set for L2 blocks. This limit is used to enforce that the blocks
+ /// on L2 are not too large to process and prove. Over time, this value can be increased as various
+ /// optimizations and improvements are made to the system at large.
+ uint64 internal constant MAX_GAS_LIMIT = 200_000_000;
+
+ /// @notice Fixed L2 gas overhead. Used as part of the L2 fee calculation.
+ /// Deprecated since the Ecotone network upgrade
+ uint256 public overhead;
+
+ /// @notice Dynamic L2 gas overhead. Used as part of the L2 fee calculation.
+ /// The most significant byte is used to determine the version since the
+ /// Ecotone network upgrade.
+ uint256 public scalar;
+
+ /// @notice Identifier for the batcher.
+ /// For version 1 of this configuration, this is represented as an address left-padded
+ /// with zeros to 32 bytes.
+ bytes32 public batcherHash;
+
+ /// @notice L2 block gas limit.
+ uint64 public gasLimit;
+
+ /// @notice Basefee scalar value. Part of the L2 fee calculation since the Ecotone network upgrade.
+ uint32 public basefeeScalar;
+
+ /// @notice Blobbasefee scalar value. Part of the L2 fee calculation since the Ecotone network upgrade.
+ uint32 public blobbasefeeScalar;
+
+ /// @notice The configuration for the deposit fee market.
+ /// Used by the OptimismPortal to meter the cost of buying L2 gas on L1.
+ /// Set as internal with a getter so that the struct is returned instead of a tuple.
+ IResourceMetering.ResourceConfig internal _resourceConfig;
+
+ /// @notice The EIP-1559 base fee max change denominator.
+ uint32 public eip1559Denominator;
+
+ /// @notice The EIP-1559 elasticity multiplier.
+ uint32 public eip1559Elasticity;
+
+ /// @notice Emitted when configuration is updated.
+ /// @param version SystemConfig version.
+ /// @param updateType Type of update.
+ /// @param data Encoded update data.
+ event ConfigUpdate(uint256 indexed version, UpdateType indexed updateType, bytes data);
+
+ /// @notice Semantic version.
+ /// @custom:semver 2.3.0-beta.5
+ function version() public pure virtual returns (string memory) {
+ return "2.3.0-beta.5";
+ }
+
+ /// @notice Constructs the SystemConfig contract. Cannot set
+ /// the owner to `address(0)` due to the Ownable contract's
+ /// implementation, so set it to `address(0xdEaD)`
+ /// @dev START_BLOCK_SLOT is set to type(uint256).max here so that it will be a dead value
+ /// in the singleton and is skipped by initialize when setting the start block.
+ constructor() {
+ Storage.setUint(START_BLOCK_SLOT, type(uint256).max);
+ initialize({
+ _owner: address(0xdEaD),
+ _basefeeScalar: 0,
+ _blobbasefeeScalar: 0,
+ _batcherHash: bytes32(0),
+ _gasLimit: 1,
+ _unsafeBlockSigner: address(0),
+ _config: IResourceMetering.ResourceConfig({
+ maxResourceLimit: 1,
+ elasticityMultiplier: 1,
+ baseFeeMaxChangeDenominator: 2,
+ minimumBaseFee: 0,
+ systemTxMaxGas: 0,
+ maximumBaseFee: 0
+ }),
+ _batchInbox: address(0),
+ _addresses: SystemConfig.Addresses({
+ l1CrossDomainMessenger: address(0),
+ l1ERC721Bridge: address(0),
+ l1StandardBridge: address(0),
+ disputeGameFactory: address(0),
+ optimismPortal: address(0),
+ optimismMintableERC20Factory: address(0),
+ gasPayingToken: address(0)
+ })
+ });
+ }
+
+ /// @notice Initializer.
+ /// The resource config must be set before the require check.
+ /// @param _owner Initial owner of the contract.
+ /// @param _basefeeScalar Initial basefee scalar value.
+ /// @param _blobbasefeeScalar Initial blobbasefee scalar value.
+ /// @param _batcherHash Initial batcher hash.
+ /// @param _gasLimit Initial gas limit.
+ /// @param _unsafeBlockSigner Initial unsafe block signer address.
+ /// @param _config Initial ResourceConfig.
+ /// @param _batchInbox Batch inbox address. An identifier for the op-node to find
+ /// canonical data.
+ /// @param _addresses Set of L1 contract addresses. These should be the proxies.
+ function initialize(
+ address _owner,
+ uint32 _basefeeScalar,
+ uint32 _blobbasefeeScalar,
+ bytes32 _batcherHash,
+ uint64 _gasLimit,
+ address _unsafeBlockSigner,
+ IResourceMetering.ResourceConfig memory _config,
+ address _batchInbox,
+ SystemConfig.Addresses memory _addresses
+ )
+ public
+ initializer
+ {
+ __Ownable_init();
+ transferOwnership(_owner);
+
+ // These are set in ascending order of their UpdateTypes.
+ _setBatcherHash(_batcherHash);
+ _setGasConfigEcotone({ _basefeeScalar: _basefeeScalar, _blobbasefeeScalar: _blobbasefeeScalar });
+ _setGasLimit(_gasLimit);
+
+ Storage.setAddress(UNSAFE_BLOCK_SIGNER_SLOT, _unsafeBlockSigner);
+ Storage.setAddress(BATCH_INBOX_SLOT, _batchInbox);
+ Storage.setAddress(L1_CROSS_DOMAIN_MESSENGER_SLOT, _addresses.l1CrossDomainMessenger);
+ Storage.setAddress(L1_ERC_721_BRIDGE_SLOT, _addresses.l1ERC721Bridge);
+ Storage.setAddress(L1_STANDARD_BRIDGE_SLOT, _addresses.l1StandardBridge);
+ Storage.setAddress(DISPUTE_GAME_FACTORY_SLOT, _addresses.disputeGameFactory);
+ Storage.setAddress(OPTIMISM_PORTAL_SLOT, _addresses.optimismPortal);
+ Storage.setAddress(OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT, _addresses.optimismMintableERC20Factory);
+
+ _setStartBlock();
+ _setGasPayingToken(_addresses.gasPayingToken);
+
+ _setResourceConfig(_config);
+ require(_gasLimit >= minimumGasLimit(), "SystemConfig: gas limit too low");
+ }
+
+ /// @notice Returns the minimum L2 gas limit that can be safely set for the system to
+ /// operate. The L2 gas limit must be larger than or equal to the amount of
+ /// gas that is allocated for deposits per block plus the amount of gas that
+ /// is allocated for the system transaction.
+ /// This function is used to determine if changes to parameters are safe.
+ /// @return uint64 Minimum gas limit.
+ function minimumGasLimit() public view returns (uint64) {
+ return uint64(_resourceConfig.maxResourceLimit) + uint64(_resourceConfig.systemTxMaxGas);
+ }
+
+ /// @notice Returns the maximum L2 gas limit that can be safely set for the system to
+ /// operate. This bound is used to prevent the gas limit from being set too high
+ /// and causing the system to be unable to process and/or prove L2 blocks.
+ /// @return uint64 Maximum gas limit.
+ function maximumGasLimit() public pure returns (uint64) {
+ return MAX_GAS_LIMIT;
+ }
+
+ /// @notice High level getter for the unsafe block signer address.
+ /// Unsafe blocks can be propagated across the p2p network if they are signed by the
+ /// key corresponding to this address.
+ /// @return addr_ Address of the unsafe block signer.
+ function unsafeBlockSigner() public view returns (address addr_) {
+ addr_ = Storage.getAddress(UNSAFE_BLOCK_SIGNER_SLOT);
+ }
+
+ /// @notice Getter for the L1CrossDomainMessenger address.
+ function l1CrossDomainMessenger() external view returns (address addr_) {
+ addr_ = Storage.getAddress(L1_CROSS_DOMAIN_MESSENGER_SLOT);
+ }
+
+ /// @notice Getter for the L1ERC721Bridge address.
+ function l1ERC721Bridge() external view returns (address addr_) {
+ addr_ = Storage.getAddress(L1_ERC_721_BRIDGE_SLOT);
+ }
+
+ /// @notice Getter for the L1StandardBridge address.
+ function l1StandardBridge() external view returns (address addr_) {
+ addr_ = Storage.getAddress(L1_STANDARD_BRIDGE_SLOT);
+ }
+
+ /// @notice Getter for the DisputeGameFactory address.
+ function disputeGameFactory() external view returns (address addr_) {
+ addr_ = Storage.getAddress(DISPUTE_GAME_FACTORY_SLOT);
+ }
+
+ /// @notice Getter for the OptimismPortal address.
+ function optimismPortal() public view returns (address addr_) {
+ addr_ = Storage.getAddress(OPTIMISM_PORTAL_SLOT);
+ }
+
+ /// @notice Getter for the OptimismMintableERC20Factory address.
+ function optimismMintableERC20Factory() external view returns (address addr_) {
+ addr_ = Storage.getAddress(OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT);
+ }
+
+ /// @notice Getter for the BatchInbox address.
+ function batchInbox() external view returns (address addr_) {
+ addr_ = Storage.getAddress(BATCH_INBOX_SLOT);
+ }
+
+ /// @notice Getter for the StartBlock number.
+ function startBlock() external view returns (uint256 startBlock_) {
+ startBlock_ = Storage.getUint(START_BLOCK_SLOT);
+ }
+
+ /// @notice Getter for the gas paying asset address.
+ function gasPayingToken() public view returns (address addr_, uint8 decimals_) {
+ (addr_, decimals_) = GasPayingToken.getToken();
+ }
+
+ /// @notice Getter for custom gas token paying networks. Returns true if the
+ /// network uses a custom gas token.
+ function isCustomGasToken() public view returns (bool) {
+ (address token,) = gasPayingToken();
+ return token != Constants.ETHER;
+ }
+
+ /// @notice Getter for the gas paying token name.
+ function gasPayingTokenName() external view returns (string memory name_) {
+ name_ = GasPayingToken.getName();
+ }
+
+ /// @notice Getter for the gas paying token symbol.
+ function gasPayingTokenSymbol() external view returns (string memory symbol_) {
+ symbol_ = GasPayingToken.getSymbol();
+ }
+
+ /// @notice Internal setter for the gas paying token address, includes validation.
+ /// The token must not already be set and must be non zero and not the ether address
+ /// to set the token address. This prevents the token address from being changed
+ /// and makes it explicitly opt-in to use custom gas token.
+ /// @param _token Address of the gas paying token.
+ function _setGasPayingToken(address _token) internal virtual {
+ if (_token != address(0) && _token != Constants.ETHER && !isCustomGasToken()) {
+ require(
+ ERC20(_token).decimals() == GAS_PAYING_TOKEN_DECIMALS, "SystemConfig: bad decimals of gas paying token"
+ );
+ bytes32 name = GasPayingToken.sanitize(ERC20(_token).name());
+ bytes32 symbol = GasPayingToken.sanitize(ERC20(_token).symbol());
+
+ // Set the gas paying token in storage and in the OptimismPortal.
+ GasPayingToken.set({ _token: _token, _decimals: GAS_PAYING_TOKEN_DECIMALS, _name: name, _symbol: symbol });
+ IOptimismPortal(payable(optimismPortal())).setGasPayingToken({
+ _token: _token,
+ _decimals: GAS_PAYING_TOKEN_DECIMALS,
+ _name: name,
+ _symbol: symbol
+ });
+ }
+ }
+
+ /// @notice Updates the unsafe block signer address. Can only be called by the owner.
+ /// @param _unsafeBlockSigner New unsafe block signer address.
+ function setUnsafeBlockSigner(address _unsafeBlockSigner) external onlyOwner {
+ _setUnsafeBlockSigner(_unsafeBlockSigner);
+ }
+
+ /// @notice Updates the unsafe block signer address.
+ /// @param _unsafeBlockSigner New unsafe block signer address.
+ function _setUnsafeBlockSigner(address _unsafeBlockSigner) internal {
+ Storage.setAddress(UNSAFE_BLOCK_SIGNER_SLOT, _unsafeBlockSigner);
+
+ bytes memory data = abi.encode(_unsafeBlockSigner);
+ emit ConfigUpdate(VERSION, UpdateType.UNSAFE_BLOCK_SIGNER, data);
+ }
+
+ /// @notice Updates the batcher hash. Can only be called by the owner.
+ /// @param _batcherHash New batcher hash.
+ function setBatcherHash(bytes32 _batcherHash) external onlyOwner {
+ _setBatcherHash(_batcherHash);
+ }
+
+ /// @notice Internal function for updating the batcher hash.
+ /// @param _batcherHash New batcher hash.
+ function _setBatcherHash(bytes32 _batcherHash) internal {
+ batcherHash = _batcherHash;
+
+ bytes memory data = abi.encode(_batcherHash);
+ emit ConfigUpdate(VERSION, UpdateType.BATCHER, data);
+ }
+
+ /// @notice Updates gas config. Can only be called by the owner.
+ /// Deprecated in favor of setGasConfigEcotone since the Ecotone upgrade.
+ /// @param _overhead New overhead value.
+ /// @param _scalar New scalar value.
+ function setGasConfig(uint256 _overhead, uint256 _scalar) external onlyOwner {
+ _setGasConfig(_overhead, _scalar);
+ }
+
+ /// @notice Internal function for updating the gas config.
+ /// @param _overhead New overhead value.
+ /// @param _scalar New scalar value.
+ function _setGasConfig(uint256 _overhead, uint256 _scalar) internal {
+ require((uint256(0xff) << 248) & _scalar == 0, "SystemConfig: scalar exceeds max.");
+
+ overhead = _overhead;
+ scalar = _scalar;
+
+ bytes memory data = abi.encode(_overhead, _scalar);
+ emit ConfigUpdate(VERSION, UpdateType.FEE_SCALARS, data);
+ }
+
+ /// @notice Updates gas config as of the Ecotone upgrade. Can only be called by the owner.
+ /// @param _basefeeScalar New basefeeScalar value.
+ /// @param _blobbasefeeScalar New blobbasefeeScalar value.
+ function setGasConfigEcotone(uint32 _basefeeScalar, uint32 _blobbasefeeScalar) external onlyOwner {
+ _setGasConfigEcotone(_basefeeScalar, _blobbasefeeScalar);
+ }
+
+ /// @notice Internal function for updating the fee scalars as of the Ecotone upgrade.
+ /// @param _basefeeScalar New basefeeScalar value.
+ /// @param _blobbasefeeScalar New blobbasefeeScalar value.
+ function _setGasConfigEcotone(uint32 _basefeeScalar, uint32 _blobbasefeeScalar) internal {
+ basefeeScalar = _basefeeScalar;
+ blobbasefeeScalar = _blobbasefeeScalar;
+
+ scalar = (uint256(0x01) << 248) | (uint256(_blobbasefeeScalar) << 32) | _basefeeScalar;
+
+ bytes memory data = abi.encode(overhead, scalar);
+ emit ConfigUpdate(VERSION, UpdateType.FEE_SCALARS, data);
+ }
+
+ /// @notice Updates the L2 gas limit. Can only be called by the owner.
+ /// @param _gasLimit New gas limit.
+ function setGasLimit(uint64 _gasLimit) external onlyOwner {
+ _setGasLimit(_gasLimit);
+ }
+
+ /// @notice Internal function for updating the L2 gas limit.
+ /// @param _gasLimit New gas limit.
+ function _setGasLimit(uint64 _gasLimit) internal {
+ require(_gasLimit >= minimumGasLimit(), "SystemConfig: gas limit too low");
+ require(_gasLimit <= maximumGasLimit(), "SystemConfig: gas limit too high");
+ gasLimit = _gasLimit;
+
+ bytes memory data = abi.encode(_gasLimit);
+ emit ConfigUpdate(VERSION, UpdateType.GAS_LIMIT, data);
+ }
+
+ /// @notice Updates the EIP-1559 parameters of the chain. Can only be called by the owner.
+ /// @param _denominator EIP-1559 base fee max change denominator.
+ /// @param _elasticity EIP-1559 elasticity multiplier.
+ function setEIP1559Params(uint32 _denominator, uint32 _elasticity) external onlyOwner {
+ _setEIP1559Params(_denominator, _elasticity);
+ }
+
+ /// @notice Internal function for updating the EIP-1559 parameters.
+ function _setEIP1559Params(uint32 _denominator, uint32 _elasticity) internal {
+ // require the parameters have sane values:
+ require(_denominator >= 1, "SystemConfig: denominator must be >= 1");
+ require(_elasticity >= 1, "SystemConfig: elasticity must be >= 1");
+ eip1559Denominator = _denominator;
+ eip1559Elasticity = _elasticity;
+
+ bytes memory data = abi.encode(uint256(_denominator) << 32 | uint64(_elasticity));
+ emit ConfigUpdate(VERSION, UpdateType.EIP_1559_PARAMS, data);
+ }
+
+ /// @notice Sets the start block in a backwards compatible way. Proxies
+ /// that were initialized before the startBlock existed in storage
+ /// can have their start block set by a user provided override.
+ /// A start block of 0 indicates that there is no override and the
+ /// start block will be set by `block.number`.
+ /// @dev This logic is used to patch legacy deployments with new storage values.
+ /// Use the override if it is provided as a non zero value and the value
+ /// has not already been set in storage. Use `block.number` if the value
+ /// has already been set in storage
+ function _setStartBlock() internal {
+ if (Storage.getUint(START_BLOCK_SLOT) == 0) {
+ Storage.setUint(START_BLOCK_SLOT, block.number);
+ }
+ }
+
+ /// @notice A getter for the resource config.
+ /// Ensures that the struct is returned instead of a tuple.
+ /// @return ResourceConfig
+ function resourceConfig() external view returns (IResourceMetering.ResourceConfig memory) {
+ return _resourceConfig;
+ }
+
+ /// @notice An internal setter for the resource config.
+ /// Ensures that the config is sane before storing it by checking for invariants.
+ /// In the future, this method may emit an event that the `op-node` picks up
+ /// for when the resource config is changed.
+ /// @param _config The new resource config.
+ function _setResourceConfig(IResourceMetering.ResourceConfig memory _config) internal {
+ // Min base fee must be less than or equal to max base fee.
+ require(
+ _config.minimumBaseFee <= _config.maximumBaseFee, "SystemConfig: min base fee must be less than max base"
+ );
+ // Base fee change denominator must be greater than 1.
+ require(_config.baseFeeMaxChangeDenominator > 1, "SystemConfig: denominator must be larger than 1");
+ // Max resource limit plus system tx gas must be less than or equal to the L2 gas limit.
+ // The gas limit must be increased before these values can be increased.
+ require(_config.maxResourceLimit + _config.systemTxMaxGas <= gasLimit, "SystemConfig: gas limit too low");
+ // Elasticity multiplier must be greater than 0.
+ require(_config.elasticityMultiplier > 0, "SystemConfig: elasticity multiplier cannot be 0");
+ // No precision loss when computing target resource limit.
+ require(
+ ((_config.maxResourceLimit / _config.elasticityMultiplier) * _config.elasticityMultiplier)
+ == _config.maxResourceLimit,
+ "SystemConfig: precision loss with target resource limit"
+ );
+
+ _resourceConfig = _config;
+ }
+}
\ No newline at end of file
diff --git a/packages/backend/discovery/bobanetwork/ethereum/diffHistory.md b/packages/backend/discovery/bobanetwork/ethereum/diffHistory.md
index 9cc74411463..257ab785e77 100644
--- a/packages/backend/discovery/bobanetwork/ethereum/diffHistory.md
+++ b/packages/backend/discovery/bobanetwork/ethereum/diffHistory.md
@@ -1,3 +1,70 @@
+Generated with discovered.json: 0x8d063efb8aca257b5f302697e4e4618982c8c3a5
+
+# Diff at Wed, 18 Dec 2024 10:01:20 GMT:
+
+- author: sekuba (<29250140+sekuba@users.noreply.github.com>)
+- comparing to: main@a44ef6747febdd9930ef05420e60556c20899f13 block: 20919938
+- current block number: 21428646
+
+## Description
+
+SystemConfig upgrade to version `2.3.0-beta.5`, which is a post-faultproofs version. But since the DisputeGameFactory address is not set and OptimismPortal is still on an old version, this has no consequence on the state validation logic.
+
+## Watched changes
+
+```diff
+ contract SystemConfig (0x158Fd5715F16Ac1F2Dc959A299B383aAaf9B59EB) {
+ +++ description: Contains configuration parameters such as the Sequencer address, gas limit on this chain and the unsafe block signer address.
+ sourceHashes.1:
+- "0xdf9a11b46747139bfe0135df8a65a2728a2dbd60a689e2398c45627915cdd752"
++ "0xe8f575933bc08fd1b1839c74e98447d0a629845c07c4281981ee0ba86ce88298"
+ values.$implementation:
+- "0xfaE274B77BA59f001196689f93E9e73693866f4a"
++ "0xb52F8f5D1285e3bc13F9C53D27C6F7336a3B50A9"
+ values.$pastUpgrades.1:
++ ["2024-12-16T17:58:59.000Z","0x2dd4983dfade963b3da262a0c56b5085ffc5ee2f3046292326568738250b5a42",["0xb52F8f5D1285e3bc13F9C53D27C6F7336a3B50A9"]]
+ values.$upgradeCount:
+- 1
++ 2
+ values.L2_OUTPUT_ORACLE_SLOT:
+- "0xe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871815"
+ values.l2OutputOracle:
+- "0xbB7aD3f9CCbC94085b7F7B1D5258e59F5F068741"
+ values.version:
+- "1.12.0"
++ "2.3.0-beta.5"
+ values.basefeeScalar:
++ 500000
+ values.blobbasefeeScalar:
++ 1014213
+ values.DISPUTE_GAME_FACTORY_SLOT:
++ "0x52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906"
+ values.disputeGameFactory:
++ "0x0000000000000000000000000000000000000000"
+ values.eip1559Denominator:
++ 0
+ values.eip1559Elasticity:
++ 0
+ values.gasPayingToken:
++ {"addr_":"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE","decimals_":18}
+ values.gasPayingTokenName:
++ "Ether"
+ values.gasPayingTokenSymbol:
++ "ETH"
+ values.isCustomGasToken:
++ false
+ values.maximumGasLimit:
++ 200000000
+ }
+```
+
+## Source code changes
+
+```diff
+.../SystemConfig/SystemConfig.sol | 1502 +++++++++++++++++++-
+ 1 file changed, 1462 insertions(+), 40 deletions(-)
+```
+
Generated with discovered.json: 0x8724b65dcee24112f0c4a946b885a8647360af24
# Diff at Fri, 01 Nov 2024 12:23:12 GMT:
diff --git a/packages/backend/discovery/bobanetwork/ethereum/discovered.json b/packages/backend/discovery/bobanetwork/ethereum/discovered.json
index fbe2038c126..8304ab08f61 100644
--- a/packages/backend/discovery/bobanetwork/ethereum/discovered.json
+++ b/packages/backend/discovery/bobanetwork/ethereum/discovered.json
@@ -1,7 +1,7 @@
{
"name": "bobanetwork",
"chain": "ethereum",
- "blockNumber": 20919938,
+ "blockNumber": 21428646,
"configHash": "0x210ae33d181dab6e47e6b5cc3721a250c4467466fae4d8b71b280a5aca28af22",
"contracts": [
{
@@ -10,7 +10,7 @@
"template": "opstack/SystemConfig",
"sourceHashes": [
"0x7913a1d7d0c47796c94eb6f8fd87a89ae9f2716eda57c9be4fd2b27c70bed617",
- "0xdf9a11b46747139bfe0135df8a65a2728a2dbd60a689e2398c45627915cdd752"
+ "0xe8f575933bc08fd1b1839c74e98447d0a629845c07c4281981ee0ba86ce88298"
],
"proxyType": "EIP1967 proxy",
"description": "Contains configuration parameters such as the Sequencer address, gas limit on this chain and the unsafe block signer address.",
@@ -40,27 +40,44 @@
"sinceTimestamp": 1710967919,
"values": {
"$admin": "0x6e598cec2701FfAA3c06175dc3Af0317a749a0Dc",
- "$implementation": "0xfaE274B77BA59f001196689f93E9e73693866f4a",
+ "$implementation": "0xb52F8f5D1285e3bc13F9C53D27C6F7336a3B50A9",
"$pastUpgrades": [
[
"2024-04-16T21:38:23.000Z",
"0x41b524b2ed6de3f6ec58d8e6508f9f6055ca3cb28a80b98af3213eb285a9fdce",
["0xfaE274B77BA59f001196689f93E9e73693866f4a"]
+ ],
+ [
+ "2024-12-16T17:58:59.000Z",
+ "0x2dd4983dfade963b3da262a0c56b5085ffc5ee2f3046292326568738250b5a42",
+ ["0xb52F8f5D1285e3bc13F9C53D27C6F7336a3B50A9"]
]
],
- "$upgradeCount": 1,
+ "$upgradeCount": 2,
+ "basefeeScalar": 500000,
"BATCH_INBOX_SLOT": "0x71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc597",
"batcherHash": "0xe1B64045351B0B6e9821F19b39f81bc4711D2230",
"batchInbox": "0xfFF0000000000000000000000000000000000288",
+ "blobbasefeeScalar": 1014213,
+ "DISPUTE_GAME_FACTORY_SLOT": "0x52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906",
+ "disputeGameFactory": "0x0000000000000000000000000000000000000000",
+ "eip1559Denominator": 0,
+ "eip1559Elasticity": 0,
"gasLimit": 30000000,
+ "gasPayingToken": {
+ "addr_": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
+ "decimals_": 18
+ },
+ "gasPayingTokenName": "Ether",
+ "gasPayingTokenSymbol": "ETH",
+ "isCustomGasToken": false,
"L1_CROSS_DOMAIN_MESSENGER_SLOT": "0x383f291819e6d54073bc9a648251d97421076bdd101933c0c022219ce9580636",
"L1_ERC_721_BRIDGE_SLOT": "0x46adcbebc6be8ce551740c29c47c8798210f23f7f4086c41752944352568d5a7",
"L1_STANDARD_BRIDGE_SLOT": "0x9904ba90dde5696cda05c9e0dab5cbaa0fea005ace4d11218a02ac668dad6376",
"l1CrossDomainMessenger": "0x6D4528d192dB72E282265D6092F4B872f9Dff69e",
"l1ERC721Bridge": "0xA6Ad22bb0E73DEF40a24E510cFbc93807d8bf87e",
"l1StandardBridge": "0xdc1664458d2f0B6090bEa60A8793A4E66c2F1c00",
- "L2_OUTPUT_ORACLE_SLOT": "0xe52a667f71ec761b9b381c7b76ca9b852adf7e8905da0e0ad49986a0a6871815",
- "l2OutputOracle": "0xbB7aD3f9CCbC94085b7F7B1D5258e59F5F068741",
+ "maximumGasLimit": 200000000,
"minimumGasLimit": 21000000,
"opStackDA": {
"isSomeTxsLengthEqualToCelestiaDAExample": false,
@@ -80,13 +97,13 @@
"systemTxMaxGas": 1000000,
"maximumBaseFee": "340282366920938463463374607431768211455"
},
- "scalar": 1000000,
+ "scalar": "452312848583266388373324160190187140051835877600158453279135543542577340704",
"sequencerInbox": "0xfFF0000000000000000000000000000000000288",
"START_BLOCK_SLOT": "0xa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f",
"startBlock": 19670770,
"UNSAFE_BLOCK_SIGNER_SLOT": "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08",
"unsafeBlockSigner": "0x4Ac69842680847e1135f514eE3d75172B685ECBf",
- "version": "1.12.0",
+ "version": "2.3.0-beta.5",
"VERSION": 0
},
"fieldMeta": {
@@ -227,7 +244,7 @@
"getChainId": 1,
"GnosisSafe_modules": [],
"multisigThreshold": "3 of 4 (75%)",
- "nonce": 14,
+ "nonce": 17,
"VERSION": "1.3.0"
},
"derivedName": "GnosisSafe"
@@ -277,7 +294,7 @@
],
"$upgradeCount": 5,
"MESSAGE_VERSION": 1,
- "messageNonce": "1766847064778384329583297500742918515827483896875618958121606201292676986",
+ "messageNonce": "1766847064778384329583297500742918515827483896875618958121606201292677007",
"MIN_GAS_CALLDATA_OVERHEAD": 16,
"MIN_GAS_DYNAMIC_OVERHEAD_DENOMINATOR": 63,
"MIN_GAS_DYNAMIC_OVERHEAD_NUMERATOR": 64,
@@ -394,8 +411,8 @@
"l2Sender": "0x000000000000000000000000000000000000dEaD",
"params": {
"prevBaseFee": 1000000000,
- "prevBoughtGas": 1304520,
- "prevBlockNum": 20904685
+ "prevBoughtGas": 100000,
+ "prevBlockNum": 21423033
},
"paused": false,
"superchainConfig": "0x996ffD627901f10C80A7d4B72A12316D2e77c076",
@@ -599,10 +616,10 @@
"finalizationPeriodSeconds": 604800,
"L2_BLOCK_TIME": 2,
"l2BlockTime": 2,
- "latestBlockNumber": 8685619,
- "latestOutputIndex": 4186,
- "nextBlockNumber": 8687419,
- "nextOutputIndex": 4187,
+ "latestBlockNumber": 11752819,
+ "latestOutputIndex": 5890,
+ "nextBlockNumber": 11754619,
+ "nextOutputIndex": 5891,
"proposer": "0xbfBAB4363034A930687B9320599a69DfBf1D21d0",
"PROPOSER": "0xbfBAB4363034A930687B9320599a69DfBf1D21d0",
"startingBlockNumber": 1149019,
@@ -659,6 +676,7 @@
}
],
"eoas": [
+ { "address": "0x0000000000000000000000000000000000000000" },
{ "address": "0x000000000000000000000000000000000000dEaD" },
{ "address": "0x33A0B6C2Bd60A592C5e91dCCd5E5f403693F0AC1" },
{ "address": "0x4Ac69842680847e1135f514eE3d75172B685ECBf" },
@@ -886,6 +904,57 @@
"function upgradeTo(address _implementation)",
"function upgradeToAndCall(address _implementation, bytes _data) payable returns (bytes)"
],
+ "0xb52F8f5D1285e3bc13F9C53D27C6F7336a3B50A9": [
+ "constructor()",
+ "event ConfigUpdate(uint256 indexed version, uint8 indexed updateType, bytes data)",
+ "event Initialized(uint8 version)",
+ "event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)",
+ "function BATCH_INBOX_SLOT() view returns (bytes32)",
+ "function DISPUTE_GAME_FACTORY_SLOT() view returns (bytes32)",
+ "function L1_CROSS_DOMAIN_MESSENGER_SLOT() view returns (bytes32)",
+ "function L1_ERC_721_BRIDGE_SLOT() view returns (bytes32)",
+ "function L1_STANDARD_BRIDGE_SLOT() view returns (bytes32)",
+ "function OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT() view returns (bytes32)",
+ "function OPTIMISM_PORTAL_SLOT() view returns (bytes32)",
+ "function START_BLOCK_SLOT() view returns (bytes32)",
+ "function UNSAFE_BLOCK_SIGNER_SLOT() view returns (bytes32)",
+ "function VERSION() view returns (uint256)",
+ "function basefeeScalar() view returns (uint32)",
+ "function batchInbox() view returns (address addr_)",
+ "function batcherHash() view returns (bytes32)",
+ "function blobbasefeeScalar() view returns (uint32)",
+ "function disputeGameFactory() view returns (address addr_)",
+ "function eip1559Denominator() view returns (uint32)",
+ "function eip1559Elasticity() view returns (uint32)",
+ "function gasLimit() view returns (uint64)",
+ "function gasPayingToken() view returns (address addr_, uint8 decimals_)",
+ "function gasPayingTokenName() view returns (string name_)",
+ "function gasPayingTokenSymbol() view returns (string symbol_)",
+ "function initialize(address _owner, uint32 _basefeeScalar, uint32 _blobbasefeeScalar, bytes32 _batcherHash, uint64 _gasLimit, address _unsafeBlockSigner, tuple(uint32 maxResourceLimit, uint8 elasticityMultiplier, uint8 baseFeeMaxChangeDenominator, uint32 minimumBaseFee, uint32 systemTxMaxGas, uint128 maximumBaseFee) _config, address _batchInbox, tuple(address l1CrossDomainMessenger, address l1ERC721Bridge, address l1StandardBridge, address disputeGameFactory, address optimismPortal, address optimismMintableERC20Factory, address gasPayingToken) _addresses)",
+ "function isCustomGasToken() view returns (bool)",
+ "function l1CrossDomainMessenger() view returns (address addr_)",
+ "function l1ERC721Bridge() view returns (address addr_)",
+ "function l1StandardBridge() view returns (address addr_)",
+ "function maximumGasLimit() pure returns (uint64)",
+ "function minimumGasLimit() view returns (uint64)",
+ "function optimismMintableERC20Factory() view returns (address addr_)",
+ "function optimismPortal() view returns (address addr_)",
+ "function overhead() view returns (uint256)",
+ "function owner() view returns (address)",
+ "function renounceOwnership()",
+ "function resourceConfig() view returns (tuple(uint32 maxResourceLimit, uint8 elasticityMultiplier, uint8 baseFeeMaxChangeDenominator, uint32 minimumBaseFee, uint32 systemTxMaxGas, uint128 maximumBaseFee))",
+ "function scalar() view returns (uint256)",
+ "function setBatcherHash(bytes32 _batcherHash)",
+ "function setEIP1559Params(uint32 _denominator, uint32 _elasticity)",
+ "function setGasConfig(uint256 _overhead, uint256 _scalar)",
+ "function setGasConfigEcotone(uint32 _basefeeScalar, uint32 _blobbasefeeScalar)",
+ "function setGasLimit(uint64 _gasLimit)",
+ "function setUnsafeBlockSigner(address _unsafeBlockSigner)",
+ "function startBlock() view returns (uint256 startBlock_)",
+ "function transferOwnership(address newOwner)",
+ "function unsafeBlockSigner() view returns (address addr_)",
+ "function version() pure returns (string)"
+ ],
"0xbB7aD3f9CCbC94085b7F7B1D5258e59F5F068741": [
"constructor(address _admin)",
"event AdminChanged(address previousAdmin, address newAdmin)",
@@ -1007,47 +1076,6 @@
"function paused() view returns (bool paused_)",
"function unpause()",
"function version() view returns (string)"
- ],
- "0xfaE274B77BA59f001196689f93E9e73693866f4a": [
- "constructor()",
- "event ConfigUpdate(uint256 indexed version, uint8 indexed updateType, bytes data)",
- "event Initialized(uint8 version)",
- "event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)",
- "function BATCH_INBOX_SLOT() view returns (bytes32)",
- "function L1_CROSS_DOMAIN_MESSENGER_SLOT() view returns (bytes32)",
- "function L1_ERC_721_BRIDGE_SLOT() view returns (bytes32)",
- "function L1_STANDARD_BRIDGE_SLOT() view returns (bytes32)",
- "function L2_OUTPUT_ORACLE_SLOT() view returns (bytes32)",
- "function OPTIMISM_MINTABLE_ERC20_FACTORY_SLOT() view returns (bytes32)",
- "function OPTIMISM_PORTAL_SLOT() view returns (bytes32)",
- "function START_BLOCK_SLOT() view returns (bytes32)",
- "function UNSAFE_BLOCK_SIGNER_SLOT() view returns (bytes32)",
- "function VERSION() view returns (uint256)",
- "function batchInbox() view returns (address addr_)",
- "function batcherHash() view returns (bytes32)",
- "function gasLimit() view returns (uint64)",
- "function initialize(address _owner, uint256 _overhead, uint256 _scalar, bytes32 _batcherHash, uint64 _gasLimit, address _unsafeBlockSigner, tuple(uint32 maxResourceLimit, uint8 elasticityMultiplier, uint8 baseFeeMaxChangeDenominator, uint32 minimumBaseFee, uint32 systemTxMaxGas, uint128 maximumBaseFee) _config, address _batchInbox, tuple(address l1CrossDomainMessenger, address l1ERC721Bridge, address l1StandardBridge, address l2OutputOracle, address optimismPortal, address optimismMintableERC20Factory) _addresses)",
- "function l1CrossDomainMessenger() view returns (address addr_)",
- "function l1ERC721Bridge() view returns (address addr_)",
- "function l1StandardBridge() view returns (address addr_)",
- "function l2OutputOracle() view returns (address addr_)",
- "function minimumGasLimit() view returns (uint64)",
- "function optimismMintableERC20Factory() view returns (address addr_)",
- "function optimismPortal() view returns (address addr_)",
- "function overhead() view returns (uint256)",
- "function owner() view returns (address)",
- "function renounceOwnership()",
- "function resourceConfig() view returns (tuple(uint32 maxResourceLimit, uint8 elasticityMultiplier, uint8 baseFeeMaxChangeDenominator, uint32 minimumBaseFee, uint32 systemTxMaxGas, uint128 maximumBaseFee))",
- "function scalar() view returns (uint256)",
- "function setBatcherHash(bytes32 _batcherHash)",
- "function setGasConfig(uint256 _overhead, uint256 _scalar)",
- "function setGasLimit(uint64 _gasLimit)",
- "function setResourceConfig(tuple(uint32 maxResourceLimit, uint8 elasticityMultiplier, uint8 baseFeeMaxChangeDenominator, uint32 minimumBaseFee, uint32 systemTxMaxGas, uint128 maximumBaseFee) _config)",
- "function setUnsafeBlockSigner(address _unsafeBlockSigner)",
- "function startBlock() view returns (uint256 startBlock_)",
- "function transferOwnership(address newOwner)",
- "function unsafeBlockSigner() view returns (address addr_)",
- "function version() view returns (string)"
]
},
"usedTemplates": {
diff --git a/packages/backend/discovery/kinto/ethereum/diffHistory.md b/packages/backend/discovery/kinto/ethereum/diffHistory.md
index 4a032d52b25..cb2ed33e2bc 100644
--- a/packages/backend/discovery/kinto/ethereum/diffHistory.md
+++ b/packages/backend/discovery/kinto/ethereum/diffHistory.md
@@ -1,3 +1,41 @@
+Generated with discovered.json: 0x2bd708fab05955301c1f1d6ccf735f064a471fbd
+
+# Diff at Wed, 18 Dec 2024 12:34:31 GMT:
+
+- author: sekuba (<29250140+sekuba@users.noreply.github.com>)
+- comparing to: main@a44ef6747febdd9930ef05420e60556c20899f13 block: 21394564
+- current block number: 21429443
+
+## Description
+
+Minor Bridger upgrade, notably adding a `rescueToken` function callable by the owner that does what it says (Bridger does not usually escrow funds, it behaves like a router).
+
+## Watched changes
+
+```diff
+ contract Bridger (0x0f1b7bd7762662B23486320AA91F30312184f70C) {
+ +++ description: Bridger gateway that can swap assets to 'L2 final assets' before bridging them to the L2.
+ sourceHashes.1:
+- "0xe7c2c13ea3945f7f426234c719fd1c436d2f5e0152427b80b30ca059c9f2f4e5"
++ "0xe2aec4572349f66126b1ebb9d5e63c56d78d4655c3d036b5fdcd621c052125e5"
+ values.$implementation:
+- "0x21D3921B50617BDef223207118950B0b577e4007"
++ "0xae2F80339Bdd9bd384502A62aEe956eAbF3796e6"
+ values.$pastUpgrades.11:
++ ["2024-12-17T00:38:35.000Z","0x9e8c1bcb81d01c1d3ed8c7f0b34ac033d5838e341641a809a6a1ad101139e118",["0xae2F80339Bdd9bd384502A62aEe956eAbF3796e6"]]
+ values.$upgradeCount:
+- 11
++ 12
+ }
+```
+
+## Source code changes
+
+```diff
+.../{.flat@21394564 => .flat}/Bridger/Bridger.sol | 27 ++++++++++++++++++++--
+ 1 file changed, 25 insertions(+), 2 deletions(-)
+```
+
Generated with discovered.json: 0x8a5f69d0cb6b892ebfd38ca8887bac3224e03da8
# Diff at Fri, 06 Dec 2024 08:09:46 GMT:
diff --git a/packages/backend/discovery/kinto/ethereum/discovered.json b/packages/backend/discovery/kinto/ethereum/discovered.json
index 335a7ea0062..2108a766f74 100644
--- a/packages/backend/discovery/kinto/ethereum/discovered.json
+++ b/packages/backend/discovery/kinto/ethereum/discovered.json
@@ -1,7 +1,7 @@
{
"name": "kinto",
"chain": "ethereum",
- "blockNumber": 21394564,
+ "blockNumber": 21429443,
"configHash": "0x2f582a24c74ad1764ce44677d855986539300e493f1545d81d17e4c66e1987db",
"contracts": [
{
@@ -9,7 +9,7 @@
"address": "0x0f1b7bd7762662B23486320AA91F30312184f70C",
"sourceHashes": [
"0xeeb4c186c20cc83c0dc547c387bbb8738f8a0b213ed2e8ecb325ad9326c326bc",
- "0xe7c2c13ea3945f7f426234c719fd1c436d2f5e0152427b80b30ca059c9f2f4e5"
+ "0xe2aec4572349f66126b1ebb9d5e63c56d78d4655c3d036b5fdcd621c052125e5"
],
"proxyType": "EIP1967 proxy",
"description": "Bridger gateway that can swap assets to 'L2 final assets' before bridging them to the L2.",
@@ -23,7 +23,7 @@
"sinceTimestamp": 1710248135,
"values": {
"$admin": "0xf152Abda9E4ce8b134eF22Dc3C6aCe19C4895D82",
- "$implementation": "0x21D3921B50617BDef223207118950B0b577e4007",
+ "$implementation": "0xae2F80339Bdd9bd384502A62aEe956eAbF3796e6",
"$pastUpgrades": [
[
"2024-03-12T12:55:35.000Z",
@@ -79,9 +79,14 @@
"2024-09-26T17:41:47.000Z",
"0x31a2c058d7ce91c9d1b526764cf6442a45bdf662d2725bf8535a167303250bec",
["0x21D3921B50617BDef223207118950B0b577e4007"]
+ ],
+ [
+ "2024-12-17T00:38:35.000Z",
+ "0x9e8c1bcb81d01c1d3ed8c7f0b34ac033d5838e341641a809a6a1ad101139e118",
+ ["0xae2F80339Bdd9bd384502A62aEe956eAbF3796e6"]
]
],
- "$upgradeCount": 11,
+ "$upgradeCount": 12,
"angleSwapper": "0xD253b62108d1831aEd298Fc2434A5A8e4E418053",
"DAI": "0x6B175474E89094C44Da98b954EedeAC495271d0F",
"ETH": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
@@ -360,12 +365,12 @@
"confirmPeriodBlocks": 45818,
"currentRequiredStake": "100000000000000000",
"extraChallengeTimeBlocks": 200,
- "firstUnresolvedNode": 2315,
+ "firstUnresolvedNode": 2334,
"inbox": "0xBFfaA85c1756472fFC37e6D172A7eC0538C14474",
"isERC20Enabled": false,
"lastStakeBlock": 21107949,
- "latestConfirmed": 2314,
- "latestNodeCreated": 2339,
+ "latestConfirmed": 2333,
+ "latestNodeCreated": 2359,
"loserStakeEscrow": "0x09d34B74cd8B1c4394A3cD9630E1Ba027E6ED4F5",
"minimumAssertionPeriod": 75,
"outbox": "0x655761AD5FC251F414D6993A73184B0669F278c8",
@@ -831,11 +836,11 @@
"0x52EcE832AF3DF3125BbfD6423E0425dB3fA99D3F"
],
"allowedOutboxList": ["0x655761AD5FC251F414D6993A73184B0669F278c8"],
- "delayedMessageCount": 4490,
+ "delayedMessageCount": 4523,
"rollup": "0x5073dA9cA4810f3E0aA01c20c7d9d02C3f522e11",
"sequencerInbox": "0xF4Ef823D57819AC7202a081A5B49376BD28E7b3a",
- "sequencerMessageCount": 3771,
- "sequencerReportedSubMessageCount": 652383
+ "sequencerMessageCount": 3800,
+ "sequencerReportedSubMessageCount": 678123
}
},
{
@@ -1032,7 +1037,7 @@
"getChainId": 1,
"GnosisSafe_modules": [],
"multisigThreshold": "3 of 5 (60%)",
- "nonce": 211,
+ "nonce": 213,
"VERSION": "1.3.0"
},
"derivedName": "GnosisSafe"
@@ -1086,7 +1091,7 @@
]
],
"$upgradeCount": 2,
- "batchCount": 3771,
+ "batchCount": 3800,
"batchPosterManager": "0x0000000000000000000000000000000000000000",
"batchPosters": ["0xe27f3f6db6824def1738b2aACe2672aC59046a39"],
"bridge": "0x859a53Fe2C8DA961387030E7CB498D6D20d0B2DB",
@@ -1114,7 +1119,7 @@
"rollup": "0x5073dA9cA4810f3E0aA01c20c7d9d02C3f522e11",
"sequencerVersion": "0x00",
"setIsBatchPosterCount": 1,
- "totalDelayedMessagesRead": 4489,
+ "totalDelayedMessagesRead": 4522,
"TREE_DAS_MESSAGE_HEADER_FLAG": "0x08",
"ZERO_HEAVY_MESSAGE_HEADER_FLAG": "0x20"
},
@@ -1310,66 +1315,6 @@
"function submitBatchSpendingReport(address sender, bytes32 messageDataHash) returns (uint256)",
"function updateRollupAddress(address _rollup)"
],
- "0x21D3921B50617BDef223207118950B0b577e4007": [
- "constructor(address exchange, address usdc, address weth, address dai, address usde, address sUsde, address wstEth)",
- "error BalanceTooLow(uint256 amount, uint256 balance)",
- "error DepositBySigResult(uint256 amountOut)",
- "error FailedToStakeEth()",
- "error InvalidAmount(uint256 amount)",
- "error InvalidNonce()",
- "error InvalidSigner(address signer)",
- "error InvalidVault(address vault)",
- "error OnlyOwner()",
- "error SignatureExpired()",
- "error SlippageError(uint256 boughtAmount, uint256 minReceive)",
- "event AdminChanged(address previousAdmin, address newAdmin)",
- "event BeaconUpgraded(address indexed beacon)",
- "event Deposit(address indexed from, address indexed wallet, address indexed asset, uint256 amount, address assetBought, uint256 amountBought)",
- "event Initialized(uint8 version)",
- "event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)",
- "event Paused(address account)",
- "event Unpaused(address account)",
- "event Upgraded(address indexed implementation)",
- "function DAI() view returns (address)",
- "function ETH() view returns (address)",
- "function PERMIT2() view returns (address)",
- "function SOLV_BTC() view returns (address)",
- "function SOLV_BTC_POOL_ID() view returns (bytes32)",
- "function SOLV_SFT_WRAP_ROUTER() view returns (address)",
- "function USDA() view returns (address)",
- "function USDC() view returns (address)",
- "function USDM() view returns (address)",
- "function USDe() view returns (address)",
- "function WBTC() view returns (address)",
- "function WETH() view returns (address)",
- "function __depositCount() view returns (uint256)",
- "function angleSwapper() view returns (address)",
- "function bridgeVaults(address) view returns (bool)",
- "function depositBySig(bytes permitSig, tuple(address kintoWallet, address signer, address inputAsset, address finalAsset, uint256 amount, uint256 minReceive, uint256 nonce, uint256 expiresAt, bytes signature) depositData, bytes swapCallData, tuple(address vault, uint256 gasFee, uint256 msgGasLimit, address connector, bytes execPayload, bytes options) bridgeData) returns (uint256)",
- "function depositERC20(address inputAsset, uint256 amount, address kintoWallet, address finalAsset, uint256 minReceive, bytes swapCallData, tuple(address vault, uint256 gasFee, uint256 msgGasLimit, address connector, bytes execPayload, bytes options) bridgeData) returns (uint256)",
- "function depositETH(uint256 amount, address kintoWallet, address finalAsset, uint256 minReceive, bytes swapCallData, tuple(address vault, uint256 gasFee, uint256 msgGasLimit, address connector, bytes execPayload, bytes options) bridgeData) payable returns (uint256)",
- "function depositPermit2(tuple(tuple(address token, uint160 amount, uint48 expiration, uint48 nonce) details, address spender, uint256 sigDeadline) permitSingle, bytes permit2Signature, tuple(address kintoWallet, address signer, address inputAsset, address finalAsset, uint256 amount, uint256 minReceive, uint256 nonce, uint256 expiresAt, bytes signature) depositData, bytes swapCallData, tuple(address vault, uint256 gasFee, uint256 msgGasLimit, address connector, bytes execPayload, bytes options) bridgeData) returns (uint256)",
- "function domainSeparator() view returns (bytes32)",
- "function initialize(address sender)",
- "function nonces(address) view returns (uint256)",
- "function owner() view returns (address)",
- "function pause()",
- "function paused() view returns (bool)",
- "function proxiableUUID() view returns (bytes32)",
- "function renounceOwnership()",
- "function sUSDe() view returns (address)",
- "function senderAccount() view returns (address)",
- "function setBridgeVault(address vault, bool flag)",
- "function setSenderAccount(address sender)",
- "function stUSD() view returns (address)",
- "function swapRouter() view returns (address)",
- "function transferOwnership(address newOwner)",
- "function unpause()",
- "function upgradeTo(address newImplementation)",
- "function upgradeToAndCall(address newImplementation, bytes data) payable",
- "function wUSDM() view returns (address)",
- "function wstETH() view returns (address)"
- ],
"0x27Bb05e547CfC9b874f18b0F6F3FB62A58Be9CdB": [
"event AdminChanged(address previousAdmin, address newAdmin)",
"event BeaconUpgraded(address indexed beacon)",
@@ -1808,6 +1753,68 @@
"0xacED35d61f71A804E7627b5622c267C8Ac31d38e": [
"function executeOneStep(tuple(uint256 maxInboxMessagesRead, address bridge), tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) valueMultiStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) frameMultiStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 recoveryPc, bytes32 modulesRoot) startMach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, bytes32 extraHash, uint32 internalsOffset) startMod, tuple(uint16 opcode, uint256 argumentData) inst, bytes proof) pure returns (tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) valueMultiStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) frameMultiStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 recoveryPc, bytes32 modulesRoot) mach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, bytes32 extraHash, uint32 internalsOffset) mod)"
],
+ "0xae2F80339Bdd9bd384502A62aEe956eAbF3796e6": [
+ "constructor(address exchange, address usdc, address weth, address dai, address usde, address sUsde, address wstEth)",
+ "error BalanceTooLow(uint256 amount, uint256 balance)",
+ "error DepositBySigResult(uint256 amountOut)",
+ "error FailedToStakeEth()",
+ "error InvalidAmount(uint256 amount)",
+ "error InvalidNonce()",
+ "error InvalidSigner(address signer)",
+ "error InvalidVault(address vault)",
+ "error OnlyOwner()",
+ "error RouterAllowanceNotZero(uint256 allowance)",
+ "error SignatureExpired()",
+ "error SlippageError(uint256 boughtAmount, uint256 minReceive)",
+ "event AdminChanged(address previousAdmin, address newAdmin)",
+ "event BeaconUpgraded(address indexed beacon)",
+ "event Deposit(address indexed from, address indexed wallet, address indexed asset, uint256 amount, address assetBought, uint256 amountBought)",
+ "event Initialized(uint8 version)",
+ "event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)",
+ "event Paused(address account)",
+ "event Unpaused(address account)",
+ "event Upgraded(address indexed implementation)",
+ "function DAI() view returns (address)",
+ "function ETH() view returns (address)",
+ "function PERMIT2() view returns (address)",
+ "function SOLV_BTC() view returns (address)",
+ "function SOLV_BTC_POOL_ID() view returns (bytes32)",
+ "function SOLV_SFT_WRAP_ROUTER() view returns (address)",
+ "function USDA() view returns (address)",
+ "function USDC() view returns (address)",
+ "function USDM() view returns (address)",
+ "function USDe() view returns (address)",
+ "function WBTC() view returns (address)",
+ "function WETH() view returns (address)",
+ "function __depositCount() view returns (uint256)",
+ "function angleSwapper() view returns (address)",
+ "function bridgeVaults(address) view returns (bool)",
+ "function depositBySig(bytes permitSig, tuple(address kintoWallet, address signer, address inputAsset, address finalAsset, uint256 amount, uint256 minReceive, uint256 nonce, uint256 expiresAt, bytes signature) depositData, bytes swapCallData, tuple(address vault, uint256 gasFee, uint256 msgGasLimit, address connector, bytes execPayload, bytes options) bridgeData) returns (uint256)",
+ "function depositERC20(address inputAsset, uint256 amount, address kintoWallet, address finalAsset, uint256 minReceive, bytes swapCallData, tuple(address vault, uint256 gasFee, uint256 msgGasLimit, address connector, bytes execPayload, bytes options) bridgeData) returns (uint256)",
+ "function depositETH(uint256 amount, address kintoWallet, address finalAsset, uint256 minReceive, bytes swapCallData, tuple(address vault, uint256 gasFee, uint256 msgGasLimit, address connector, bytes execPayload, bytes options) bridgeData) payable returns (uint256)",
+ "function depositPermit2(tuple(tuple(address token, uint160 amount, uint48 expiration, uint48 nonce) details, address spender, uint256 sigDeadline) permitSingle, bytes permit2Signature, tuple(address kintoWallet, address signer, address inputAsset, address finalAsset, uint256 amount, uint256 minReceive, uint256 nonce, uint256 expiresAt, bytes signature) depositData, bytes swapCallData, tuple(address vault, uint256 gasFee, uint256 msgGasLimit, address connector, bytes execPayload, bytes options) bridgeData) returns (uint256)",
+ "function domainSeparator() view returns (bytes32)",
+ "function initialize(address sender)",
+ "function nonces(address) view returns (uint256)",
+ "function owner() view returns (address)",
+ "function pause()",
+ "function paused() view returns (bool)",
+ "function proxiableUUID() view returns (bytes32)",
+ "function renounceOwnership()",
+ "function rescueToken(address token)",
+ "function sUSDe() view returns (address)",
+ "function senderAccount() view returns (address)",
+ "function setBridgeVault(address vault, bool flag)",
+ "function setSenderAccount(address sender)",
+ "function stUSD() view returns (address)",
+ "function swapRouter() view returns (address)",
+ "function transferOwnership(address newOwner)",
+ "function unpause()",
+ "function upgradeTo(address newImplementation)",
+ "function upgradeToAndCall(address newImplementation, bytes data) payable",
+ "function wUSDM() view returns (address)",
+ "function wstETH() view returns (address)"
+ ],
"0xBFfaA85c1756472fFC37e6D172A7eC0538C14474": [
"constructor(address _logic, address admin_, bytes _data) payable",
"event AdminChanged(address previousAdmin, address newAdmin)",
diff --git a/packages/backend/discovery/kinto/kinto/config.jsonc b/packages/backend/discovery/kinto/kinto/config.jsonc
index bd2600d0dcd..ab4a0820702 100644
--- a/packages/backend/discovery/kinto/kinto/config.jsonc
+++ b/packages/backend/discovery/kinto/kinto/config.jsonc
@@ -147,8 +147,8 @@
"ignoreMethods": ["proxiableUUID"]
},
"BridgedKinto": {
- "ignoreMethods": ["proxiableUUID"],
- "ignoreInWatchMode": ["totalSupply"]
+ "ignoreMethods": ["proxiableUUID", "getPastTotalSupply"],
+ "ignoreInWatchMode": ["totalSupply", "clock"]
},
"RewardsDistributor": {
"ignoreMethods": ["proxiableUUID", "getRewards", "rewardsPerQuarter"],
diff --git a/packages/backend/discovery/kinto/kinto/diffHistory.md b/packages/backend/discovery/kinto/kinto/diffHistory.md
index c781b773a56..e306363c249 100644
--- a/packages/backend/discovery/kinto/kinto/diffHistory.md
+++ b/packages/backend/discovery/kinto/kinto/diffHistory.md
@@ -1,3 +1,64 @@
+Generated with discovered.json: 0x7acb4802288d2af3c0fa1a8ad793cc2ffe58e589
+
+# Diff at Wed, 18 Dec 2024 12:37:21 GMT:
+
+- author: sekuba (<29250140+sekuba@users.noreply.github.com>)
+- comparing to: main@a44ef6747febdd9930ef05420e60556c20899f13 block: 673467
+- current block number: 678494
+
+## Description
+
+This upgrade adds the ArbSys contract (`0x0000000000000000000000000000000000000064`) as a system contract, whitelisting it in the STF to be called by EOAs. This is necessary for withdrawing ETH from Kinto from an EOA, e.g. in a forced transaction.
+
+The token contract of the KINTO token is upgraded to integrate new delegation and token voting libraries.
+
+## Watched changes
+
+```diff
+ contract BridgedKinto (0x010700808D59d2bb92257fCafACfe8e5bFF7aB87) {
+ +++ description: None
+ sourceHashes.1:
+- "0x44215a226a4f9bbe6261cc55102df996258b9a5a2456bcfd1e33e7bb9886a8a7"
++ "0x4f5f7229da06877c8ec759071cd3d1999f9680fa1d5a7e5d5381558383c25b22"
+ values.$implementation:
+- "0xbE43c24500B855f0cc0D0F99361683B6C6ED73b8"
++ "0xAf968044D5DE68fE01B5a6517d0DbeE3caD8563a"
+ values.$pastUpgrades.4:
++ ["2024-12-18T00:08:48.000Z","0xb0828f7016e3452a4b32bf6d987b8a8e265c5bdf5fedbcc42b51940f17d18ab8",["0xAf968044D5DE68fE01B5a6517d0DbeE3caD8563a"]]
+ values.$pastUpgrades.3:
++ ["2024-12-17T20:37:39.000Z","0xbe1519e9c0c006360238f02214b8b50211659d44f2c37353ce47efdc9db07352",["0xDd11ab74e0e8B042F843447F5754376f2F303492"]]
+ values.$upgradeCount:
+- 3
++ 5
+ values.CLOCK_MODE:
++ "mode=timestamp"
+ }
+```
+
+```diff
+ contract KintoWallet (0x25EA8c663BA8cCd79284B8c4001e7A245071885c) {
+ +++ description: None
+ values.getNonce:
+- 217
++ 220
+ }
+```
+
+```diff
+ contract KintoAppRegistry (0x5A2b641b84b0230C8e75F55d5afd27f4Dbd59d5b) {
+ +++ description: Central system contract defining addresses that are allowed to be called by EOAs. The modified Kinto node reads this configuration and drops all other transactions from EOAs. Accordingly, users can only transact from their smart wallets.
+ values.getSystemContracts.16:
++ "0x0000000000000000000000000000000000000064"
+ }
+```
+
+## Source code changes
+
+```diff
+.../BridgedKinto/BridgedKinto.sol | 3562 ++++++++++++--------
+ 1 file changed, 2213 insertions(+), 1349 deletions(-)
+```
+
Generated with discovered.json: 0x61bb2abc25873ee5cbc6fd74a69cf3ea384a4f54
# Diff at Mon, 16 Dec 2024 13:50:33 GMT:
diff --git a/packages/backend/discovery/kinto/kinto/discovered.json b/packages/backend/discovery/kinto/kinto/discovered.json
index b46dd0263dd..2adfe154965 100644
--- a/packages/backend/discovery/kinto/kinto/discovered.json
+++ b/packages/backend/discovery/kinto/kinto/discovered.json
@@ -1,8 +1,8 @@
{
"name": "kinto",
"chain": "kinto",
- "blockNumber": 673467,
- "configHash": "0x4f6bebbb9ed3611a95e335371c483d100378f3b4735aa77e7997425d0555bbe1",
+ "blockNumber": 678494,
+ "configHash": "0x5f878a90d8050c6e49fe6f5d0445a7845807b9abfd09b264e62e67c17db819aa",
"contracts": [
{
"name": "NioGuardians",
@@ -14,7 +14,7 @@
"sinceTimestamp": 1729791292,
"values": {
"$immutable": true,
- "clock": 1734357017,
+ "clock": 1734525421,
"CLOCK_MODE": "mode=timestamp",
"eip712Domain": {
"fields": "0x0f",
@@ -47,7 +47,7 @@
"accessManager": "0xacC000818e5Bbd911D5d449aA81CB5cA24024739",
"BALLOT_TYPEHASH": "0xf2aad550cf55f045cb27e9c559f9889fdfb6e6cdaa032301d6ea397784ae51d7",
"baseDelaySeconds": 259200,
- "clock": 1734357017,
+ "clock": 1734525421,
"CLOCK_MODE": "mode=timestamp",
"COUNTING_MODE": "support=bravo&quorum=for,abstain",
"eip712Domain": {
@@ -78,14 +78,14 @@
"address": "0x010700808D59d2bb92257fCafACfe8e5bFF7aB87",
"sourceHashes": [
"0xeeb4c186c20cc83c0dc547c387bbb8738f8a0b213ed2e8ecb325ad9326c326bc",
- "0x44215a226a4f9bbe6261cc55102df996258b9a5a2456bcfd1e33e7bb9886a8a7"
+ "0x4f5f7229da06877c8ec759071cd3d1999f9680fa1d5a7e5d5381558383c25b22"
],
"proxyType": "EIP1967 proxy",
- "ignoreInWatchMode": ["totalSupply"],
+ "ignoreInWatchMode": ["totalSupply", "clock"],
"sinceTimestamp": 1718926428,
"values": {
"$admin": "0x0000000000000000000000000000000000000000",
- "$implementation": "0xbE43c24500B855f0cc0D0F99361683B6C6ED73b8",
+ "$implementation": "0xAf968044D5DE68fE01B5a6517d0DbeE3caD8563a",
"$pastUpgrades": [
[
"2024-06-20T23:33:48.000Z",
@@ -101,9 +101,21 @@
"2024-07-10T20:17:25.000Z",
"0xb70427666e80d6b474e9f29949fda22eb4fb50c9b548295f6d3f1a6f8a465561",
["0xbE43c24500B855f0cc0D0F99361683B6C6ED73b8"]
+ ],
+ [
+ "2024-12-17T20:37:39.000Z",
+ "0xbe1519e9c0c006360238f02214b8b50211659d44f2c37353ce47efdc9db07352",
+ ["0xDd11ab74e0e8B042F843447F5754376f2F303492"]
+ ],
+ [
+ "2024-12-18T00:08:48.000Z",
+ "0xb0828f7016e3452a4b32bf6d987b8a8e265c5bdf5fedbcc42b51940f17d18ab8",
+ ["0xAf968044D5DE68fE01B5a6517d0DbeE3caD8563a"]
]
],
- "$upgradeCount": 3,
+ "$upgradeCount": 5,
+ "clock": 1734525421,
+ "CLOCK_MODE": "mode=timestamp",
"decimals": 18,
"DEFAULT_ADMIN_ROLE": "0x0000000000000000000000000000000000000000000000000000000000000000",
"DOMAIN_SEPARATOR": "0xeecc985db8992f45834fdd301c1051f177b587a884e76e7dfb8876780af1e813",
@@ -304,7 +316,7 @@
"appRegistry": "0x5A2b641b84b0230C8e75F55d5afd27f4Dbd59d5b",
"COST_OF_POST": 200000,
"entryPoint": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb",
- "getDeposit": "31232337647282674604",
+ "getDeposit": "31248799548063110675",
"kintoID": "0xf369f78E3A0492CC4e96a90dae0728A38498e9c7",
"MAX_COST_OF_PREVERIFICATION": 4000000,
"MAX_COST_OF_VERIFICATION": 530000,
@@ -509,7 +521,7 @@
"entryPoint": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb",
"factory": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75",
"getAccessPoint": "0xbd103754B3B4eD40BE01415c3c8F7f6A934Fe16a",
- "getNonce": 217,
+ "getNonce": 220,
"getOwners": [
"0x2B409E1Bb2164D6993d0189720a5A3cE8980B5c4",
"0x4181803232280371E02a875F51515BE57B215231"
@@ -751,7 +763,7 @@
"entryPoint": "0x2843C269D2a64eCfA63548E8B3Fc0FD23B7F70cb",
"factory": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75",
"getAccessPoint": "0x474ec69B0fD5Ebc1EfcFe18B2E8Eb510D755b8C7",
- "getNonce": 3876,
+ "getNonce": 3881,
"getOwners": [
"0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c",
"0xc1f4D15C16A1f3555E0a5F7AeFD1e17AD4aaf40B",
@@ -837,7 +849,7 @@
"capacitorFactory__": "0x35B1Ca86D564e69FA38Ee456C12c78A62e78Aa4c",
"chainSlug": 7887,
"executionManager__": "0xc8a4D2fd77c155fd52e65Ab07F337aBF84495Ead",
- "globalMessageCount": 7207,
+ "globalMessageCount": 7422,
"hasher__": "0x9652Dd5e1388CA80712470122F27be0d1c33B48b",
"nominee": "0x0000000000000000000000000000000000000000",
"owner": "0x2e2B1c42E38f5af81771e65D87729E57ABD1337a",
@@ -1040,7 +1052,8 @@
"0xd563ECBDF90EBA783d0a218EFf158C1263ad02BE",
"0x8d2D899402ed84b6c0510bB1ad34ee436ADDD20d",
"0x000000000000000000000000000000000000006E",
- "0x4e59b44847b379578588920cA78FbF26c0B4956C"
+ "0x4e59b44847b379578588920cA78FbF26c0B4956C",
+ "0x0000000000000000000000000000000000000064"
],
"name": "Kinto APP",
"owner": "0xacC000818e5Bbd911D5d449aA81CB5cA24024739",
@@ -1363,7 +1376,7 @@
"kintoID": "0xf369f78E3A0492CC4e96a90dae0728A38498e9c7",
"owner": "0xacC000818e5Bbd911D5d449aA81CB5cA24024739",
"rewardsDistributor": "0xD157904639E89df05e89e0DabeEC99aE3d74F9AA",
- "totalWallets": 65062
+ "totalWallets": 66237
},
"derivedName": "KintoWalletFactory"
},
@@ -1584,16 +1597,16 @@
"$upgradeCount": 8,
"bonusAmount": 0,
"DEFAULT_ADMIN_ROLE": "0x0000000000000000000000000000000000000000000000000000000000000000",
- "getTotalLimit": "374428651857895166691195",
- "getUnclaimedLimit": "193208166399099890568122",
+ "getTotalLimit": "378170259546760771144498",
+ "getUnclaimedLimit": "196665647994007346306894",
"KINTO": "0x010700808D59d2bb92257fCafACfe8e5bFF7aB87",
"NEW_USER_REWARD": "1000000000000000000",
"NEW_USER_REWARD_END_TIMESTAMP": 1734133547,
"NEW_USER_REWARD_TIMESTAMP": 1729785402,
"quarters": 40,
- "root": "0x5d68e54208b1bd368800ce071329b7986a2f96365ce5b71acd591e69473e6636",
+ "root": "0xa409bd9b89ed4d4a88fede8133ea031a291b88201ddb536cf33f8eaae3eb22b7",
"startTime": 1718690400,
- "totalClaimed": "181220485458795276123073",
+ "totalClaimed": "181504611552753424837604",
"totalTokens": "4000000000000000000000000",
"UPDATER_ROLE": "0x56730d7d989818781b81ff2da8c4c452dd13af73dfb8c4f4723e21d17335fd24",
"UPGRADE_INTERFACE_VERSION": "5.0.0",
@@ -1705,7 +1718,7 @@
],
"GOVERNANCE_ROLE": "0x71840dc4906352362b0cdaf79870196c8e42acafade72d5d5a6d59291253ceb1",
"KYC_PROVIDER_ROLE": "0x6c4079fcac94e7142d8c209744c998efe53a188aadb7e55958f7ad3ea8a1d652",
- "lastMonitoredAt": 1734291543,
+ "lastMonitoredAt": 1734464469,
"name": "Kinto ID",
"ownerOf": [
"0x660ad4B5A74130a4796B4d54BC6750Ae93C86e6c",
@@ -1719,7 +1732,7 @@
"https://kinto.xyz/api/v1/nft-kinto-id/3",
"https://kinto.xyz/api/v1/nft-kinto-id/4"
],
- "totalSupply": 65394,
+ "totalSupply": 66574,
"UPGRADER_ROLE": "0x189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e3",
"walletFactory": "0x8a4720488CA32f1223ccFE5A087e250fE3BC5D75"
},
@@ -2480,6 +2493,95 @@
"function setTargetFunctionRole(address target, bytes4[] selectors, uint64 roleId)",
"function updateAuthority(address target, address newAuthority)"
],
+ "0xAf968044D5DE68fE01B5a6517d0DbeE3caD8563a": [
+ "constructor()",
+ "error AccessControlBadConfirmation()",
+ "error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)",
+ "error AddressEmptyCode(address target)",
+ "error ArrayLengthMismatch()",
+ "error CheckpointUnorderedInsertion()",
+ "error ECDSAInvalidSignature()",
+ "error ECDSAInvalidSignatureLength(uint256 length)",
+ "error ECDSAInvalidSignatureS(bytes32 s)",
+ "error ERC1967InvalidImplementation(address implementation)",
+ "error ERC1967NonPayable()",
+ "error ERC20ExceededSafeSupply(uint256 increasedSupply, uint256 cap)",
+ "error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)",
+ "error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)",
+ "error ERC20InvalidApprover(address approver)",
+ "error ERC20InvalidReceiver(address receiver)",
+ "error ERC20InvalidSender(address sender)",
+ "error ERC20InvalidSpender(address spender)",
+ "error ERC2612ExpiredSignature(uint256 deadline)",
+ "error ERC2612InvalidSigner(address signer, address owner)",
+ "error ERC5805FutureLookup(uint256 timepoint, uint48 clock)",
+ "error ERC6372InconsistentClock()",
+ "error EmptyArrays()",
+ "error FailedInnerCall()",
+ "error InvalidAccountNonce(address account, uint256 currentNonce)",
+ "error InvalidInitialization()",
+ "error NotInitializing()",
+ "error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value)",
+ "error TransferIsNotAllowed(address from, address to, uint256 amount)",
+ "error UUPSUnauthorizedCallContext()",
+ "error UUPSUnsupportedProxiableUUID(bytes32 slot)",
+ "error VotesExpiredSignature(uint256 expiry)",
+ "event Approval(address indexed owner, address indexed spender, uint256 value)",
+ "event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate)",
+ "event DelegateVotesChanged(address indexed delegate, uint256 previousVotes, uint256 newVotes)",
+ "event EIP712DomainChanged()",
+ "event Initialized(uint64 version)",
+ "event MiningContractSet(address indexed miningContract, address oldMiningContract)",
+ "event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)",
+ "event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)",
+ "event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)",
+ "event Transfer(address indexed from, address indexed to, uint256 value)",
+ "event Upgraded(address indexed implementation)",
+ "function CLOCK_MODE() pure returns (string)",
+ "function DEFAULT_ADMIN_ROLE() view returns (bytes32)",
+ "function DOMAIN_SEPARATOR() view returns (bytes32)",
+ "function MINTER_ROLE() view returns (bytes32)",
+ "function TREASURY() view returns (address)",
+ "function UPGRADER_ROLE() view returns (bytes32)",
+ "function UPGRADE_INTERFACE_VERSION() view returns (string)",
+ "function allowance(address owner, address spender) view returns (uint256)",
+ "function approve(address spender, uint256 value) returns (bool)",
+ "function balanceOf(address account) view returns (uint256)",
+ "function batchBurn(address[] from, uint256[] amounts)",
+ "function batchMint(address[] recipients, uint256[] amounts)",
+ "function burn(address from, uint256 amount)",
+ "function checkpoints(address account, uint32 pos) view returns (tuple(uint48 _key, uint208 _value))",
+ "function clock() view returns (uint48)",
+ "function decimals() view returns (uint8)",
+ "function delegate(address delegatee)",
+ "function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s)",
+ "function delegates(address account) view returns (address)",
+ "function eip712Domain() view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)",
+ "function fixVotingSupply()",
+ "function getPastTotalSupply(uint256 timepoint) view returns (uint256)",
+ "function getPastVotes(address account, uint256 timepoint) view returns (uint256)",
+ "function getRoleAdmin(bytes32 role) view returns (bytes32)",
+ "function getVotes(address account) view returns (uint256)",
+ "function grantRole(bytes32 role, address account)",
+ "function hasRole(bytes32 role, address account) view returns (bool)",
+ "function initialize(string name, string symbol, address admin, address minter, address upgrader)",
+ "function miningContract() view returns (address)",
+ "function mint(address to, uint256 amount)",
+ "function name() pure returns (string)",
+ "function nonces(address user) view returns (uint256)",
+ "function numCheckpoints(address account) view returns (uint32)",
+ "function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)",
+ "function proxiableUUID() view returns (bytes32)",
+ "function renounceRole(bytes32 role, address callerConfirmation)",
+ "function revokeRole(bytes32 role, address account)",
+ "function setMiningContract(address newMiningContract)",
+ "function supportsInterface(bytes4 interfaceId) view returns (bool)",
+ "function symbol() pure returns (string)",
+ "function totalSupply() view returns (uint256)",
+ "function transfer(address to, uint256 value) returns (bool)",
+ "function transferFrom(address from, address to, uint256 value) returns (bool)",
+ "function upgradeToAndCall(address newImplementation, bytes data) payable"
+ ],
"0xb9cE6BC89b79c713f34fd15D82a70900fEFD0de1": [
"constructor(address _walletFactory, address _paymaster)",
"error AlreadyRegistered(address app)",
@@ -2575,72 +2677,6 @@
"function upgradeToAndCall(address newImplementation, bytes data) payable",
"function walletToDeployer(address) view returns (address)"
],
- "0xbE43c24500B855f0cc0D0F99361683B6C6ED73b8": [
- "constructor()",
- "error AccessControlBadConfirmation()",
- "error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)",
- "error AddressEmptyCode(address target)",
- "error ECDSAInvalidSignature()",
- "error ECDSAInvalidSignatureLength(uint256 length)",
- "error ECDSAInvalidSignatureS(bytes32 s)",
- "error ERC1967InvalidImplementation(address implementation)",
- "error ERC1967NonPayable()",
- "error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)",
- "error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)",
- "error ERC20InvalidApprover(address approver)",
- "error ERC20InvalidReceiver(address receiver)",
- "error ERC20InvalidSender(address sender)",
- "error ERC20InvalidSpender(address spender)",
- "error ERC2612ExpiredSignature(uint256 deadline)",
- "error ERC2612InvalidSigner(address signer, address owner)",
- "error FailedInnerCall()",
- "error InvalidAccountNonce(address account, uint256 currentNonce)",
- "error InvalidInitialization()",
- "error NotInitializing()",
- "error TransferIsNotAllowed(address from, address to, uint256 amount)",
- "error UUPSUnauthorizedCallContext()",
- "error UUPSUnsupportedProxiableUUID(bytes32 slot)",
- "event Approval(address indexed owner, address indexed spender, uint256 value)",
- "event EIP712DomainChanged()",
- "event Initialized(uint64 version)",
- "event MiningContractSet(address indexed miningContract, address oldMiningContract)",
- "event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)",
- "event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)",
- "event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)",
- "event Transfer(address indexed from, address indexed to, uint256 value)",
- "event Upgraded(address indexed implementation)",
- "function DEFAULT_ADMIN_ROLE() view returns (bytes32)",
- "function DOMAIN_SEPARATOR() view returns (bytes32)",
- "function MINTER_ROLE() view returns (bytes32)",
- "function TREASURY() view returns (address)",
- "function UPGRADER_ROLE() view returns (bytes32)",
- "function UPGRADE_INTERFACE_VERSION() view returns (string)",
- "function allowance(address owner, address spender) view returns (uint256)",
- "function approve(address spender, uint256 value) returns (bool)",
- "function balanceOf(address account) view returns (uint256)",
- "function burn(address from, uint256 amount)",
- "function decimals() view returns (uint8)",
- "function eip712Domain() view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)",
- "function getRoleAdmin(bytes32 role) view returns (bytes32)",
- "function grantRole(bytes32 role, address account)",
- "function hasRole(bytes32 role, address account) view returns (bool)",
- "function initialize(string name, string symbol, address admin, address minter, address upgrader)",
- "function miningContract() view returns (address)",
- "function mint(address to, uint256 amount)",
- "function name() pure returns (string)",
- "function nonces(address owner) view returns (uint256)",
- "function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)",
- "function proxiableUUID() view returns (bytes32)",
- "function renounceRole(bytes32 role, address callerConfirmation)",
- "function revokeRole(bytes32 role, address account)",
- "function setMiningContract(address newMiningContract)",
- "function supportsInterface(bytes4 interfaceId) view returns (bool)",
- "function symbol() pure returns (string)",
- "function totalSupply() view returns (uint256)",
- "function transfer(address to, uint256 value) returns (bool)",
- "function transferFrom(address from, address to, uint256 value) returns (bool)",
- "function upgradeToAndCall(address newImplementation, bytes data) payable"
- ],
"0xc8a4D2fd77c155fd52e65Ab07F337aBF84495Ead": [
"constructor(address owner_, uint32 chainSlug_, address socket_, address signatureVerifier_)",
"error FeesTooHigh()",
diff --git a/packages/backend/discovery/omni/ethereum/config.jsonc b/packages/backend/discovery/omni/ethereum/config.jsonc
index 84567d5c1cb..0cd16775145 100644
--- a/packages/backend/discovery/omni/ethereum/config.jsonc
+++ b/packages/backend/discovery/omni/ethereum/config.jsonc
@@ -10,7 +10,7 @@
"0x88ad09518695c6c3712AC10a214bE5109a655671": "MultiTokenMediator",
"0x4C36d2919e407f0Cc2Ee3c993ccF8ac26d9CE64e": "ForeignAMB",
"0xed84a648b3c51432ad0fD1C2cD2C45677E9d4064": "BridgeValidators",
- "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6": "BridgeGovernance",
+ "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6": "OmniBridgeGovernance",
"0x4b5F5231e2F08Ad49d79Ce5672A8339a63Cfbd43": "GnosisSafe",
"0x87D48c565D0D85770406D248efd7dc3cbd41e729": "AAVEInterestERC20",
"0xd784927Ff2f95ba542BfC824c8a8a98F3495f6b5": "AAVEIncentivesController",
@@ -22,7 +22,16 @@
"overrides": {
"HashiManager": {
"proxyType": "Eternal Storage proxy",
- "ignoreRelatives": ["yaho", "yaru", "targetAddress"] // until HASHI_IS_MANDATORY=true we ignore this optional external validator
+ "ignoreRelatives": ["yaho", "yaru", "targetAddress"], // until HASHI_IS_MANDATORY=true we ignore this optional external validator
+ "fields": {
+ "AdaptersFromStorage": {
+ "handler": {
+ "type": "storage",
+ "slot": "0x21aa67cae9293b939ada82eb9133293e592da66aa847a5596523bd6d2bf2529b",
+ "returnType": "address"
+ }
+ }
+ }
},
"MultiTokenMediator": {
"proxyType": "Eternal Storage proxy",
@@ -41,12 +50,6 @@
}
}
},
- "BridgeGovernance": {
- "ignoreInWatchMode": ["nonce"]
- },
- "GnosisSafe": {
- "ignoreInWatchMode": ["nonce"]
- },
"AAVEIncentivesController": {
"ignoreDiscovery": true
},
diff --git a/packages/backend/discovery/omni/ethereum/diffHistory.md b/packages/backend/discovery/omni/ethereum/diffHistory.md
index 6efb93f9ee3..8facd77fd2a 100644
--- a/packages/backend/discovery/omni/ethereum/diffHistory.md
+++ b/packages/backend/discovery/omni/ethereum/diffHistory.md
@@ -1,3 +1,76 @@
+Generated with discovered.json: 0xa110d151b4ecd24c5245269a01c27963881e38cb
+
+# Diff at Wed, 18 Dec 2024 10:36:37 GMT:
+
+- author: sekuba (<29250140+sekuba@users.noreply.github.com>)
+- comparing to: main@a44ef6747febdd9930ef05420e60556c20899f13 block: 21071443
+- current block number: 21428761
+
+## Description
+
+The requiredBlockConfirmations of the bridge are raised to 175.
+
+Two OmniBridgeGovernance MS members are changed.
+
+The expectedAdaptersHash of the HashiManager changed without our discovery recognizing the change in adapters. For ref: [Tenderly trace of setting the two adapters](https://dashboard.tenderly.co/tx/mainnet/0xc45be0d0becee51c0d8985169217231ddfdc2d1f62b5961b0eb04e04c6605bde) `0x7606e9d8655e48159e7bec8541c2e71a7aa3e418` (LayerZero) and `0xcbb5c5e8b7ae3fc01eeb2c8fecdc609df7d21a19` ([DendrETH](https://github.com/metacraft-labs/DendrETH)) while we still discover only `0x3A259A51D200d902AC25BE2005d95EADA6a1bfc5` for the `adapters` value. Looking at the code, this is apparently how the HashiManager contract is supposed to work as it does not save new adapter addresses when setting a new expected adapters hash.
+
+Hashi is still optional for bridging (`HASHI_IS_MANDATORY=false`).
+
+## Watched changes
+
+```diff
+ contract OmniBridgeGovernance (0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6) {
+ +++ description: None
+ values.$members.4:
+- "0x86Da253817DC599059e3AD5A1F098F7b96aBf34c"
++ "0xA07888742c18d7e658132AE0148fF205fFF46481"
+ values.$members.3:
+- "0xAC0622953d25e1a6c4e0f32Ffc1A9C1cE350B60E"
++ "0xf59E447E97bC03c2B0C5719e2E551F0B15b724e5"
+ }
+```
+
+```diff
+ contract ForeignAMB (0x4C36d2919e407f0Cc2Ee3c993ccF8ac26d9CE64e) {
+ +++ description: None
+ values.requiredBlockConfirmations:
+- 130
++ 175
+ }
+```
+
+```diff
+ contract HashiManager (0x93f6eE78451AaCc1Db1db49a12aBfCc4662B9Cc9) {
+ +++ description: None
+ values.expectedAdaptersHash:
+- "0x6b603f4a7f51661e39122b2cc2745ffbc56eca92e59f655d365cd5170d930c0a"
++ "0x1f8c600da3ac9efbad8aeccc97ebbdc71e7f928fbc2589cd663f5063c0f4af52"
+ }
+```
+
+## Config/verification related changes
+
+Following changes come from updates made to the config file,
+or/and contracts becoming verified, not from differences found during
+discovery. Values are for block 21071443 (main branch discovery), not current.
+
+```diff
+ contract OmniBridgeGovernance (0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6) {
+ +++ description: None
+ name:
+- "BridgeGovernance"
++ "OmniBridgeGovernance"
+ }
+```
+
+```diff
+ contract HashiManager (0x93f6eE78451AaCc1Db1db49a12aBfCc4662B9Cc9) {
+ +++ description: None
+ values.AdaptersFromStorage:
++ "0x0000000000000000000000000000000000000000"
+ }
+```
+
Generated with discovered.json: 0x67450b31edfaadab300dc80a39f10000188eee25
# Diff at Tue, 03 Dec 2024 13:12:43 GMT:
diff --git a/packages/backend/discovery/omni/ethereum/discovered.json b/packages/backend/discovery/omni/ethereum/discovered.json
index e35d848e29c..192864446cd 100644
--- a/packages/backend/discovery/omni/ethereum/discovered.json
+++ b/packages/backend/discovery/omni/ethereum/discovered.json
@@ -1,11 +1,11 @@
{
"name": "omni",
"chain": "ethereum",
- "blockNumber": 21071443,
- "configHash": "0x8b9143b8282c5576f9a2a9ff4dd23827f7b9648de7f19a0142caccc137c3d916",
+ "blockNumber": 21428761,
+ "configHash": "0xe7e2181ba52dc7df5fa6c9434105df59650e73fd85b68bd5e05dee5a2b659649",
"contracts": [
{
- "name": "BridgeGovernance",
+ "name": "OmniBridgeGovernance",
"address": "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6",
"template": "GnosisSafe",
"sourceHashes": [
@@ -36,8 +36,8 @@
"0x4b5F5231e2F08Ad49d79Ce5672A8339a63Cfbd43",
"0xb8173f558f75EE263013fd6294177bf75279a21e",
"0xDdf2d07267EAF2cE3E13ee4319bE1F34D55ed992",
- "0xAC0622953d25e1a6c4e0f32Ffc1A9C1cE350B60E",
- "0x86Da253817DC599059e3AD5A1F098F7b96aBf34c",
+ "0xf59E447E97bC03c2B0C5719e2E551F0B15b724e5",
+ "0xA07888742c18d7e658132AE0148fF205fFF46481",
"0x1685324Bf373670ad5C9c56bd88A1dc1C063b0f9",
"0x0101016044726994aFd16f4A99f0d960090D35e7",
"0x5b10cE4DDD27F57d4D432D409A5321219cbA7893",
@@ -55,7 +55,7 @@
"getChainId": 1,
"GnosisSafe_modules": [],
"multisigThreshold": "8 of 16 (50%)",
- "nonce": 83,
+ "nonce": 84,
"VERSION": "1.3.0"
},
"derivedName": "GnosisSafe"
@@ -84,7 +84,7 @@
"getChainId": 1,
"GnosisSafe_modules": [],
"multisigThreshold": "2 of 3 (67%)",
- "nonce": 15,
+ "nonce": 16,
"VERSION": "1.3.0"
},
"derivedName": "GnosisSafe"
@@ -158,7 +158,7 @@
"messageSender": "0x0000000000000000000000000000000000000000",
"messageSourceChainId": 0,
"owner": "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6",
- "requiredBlockConfirmations": 130,
+ "requiredBlockConfirmations": 175,
"requiredSignatures": 4,
"sourceChainId": 1,
"transactionHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -193,7 +193,7 @@
"getChainId": 1,
"GnosisSafe_modules": [],
"multisigThreshold": "2 of 4 (50%)",
- "nonce": 1,
+ "nonce": 2,
"VERSION": "1.4.1"
}
},
@@ -348,8 +348,9 @@
],
"$upgradeCount": 1,
"adapters": ["0x3A259A51D200d902AC25BE2005d95EADA6a1bfc5"],
+ "AdaptersFromStorage": "0x0000000000000000000000000000000000000000",
"deployedAtBlock": 0,
- "expectedAdaptersHash": "0x6b603f4a7f51661e39122b2cc2745ffbc56eca92e59f655d365cd5170d930c0a",
+ "expectedAdaptersHash": "0x1f8c600da3ac9efbad8aeccc97ebbdc71e7f928fbc2589cd663f5063c0f4af52",
"expectedThreshold": 1,
"implementation": "0x159B36Ed5BA327fd269Fb93c75918257DCfe686d",
"isInitialized": true,
@@ -454,9 +455,8 @@
{ "address": "0x72Ff26D9517324eEFA89A48B75c5df41132c4f54" },
{ "address": "0x80BA18503a1Fa16Ea22F3ef1Af23e2994EaC1d97" },
{ "address": "0x839395e20bbB182fa440d08F850E6c7A8f6F0780" },
- { "address": "0x86Da253817DC599059e3AD5A1F098F7b96aBf34c" },
{ "address": "0x9bd93c5ad5e0a6be890c82FD77eE42ce8B642eF8" },
- { "address": "0xAC0622953d25e1a6c4e0f32Ffc1A9C1cE350B60E" },
+ { "address": "0xA07888742c18d7e658132AE0148fF205fFF46481" },
{ "address": "0xB1dD1828794075f7521365163A93DE9e68e3c49f" },
{ "address": "0xb8173f558f75EE263013fd6294177bf75279a21e" },
{ "address": "0xbDc141c8D2343f33F40Cb9edD601CcF460CD0dDe" },
@@ -467,6 +467,7 @@
{ "address": "0xd945325557f1FB4374fBf10Ae86D385632Df870A" },
{ "address": "0xDdf2d07267EAF2cE3E13ee4319bE1F34D55ed992" },
{ "address": "0xeca6EAa2C77d8f0aA9247e681C64455deAae51aC" },
+ { "address": "0xf59E447E97bC03c2B0C5719e2E551F0B15b724e5" },
{ "address": "0xf6A78083ca3e2a662D6dd1703c939c8aCE2e268d" },
{ "address": "0xfA98B60E02A61B6590f073cAD56e68326652d094" },
{ "address": "0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF" }
diff --git a/packages/backend/discovery/playblock/nova/diffHistory.md b/packages/backend/discovery/playblock/nova/diffHistory.md
index 95df3cf414d..90781861f9a 100644
--- a/packages/backend/discovery/playblock/nova/diffHistory.md
+++ b/packages/backend/discovery/playblock/nova/diffHistory.md
@@ -1,4 +1,4 @@
-Generated with discovered.json: 0x4af70d84249be9b9892f19af33276b6d28628af1
+Generated with discovered.json: 0xb660accfc7ec3e63ad9fc63a6d60d3a4860cff7c
# Diff at Tue, 17 Dec 2024 10:57:28 GMT:
diff --git a/packages/backend/discovery/playblock/nova/discovered.json b/packages/backend/discovery/playblock/nova/discovered.json
index a956106015a..7b5ec679115 100644
--- a/packages/backend/discovery/playblock/nova/discovered.json
+++ b/packages/backend/discovery/playblock/nova/discovered.json
@@ -1,7 +1,7 @@
{
"name": "playblock",
"chain": "nova",
- "blockNumber": 80766159,
+ "blockNumber": 80805453,
"configHash": "0x8c4aa8fb727afa83b0355072a3a542c09afc4404817c8da056e901a0567e32e4",
"contracts": [
{
@@ -80,12 +80,12 @@
"confirmPeriodBlocks": 150,
"currentRequiredStake": "100000000000000000",
"extraChallengeTimeBlocks": 0,
- "firstUnresolvedNode": 6477,
+ "firstUnresolvedNode": 6503,
"inbox": "0xFF55fB76F5671dD9eB6c62EffF8D693Bb161a3ad",
"isERC20Enabled": false,
"lastStakeBlock": 19391320,
- "latestConfirmed": 6476,
- "latestNodeCreated": 6476,
+ "latestConfirmed": 6502,
+ "latestNodeCreated": 6502,
"loserStakeEscrow": "0x0000000000000000000000000000000000000000",
"minimumAssertionPeriod": 75,
"outbox": "0xA597e0212971e65f53f288Ff1fFd26A6C8201f83",
@@ -485,8 +485,8 @@
"nativeToken": "0x73C3cDd1418c3F17D54A81148387d93122802E72",
"rollup": "0x04ea347cC6A258A7F65D67aFb60B1d487062A1d0",
"sequencerInbox": "0xe347C1223381b9Dcd6c0F61cf81c90175A7Bae77",
- "sequencerMessageCount": 148385,
- "sequencerReportedSubMessageCount": 80120530
+ "sequencerMessageCount": 148530,
+ "sequencerReportedSubMessageCount": 80490100
},
"derivedName": "ERC20Bridge"
},
diff --git a/packages/backend/discovery/publicgoodsnetwork/ethereum/diffHistory.md b/packages/backend/discovery/publicgoodsnetwork/ethereum/diffHistory.md
index c240d10ea4c..2a8c304347c 100644
--- a/packages/backend/discovery/publicgoodsnetwork/ethereum/diffHistory.md
+++ b/packages/backend/discovery/publicgoodsnetwork/ethereum/diffHistory.md
@@ -1,3 +1,26 @@
+Generated with discovered.json: 0xf2c34bb8ea00da0d45419dedffb6de0495deb57f
+
+# Diff at Wed, 18 Dec 2024 10:43:46 GMT:
+
+- author: sekuba (<29250140+sekuba@users.noreply.github.com>)
+- comparing to: main@a44ef6747febdd9930ef05420e60556c20899f13 block: 21415736
+- current block number: 21428894
+
+## Description
+
+OptiPortal unpaused, ready for claims through the BalanceClaimer added in the last upgrade.
+
+## Watched changes
+
+```diff
+ contract OptimismPortal (0xb26Fd985c5959bBB382BAFdD0b879E149e48116c) {
+ +++ description: The main entry point to deposit funds from host chain to this chain. It also allows to prove and finalize withdrawals.
+ values.paused:
+- true
++ false
+ }
+```
+
Generated with discovered.json: 0x450ab2617c6d7c7826a6f90f48870b03e998d403
# Diff at Mon, 16 Dec 2024 14:40:20 GMT:
diff --git a/packages/backend/discovery/publicgoodsnetwork/ethereum/discovered.json b/packages/backend/discovery/publicgoodsnetwork/ethereum/discovered.json
index 2bd8c5ef343..93dd1c3ddf5 100644
--- a/packages/backend/discovery/publicgoodsnetwork/ethereum/discovered.json
+++ b/packages/backend/discovery/publicgoodsnetwork/ethereum/discovered.json
@@ -1,7 +1,7 @@
{
"name": "publicgoodsnetwork",
"chain": "ethereum",
- "blockNumber": 21415736,
+ "blockNumber": 21428894,
"configHash": "0x3a54f3ab3aeb854af2a1777b38da8dc8dc9f3879d47ee4eda3de6e36ed655d68",
"contracts": [
{
@@ -122,7 +122,7 @@
"getChainId": 1,
"GnosisSafe_modules": [],
"multisigThreshold": "3 of 8 (38%)",
- "nonce": 4,
+ "nonce": 5,
"VERSION": "1.3.0"
},
"derivedName": "GnosisSafe"
@@ -381,10 +381,10 @@
"deletedOutputs": [],
"FINALIZATION_PERIOD_SECONDS": 604800,
"L2_BLOCK_TIME": 2,
- "latestBlockNumber": 22624200,
- "latestOutputIndex": 12568,
- "nextBlockNumber": 22626000,
- "nextOutputIndex": 12569,
+ "latestBlockNumber": 22674600,
+ "latestOutputIndex": 12596,
+ "nextBlockNumber": 22676400,
+ "nextOutputIndex": 12597,
"PROPOSER": "0x69968Ce0E92d9c101BAd81de55EFbcb69603cFe3",
"startingBlockNumber": 0,
"startingTimestamp": 1689106727,
@@ -456,7 +456,7 @@
"prevBoughtGas": 490798,
"prevBlockNum": 21363499
},
- "paused": true,
+ "paused": false,
"SYSTEM_CONFIG": "0x7Df716EAD1d83a2BF35B416B7BC84bd0700357C9",
"version": "1.7.0"
}
diff --git a/packages/backend/discovery/reya/ethereum/diffHistory.md b/packages/backend/discovery/reya/ethereum/diffHistory.md
index c78b920fb67..7efd5534238 100644
--- a/packages/backend/discovery/reya/ethereum/diffHistory.md
+++ b/packages/backend/discovery/reya/ethereum/diffHistory.md
@@ -1,3 +1,26 @@
+Generated with discovered.json: 0x6c2987f2fd2f0d30409924f65b1807ff9fddb32b
+
+# Diff at Wed, 18 Dec 2024 10:51:47 GMT:
+
+- author: sekuba (<29250140+sekuba@users.noreply.github.com>)
+- comparing to: main@a44ef6747febdd9930ef05420e60556c20899f13 block: 21292526
+- current block number: 21428935
+
+## Description
+
+Reya socket vault admin transfered to a new EOA (previous was socketadmin.eth, current one is funded by it).
+
+## Watched changes
+
+```diff
+ contract SocketVault_Reya (0xdFf78A949E47c1e90f3Dd6dd7Fe2Fa72B42a75f7) {
+ +++ description: None
+ values.owner:
+- "0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34"
++ "0xB0BBff6311B7F245761A7846d3Ce7B1b100C1836"
+ }
+```
+
Generated with discovered.json: 0x3f145b2993136469b9ddeb0b2659975ed948d77d
# Diff at Thu, 05 Dec 2024 11:52:10 GMT:
diff --git a/packages/backend/discovery/reya/ethereum/discovered.json b/packages/backend/discovery/reya/ethereum/discovered.json
index 64d3adc9b6e..347be0726d5 100644
--- a/packages/backend/discovery/reya/ethereum/discovered.json
+++ b/packages/backend/discovery/reya/ethereum/discovered.json
@@ -1,7 +1,7 @@
{
"name": "reya",
"chain": "ethereum",
- "blockNumber": 21292526,
+ "blockNumber": 21428935,
"configHash": "0x3ff845d874ff98fbd5571884e1d5be237a1e56d3923a54188ce4ad68c563a4ad",
"contracts": [
{
@@ -170,11 +170,11 @@
"0xFd9f59554351122b231F832a0e0A1aBb0604D7fd"
],
"allowedOutboxList": ["0x3f373b0A7DcEe7b7bCfC16DF85CfAE18388542c9"],
- "delayedMessageCount": 22978,
+ "delayedMessageCount": 24429,
"rollup": "0x448Bbd134dE1B23976073aB4F2915849b2dcD73A",
"sequencerInbox": "0x6CA2A628fb690Bd431F4aA608655ce37c66aff9d",
- "sequencerMessageCount": 21690,
- "sequencerReportedSubMessageCount": 51947363
+ "sequencerMessageCount": 23058,
+ "sequencerReportedSubMessageCount": 53811995
}
},
{
@@ -306,12 +306,12 @@
"confirmPeriodBlocks": 45818,
"currentRequiredStake": "100000000000000000",
"extraChallengeTimeBlocks": 0,
- "firstUnresolvedNode": 1916,
+ "firstUnresolvedNode": 1954,
"inbox": "0x672109752635177ebcb17F2C7e04575A709014BD",
"isERC20Enabled": false,
"lastStakeBlock": 19347657,
- "latestConfirmed": 1915,
- "latestNodeCreated": 1927,
+ "latestConfirmed": 1953,
+ "latestNodeCreated": 1965,
"loserStakeEscrow": "0x0000000000000000000000000000000000000000",
"minimumAssertionPeriod": 75,
"outbox": "0x3f373b0A7DcEe7b7bCfC16DF85CfAE18388542c9",
@@ -478,7 +478,7 @@
]
],
"$upgradeCount": 2,
- "batchCount": 21690,
+ "batchCount": 23058,
"batchPosterManager": "0x0000000000000000000000000000000000000000",
"batchPosters": ["0xf5636Df6f86f31668aeAe9bB8a1C4F0ED147926a"],
"bridge": "0x383c03c4EfF819E73409DbC690755a9992393814",
@@ -509,7 +509,7 @@
"rollup": "0x448Bbd134dE1B23976073aB4F2915849b2dcD73A",
"sequencerVersion": "0x88",
"setIsBatchPosterCount": 1,
- "totalDelayedMessagesRead": 22977,
+ "totalDelayedMessagesRead": 24428,
"TREE_DAS_MESSAGE_HEADER_FLAG": "0x08",
"ZERO_HEAVY_MESSAGE_HEADER_FLAG": "0x20"
},
@@ -738,7 +738,7 @@
"getChainId": 1,
"GnosisSafe_modules": [],
"multisigThreshold": "4 of 8 (50%)",
- "nonce": 13,
+ "nonce": 17,
"VERSION": "1.3.0"
},
"derivedName": "GnosisSafe"
@@ -765,7 +765,7 @@
"$immutable": true,
"bridgeType": "0x9faa379a8f7762447354a00c30bda6b12f39577783c03b588d3fd75b4e2a5876",
"nominee": "0x0000000000000000000000000000000000000000",
- "owner": "0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34"
+ "owner": "0xB0BBff6311B7F245761A7846d3Ce7B1b100C1836"
},
"derivedName": "Vault"
},
@@ -832,7 +832,6 @@
{ "address": "0x28bB9385A588EF4747264D19B9A9F1603591680c" },
{ "address": "0x547D0F472309e4239b296D01e03bEDc101241a26" },
{ "address": "0x5bE3E96Cdc3A97628bD7308d3588B9a474F4A54d" },
- { "address": "0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34" },
{
"address": "0x6106B6480DE82E3eC2680d7c61A9D18d71Bf9122",
"receivedPermissions": [
@@ -844,6 +843,7 @@
]
},
{ "address": "0x691C2EF68e25E620fa6cAdE2728f6aE34F37aAD2" },
+ { "address": "0xB0BBff6311B7F245761A7846d3Ce7B1b100C1836" },
{ "address": "0xB0C2CBFfCd4C31AFFEe14993b6d48f99D285f621" },
{ "address": "0xBc0ca6865d6883a83D4aDDD6b862aE042d855E0d" },
{
diff --git a/packages/backend/discovery/shared-eigenlayer/ethereum/diffHistory.md b/packages/backend/discovery/shared-eigenlayer/ethereum/diffHistory.md
index aed61533423..afd9cd6bb3b 100644
--- a/packages/backend/discovery/shared-eigenlayer/ethereum/diffHistory.md
+++ b/packages/backend/discovery/shared-eigenlayer/ethereum/diffHistory.md
@@ -1,3 +1,29 @@
+Generated with discovered.json: 0x79b881bc073e17c0b4a3ce9698ef8a05529c470f
+
+# Diff at Wed, 18 Dec 2024 11:09:45 GMT:
+
+- author: sekuba (<29250140+sekuba@users.noreply.github.com>)
+- comparing to: main@a44ef6747febdd9930ef05420e60556c20899f13 block: 21357574
+- current block number: 21429022
+
+## Description
+
+EigenLayerTokenMultisig threshold increased to 4/6.
+
+## Watched changes
+
+```diff
+ contract EigenLayerTokenMultisig (0xbb00DDa2832850a43840A3A86515E3Fe226865F2) {
+ +++ description: None
+ values.$threshold:
+- 3
++ 4
+ values.multisigThreshold:
+- "3 of 6 (50%)"
++ "4 of 6 (67%)"
+ }
+```
+
Generated with discovered.json: 0x951069dec9580ef9487e7c2cbfaf18e249e8a21a
# Diff at Mon, 09 Dec 2024 15:51:32 GMT:
diff --git a/packages/backend/discovery/shared-eigenlayer/ethereum/discovered.json b/packages/backend/discovery/shared-eigenlayer/ethereum/discovered.json
index 66dfa0acf16..90bae64bd27 100644
--- a/packages/backend/discovery/shared-eigenlayer/ethereum/discovered.json
+++ b/packages/backend/discovery/shared-eigenlayer/ethereum/discovered.json
@@ -1,7 +1,7 @@
{
"name": "shared-eigenlayer",
"chain": "ethereum",
- "blockNumber": 21357574,
+ "blockNumber": 21429022,
"configHash": "0x8f3dd5677c880d9ef5f8ebc4a89bd46ed78daa9b7e36d71a0fc890a8c7324d58",
"contracts": [
{
@@ -14,8 +14,8 @@
"sinceTimestamp": 1602667372,
"values": {
"$immutable": true,
- "get_deposit_count": "0x62a21b0000000000",
- "get_deposit_root": "0xd0c7375e487d170977bd199bf9b56aee9dd6b744584ba4d9c35aca98428f06e5"
+ "get_deposit_count": "0x8fd31b0000000000",
+ "get_deposit_root": "0x9c1a54a50b2318ec11ef882f95f7ae5d87b566f21e5fdf14aa68bca7c7a7e6b2"
},
"derivedName": "DepositContract"
},
@@ -73,7 +73,7 @@
"expirationTimestamp": "115792089237316195423570985008687907853269984665640564039457584007913129639935"
},
"isExpired": false,
- "latestPress": 1733360411,
+ "latestPress": 1733965235,
"owner": "0xbb00DDa2832850a43840A3A86515E3Fe226865F2"
},
"fieldMeta": {
@@ -185,7 +185,8 @@
"0xa3F64D3102a035db35c42A9001BBc83e08c7a366",
"0x461591A7e68906eDBcD643E010A7e1AE3B023c6d",
"0xBc77233855e3274E1903771675Eb71E602D9DC2e",
- "0xeF2A435e5EE44B2041100EF8cbC8ae035166606c"
+ "0xeF2A435e5EE44B2041100EF8cbC8ae035166606c",
+ "0x3aDdEb54ddd43Eb40235eC32DfA7928F28A44bb5"
],
"delegation": "0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A",
"DOMAIN_TYPEHASH": "0x8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866",
@@ -658,7 +659,7 @@
"name": "Backing Eigen",
"owner": "0x2520C6b2C1FBE1813AB5c7c1018CDa39529e9FF2",
"symbol": "bEIGEN",
- "totalSupply": "1695532817023767092307692325",
+ "totalSupply": "1696820237537832215384615403",
"transferRestrictionsDisabledAfter": 0
},
"fieldMeta": {
@@ -864,7 +865,7 @@
"delegationManager": "0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A",
"eigenPodBeacon": "0x5a2a4F2F3C18f09179B6703e63D9eDD165909073",
"ethPOS": "0x00000000219ab540356cBB839Cbe05303d7705Fa",
- "numPods": 32642,
+ "numPods": 32684,
"owner": "0x369e6F597e22EaB55fFb173C6d9cD234BD699111",
"paused": 0,
"pauserRegistry": "0x0c431C66F4dE941d089625E5B423D00707977060",
@@ -961,12 +962,12 @@
"0x30dd80F21aD9222Ce8f33b429fC0Fe25655Fe88a",
"0xb82C36F6C5a3CD345C0954d90c68e26528014aDD"
],
- "$threshold": 3,
+ "$threshold": 4,
"domainSeparator": "0x1402d1fac147648503e0981151b32afe3fec9a5207c84371b09867cbdc7a67a2",
"getChainId": 1,
"GnosisSafe_modules": [],
- "multisigThreshold": "3 of 6 (50%)",
- "nonce": 78,
+ "multisigThreshold": "4 of 6 (67%)",
+ "nonce": 79,
"VERSION": "1.3.0"
},
"derivedName": "GnosisSafe"
@@ -1332,7 +1333,7 @@
"name": "Eigen",
"owner": "0x2520C6b2C1FBE1813AB5c7c1018CDa39529e9FF2",
"symbol": "EIGEN",
- "totalSupply": "1695532817023767092307692325",
+ "totalSupply": "1696820237537832215384615403",
"transferRestrictionsDisabledAfter": 0
},
"fieldMeta": {
diff --git a/packages/backend/discovery/socket/ethereum/diffHistory.md b/packages/backend/discovery/socket/ethereum/diffHistory.md
index aba51c2ebb3..9e1c3a7075b 100644
--- a/packages/backend/discovery/socket/ethereum/diffHistory.md
+++ b/packages/backend/discovery/socket/ethereum/diffHistory.md
@@ -1,3 +1,63 @@
+Generated with discovered.json: 0x9cdfbc24d1629059d43619ffceb966fdb28a3f57
+
+# Diff at Wed, 18 Dec 2024 10:57:41 GMT:
+
+- author: sekuba (<29250140+sekuba@users.noreply.github.com>)
+- comparing to: main@a44ef6747febdd9930ef05420e60556c20899f13 block: 21394305
+- current block number: 21428964
+
+## Description
+
+Owner pointers of socketadmin.eth changed to a new (socket-funded) EOA.
+
+## Watched changes
+
+```diff
+ contract WBTC Vault Reya (0x2344621d5aA6e784e8C6f4c54b0B29Dd9c3Ad4B6) {
+ +++ description: None
+ values.owner:
+- "0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34"
++ "0xB0BBff6311B7F245761A7846d3Ce7B1b100C1836"
+ }
+```
+
+```diff
+ contract WETH Vault Reya (0x64dF894688c5052BeAdC35371cF69151Ebc5D658) {
+ +++ description: None
+ values.owner:
+- "0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34"
++ "0xB0BBff6311B7F245761A7846d3Ce7B1b100C1836"
+ }
+```
+
+```diff
+ contract Socket (0x943AC2775928318653e91d350574436A1b9b16f9) {
+ +++ description: None
++++ description: ConnectorPlugs connect vaults (escrows) or controllers via the socket main contract to the switchboards. They have counterparts on the sibling chain.
++++ severity: LOW
+ values.plugs.138:
++ "0x75695e8A56405dC60a0aFf07d1AF01A0baCA7188"
+ }
+```
+
+```diff
+ contract USDe Vault Reya (0xaA2f2B6cD33Eaabb795c6DB60AAec599C8450F35) {
+ +++ description: None
+ values.owner:
+- "0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34"
++ "0xB0BBff6311B7F245761A7846d3Ce7B1b100C1836"
+ }
+```
+
+```diff
+ contract USDC Vault Reya (0xdFf78A949E47c1e90f3Dd6dd7Fe2Fa72B42a75f7) {
+ +++ description: None
+ values.owner:
+- "0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34"
++ "0xB0BBff6311B7F245761A7846d3Ce7B1b100C1836"
+ }
+```
+
Generated with discovered.json: 0x14dd41929a299910e18622e57318631aefcd6b63
# Diff at Fri, 13 Dec 2024 14:51:52 GMT:
diff --git a/packages/backend/discovery/socket/ethereum/discovered.json b/packages/backend/discovery/socket/ethereum/discovered.json
index 6f654611d12..3c4731d28db 100644
--- a/packages/backend/discovery/socket/ethereum/discovered.json
+++ b/packages/backend/discovery/socket/ethereum/discovered.json
@@ -1,7 +1,7 @@
{
"name": "socket",
"chain": "ethereum",
- "blockNumber": 21394305,
+ "blockNumber": 21428964,
"configHash": "0xb5ce17cb1c9c00fea8d4213e87c3d8579a04a2db4839ef0f4e2fdd6516de1262",
"contracts": [
{
@@ -231,7 +231,7 @@
"$immutable": true,
"bridgeType": "0x9faa379a8f7762447354a00c30bda6b12f39577783c03b588d3fd75b4e2a5876",
"nominee": "0x0000000000000000000000000000000000000000",
- "owner": "0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34"
+ "owner": "0xB0BBff6311B7F245761A7846d3Ce7B1b100C1836"
},
"derivedName": "Vault"
},
@@ -259,7 +259,7 @@
"getChainId": 1,
"GnosisSafe_modules": [],
"multisigThreshold": "2 of 3 (67%)",
- "nonce": 375,
+ "nonce": 376,
"VERSION": "1.3.0"
},
"derivedName": "GnosisSafe"
@@ -534,7 +534,7 @@
"$immutable": true,
"bridgeType": "0x9faa379a8f7762447354a00c30bda6b12f39577783c03b588d3fd75b4e2a5876",
"nominee": "0x0000000000000000000000000000000000000000",
- "owner": "0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34"
+ "owner": "0xB0BBff6311B7F245761A7846d3Ce7B1b100C1836"
},
"derivedName": "Vault"
},
@@ -654,7 +654,7 @@
"capacitorFactory__": "0x11Fbb9116801DB54bB51fF4dF423e34E8b45fc9a",
"chainSlug": 1,
"executionManager__": "0x98CAd9A205f1F7A7150241Ef2d565d1702BCe57C",
- "globalMessageCount": 8475,
+ "globalMessageCount": 8786,
"hasher__": "0x5C71beE4a6b0D617D8c3d107D331292741789E27",
"inboundSwitchboards": [
"0x139f39DC7dC05F7aC2DB3DB6af4f2e1a9De7c287",
@@ -810,7 +810,8 @@
"0x12a4CC40a8F89E40F8C849c2F89741D5C9590a14",
"0x94104d7801f30d2f9069118C65Fe63A3A11515B1",
"0xA2bE759B86CeA53372C3e9a882047cdC3884D568",
- "0x15f70f64438603e5872A4E81c7a8B5edB5D70d93"
+ "0x15f70f64438603e5872A4E81c7a8B5edB5D70d93",
+ "0x75695e8A56405dC60a0aFf07d1AF01A0baCA7188"
],
"transmitManager__": "0xeD037aFBffC65a94E9CC592947E851FB2f730341",
"version": "0x484f1c5889188a0a81068ce8c49d8f7c3b3f1b0c1723b50ebd656a8d4f99e356"
@@ -914,7 +915,7 @@
"$immutable": true,
"bridgeType": "0x9faa379a8f7762447354a00c30bda6b12f39577783c03b588d3fd75b4e2a5876",
"nominee": "0x0000000000000000000000000000000000000000",
- "owner": "0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34"
+ "owner": "0xB0BBff6311B7F245761A7846d3Ce7B1b100C1836"
},
"derivedName": "Vault"
},
@@ -1164,7 +1165,7 @@
"$immutable": true,
"bridgeType": "0x9faa379a8f7762447354a00c30bda6b12f39577783c03b588d3fd75b4e2a5876",
"nominee": "0x0000000000000000000000000000000000000000",
- "owner": "0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34"
+ "owner": "0xB0BBff6311B7F245761A7846d3Ce7B1b100C1836"
},
"derivedName": "Vault"
},
@@ -1261,7 +1262,7 @@
"getChainId": 1,
"GnosisSafe_modules": [],
"multisigThreshold": "3 of 5 (60%)",
- "nonce": 211,
+ "nonce": 213,
"VERSION": "1.3.0"
},
"derivedName": "GnosisSafe"
@@ -1287,10 +1288,6 @@
{ "address": "0x4cEa25e9c999E69F45765539783D149024f99F12" },
{ "address": "0x5D973Ea995d14799E528B14472346bfDE21eAe2e" },
{ "address": "0x5ECfd6968593159e5b4f06832857943409122849" },
- {
- "name": "socketadmin.eth EOA",
- "address": "0x5fD7D0d6b91CC4787Bcb86ca47e0Bd4ea0346d34"
- },
{ "address": "0x76E6F5C2A64df0F53077602642B79a45D5Ba6D52" },
{ "address": "0x94561e98DD5E55271f91A103e4979aa6C493745E" },
{ "address": "0x9eab2223d84060E212354BfA620BF687b6E9Ae20" },
diff --git a/packages/backend/discovery/sophon/ethereum/config.jsonc b/packages/backend/discovery/sophon/ethereum/config.jsonc
index e90c2ec8c28..0ac6507fe2c 100644
--- a/packages/backend/discovery/sophon/ethereum/config.jsonc
+++ b/packages/backend/discovery/sophon/ethereum/config.jsonc
@@ -10,7 +10,7 @@
"0x05eDE6aD1f39B7A16C949d5C33a0658c9C7241e3": "SophonZkEvm",
"0xE1eeA4D6443b19D373Fe99De838b930Ef0ac2Ad3": "SophonZkEvmAdmin",
"0xe4644b6d106A18062344c0A853666bc0B8f052d1": "SophonChainAdminMultisig",
- "0x478a303CCe3c62CE52A8D66885b9D04F2733F3b6": "SophonUSDCEscrowMultisig"
+ "0x3b181838Ae9DB831C17237FAbD7c10801Dd49fcD": "SophonUSDCEscrowMultisig"
},
"sharedModules": {
"BridgeHub": "shared-zk-stack"
diff --git a/packages/backend/discovery/sophon/ethereum/diffHistory.md b/packages/backend/discovery/sophon/ethereum/diffHistory.md
index d821421e44e..96e7bcd2541 100644
--- a/packages/backend/discovery/sophon/ethereum/diffHistory.md
+++ b/packages/backend/discovery/sophon/ethereum/diffHistory.md
@@ -1,3 +1,70 @@
+Generated with discovered.json: 0x01edddd129ce4880a2833eea307b2095e355ab11
+
+# Diff at Wed, 18 Dec 2024 13:08:26 GMT:
+
+- author: sekuba (<29250140+sekuba@users.noreply.github.com>)
+- comparing to: main@a44ef6747febdd9930ef05420e60556c20899f13 block: 21421507
+- current block number: 21429615
+
+## Description
+
+USDC escrow admin changed to a new Multisig (SophonUSDCEscrowMultisig) and also gets a new owner (SophonChainAdminMultisig).
+
+## Watched changes
+
+```diff
+- Status: DELETED
+ contract GnosisSafe (0x478a303CCe3c62CE52A8D66885b9D04F2733F3b6)
+ +++ description: None
+```
+
+```diff
+ contract L1USDCBridge (0xf553E6D903AA43420ED7e3bc2313bE9286A8F987) {
+ +++ description: None
+ issuedPermissions.0.target:
+- "0x478a303CCe3c62CE52A8D66885b9D04F2733F3b6"
++ "0x3b181838Ae9DB831C17237FAbD7c10801Dd49fcD"
+ values.$admin:
+- "0x478a303CCe3c62CE52A8D66885b9D04F2733F3b6"
++ "0x3b181838Ae9DB831C17237FAbD7c10801Dd49fcD"
+ values.owner:
+- "0x299174d47c243B5381c6062aBEFbfF915B601D85"
++ "0xe4644b6d106A18062344c0A853666bc0B8f052d1"
+ values.pendingOwner:
+- "0xe4644b6d106A18062344c0A853666bc0B8f052d1"
++ "0x0000000000000000000000000000000000000000"
+ }
+```
+
+```diff
++ Status: CREATED
+ contract SophonUSDCEscrowMultisig (0x3b181838Ae9DB831C17237FAbD7c10801Dd49fcD)
+ +++ description: None
+```
+
+## Source code changes
+
+```diff
+.../GnosisSafe => .flat/SophonUSDCEscrowMultisig}/GnosisSafe.sol | 0
+ .../GnosisSafe => .flat/SophonUSDCEscrowMultisig}/GnosisSafeProxy.p.sol | 0
+ 2 files changed, 0 insertions(+), 0 deletions(-)
+```
+
+## Config/verification related changes
+
+Following changes come from updates made to the config file,
+or/and contracts becoming verified, not from differences found during
+discovery. Values are for block 21421507 (main branch discovery), not current.
+
+```diff
+ contract GnosisSafe (0x478a303CCe3c62CE52A8D66885b9D04F2733F3b6) {
+ +++ description: None
+ name:
+- "SophonUSDCEscrowMultisig"
++ "GnosisSafe"
+ }
+```
+
Generated with discovered.json: 0x71f166a5c91fcd46b0fec02e380196fac8467e70
# Diff at Tue, 17 Dec 2024 09:58:24 GMT:
diff --git a/packages/backend/discovery/sophon/ethereum/discovered.json b/packages/backend/discovery/sophon/ethereum/discovered.json
index a6051c93a3a..27f816b122e 100644
--- a/packages/backend/discovery/sophon/ethereum/discovered.json
+++ b/packages/backend/discovery/sophon/ethereum/discovered.json
@@ -1,8 +1,8 @@
{
"name": "sophon",
"chain": "ethereum",
- "blockNumber": 21421507,
- "configHash": "0x63482a33516812a44ebfcf64dc6b72fe94d8f20704029ff4af4cc7ca3812b439",
+ "blockNumber": 21429615,
+ "configHash": "0x44fa86ae672b7be5ab690c0a041b5627ee7c81615eabd27aa01a78390fb1ac06",
"contracts": [
{
"name": "SophonZkEvm",
@@ -151,25 +151,25 @@
"getBaseToken": "0x6B7774CB12ed7573a7586E7D0e62a2A563dDd3f0",
"getBaseTokenBridge": "0xD7f9f54194C633F36CCD5F3da84ad4a1c38cB2cB",
"getBridgehub": "0x303a465B659cBB0ab36eE643eA362c509EEb5213",
- "getFirstUnprocessedPriorityTx": 19,
+ "getFirstUnprocessedPriorityTx": 25,
"getL2BootloaderBytecodeHash": "0x010008e742608b21bf7eb23c1a9d0602047e3618b464c9b59c0fba3b3d7ab66e",
"getL2DefaultAccountBytecodeHash": "0x01000563374c277a2c1e34659a2a1e87371bb6d852ce142022d497bfb50b9e32",
"getL2SystemContractsUpgradeBatchNumber": 0,
"getL2SystemContractsUpgradeBlockNumber": 0,
"getL2SystemContractsUpgradeTxHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"getPendingAdmin": "0x0000000000000000000000000000000000000000",
- "getPriorityQueueSize": 6,
+ "getPriorityQueueSize": 0,
"getPriorityTxMaxGasLimit": 72000000,
"getProtocolVersion": 103079215106,
"getPubdataPricingMode": 1,
"getSemverProtocolVersion": [0, 24, 2],
"getStateTransitionManager": "0xc2eE6b6af7d616f6e27ce7F4A451Aedc2b0F5f5C",
- "getTotalBatchesCommitted": 143,
- "getTotalBatchesExecuted": 113,
- "getTotalBatchesVerified": 141,
- "getTotalBlocksCommitted": 143,
- "getTotalBlocksExecuted": 113,
- "getTotalBlocksVerified": 141,
+ "getTotalBatchesCommitted": 245,
+ "getTotalBatchesExecuted": 151,
+ "getTotalBatchesVerified": 244,
+ "getTotalBlocksCommitted": 245,
+ "getTotalBlocksExecuted": 151,
+ "getTotalBlocksVerified": 244,
"getTotalPriorityTxs": 25,
"getVerifier": "0x70F3FBf8a427155185Ec90BED8a3434203de9604",
"getVerifierParams": {
@@ -200,7 +200,7 @@
},
{
"name": "SophonUSDCEscrowMultisig",
- "address": "0x478a303CCe3c62CE52A8D66885b9D04F2733F3b6",
+ "address": "0x3b181838Ae9DB831C17237FAbD7c10801Dd49fcD",
"template": "GnosisSafe",
"sourceHashes": [
"0x81a7349eebb98ac33b0bc6842e3cb258034a8f2a4ba004570bb8e2e25947f9ff",
@@ -214,22 +214,25 @@
}
],
"ignoreInWatchMode": ["nonce"],
- "sinceTimestamp": 1717436735,
+ "sinceTimestamp": 1711721747,
"values": {
"$immutable": false,
"$implementation": "0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552",
"$members": [
+ "0x2Ea9CcB15Ceb6c228786a3d4837B0bA3e9736D97",
+ "0x501007545326469ecB896E867EF8a806107F4545",
+ "0x91455BACbDB3bD379783272ee3fc9841F5c7aC39",
"0x02266d7404AF55F39605Ea1D2b6bfff6DF74157d",
"0x53c79F415FFb95d66dfD97deB52A20AA2f69c84d",
"0x355458F230cBD78674e54BCA0Dd2B36017cF9b41",
- "0x4BBBaCCbA75dbb482619722FFE68bBddC9CCc336"
+ "0xE1271b010dc5dDbd17d094b35DD2E24e617b34Ea"
],
- "$threshold": 2,
- "domainSeparator": "0x15c56fa778e6180222c84b5bee316b0408cec93957578014e05c27afcf9b0891",
+ "$threshold": 4,
+ "domainSeparator": "0x57b360e8d9ab75b4ff35c67b281a41cc09239888a70aabb684f93036f520b13d",
"getChainId": 1,
"GnosisSafe_modules": [],
- "multisigThreshold": "2 of 4 (50%)",
- "nonce": 104,
+ "multisigThreshold": "4 of 7 (57%)",
+ "nonce": 48,
"VERSION": "1.3.0"
},
"derivedName": "GnosisSafe"
@@ -301,7 +304,7 @@
"getChainId": 1,
"GnosisSafe_modules": [],
"multisigThreshold": "3 of 6 (50%)",
- "nonce": 1,
+ "nonce": 2,
"VERSION": "1.4.1"
},
"derivedName": "Safe"
@@ -318,13 +321,13 @@
"issuedPermissions": [
{
"permission": "upgrade",
- "target": "0x478a303CCe3c62CE52A8D66885b9D04F2733F3b6",
+ "target": "0x3b181838Ae9DB831C17237FAbD7c10801Dd49fcD",
"via": []
}
],
"sinceTimestamp": 1734114251,
"values": {
- "$admin": "0x478a303CCe3c62CE52A8D66885b9D04F2733F3b6",
+ "$admin": "0x3b181838Ae9DB831C17237FAbD7c10801Dd49fcD",
"$implementation": "0x86dF12f51E3531689e0615bb2F739ddf01337715",
"$pastUpgrades": [
[
@@ -337,10 +340,10 @@
"admin": "0x0000000000000000000000000000000000000000",
"BRIDGE_HUB": "0x303a465B659cBB0ab36eE643eA362c509EEb5213",
"L1_USDC_TOKEN": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
- "owner": "0x299174d47c243B5381c6062aBEFbfF915B601D85",
+ "owner": "0xe4644b6d106A18062344c0A853666bc0B8f052d1",
"paused": false,
"pendingAdmin": "0x0000000000000000000000000000000000000000",
- "pendingOwner": "0xe4644b6d106A18062344c0A853666bc0B8f052d1"
+ "pendingOwner": "0x0000000000000000000000000000000000000000"
}
}
],
@@ -349,14 +352,16 @@
{ "address": "0x02266d7404AF55F39605Ea1D2b6bfff6DF74157d" },
{ "address": "0x14574dfC6B7aF658c5033BA95673864947956521" },
{ "address": "0x20719Abd2E63518e68D30a295388cAd6B542dCEf" },
- { "address": "0x299174d47c243B5381c6062aBEFbfF915B601D85" },
+ { "address": "0x2Ea9CcB15Ceb6c228786a3d4837B0bA3e9736D97" },
{ "address": "0x355458F230cBD78674e54BCA0Dd2B36017cF9b41" },
{ "address": "0x3b6036d410cA018661324766680674921a8b2d89" },
- { "address": "0x4BBBaCCbA75dbb482619722FFE68bBddC9CCc336" },
+ { "address": "0x501007545326469ecB896E867EF8a806107F4545" },
{ "address": "0x53c79F415FFb95d66dfD97deB52A20AA2f69c84d" },
{ "address": "0x7f413262Cb811B034d077d9184b5Efda6943f2c3" },
{ "address": "0x90E10C37d8d9e854e7775B0069728642A1F88610" },
+ { "address": "0x91455BACbDB3bD379783272ee3fc9841F5c7aC39" },
{ "address": "0xd89b0f620E0C72BD82e0447dE07FB0A0Abe01F69" },
+ { "address": "0xE1271b010dc5dDbd17d094b35DD2E24e617b34Ea" },
{ "address": "0xe14828E4405239dD331F194F1B7883eeD73bCBF3" }
],
"abis": {
@@ -364,6 +369,9 @@
"constructor(uint256 _chainId, tuple(tuple(address facet, uint8 action, bool isFreezable, bytes4[] selectors)[] facetCuts, address initAddress, bytes initCalldata) _diamondCut)",
"event DiamondCut(tuple(address facet, uint8 action, bool isFreezable, bytes4[] selectors)[] facetCuts, address initAddress, bytes initCalldata)"
],
+ "0x3b181838Ae9DB831C17237FAbD7c10801Dd49fcD": [
+ "constructor(address _singleton)"
+ ],
"0x41675C099F32341bf84BFc5382aF534df5C7461a": [
"constructor()",
"event AddedOwner(address indexed owner)",
@@ -412,9 +420,6 @@
"function simulateAndRevert(address targetContract, bytes calldataPayload)",
"function swapOwner(address prevOwner, address oldOwner, address newOwner)"
],
- "0x478a303CCe3c62CE52A8D66885b9D04F2733F3b6": [
- "constructor(address _singleton)"
- ],
"0x70F3FBf8a427155185Ec90BED8a3434203de9604": [
"function verificationKeyHash() pure returns (bytes32 vkHash)",
"function verify(uint256[], uint256[], uint256[]) view returns (bool)"
diff --git a/packages/backend/discovery/thebinaryholdings/ethereum/diffHistory.md b/packages/backend/discovery/thebinaryholdings/ethereum/diffHistory.md
index d80207d5b8d..feb743c0215 100644
--- a/packages/backend/discovery/thebinaryholdings/ethereum/diffHistory.md
+++ b/packages/backend/discovery/thebinaryholdings/ethereum/diffHistory.md
@@ -1,3 +1,204 @@
+Generated with discovered.json: 0xac557798f3fb7a1c786f19c6bf75a3f053f8ccdf
+
+# Diff at Wed, 18 Dec 2024 11:11:58 GMT:
+
+- author: sekuba (<29250140+sekuba@users.noreply.github.com>)
+- comparing to: main@a44ef6747febdd9930ef05420e60556c20899f13 block: 20777124
+- current block number: 21429035
+
+## Description
+
+Multiple upgrades back-and-forth (4 upgrades in the case of L2OutputOracle) to eventually the same implementations as before. Upgrade MS threshold decreased to 1/2 (EOA warn added).
+
+## Watched changes
+
+```diff
+ contract L2OutputOracle (0x012f4baa6e0F5Ac4dFDF47BDdd9CF68a2B17821e) {
+ +++ description: Contains a list of proposed state roots which Proposers assert to be a result of block execution. Currently only the PROPOSER address can submit new state roots.
+ issuedPermissions.3:
++ {"permission":"upgrade","target":"0xE559cf25AE191566d4A2E1cd5A533475179672A0","via":[{"address":"0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3","delay":0},{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0}]}
+ issuedPermissions.2.target:
+- "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
++ "0x666372fEfB85dA96a1a56667638321605afe95bC"
+ issuedPermissions.2.via.1:
++ {"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0}
+ issuedPermissions.2.via.0.address:
+- "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"
++ "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
+ issuedPermissions.1.target:
+- "0x2b6cD940ABE0CAF2fd89155b99522548c00EBaB1"
++ "0xe615dC682b340e00c2d80472a281CbD5A2b68ae7"
+ values.$pastUpgrades.4:
++ ["2024-12-13T12:21:11.000Z","0x1c58ba302b76a7b5f7cc1c3124223f9ba4c62e072ccdd9623dcfd88330e92244",["0xF8BE077b85C8553124918d4ECE132E0Fb634c86A"]]
+ values.$pastUpgrades.3:
++ ["2024-12-13T12:17:35.000Z","0x76ec730181ff0f2f002c07941ca2433b9788f7773c948e295af6722beee9007e",["0x14E08A30B7Bb79c9777149f53e2dbBA58eBa1104"]]
+ values.$pastUpgrades.2:
++ ["2024-12-13T12:12:35.000Z","0xbd013fcec97c6e28b2ddabcb76b600d3c28d4ba966a2b1de6d02088025a9947c",["0xF8BE077b85C8553124918d4ECE132E0Fb634c86A"]]
+ values.$pastUpgrades.1:
++ ["2024-12-13T12:04:35.000Z","0x9a9f680a935c2514123c19ab6f6a928ca46a102ec1129fa06850714aafe6ffa7",["0x14E08A30B7Bb79c9777149f53e2dbBA58eBa1104"]]
+ values.$upgradeCount:
+- 1
++ 5
+ values.proposer:
+- "0x2b6cD940ABE0CAF2fd89155b99522548c00EBaB1"
++ "0xe615dC682b340e00c2d80472a281CbD5A2b68ae7"
+ values.PROPOSER:
+- "0x2b6cD940ABE0CAF2fd89155b99522548c00EBaB1"
++ "0xe615dC682b340e00c2d80472a281CbD5A2b68ae7"
+ }
+```
+
+```diff
+ contract L1ERC721Bridge (0x1b396e4dC6ECB0be33CF01C5a34E1a3a7D03c378) {
+ +++ description: Used to bridge ERC-721 tokens from host chain to this chain.
+ issuedPermissions.1:
++ {"permission":"upgrade","target":"0xE559cf25AE191566d4A2E1cd5A533475179672A0","via":[{"address":"0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3","delay":0},{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0}]}
+ issuedPermissions.0.target:
+- "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
++ "0x666372fEfB85dA96a1a56667638321605afe95bC"
+ issuedPermissions.0.via.1:
++ {"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0}
+ issuedPermissions.0.via.0.address:
+- "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"
++ "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
+ }
+```
+
+```diff
+ contract SuperchainConfig (0x34bb53D7C525114A27F0FE2aF91bdDAd186abb12) {
+ +++ description: This is NOT the shared SuperchainConfig contract of the OP stack Superchain but rather a local fork. It manages the `PAUSED_SLOT`, a boolean value indicating whether the local chain is paused, and `GUARDIAN_SLOT`, the address of the guardian which can pause and unpause the system.
+ issuedPermissions.2:
++ {"permission":"upgrade","target":"0xE559cf25AE191566d4A2E1cd5A533475179672A0","via":[{"address":"0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3","delay":0},{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0}]}
+ issuedPermissions.1.target:
+- "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
++ "0x666372fEfB85dA96a1a56667638321605afe95bC"
+ issuedPermissions.1.via.1:
++ {"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0}
+ issuedPermissions.1.via.0.address:
+- "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"
++ "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
+ }
+```
+
+```diff
+ contract TBHMultisig (0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3) {
+ +++ description: None
+ receivedPermissions:
+- [{"permission":"configure","target":"0x8173904703995c6BbA59a42B8bBf8405F978758a","description":"set and change address mappings.","via":[{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"}]},{"permission":"upgrade","target":"0x012f4baa6e0F5Ac4dFDF47BDdd9CF68a2B17821e","via":[{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"}]},{"permission":"upgrade","target":"0x1b396e4dC6ECB0be33CF01C5a34E1a3a7D03c378","via":[{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"}]},{"permission":"upgrade","target":"0x34bb53D7C525114A27F0FE2aF91bdDAd186abb12","via":[{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"}]},{"permission":"upgrade","target":"0x5ff88fcF8e9947f45F4cAf8FFd5231B5DdF05e0A","via":[{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"}]},{"permission":"upgrade","target":"0x7aC7e5989EaC278B7BbfeF560871a2026baD472c","via":[{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"}]},{"permission":"upgrade","target":"0xa641e14B685b5E652865e14A4fBc07e51371D124","via":[{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"}]},{"permission":"upgrade","target":"0xD1B30378CBF968E5525e8835219A5726A1e71D10","description":"upgrading the bridge implementation can give access to all funds escrowed therein.","via":[{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"}]}]
+ values.$members.1:
+- "0x25A6E7c6f3d0fE89A656Fcf065614B74E55099fF"
++ "0xE559cf25AE191566d4A2E1cd5A533475179672A0"
+ values.$members.0:
+- "0xE559cf25AE191566d4A2E1cd5A533475179672A0"
++ "0x666372fEfB85dA96a1a56667638321605afe95bC"
+ values.$threshold:
+- 2
++ 1
+ values.multisigThreshold:
+- "2 of 2 (100%)"
++ "1 of 2 (50%)"
+ }
+```
+
+```diff
+ contract OptimismPortal (0x5ff88fcF8e9947f45F4cAf8FFd5231B5DdF05e0A) {
+ +++ description: The main entry point to deposit funds from host chain to this chain. It also allows to prove and finalize withdrawals.
+ issuedPermissions.2:
++ {"permission":"upgrade","target":"0xE559cf25AE191566d4A2E1cd5A533475179672A0","via":[{"address":"0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3","delay":0},{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0}]}
+ issuedPermissions.1.target:
+- "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
++ "0x666372fEfB85dA96a1a56667638321605afe95bC"
+ issuedPermissions.1.via.1:
++ {"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0}
+ issuedPermissions.1.via.0.address:
+- "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"
++ "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
+ }
+```
+
+```diff
+ contract SystemConfig (0x7aC7e5989EaC278B7BbfeF560871a2026baD472c) {
+ +++ description: Contains configuration parameters such as the Sequencer address, gas limit on this chain and the unsafe block signer address.
+ issuedPermissions.3:
++ {"permission":"upgrade","target":"0xE559cf25AE191566d4A2E1cd5A533475179672A0","via":[{"address":"0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3","delay":0},{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0}]}
+ issuedPermissions.2.target:
+- "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
++ "0x666372fEfB85dA96a1a56667638321605afe95bC"
+ issuedPermissions.2.via.1:
++ {"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0}
+ issuedPermissions.2.via.0.address:
+- "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"
++ "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
+ issuedPermissions.1.target:
+- "0x7f9D9c1BCE1062E1077845eA39a0303429600a06"
++ "0x68d5BBf3a01ECbB47CE38Cf64a7d6C0eA618040f"
+ issuedPermissions.0.target:
+- "0x25A6E7c6f3d0fE89A656Fcf065614B74E55099fF"
++ "0x666372fEfB85dA96a1a56667638321605afe95bC"
+ values.batcherHash:
+- "0x7f9D9c1BCE1062E1077845eA39a0303429600a06"
++ "0x68d5BBf3a01ECbB47CE38Cf64a7d6C0eA618040f"
+ values.owner:
+- "0x25A6E7c6f3d0fE89A656Fcf065614B74E55099fF"
++ "0x666372fEfB85dA96a1a56667638321605afe95bC"
+ values.unsafeBlockSigner:
+- "0xDbad225D1C0DaBc27f6a9d250dBb136413C0DFb4"
++ "0x666bfb2Bac23cf5fE3308301A3c5130f92D96B07"
+ }
+```
+
+```diff
+ contract AddressManager (0x8173904703995c6BbA59a42B8bBf8405F978758a) {
+ +++ description: Legacy contract used to manage a mapping of string names to addresses. Modern OP stack uses a different standard proxy system instead, but this contract is still necessary for backwards compatibility with several older contracts.
+ issuedPermissions.1:
++ {"permission":"configure","target":"0xE559cf25AE191566d4A2E1cd5A533475179672A0","via":[{"address":"0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3","delay":0},{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0,"description":"set and change address mappings."}]}
+ issuedPermissions.0.target:
+- "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
++ "0x666372fEfB85dA96a1a56667638321605afe95bC"
+ issuedPermissions.0.via.1:
++ {"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0,"description":"set and change address mappings."}
+ issuedPermissions.0.via.0.address:
+- "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"
++ "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
+ issuedPermissions.0.via.0.description:
+- "set and change address mappings."
+ }
+```
+
+```diff
+ contract OptimismMintableERC20Factory (0xa641e14B685b5E652865e14A4fBc07e51371D124) {
+ +++ description: A helper contract that generates OptimismMintableERC20 contracts on the network it's deployed to. OptimismMintableERC20 is a standard extension of the base ERC20 token contract designed to allow the L1StandardBridge contracts to mint and burn tokens. This makes it possible to use an OptimismMintablERC20 as this chain's representation of a token on the host chain, or vice-versa.
+ issuedPermissions.1:
++ {"permission":"upgrade","target":"0xE559cf25AE191566d4A2E1cd5A533475179672A0","via":[{"address":"0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3","delay":0},{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0}]}
+ issuedPermissions.0.target:
+- "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
++ "0x666372fEfB85dA96a1a56667638321605afe95bC"
+ issuedPermissions.0.via.1:
++ {"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0}
+ issuedPermissions.0.via.0.address:
+- "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"
++ "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
+ }
+```
+
+```diff
+ contract L1StandardBridge (0xD1B30378CBF968E5525e8835219A5726A1e71D10) {
+ +++ description: The main entry point to deposit ERC20 tokens from host chain to this chain. This contract can store any token.
+ issuedPermissions.1:
++ {"permission":"upgrade","target":"0xE559cf25AE191566d4A2E1cd5A533475179672A0","via":[{"address":"0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3","delay":0},{"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0,"description":"upgrading the bridge implementation can give access to all funds escrowed therein."}]}
+ issuedPermissions.0.target:
+- "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
++ "0x666372fEfB85dA96a1a56667638321605afe95bC"
+ issuedPermissions.0.via.1:
++ {"address":"0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF","delay":0,"description":"upgrading the bridge implementation can give access to all funds escrowed therein."}
+ issuedPermissions.0.via.0.address:
+- "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF"
++ "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3"
+ issuedPermissions.0.via.0.description:
+- "upgrading the bridge implementation can give access to all funds escrowed therein."
+ }
+```
+
Generated with discovered.json: 0x567de9e07b8ee1e0e4fb48301efab1be22e59ef8
# Diff at Fri, 01 Nov 2024 12:24:11 GMT:
diff --git a/packages/backend/discovery/thebinaryholdings/ethereum/discovered.json b/packages/backend/discovery/thebinaryholdings/ethereum/discovered.json
index 68793affa3f..852e32cdd12 100644
--- a/packages/backend/discovery/thebinaryholdings/ethereum/discovered.json
+++ b/packages/backend/discovery/thebinaryholdings/ethereum/discovered.json
@@ -1,7 +1,7 @@
{
"name": "thebinaryholdings",
"chain": "ethereum",
- "blockNumber": 20777124,
+ "blockNumber": 21429035,
"configHash": "0xb0c4117fe18999d663d6c8d502aa5e139bdf96f44168eecf29ef59bcb1a9d215",
"contracts": [
{
@@ -22,13 +22,31 @@
},
{
"permission": "propose",
- "target": "0x2b6cD940ABE0CAF2fd89155b99522548c00EBaB1",
+ "target": "0xe615dC682b340e00c2d80472a281CbD5A2b68ae7",
"via": []
},
{
"permission": "upgrade",
- "target": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "target": "0x666372fEfB85dA96a1a56667638321605afe95bC",
"via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
+ {
+ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
+ "delay": 0
+ }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0xE559cf25AE191566d4A2E1cd5A533475179672A0",
+ "via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
{
"address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
"delay": 0
@@ -51,9 +69,29 @@
"2024-06-26T10:49:47.000Z",
"0xb5ac763936b2295e23b585a3d6dcaf820ebeb7ea7a77f22d1c637e6144b33466",
["0xF8BE077b85C8553124918d4ECE132E0Fb634c86A"]
+ ],
+ [
+ "2024-12-13T12:04:35.000Z",
+ "0x9a9f680a935c2514123c19ab6f6a928ca46a102ec1129fa06850714aafe6ffa7",
+ ["0x14E08A30B7Bb79c9777149f53e2dbBA58eBa1104"]
+ ],
+ [
+ "2024-12-13T12:12:35.000Z",
+ "0xbd013fcec97c6e28b2ddabcb76b600d3c28d4ba966a2b1de6d02088025a9947c",
+ ["0xF8BE077b85C8553124918d4ECE132E0Fb634c86A"]
+ ],
+ [
+ "2024-12-13T12:17:35.000Z",
+ "0x76ec730181ff0f2f002c07941ca2433b9788f7773c948e295af6722beee9007e",
+ ["0x14E08A30B7Bb79c9777149f53e2dbBA58eBa1104"]
+ ],
+ [
+ "2024-12-13T12:21:11.000Z",
+ "0x1c58ba302b76a7b5f7cc1c3124223f9ba4c62e072ccdd9623dcfd88330e92244",
+ ["0xF8BE077b85C8553124918d4ECE132E0Fb634c86A"]
]
],
- "$upgradeCount": 1,
+ "$upgradeCount": 5,
"challenger": "0x79DdF0745D14783cDC2a05624c585Ddce07F4A02",
"CHALLENGER": "0x79DdF0745D14783cDC2a05624c585Ddce07F4A02",
"deletedOutputs": [],
@@ -61,12 +99,12 @@
"finalizationPeriodSeconds": 604800,
"L2_BLOCK_TIME": 2,
"l2BlockTime": 2,
- "latestBlockNumber": 3627000,
- "latestOutputIndex": 2014,
- "nextBlockNumber": 3628800,
- "nextOutputIndex": 2015,
- "proposer": "0x2b6cD940ABE0CAF2fd89155b99522548c00EBaB1",
- "PROPOSER": "0x2b6cD940ABE0CAF2fd89155b99522548c00EBaB1",
+ "latestBlockNumber": 6998400,
+ "latestOutputIndex": 3887,
+ "nextBlockNumber": 7000200,
+ "nextOutputIndex": 3888,
+ "proposer": "0xe615dC682b340e00c2d80472a281CbD5A2b68ae7",
+ "PROPOSER": "0xe615dC682b340e00c2d80472a281CbD5A2b68ae7",
"startingBlockNumber": 0,
"startingTimestamp": 1719397463,
"SUBMISSION_INTERVAL": 1800,
@@ -92,8 +130,26 @@
"issuedPermissions": [
{
"permission": "upgrade",
- "target": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "target": "0x666372fEfB85dA96a1a56667638321605afe95bC",
"via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
+ {
+ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
+ "delay": 0
+ }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0xE559cf25AE191566d4A2E1cd5A533475179672A0",
+ "via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
{
"address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
"delay": 0
@@ -141,8 +197,26 @@
},
{
"permission": "upgrade",
- "target": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "target": "0x666372fEfB85dA96a1a56667638321605afe95bC",
+ "via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
+ {
+ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
+ "delay": 0
+ }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0xE559cf25AE191566d4A2E1cd5A533475179672A0",
"via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
{
"address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
"delay": 0
@@ -229,50 +303,6 @@
"0xd42bbf9f7dcd3720a7fc6bdc6edfdfae8800a37d6dd4decfa0ef6ca4a2e88940"
],
"proxyType": "gnosis safe",
- "receivedPermissions": [
- {
- "permission": "configure",
- "target": "0x8173904703995c6BbA59a42B8bBf8405F978758a",
- "description": "set and change address mappings.",
- "via": [{ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" }]
- },
- {
- "permission": "upgrade",
- "target": "0x012f4baa6e0F5Ac4dFDF47BDdd9CF68a2B17821e",
- "via": [{ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" }]
- },
- {
- "permission": "upgrade",
- "target": "0x1b396e4dC6ECB0be33CF01C5a34E1a3a7D03c378",
- "via": [{ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" }]
- },
- {
- "permission": "upgrade",
- "target": "0x34bb53D7C525114A27F0FE2aF91bdDAd186abb12",
- "via": [{ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" }]
- },
- {
- "permission": "upgrade",
- "target": "0x5ff88fcF8e9947f45F4cAf8FFd5231B5DdF05e0A",
- "via": [{ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" }]
- },
- {
- "permission": "upgrade",
- "target": "0x7aC7e5989EaC278B7BbfeF560871a2026baD472c",
- "via": [{ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" }]
- },
- {
- "permission": "upgrade",
- "target": "0xa641e14B685b5E652865e14A4fBc07e51371D124",
- "via": [{ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" }]
- },
- {
- "permission": "upgrade",
- "target": "0xD1B30378CBF968E5525e8835219A5726A1e71D10",
- "description": "upgrading the bridge implementation can give access to all funds escrowed therein.",
- "via": [{ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" }]
- }
- ],
"directlyReceivedPermissions": [
{
"permission": "act",
@@ -285,15 +315,15 @@
"$immutable": false,
"$implementation": "0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552",
"$members": [
- "0xE559cf25AE191566d4A2E1cd5A533475179672A0",
- "0x25A6E7c6f3d0fE89A656Fcf065614B74E55099fF"
+ "0x666372fEfB85dA96a1a56667638321605afe95bC",
+ "0xE559cf25AE191566d4A2E1cd5A533475179672A0"
],
- "$threshold": 2,
+ "$threshold": 1,
"domainSeparator": "0xfe2b76645f343e4c0015c3007a5022c26319b5df8ab9f22ab1f30bf7964221ed",
"getChainId": 1,
"GnosisSafe_modules": [],
- "multisigThreshold": "2 of 2 (100%)",
- "nonce": 16,
+ "multisigThreshold": "1 of 2 (50%)",
+ "nonce": 23,
"VERSION": "1.3.0"
},
"derivedName": "GnosisSafe"
@@ -316,8 +346,26 @@
},
{
"permission": "upgrade",
- "target": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "target": "0x666372fEfB85dA96a1a56667638321605afe95bC",
+ "via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
+ {
+ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
+ "delay": 0
+ }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0xE559cf25AE191566d4A2E1cd5A533475179672A0",
"via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
{
"address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
"delay": 0
@@ -344,7 +392,7 @@
"params": {
"prevBaseFee": 1000000000,
"prevBoughtGas": 21000,
- "prevBlockNum": 20669746
+ "prevBlockNum": 20870944
},
"paused": false,
"superchainConfig": "0x34bb53D7C525114A27F0FE2aF91bdDAd186abb12",
@@ -365,18 +413,36 @@
"issuedPermissions": [
{
"permission": "configure",
- "target": "0x25A6E7c6f3d0fE89A656Fcf065614B74E55099fF",
+ "target": "0x666372fEfB85dA96a1a56667638321605afe95bC",
"via": []
},
{
"permission": "sequence",
- "target": "0x7f9D9c1BCE1062E1077845eA39a0303429600a06",
+ "target": "0x68d5BBf3a01ECbB47CE38Cf64a7d6C0eA618040f",
"via": []
},
{
"permission": "upgrade",
- "target": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "target": "0x666372fEfB85dA96a1a56667638321605afe95bC",
+ "via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
+ {
+ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
+ "delay": 0
+ }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0xE559cf25AE191566d4A2E1cd5A533475179672A0",
"via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
{
"address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
"delay": 0
@@ -399,7 +465,7 @@
"$upgradeCount": 1,
"basefeeScalar": 1198951,
"BATCH_INBOX_SLOT": "0x71ac12829d66ee73d8d95bff50b3589745ce57edae70a3fb111a2342464dc597",
- "batcherHash": "0x7f9D9c1BCE1062E1077845eA39a0303429600a06",
+ "batcherHash": "0x68d5BBf3a01ECbB47CE38Cf64a7d6C0eA618040f",
"batchInbox": "0xFF00000000000000000000000000000000000624",
"blobbasefeeScalar": 2001,
"DISPUTE_GAME_FACTORY_SLOT": "0x52322a25d9f59ea17656545543306b7aef62bc0cc53a0e65ccfa0c75b97aa906",
@@ -429,7 +495,7 @@
"optimismMintableERC20Factory": "0xa641e14B685b5E652865e14A4fBc07e51371D124",
"optimismPortal": "0x5ff88fcF8e9947f45F4cAf8FFd5231B5DdF05e0A",
"overhead": 0,
- "owner": "0x25A6E7c6f3d0fE89A656Fcf065614B74E55099fF",
+ "owner": "0x666372fEfB85dA96a1a56667638321605afe95bC",
"resourceConfig": {
"maxResourceLimit": 20000000,
"elasticityMultiplier": 10,
@@ -443,7 +509,7 @@
"START_BLOCK_SLOT": "0xa11ee3ab75b40e88a0105e935d17cd36c8faee0138320d776c411291bdbbb19f",
"startBlock": 20175362,
"UNSAFE_BLOCK_SIGNER_SLOT": "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08",
- "unsafeBlockSigner": "0xDbad225D1C0DaBc27f6a9d250dBb136413C0DFb4",
+ "unsafeBlockSigner": "0x666bfb2Bac23cf5fE3308301A3c5130f92D96B07",
"version": "2.3.0-beta.2",
"VERSION": 0
},
@@ -511,8 +577,27 @@
"issuedPermissions": [
{
"permission": "configure",
- "target": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "target": "0x666372fEfB85dA96a1a56667638321605afe95bC",
+ "via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
+ {
+ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
+ "delay": 0,
+ "description": "set and change address mappings."
+ }
+ ]
+ },
+ {
+ "permission": "configure",
+ "target": "0xE559cf25AE191566d4A2E1cd5A533475179672A0",
"via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
{
"address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
"delay": 0,
@@ -540,8 +625,26 @@
"issuedPermissions": [
{
"permission": "upgrade",
- "target": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "target": "0x666372fEfB85dA96a1a56667638321605afe95bC",
"via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
+ {
+ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
+ "delay": 0
+ }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0xE559cf25AE191566d4A2E1cd5A533475179672A0",
+ "via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
{
"address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
"delay": 0
@@ -580,8 +683,27 @@
"issuedPermissions": [
{
"permission": "upgrade",
- "target": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "target": "0x666372fEfB85dA96a1a56667638321605afe95bC",
"via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
+ {
+ "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
+ "delay": 0,
+ "description": "upgrading the bridge implementation can give access to all funds escrowed therein."
+ }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0xE559cf25AE191566d4A2E1cd5A533475179672A0",
+ "via": [
+ {
+ "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3",
+ "delay": 0
+ },
{
"address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF",
"delay": 0,
@@ -611,21 +733,88 @@
"eoas": [
{ "address": "0x000000000000000000000000000000000000dEaD" },
{
- "address": "0x25A6E7c6f3d0fE89A656Fcf065614B74E55099fF",
+ "address": "0x666372fEfB85dA96a1a56667638321605afe95bC",
"receivedPermissions": [
{
"permission": "configure",
"target": "0x7aC7e5989EaC278B7BbfeF560871a2026baD472c",
"description": "it can update the preconfer address, the batch submitter (Sequencer) address and the gas configuration of the system."
+ },
+ {
+ "permission": "configure",
+ "target": "0x8173904703995c6BbA59a42B8bBf8405F978758a",
+ "description": "set and change address mappings.",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0x012f4baa6e0F5Ac4dFDF47BDdd9CF68a2B17821e",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0x1b396e4dC6ECB0be33CF01C5a34E1a3a7D03c378",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0x34bb53D7C525114A27F0FE2aF91bdDAd186abb12",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0x5ff88fcF8e9947f45F4cAf8FFd5231B5DdF05e0A",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0x7aC7e5989EaC278B7BbfeF560871a2026baD472c",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0xa641e14B685b5E652865e14A4fBc07e51371D124",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0xD1B30378CBF968E5525e8835219A5726A1e71D10",
+ "description": "upgrading the bridge implementation can give access to all funds escrowed therein.",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
}
]
},
+ { "address": "0x666bfb2Bac23cf5fE3308301A3c5130f92D96B07" },
{
- "address": "0x2b6cD940ABE0CAF2fd89155b99522548c00EBaB1",
+ "address": "0x68d5BBf3a01ECbB47CE38Cf64a7d6C0eA618040f",
"receivedPermissions": [
{
- "permission": "propose",
- "target": "0x012f4baa6e0F5Ac4dFDF47BDdd9CF68a2B17821e"
+ "permission": "sequence",
+ "target": "0x7aC7e5989EaC278B7BbfeF560871a2026baD472c"
}
]
},
@@ -639,29 +828,98 @@
]
},
{
- "address": "0x7f9D9c1BCE1062E1077845eA39a0303429600a06",
+ "address": "0x87aab081Ac9F8ce80fb048f23280DF019036BA1d",
"receivedPermissions": [
{
- "permission": "sequence",
- "target": "0x7aC7e5989EaC278B7BbfeF560871a2026baD472c"
+ "permission": "guard",
+ "target": "0x34bb53D7C525114A27F0FE2aF91bdDAd186abb12"
+ },
+ {
+ "permission": "guard",
+ "target": "0x5ff88fcF8e9947f45F4cAf8FFd5231B5DdF05e0A"
}
]
},
{
- "address": "0x87aab081Ac9F8ce80fb048f23280DF019036BA1d",
+ "address": "0xE559cf25AE191566d4A2E1cd5A533475179672A0",
"receivedPermissions": [
{
- "permission": "guard",
- "target": "0x34bb53D7C525114A27F0FE2aF91bdDAd186abb12"
+ "permission": "configure",
+ "target": "0x8173904703995c6BbA59a42B8bBf8405F978758a",
+ "description": "set and change address mappings.",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
},
{
- "permission": "guard",
- "target": "0x5ff88fcF8e9947f45F4cAf8FFd5231B5DdF05e0A"
+ "permission": "upgrade",
+ "target": "0x012f4baa6e0F5Ac4dFDF47BDdd9CF68a2B17821e",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0x1b396e4dC6ECB0be33CF01C5a34E1a3a7D03c378",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0x34bb53D7C525114A27F0FE2aF91bdDAd186abb12",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0x5ff88fcF8e9947f45F4cAf8FFd5231B5DdF05e0A",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0x7aC7e5989EaC278B7BbfeF560871a2026baD472c",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0xa641e14B685b5E652865e14A4fBc07e51371D124",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ },
+ {
+ "permission": "upgrade",
+ "target": "0xD1B30378CBF968E5525e8835219A5726A1e71D10",
+ "description": "upgrading the bridge implementation can give access to all funds escrowed therein.",
+ "via": [
+ { "address": "0x38593Cce8FaB9887Ef9760f5F6aB3d6C595143cF" },
+ { "address": "0x48EC051349dDc7E8baBafCBfe27696ECF2A8a8B3" }
+ ]
+ }
+ ]
+ },
+ {
+ "address": "0xe615dC682b340e00c2d80472a281CbD5A2b68ae7",
+ "receivedPermissions": [
+ {
+ "permission": "propose",
+ "target": "0x012f4baa6e0F5Ac4dFDF47BDdd9CF68a2B17821e"
}
]
},
- { "address": "0xDbad225D1C0DaBc27f6a9d250dBb136413C0DFb4" },
- { "address": "0xE559cf25AE191566d4A2E1cd5A533475179672A0" },
{ "address": "0xFF00000000000000000000000000000000000624" }
],
"abis": {
diff --git a/packages/backend/discovery/treasure/ethereum/config.jsonc b/packages/backend/discovery/treasure/ethereum/config.jsonc
index 82d0303a12f..32279c6857f 100644
--- a/packages/backend/discovery/treasure/ethereum/config.jsonc
+++ b/packages/backend/discovery/treasure/ethereum/config.jsonc
@@ -46,7 +46,9 @@
"getTotalBatchesVerified",
"getTotalBatchesCommitted",
"getTotalPriorityTxs",
- "getFirstUnprocessedPriorityTx"
+ "getFirstUnprocessedPriorityTx",
+ "baseTokenGasPriceMultiplierNominator",
+ "baseTokenGasPriceMultiplierDenominator"
],
"fields": {
"txFilterer": {
diff --git a/packages/backend/discovery/treasure/ethereum/diffHistory.md b/packages/backend/discovery/treasure/ethereum/diffHistory.md
index 1a092743b43..8a55078f2a1 100644
--- a/packages/backend/discovery/treasure/ethereum/diffHistory.md
+++ b/packages/backend/discovery/treasure/ethereum/diffHistory.md
@@ -1,4 +1,4 @@
-Generated with discovered.json: 0x91239374f05bc0877cd78330655867acf0b55967
+Generated with discovered.json: 0xd294c53381a2cd4212e1f30f4ce84c5251a3360b
# Diff at Thu, 12 Dec 2024 11:05:27 GMT:
diff --git a/packages/backend/discovery/treasure/ethereum/discovered.json b/packages/backend/discovery/treasure/ethereum/discovered.json
index 8ef75b25dc3..56d3336fc3d 100644
--- a/packages/backend/discovery/treasure/ethereum/discovered.json
+++ b/packages/backend/discovery/treasure/ethereum/discovered.json
@@ -1,8 +1,8 @@
{
"name": "treasure",
"chain": "ethereum",
- "blockNumber": 21386011,
- "configHash": "0x689befd7204ca2d1c1da2b9c53556251e9fbc284b8116d94b22cdf94aeb90258",
+ "blockNumber": 21429089,
+ "configHash": "0x544b2936cb47784e5e83a75751d34b370dd03a6c3c1d385f6ce028257e6487d2",
"contracts": [
{
"name": "TreasureChainAdminMultisig",
@@ -54,7 +54,9 @@
"getTotalBatchesVerified",
"getTotalBatchesCommitted",
"getTotalPriorityTxs",
- "getFirstUnprocessedPriorityTx"
+ "getFirstUnprocessedPriorityTx",
+ "baseTokenGasPriceMultiplierNominator",
+ "baseTokenGasPriceMultiplierDenominator"
],
"sinceTimestamp": 1732199087,
"values": {
@@ -88,8 +90,8 @@
]
],
"$upgradeCount": 2,
- "baseTokenGasPriceMultiplierDenominator": 16701,
- "baseTokenGasPriceMultiplierNominator": 100000000,
+ "baseTokenGasPriceMultiplierDenominator": 861,
+ "baseTokenGasPriceMultiplierNominator": 6250000,
"daMode": 1,
"facetAddresses": [
"0xF6F26b416CE7AE5e5FE224Be332C7aE4e1f3450a",
@@ -181,26 +183,26 @@
"getBaseToken": "0xB0c7a3Ba49C7a6EaBa6cD4a96C55a1391070Ac9A",
"getBaseTokenBridge": "0xD7f9f54194C633F36CCD5F3da84ad4a1c38cB2cB",
"getBridgehub": "0x303a465B659cBB0ab36eE643eA362c509EEb5213",
- "getFirstUnprocessedPriorityTx": 22,
+ "getFirstUnprocessedPriorityTx": 54,
"getL2BootloaderBytecodeHash": "0x010008e742608b21bf7eb23c1a9d0602047e3618b464c9b59c0fba3b3d7ab66e",
"getL2DefaultAccountBytecodeHash": "0x01000563374c277a2c1e34659a2a1e87371bb6d852ce142022d497bfb50b9e32",
"getL2SystemContractsUpgradeBatchNumber": 0,
"getL2SystemContractsUpgradeBlockNumber": 0,
"getL2SystemContractsUpgradeTxHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"getPendingAdmin": "0x0000000000000000000000000000000000000000",
- "getPriorityQueueSize": 14,
+ "getPriorityQueueSize": 0,
"getPriorityTxMaxGasLimit": 72000000,
"getProtocolVersion": 103079215106,
"getPubdataPricingMode": 1,
"getSemverProtocolVersion": [0, 24, 2],
"getStateTransitionManager": "0xc2eE6b6af7d616f6e27ce7F4A451Aedc2b0F5f5C",
- "getTotalBatchesCommitted": 41,
- "getTotalBatchesExecuted": 38,
- "getTotalBatchesVerified": 41,
- "getTotalBlocksCommitted": 41,
- "getTotalBlocksExecuted": 38,
- "getTotalBlocksVerified": 41,
- "getTotalPriorityTxs": 36,
+ "getTotalBatchesCommitted": 65,
+ "getTotalBatchesExecuted": 61,
+ "getTotalBatchesVerified": 64,
+ "getTotalBlocksCommitted": 65,
+ "getTotalBlocksExecuted": 61,
+ "getTotalBlocksVerified": 64,
+ "getTotalPriorityTxs": 54,
"getVerifier": "0x70F3FBf8a427155185Ec90BED8a3434203de9604",
"getVerifierParams": {
"recursionNodeLevelVkHash": "0xf520cd5b37e74e19fdb369c8d676a04dce8a19457497ac6686d2bb95d94109c8",
diff --git a/packages/backend/discovery/xai/arbitrum/config.jsonc b/packages/backend/discovery/xai/arbitrum/config.jsonc
index a0348a07e2e..631b6d7ae4d 100644
--- a/packages/backend/discovery/xai/arbitrum/config.jsonc
+++ b/packages/backend/discovery/xai/arbitrum/config.jsonc
@@ -51,7 +51,7 @@
"ignoreRelatives": ["esXaiAddress", "xaiAddress"]
},
"NodeLicenseRegistry": {
- "description": "This is the contract where Xai Sentry Keys to run a node are minted.",
+ "description": "This is the contract where Xai Sentry Keys for running a sentry node are minted.",
"ignoreMethods": [
"getPricingTier",
"tokenByIndex",
@@ -59,9 +59,13 @@
"getAverageCost",
"getMintTimestamp",
"ownerOf",
- "tokenURI"
+ "tokenURI",
+ "_averageCost",
+ "_mintTimestamps",
+ "ethToXai"
],
- "ignoreInWatchMode": ["totalSupply"]
+ "ignoreInWatchMode": ["totalSupply"],
+ "ignoreRelatives": ["esXaiAddress", "xaiAddress"]
}
}
}
diff --git a/packages/backend/discovery/xai/arbitrum/diffHistory.md b/packages/backend/discovery/xai/arbitrum/diffHistory.md
index ffaf28b7f60..2fc1680b524 100644
--- a/packages/backend/discovery/xai/arbitrum/diffHistory.md
+++ b/packages/backend/discovery/xai/arbitrum/diffHistory.md
@@ -1,3 +1,322 @@
+Generated with discovered.json: 0x2c65a62bde750190ecb05ab1a59de3bb6766b5ce
+
+# Diff at Wed, 18 Dec 2024 12:17:32 GMT:
+
+- author: sekuba (<29250140+sekuba@users.noreply.github.com>)
+- comparing to: main@a44ef6747febdd9930ef05420e60556c20899f13 block: 282642841
+- current block number: 286040164
+
+## Description
+
+Upgrade to known ArbOS v32 contracts, unused fastConfirmer (would be orthogonal to the sentry system).
+
+Multiple upgrades of the sentry node- and staking related infra contracts without major changes: Minting sentry keys is re-enabled and can be done with other currencies than ETH. 'promo-codes' and referral rewards are included in the SC logic.
+
+## Watched changes
+
+```diff
+ contract UpgradeExecutor (0x0EE7AD3Cc291343C9952fFd8844e86d294fa513F) {
+ +++ description: Central contract defining the access control permissions for upgrading the system contract implementations.
+ directlyReceivedPermissions.1.description:
+- "Pause and unpause and set important roles and parameters in the system contracts: Can delegate Sequencer management to a BatchPosterManager address, manage data availability and DACs, set the Sequencer-only window, introduce an allowList to the bridge and whitelist Inboxes/Outboxes."
++ "Pause and unpause and set important roles and parameters in the system contracts: Can delegate Sequencer management to a BatchPosterManager address, manage data availability, DACs and the fastConfirmer role, set the Sequencer-only window, introduce an allowList to the bridge and whitelist Inboxes/Outboxes."
+ }
+```
+
+```diff
+ contract ChallengeManager (0x3a3f62034a42a35eA1686B199bB73006aa525eE4) {
+ +++ description: Contract that allows challenging state roots. Can be called through the RollupProxy by Validators or the UpgradeExecutor.
+ sourceHashes.1:
+- "0x58a6261c83c2766f749641902ad6fdb695ea189d2747f073b57a8f35b9a547e5"
++ "0x1a095768302d7d1c3d02375eaa3341833b4f1aaac707e1c608bce478c87cbf27"
+ values.$implementation:
+- "0x5cA988F213EfbCB86ED7e2AACB0C15c91e648f8d"
++ "0x5AA806015FEC88669bF7DAd746BB4ADC1E79BcED"
+ values.$pastUpgrades.2:
++ ["2024-12-16T20:39:05.000Z","0x1621d4d8758255b5b5ac8feb35fd9358c768eb27f61784ff0db9dbb54a6e268f",["0x5AA806015FEC88669bF7DAd746BB4ADC1E79BcED"]]
+ values.$upgradeCount:
+- 2
++ 3
+ values.osp:
+- "0xb20107bfB36D3B5AcA534aCAfbd8857b10b402a8"
++ "0xD89d54007079071cBA859127318b9F34eeB78049"
+ }
+```
+
+```diff
+ contract XaiMultisig (0x4972A8EF186Ee42A14Cdd3c47f52ec06a6dc495E) {
+ +++ description: None
+ receivedPermissions.0.description:
+- "Pause and unpause and set important roles and parameters in the system contracts: Can delegate Sequencer management to a BatchPosterManager address, manage data availability and DACs, set the Sequencer-only window, introduce an allowList to the bridge and whitelist Inboxes/Outboxes."
++ "Pause and unpause and set important roles and parameters in the system contracts: Can delegate Sequencer management to a BatchPosterManager address, manage data availability, DACs and the fastConfirmer role, set the Sequencer-only window, introduce an allowList to the bridge and whitelist Inboxes/Outboxes."
+ }
+```
+
+```diff
+- Status: DELETED
+ contract OneStepProverMemory (0x526a6E634aD36bB0007c4422586c135F1F9B525a)
+ +++ description: One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.
+```
+
+```diff
+- Status: DELETED
+ contract OneStepProver0 (0x800dA62bE6626127F71B34E795286C34C04D6712)
+ +++ description: One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.
+```
+
+```diff
+- Status: DELETED
+ contract OneStepProofEntry (0xb20107bfB36D3B5AcA534aCAfbd8857b10b402a8)
+ +++ description: One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.
+```
+
+```diff
+ contract NodeLicenseRegistry (0xbc14d8563b248B79689ECbc43bBa53290e0b6b66) {
+ +++ description: This is the contract where Xai Sentry Keys for running a sentry node are minted.
+ sourceHashes.1:
+- "0xc408ffd6d9b25f5dccbe9efa0caca71b711c95f903420227c41605fc4672a46c"
++ "0xa5bceee1502b9b30ff5e8cf1acb16d0196637dd53d375860c3bec1fae2701c7f"
+ values.$implementation:
+- "0xE6E5356423516C9b75d4Dfb1fCa3973c5B695be8"
++ "0xe72b004FCa3A05251c6C8d1BF1482B9308876c7f"
+ values.$pastUpgrades.11:
++ ["2024-12-14T01:58:28.000Z","0x243eb3ec2ccf3d1d472d5a49df0f738f93262df905c8868a72dc4066546b4a2c",["0xe72b004FCa3A05251c6C8d1BF1482B9308876c7f"]]
+ values.$pastUpgrades.10:
++ ["2024-12-13T01:28:49.000Z","0x2076fd7a582c2de1357c834161c5e856568af154e7101ede7f363eab012df090",["0x14e6e53dc0E4d0d02644a96F4bC1798A7876db49"]]
+ values.$pastUpgrades.9:
++ ["2024-12-10T15:27:38.000Z","0x2b7d573f6a4f5b1d188483697b9767e34ea3e2dcf6e534785bb2b764a4de2428",["0xC6BccA5297Cd4511250E2D3241bEd586631E2aA0"]]
+ values.$upgradeCount:
+- 9
++ 12
+ values.maxSupply:
+- 50000
++ 5000000
+ values.ADMIN_MINT_ROLE:
++ "0x507caaa5b2a5a027bc340a5334d9220583b7d60d846ee2aabc76e37d69a7253b"
+ values.AIRDROP_ADMIN_ROLE:
++ "0x786fcfa0099ab9aba15d4b2ccc7ffa9994e7c522c9b340b95e584749e47fcfb9"
+ values.esXaiAddress:
++ "0x4C749d097832DE2FEcc989ce18fDc5f1BD76700c"
+ values.mintingPaused:
++ false
+ values.refereeAddress:
++ "0xfD41041180571C5D371BEA3D9550E55653671198"
+ values.refereeCalculationsAddress:
++ "0xCd62360854aecf6285Fa310D69C5EBaf4Cd5e95F"
+ values.TRANSFER_ROLE:
++ "0x8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c"
+ values.usdcAddress:
++ "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"
+ values.xaiAddress:
++ "0x4Cb9a7AE498CEDcBb5EAe9f25736aE7d428C9D66"
+ derivedName:
+- "NodeLicense7"
++ "NodeLicense9"
+ }
+```
+
+```diff
+ contract RollupProxy (0xC47DacFbAa80Bd9D8112F4e8069482c2A3221336) {
+ +++ description: Central contract for the project's configuration like its execution logic hash (`wasmModuleRoot`) and addresses of the other system contracts. Entry point for Proposers creating new Rollup Nodes (state commitments) and Challengers submitting fraud proofs (In the Orbit stack, these two roles are both held by the Validators).
+ template:
+- "orbitstack/RollupProxy"
++ "orbitstack/RollupProxy_fastConfirm"
+ sourceHashes.2:
+- "0xef94a66bd5339efd18fb9ca1f8031482e7ef7bbe6c5a0a10fae254ab83712406"
++ "0x7ee21b18b2e18c636bfafc08ff72692cc43302b2599ba75f0abad67282866dd5"
+ sourceHashes.1:
+- "0x8b48118fe606012c0dcac2ccc1821785935aec89fab8f219f47b32c482b0017e"
++ "0x9349e73cbc2d2b818c1d79711574ba210b56249d8d3845bc78c776caf8f8ff42"
+ issuedPermissions.0.via.0.description:
+- "Pause and unpause and set important roles and parameters in the system contracts: Can delegate Sequencer management to a BatchPosterManager address, manage data availability and DACs, set the Sequencer-only window, introduce an allowList to the bridge and whitelist Inboxes/Outboxes."
++ "Pause and unpause and set important roles and parameters in the system contracts: Can delegate Sequencer management to a BatchPosterManager address, manage data availability, DACs and the fastConfirmer role, set the Sequencer-only window, introduce an allowList to the bridge and whitelist Inboxes/Outboxes."
+ values.$implementation.1:
+- "0x0aE4dD666748bF0F6dB5c149Eab1D8aD27820A6A"
++ "0x1BeD37FeDFE8B2721a69A559313D2b58d16Ecd77"
+ values.$implementation.0:
+- "0xEe9E5546A11Cb5b4A86e92DA05f2ef75C26E4754"
++ "0xdD91f6e88576fEc4A38A518DA39C92e13CBB6446"
+ values.$pastUpgrades.1:
++ ["2024-12-16T20:39:05.000Z","0x1621d4d8758255b5b5ac8feb35fd9358c768eb27f61784ff0db9dbb54a6e268f",["0xdD91f6e88576fEc4A38A518DA39C92e13CBB6446","0x1BeD37FeDFE8B2721a69A559313D2b58d16Ecd77"]]
+ values.$upgradeCount:
+- 1
++ 2
++++ description: ArbOS version derived from known wasmModuleRoots.
+ values.arbOsFromWmRoot:
+- "ArbOS v20 wasmModuleRoot"
++ "ArbOS v32 wasmModuleRoot"
++++ description: Root hash of the WASM module used for execution, like a fingerprint of the L2 logic. Can be associated with ArbOS versions.
+ values.wasmModuleRoot:
+- "0x8b104a2e80ac6165dc58b9048de12f301d70b02a0ab51396c22b4b4b802a16a4"
++ "0x184884e1eb9fefdc158f6c8ac912bb183bf3cf83f0090317e0bc4ac5860baa39"
+ values.anyTrustFastConfirmer:
++ "0x0000000000000000000000000000000000000000"
+ }
+```
+
+```diff
+- Status: DELETED
+ contract OneStepProverHostIo (0xc555b2F1D559Fbb854569b33640990D178F94747)
+ +++ description: One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.
+```
+
+```diff
+ contract RefereeCalculations (0xCd62360854aecf6285Fa310D69C5EBaf4Cd5e95F) {
+ +++ description: None
+ sourceHashes.1:
+- "0x84fc1ee0b022c330db75d04b71a06523524388e6db61a159b2bd3b5d02bccf28"
++ "0xc9c19fb4d016fe3bcc74ab045b2d6a2231e661f4d86cbb0cac0dc5d1301fb49a"
+ values.$implementation:
+- "0x5A195953555A11d2a4b654DCa3aE4f9f19eBC3E2"
++ "0x1488598b22Cc196Aa547894493BC2313a8A00C1e"
+ values.$pastUpgrades.1:
++ ["2024-12-10T17:38:10.000Z","0x20e602e4c1899b6cb255bb9db60aebb18a0a89f0087ad8ffc50492d6e89302b7",["0x1488598b22Cc196Aa547894493BC2313a8A00C1e"]]
+ values.$upgradeCount:
+- 1
++ 2
+ }
+```
+
+```diff
+- Status: DELETED
+ contract OneStepProverMath (0xe8709022B9C9D7347856c75910fe07e10C904446)
+ +++ description: One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.
+```
+
+```diff
+ contract PoolFactory (0xF9E08660223E2dbb1c0b28c82942aB6B5E38b8E5) {
+ +++ description: The PoolFactory allows creating and managing staking pools for V2 staking. Users can stake esXAI (and / or Sentry Keys) in pools. This contract's address is whitelisted in the esXAI token contract, which allows it to initiate arbitrary esXAI token transfers. V2 staking through this contract is currently set to true.
+ sourceHashes.1:
+- "0x317ab76b0d59c8c31385b5239fb1bdfff324c9629c5e8d74b82808349fbb169a"
++ "0x6b20ddf2a4ea9bb1615fb08c76f1f2f98b13ead97bc452a3840e59119c8abee1"
+ values.$implementation:
+- "0x21EEC6626f15d02A8896ebB7EDD68ff3CB61e89E"
++ "0x2095FE5CEDBE22Afc2174daC57cB6831954A560D"
+ values.$pastUpgrades.3:
++ ["2024-12-13T16:24:54.000Z","0xf515093e32598c21145005613e2d1f385b8d902d4642aacb4e6caa0f799aee27",["0x2095FE5CEDBE22Afc2174daC57cB6831954A560D"]]
+ values.$pastUpgrades.2:
++ ["2024-12-13T00:36:48.000Z","0x869e99caece9b22a813fc83475c90e783b6ac2e37aa192780fcfb7491770e79d",["0xec287a91Ac0b72Ba7f249c08a2c64dA317eF9715"]]
+ values.$pastUpgrades.1:
++ ["2024-12-10T15:27:48.000Z","0x719feb67c546cad4f43b5e741590f7b2258e896049163656eccb2f598515adc4",["0x5bfd44421b5E0405F8cfcc17463522AF6b9e1Ab3"]]
+ values.$upgradeCount:
+- 1
++ 4
+ values.STAKE_KEYS_ADMIN_ROLE:
++ "0x4744ee11e24f5fc5de82fa6dba03b134899d8fd3405c7e9a26e120c89c8d9c28"
+ derivedName:
+- "PoolFactory"
++ "PoolFactory2"
+ }
+```
+
+```diff
+ contract SentryReferee (0xfD41041180571C5D371BEA3D9550E55653671198) {
+ +++ description: The referee contract manages the Xai Sentry protocol. Sentry nodes that are tasked to watch the state transitions on Xai receive esXAI rewards for their service. These watchers participate in a game with a central 'challenger' by posting their assertions to make sure they are actually watching. In case of a malicious state transition, sentries are supposed to raise an alarm offchain. The referee contract is also a whitelisted address in the esXAI token contract, which allows it to initiate arbitrary esXAI token transfers. New staking through this contract is disabled in favor of the new v2 staking. V1 Stakers can continue to get staking rewards here or withdraw/migrate their assets.
+ sourceHashes.1:
+- "0x049618a11ae7ca2b4087908a6cb43e2102853e1798710e66a169be6fd6d4ed99"
++ "0xc8757a87d8b14b9a5c61b8130720860918aaa5843442a0b6bf6307c3a7353c32"
+ values.$implementation:
+- "0xfCa2657FC4456Ac256A78A31aAB1128F5e1d2D40"
++ "0x4F18941fE5bE7a54318989b2C42648914dCe47C4"
+ values.$pastUpgrades.11:
++ ["2024-12-15T00:07:08.000Z","0xd4a4e9be6cfdbb76dec68088cfa15e609b8d3356755c15de6e411c9034963c63",["0x4F18941fE5bE7a54318989b2C42648914dCe47C4"]]
+ values.$pastUpgrades.10:
++ ["2024-12-13T00:36:38.000Z","0x58b76b23b8bb0f3ba0bf4d2807f545b1838c527e3a71d18fe2369ee7bf6c12ca",["0x1f122B41D6740F5dE2Df93b8b00013e84227955e"]]
+ values.$pastUpgrades.9:
++ ["2024-12-10T15:27:05.000Z","0x7de66eae5bdbc8b25d8c61bc496b8022ca928b709de3dd72e7de1951fab33ecd",["0x119B21e962B6C5e57340a3CCeCFC3a90385A70dC"]]
+ values.$upgradeCount:
+- 9
++ 12
+ values.maxKeysPerPool:
+- 1000
++ 100000
+ values.maxStakeAmountPerLicense:
+- "20000000000000000000000"
++ "200000000000000000000"
+ derivedName:
+- "Referee9"
++ "Referee10"
+ }
+```
+
+```diff
++ Status: CREATED
+ contract OneStepProverHostIo (0x33c1514Bf90e202d242C299b37C60f908aa206D4)
+ +++ description: One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.
+```
+
+```diff
++ Status: CREATED
+ contract OneStepProver0 (0x54E0923782b701044444De5d8c3A45aC890b0881)
+ +++ description: One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.
+```
+
+```diff
++ Status: CREATED
+ contract MasterMinter (0x8aFf09e2259cacbF4Fc4e3E53F3bf799EfEEab36)
+ +++ description: None
+```
+
+```diff
++ Status: CREATED
+ contract FiatTokenV2_2 (0xaf88d065e77c8cC2239327C5EDb3A432268e5831)
+ +++ description: None
+```
+
+```diff
++ Status: CREATED
+ contract OneStepProofEntry (0xD89d54007079071cBA859127318b9F34eeB78049)
+ +++ description: One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.
+```
+
+```diff
++ Status: CREATED
+ contract OneStepProverMath (0xE58a2dEb5718F9aAF2C1DdD0E366ED076D204cc4)
+ +++ description: One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.
+```
+
+```diff
++ Status: CREATED
+ contract OneStepProverMemory (0xf8E5e5562c2c12d8690786f5C9FA65F20F6bD881)
+ +++ description: One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.
+```
+
+## Source code changes
+
+```diff
+.../ChallengeManager/ChallengeManager.sol | 404 ++--
+ .../.flat/FiatTokenV2_2/FiatTokenProxy.p.sol | 417 ++++
+ .../arbitrum/.flat/FiatTokenV2_2/FiatTokenV2_2.sol | 2357 ++++++++++++++++++++
+ .../xai/arbitrum/.flat/MasterMinter.sol | 454 ++++
+ .../NodeLicenseRegistry/NodeLicense9.sol} | 715 ++++--
+ .../OneStepProofEntry.sol | 485 +++-
+ .../{.flat@282642841 => .flat}/OneStepProver0.sol | 765 +++++--
+ .../OneStepProverHostIo.sol | 892 ++++++--
+ .../OneStepProverMath.sol | 65 +-
+ .../OneStepProverMemory.sol | 315 ++-
+ .../PoolFactory/PoolFactory2.sol} | 816 +++++--
+ .../RefereeCalculations/RefereeCalculations.sol | 41 +
+ .../RollupProxy/RollupAdminLogic.1.sol | 370 +--
+ .../RollupProxy/RollupUserLogic.2.sol | 415 ++--
+ .../SentryReferee/Referee10.sol} | 671 ++++--
+ 15 files changed, 7659 insertions(+), 1523 deletions(-)
+```
+
+## Config/verification related changes
+
+Following changes come from updates made to the config file,
+or/and contracts becoming verified, not from differences found during
+discovery. Values are for block 282642841 (main branch discovery), not current.
+
+```diff
+ contract NodeLicenseRegistry (0xbc14d8563b248B79689ECbc43bBa53290e0b6b66) {
+ +++ description: This is the contract where Xai Sentry Keys for running a sentry node are minted.
+ description:
+- "This is the contract where Xai Sentry Keys to run a node are minted."
++ "This is the contract where Xai Sentry Keys for running a sentry node are minted."
+ }
+```
+
Generated with discovered.json: 0x7066c482913892a0d5497dd83af41388af955677
# Diff at Sun, 08 Dec 2024 13:29:13 GMT:
diff --git a/packages/backend/discovery/xai/arbitrum/discovered.json b/packages/backend/discovery/xai/arbitrum/discovered.json
index 6c1e05d80a1..b891c162008 100644
--- a/packages/backend/discovery/xai/arbitrum/discovered.json
+++ b/packages/backend/discovery/xai/arbitrum/discovered.json
@@ -1,8 +1,8 @@
{
"name": "xai",
"chain": "arbitrum",
- "blockNumber": 282642841,
- "configHash": "0x9bc9308a46649854266250f47cda29645a652cc58448278ff19c85af46e5e426",
+ "blockNumber": 286040164,
+ "configHash": "0x30b22622a6e6adfadbf06ee4737ec595941a90d416befc5a480876497b77ed59",
"contracts": [
{
"name": "XaiMultisig2",
@@ -125,7 +125,7 @@
{
"permission": "configure",
"target": "0xC47DacFbAa80Bd9D8112F4e8069482c2A3221336",
- "description": "Pause and unpause and set important roles and parameters in the system contracts: Can delegate Sequencer management to a BatchPosterManager address, manage data availability and DACs, set the Sequencer-only window, introduce an allowList to the bridge and whitelist Inboxes/Outboxes."
+ "description": "Pause and unpause and set important roles and parameters in the system contracts: Can delegate Sequencer management to a BatchPosterManager address, manage data availability, DACs and the fastConfirmer role, set the Sequencer-only window, introduce an allowList to the bridge and whitelist Inboxes/Outboxes."
},
{
"permission": "upgrade",
@@ -262,6 +262,17 @@
"whitelist": "0x0000000000000000000000000000000000000000"
}
},
+ {
+ "name": "OneStepProverHostIo",
+ "address": "0x33c1514Bf90e202d242C299b37C60f908aa206D4",
+ "template": "orbitstack/OneStepProverHostIo",
+ "sourceHashes": [
+ "0x2e969e0e83aea53307795f6826413e39bb416a64bc6da18f3a339ffeef444d32"
+ ],
+ "description": "One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.",
+ "sinceTimestamp": 1724148192,
+ "values": { "$immutable": true }
+ },
{
"name": "ERC20RollupEventInbox",
"address": "0x36aDe24988E4C47602e38BD9a0Bd89031eF807a8",
@@ -311,7 +322,7 @@
"template": "orbitstack/ChallengeManager",
"sourceHashes": [
"0xa7e3f6c355703ed46fcb2156862c4f01792b87beb10a87a81ce3bd5beee79b67",
- "0x58a6261c83c2766f749641902ad6fdb695ea189d2747f073b57a8f35b9a547e5"
+ "0x1a095768302d7d1c3d02375eaa3341833b4f1aaac707e1c608bce478c87cbf27"
],
"proxyType": "EIP1967 proxy",
"description": "Contract that allows challenging state roots. Can be called through the RollupProxy by Validators or the UpgradeExecutor.",
@@ -334,7 +345,7 @@
"sinceTimestamp": 1704309371,
"values": {
"$admin": "0x041F85dD87c46B941dc9b15c6628B19ee5358485",
- "$implementation": "0x5cA988F213EfbCB86ED7e2AACB0C15c91e648f8d",
+ "$implementation": "0x5AA806015FEC88669bF7DAd746BB4ADC1E79BcED",
"$pastUpgrades": [
[
"2024-01-03T19:16:11.000Z",
@@ -345,11 +356,16 @@
"2024-08-20T17:31:00.000Z",
"0x6c1bbf992f2fe7d5bb565a16a55f85bda8e565c4b26cb742a6f841ca8a5d9f80",
["0x5cA988F213EfbCB86ED7e2AACB0C15c91e648f8d"]
+ ],
+ [
+ "2024-12-16T20:39:05.000Z",
+ "0x1621d4d8758255b5b5ac8feb35fd9358c768eb27f61784ff0db9dbb54a6e268f",
+ ["0x5AA806015FEC88669bF7DAd746BB4ADC1E79BcED"]
]
],
- "$upgradeCount": 2,
+ "$upgradeCount": 3,
"bridge": "0x7dd8A76bdAeBE3BBBaCD7Aa87f1D4FDa1E60f94f",
- "osp": "0xb20107bfB36D3B5AcA534aCAfbd8857b10b402a8",
+ "osp": "0xD89d54007079071cBA859127318b9F34eeB78049",
"resultReceiver": "0xC47DacFbAa80Bd9D8112F4e8069482c2A3221336",
"sequencerInbox": "0x995a9d3ca121D48d21087eDE20bc8acb2398c8B1",
"totalChallengesCreated": 0
@@ -368,7 +384,7 @@
{
"permission": "configure",
"target": "0xC47DacFbAa80Bd9D8112F4e8069482c2A3221336",
- "description": "Pause and unpause and set important roles and parameters in the system contracts: Can delegate Sequencer management to a BatchPosterManager address, manage data availability and DACs, set the Sequencer-only window, introduce an allowList to the bridge and whitelist Inboxes/Outboxes.",
+ "description": "Pause and unpause and set important roles and parameters in the system contracts: Can delegate Sequencer management to a BatchPosterManager address, manage data availability, DACs and the fastConfirmer role, set the Sequencer-only window, introduce an allowList to the bridge and whitelist Inboxes/Outboxes.",
"via": [{ "address": "0x0EE7AD3Cc291343C9952fFd8844e86d294fa513F" }]
},
{
@@ -472,20 +488,20 @@
"getChainId": 42161,
"GnosisSafe_modules": [],
"multisigThreshold": "3 of 5 (60%)",
- "nonce": 7,
+ "nonce": 8,
"VERSION": "1.3.0"
},
"derivedName": "GnosisSafeL2"
},
{
- "name": "OneStepProverMemory",
- "address": "0x526a6E634aD36bB0007c4422586c135F1F9B525a",
- "template": "orbitstack/OneStepProverMemory",
+ "name": "OneStepProver0",
+ "address": "0x54E0923782b701044444De5d8c3A45aC890b0881",
+ "template": "orbitstack/OneStepProver0",
"sourceHashes": [
- "0x731b4466319a83c95ce227d1a6c85aa03864f5d2bed03bda186843033a8b8d61"
+ "0x642d283934aef1189cf62e1bcd34a5081762b33fdd3ec8e823f304f874e48748"
],
"description": "One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.",
- "sinceTimestamp": 1710434327,
+ "sinceTimestamp": 1724148167,
"values": { "$immutable": true }
},
{
@@ -589,24 +605,26 @@
"0x36aDe24988E4C47602e38BD9a0Bd89031eF807a8"
],
"allowedOutboxList": ["0x1E400568AD4840dbE50FB32f306B842e9ddeF726"],
- "delayedMessageCount": 90836,
+ "delayedMessageCount": 90876,
"nativeToken": "0x4Cb9a7AE498CEDcBb5EAe9f25736aE7d428C9D66",
"rollup": "0xC47DacFbAa80Bd9D8112F4e8069482c2A3221336",
"sequencerInbox": "0x995a9d3ca121D48d21087eDE20bc8acb2398c8B1",
- "sequencerMessageCount": 125640,
- "sequencerReportedSubMessageCount": 63837956
+ "sequencerMessageCount": 130640,
+ "sequencerReportedSubMessageCount": 66116914
}
},
{
- "name": "OneStepProver0",
- "address": "0x800dA62bE6626127F71B34E795286C34C04D6712",
- "template": "orbitstack/OneStepProver0",
+ "name": "MasterMinter",
+ "address": "0x8aFf09e2259cacbF4Fc4e3E53F3bf799EfEEab36",
"sourceHashes": [
- "0x20330713abbbcf0219ef7d1c0aa3a6ede1b421f14c9d21b25c973e54fb75f5df"
+ "0xf49a07669c94c3b5ba913378cfa842a379d9d3f4456a1070979d52d7f9d69c87"
],
- "description": "One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.",
- "sinceTimestamp": 1710434319,
- "values": { "$immutable": true }
+ "sinceTimestamp": 1667248939,
+ "values": {
+ "$immutable": true,
+ "getMinterManager": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
+ "owner": "0xEdC4ed529B990DD4fFB9Ed47b6c3e385A9dcdd0A"
+ }
},
{
"name": "GasSubsidy",
@@ -726,7 +744,7 @@
]
],
"$upgradeCount": 2,
- "batchCount": 125640,
+ "batchCount": 130640,
"batchPosterManager": "0x000d8C5A70B8805DF02f409F2715d05B9A63E871",
"batchPosters": ["0x7F68dba68E72a250004812fe04F1123Fca89aBa9"],
"bridge": "0x7dd8A76bdAeBE3BBBaCD7Aa87f1D4FDa1E60f94f",
@@ -762,7 +780,7 @@
"rollup": "0xC47DacFbAa80Bd9D8112F4e8069482c2A3221336",
"sequencerVersion": "0x88",
"setIsBatchPosterCount": 1,
- "totalDelayedMessagesRead": 90836,
+ "totalDelayedMessagesRead": 90876,
"TREE_DAS_MESSAGE_HEADER_FLAG": "0x08",
"ZERO_HEAVY_MESSAGE_HEADER_FLAG": "0x20"
},
@@ -820,20 +838,52 @@
}
},
{
- "name": "OneStepProofEntry",
- "address": "0xb20107bfB36D3B5AcA534aCAfbd8857b10b402a8",
- "template": "orbitstack/OneStepProofEntry",
+ "name": "FiatTokenV2_2",
+ "address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
"sourceHashes": [
- "0xf3479c667d20b1c17ea2573dc7fe09e4315a3e20bc09d31bc92603520cc962cc"
+ "0x3e6aa5a9e907eadff9fe4df338a8f629966b60307fbbe5956fb9886d74822fd1",
+ "0xacd76117eb21f736961ade180c25f63d796bc2e83f43b82ee3ff585bb34ce6ed"
],
- "description": "One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.",
- "sinceTimestamp": 1710434350,
+ "proxyType": "ZeppelinOS proxy",
+ "issuedPermissions": [
+ {
+ "permission": "upgrade",
+ "target": "0x2E0A67588cfBCAD40f9e4DD76052436190A77a68",
+ "via": []
+ }
+ ],
+ "sinceTimestamp": 1667248932,
"values": {
- "$immutable": true,
- "prover0": "0x800dA62bE6626127F71B34E795286C34C04D6712",
- "proverHostIo": "0xc555b2F1D559Fbb854569b33640990D178F94747",
- "proverMath": "0xe8709022B9C9D7347856c75910fe07e10C904446",
- "proverMem": "0x526a6E634aD36bB0007c4422586c135F1F9B525a"
+ "$admin": "0x2E0A67588cfBCAD40f9e4DD76052436190A77a68",
+ "$immutable": false,
+ "$implementation": "0x86E721b43d4ECFa71119Dd38c0f938A75Fdb57B3",
+ "$pastUpgrades": [
+ [
+ "2023-12-13T17:32:40.000Z",
+ "0x3cc9b4d7d8270ac6593bb909fed64cc6f8382b029c3a8ef9e8257d2d8cd86c86",
+ ["0x86E721b43d4ECFa71119Dd38c0f938A75Fdb57B3"]
+ ]
+ ],
+ "$upgradeCount": 1,
+ "admin": "0x2E0A67588cfBCAD40f9e4DD76052436190A77a68",
+ "blacklister": "0x13F2A44FaD26c2cc25d3e3b869364142ce5995Bb",
+ "CANCEL_AUTHORIZATION_TYPEHASH": "0x158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429",
+ "currency": "USD",
+ "decimals": 6,
+ "DOMAIN_SEPARATOR": "0x08d11903f8419e68b1b8721bcbe2e9fc68569122a77ef18c216f10b3b5112c78",
+ "implementation": "0x86E721b43d4ECFa71119Dd38c0f938A75Fdb57B3",
+ "masterMinter": "0x8aFf09e2259cacbF4Fc4e3E53F3bf799EfEEab36",
+ "name": "USD Coin",
+ "owner": "0xc7a599037fDa4Ff8029df9a042Af6053d061ebc9",
+ "paused": false,
+ "pauser": "0x36e3b4db327d9e66F5aE5A0200DCdbEF0D2E240B",
+ "PERMIT_TYPEHASH": "0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9",
+ "RECEIVE_WITH_AUTHORIZATION_TYPEHASH": "0xd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de8",
+ "rescuer": "0x0000000000000000000000000000000000000000",
+ "symbol": "USDC",
+ "totalSupply": 3294319872676284,
+ "TRANSFER_WITH_AUTHORIZATION_TYPEHASH": "0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267",
+ "version": "2"
}
},
{
@@ -888,10 +938,10 @@
"address": "0xbc14d8563b248B79689ECbc43bBa53290e0b6b66",
"sourceHashes": [
"0x36a2777510f3b20063560bdcb7f657da283bcfdc484a19b0a0f77d18f6a8b5e1",
- "0xc408ffd6d9b25f5dccbe9efa0caca71b711c95f903420227c41605fc4672a46c"
+ "0xa5bceee1502b9b30ff5e8cf1acb16d0196637dd53d375860c3bec1fae2701c7f"
],
"proxyType": "EIP1967 proxy",
- "description": "This is the contract where Xai Sentry Keys to run a node are minted.",
+ "description": "This is the contract where Xai Sentry Keys for running a sentry node are minted.",
"issuedPermissions": [
{
"permission": "upgrade",
@@ -908,7 +958,7 @@
"sinceTimestamp": 1701801243,
"values": {
"$admin": "0xD88c8E0aE21beA6adE41A41130Bb4cd43e6b1723",
- "$implementation": "0xE6E5356423516C9b75d4Dfb1fCa3973c5B695be8",
+ "$implementation": "0xe72b004FCa3A05251c6C8d1BF1482B9308876c7f",
"$pastUpgrades": [
[
"2023-12-05T18:34:03.000Z",
@@ -954,30 +1004,54 @@
"2024-12-06T17:52:34.000Z",
"0x394e784074ba95b55fdcea26980e75c894d6fe1295153b97cdb456d010c2a3a0",
["0xE6E5356423516C9b75d4Dfb1fCa3973c5B695be8"]
+ ],
+ [
+ "2024-12-10T15:27:38.000Z",
+ "0x2b7d573f6a4f5b1d188483697b9767e34ea3e2dcf6e534785bb2b764a4de2428",
+ ["0xC6BccA5297Cd4511250E2D3241bEd586631E2aA0"]
+ ],
+ [
+ "2024-12-13T01:28:49.000Z",
+ "0x2076fd7a582c2de1357c834161c5e856568af154e7101ede7f363eab012df090",
+ ["0x14e6e53dc0E4d0d02644a96F4bC1798A7876db49"]
+ ],
+ [
+ "2024-12-14T01:58:28.000Z",
+ "0x243eb3ec2ccf3d1d472d5a49df0f738f93262df905c8868a72dc4066546b4a2c",
+ ["0xe72b004FCa3A05251c6C8d1BF1482B9308876c7f"]
]
],
- "$upgradeCount": 9,
+ "$upgradeCount": 12,
+ "ADMIN_MINT_ROLE": "0x507caaa5b2a5a027bc340a5334d9220583b7d60d846ee2aabc76e37d69a7253b",
+ "AIRDROP_ADMIN_ROLE": "0x786fcfa0099ab9aba15d4b2ccc7ffa9994e7c522c9b340b95e584749e47fcfb9",
"claimable": true,
"DEFAULT_ADMIN_ROLE": "0x0000000000000000000000000000000000000000000000000000000000000000",
+ "esXaiAddress": "0x4C749d097832DE2FEcc989ce18fDc5f1BD76700c",
"fundsReceiver": "0xFCF7248C495d6fd3641eE43F861c48Ebe402c878",
"getPricingTiersLength": 40,
- "maxSupply": 50000,
+ "maxSupply": 5000000,
+ "mintingPaused": false,
"name": "Sentry Node License",
+ "refereeAddress": "0xfD41041180571C5D371BEA3D9550E55653671198",
+ "refereeCalculationsAddress": "0xCd62360854aecf6285Fa310D69C5EBaf4Cd5e95F",
"referralDiscountPercentage": 5,
"referralRewardPercentage": 15,
"symbol": "SNL",
- "totalSupply": 35180
+ "totalSupply": 3579858,
+ "TRANSFER_ROLE": "0x8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c",
+ "usdcAddress": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
+ "xaiAddress": "0x4Cb9a7AE498CEDcBb5EAe9f25736aE7d428C9D66"
},
- "derivedName": "NodeLicense7"
+ "derivedName": "NodeLicense9"
},
{
"name": "RollupProxy",
"address": "0xC47DacFbAa80Bd9D8112F4e8069482c2A3221336",
- "template": "orbitstack/RollupProxy",
+ "template": "orbitstack/RollupProxy_fastConfirm",
"sourceHashes": [
"0xb8da0b3748daac768860783e8555198fd2d1bbdffb775b81557a7124890c7eca",
- "0x8b48118fe606012c0dcac2ccc1821785935aec89fab8f219f47b32c482b0017e",
- "0xef94a66bd5339efd18fb9ca1f8031482e7ef7bbe6c5a0a10fae254ab83712406"
+ "0x9349e73cbc2d2b818c1d79711574ba210b56249d8d3845bc78c776caf8f8ff42",
+ "0x7ee21b18b2e18c636bfafc08ff72692cc43302b2599ba75f0abad67282866dd5"
],
"proxyType": "Arbitrum proxy",
"description": "Central contract for the project's configuration like its execution logic hash (`wasmModuleRoot`) and addresses of the other system contracts. Entry point for Proposers creating new Rollup Nodes (state commitments) and Challengers submitting fraud proofs (In the Orbit stack, these two roles are both held by the Validators).",
@@ -989,7 +1063,7 @@
{
"address": "0x0EE7AD3Cc291343C9952fFd8844e86d294fa513F",
"delay": 0,
- "description": "Pause and unpause and set important roles and parameters in the system contracts: Can delegate Sequencer management to a BatchPosterManager address, manage data availability and DACs, set the Sequencer-only window, introduce an allowList to the bridge and whitelist Inboxes/Outboxes."
+ "description": "Pause and unpause and set important roles and parameters in the system contracts: Can delegate Sequencer management to a BatchPosterManager address, manage data availability, DACs and the fastConfirmer role, set the Sequencer-only window, introduce an allowList to the bridge and whitelist Inboxes/Outboxes."
}
]
},
@@ -1018,8 +1092,8 @@
"values": {
"$admin": "0x0EE7AD3Cc291343C9952fFd8844e86d294fa513F",
"$implementation": [
- "0xEe9E5546A11Cb5b4A86e92DA05f2ef75C26E4754",
- "0x0aE4dD666748bF0F6dB5c149Eab1D8aD27820A6A"
+ "0xdD91f6e88576fEc4A38A518DA39C92e13CBB6446",
+ "0x1BeD37FeDFE8B2721a69A559313D2b58d16Ecd77"
],
"$pastUpgrades": [
[
@@ -1029,10 +1103,19 @@
"0xEe9E5546A11Cb5b4A86e92DA05f2ef75C26E4754",
"0x0aE4dD666748bF0F6dB5c149Eab1D8aD27820A6A"
]
+ ],
+ [
+ "2024-12-16T20:39:05.000Z",
+ "0x1621d4d8758255b5b5ac8feb35fd9358c768eb27f61784ff0db9dbb54a6e268f",
+ [
+ "0xdD91f6e88576fEc4A38A518DA39C92e13CBB6446",
+ "0x1BeD37FeDFE8B2721a69A559313D2b58d16Ecd77"
+ ]
]
],
- "$upgradeCount": 1,
- "arbOsFromWmRoot": "ArbOS v20 wasmModuleRoot",
+ "$upgradeCount": 2,
+ "anyTrustFastConfirmer": "0x0000000000000000000000000000000000000000",
+ "arbOsFromWmRoot": "ArbOS v32 wasmModuleRoot",
"baseStake": "100000000000000000",
"bridge": "0x7dd8A76bdAeBE3BBBaCD7Aa87f1D4FDa1E60f94f",
"chainId": 660279,
@@ -1041,12 +1124,12 @@
"confirmPeriodBlocks": 45818,
"currentRequiredStake": "100000000000000000",
"extraChallengeTimeBlocks": 0,
- "firstUnresolvedNode": 7750,
+ "firstUnresolvedNode": 7986,
"inbox": "0xaE21fDA3de92dE2FDAF606233b2863782Ba046F9",
"isERC20Enabled": false,
"lastStakeBlock": 18944658,
- "latestConfirmed": 7749,
- "latestNodeCreated": 7901,
+ "latestConfirmed": 7985,
+ "latestNodeCreated": 8137,
"loserStakeEscrow": "0x0000000000000000000000000000000000000000",
"minimumAssertionPeriod": 75,
"outbox": "0x1E400568AD4840dbE50FB32f306B842e9ddeF726",
@@ -1064,7 +1147,7 @@
"validatorUtils": "0x6c21303F5986180B1394d2C89f3e883890E2867b",
"validatorWalletCreator": "0x2b0E04Dc90e3fA58165CB41E2834B44A56E766aF",
"validatorWhitelistDisabled": false,
- "wasmModuleRoot": "0x8b104a2e80ac6165dc58b9048de12f301d70b02a0ab51396c22b4b4b802a16a4",
+ "wasmModuleRoot": "0x184884e1eb9fefdc158f6c8ac912bb183bf3cf83f0090317e0bc4ac5860baa39",
"zombieAddress": [],
"zombieCount": 0,
"zombieLatestStakedNode": []
@@ -1118,23 +1201,12 @@
}
]
},
- {
- "name": "OneStepProverHostIo",
- "address": "0xc555b2F1D559Fbb854569b33640990D178F94747",
- "template": "orbitstack/OneStepProverHostIo",
- "sourceHashes": [
- "0x5b0a5e16100b7e163dcf39dc6a9034f12a7bad7a475cdffc73054b937be0683d"
- ],
- "description": "One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.",
- "sinceTimestamp": 1710434342,
- "values": { "$immutable": true }
- },
{
"name": "RefereeCalculations",
"address": "0xCd62360854aecf6285Fa310D69C5EBaf4Cd5e95F",
"sourceHashes": [
"0x36a2777510f3b20063560bdcb7f657da283bcfdc484a19b0a0f77d18f6a8b5e1",
- "0x84fc1ee0b022c330db75d04b71a06523524388e6db61a159b2bd3b5d02bccf28"
+ "0xc9c19fb4d016fe3bcc74ab045b2d6a2231e661f4d86cbb0cac0dc5d1301fb49a"
],
"proxyType": "EIP1967 proxy",
"issuedPermissions": [
@@ -1152,15 +1224,20 @@
"sinceTimestamp": 1730222058,
"values": {
"$admin": "0xD88c8E0aE21beA6adE41A41130Bb4cd43e6b1723",
- "$implementation": "0x5A195953555A11d2a4b654DCa3aE4f9f19eBC3E2",
+ "$implementation": "0x1488598b22Cc196Aa547894493BC2313a8A00C1e",
"$pastUpgrades": [
[
"2024-10-29T17:14:18.000Z",
"0x81688f6d7848854fecc257f024bf46b66d2019fdd75590e137b0f91db2f7089e",
["0x5A195953555A11d2a4b654DCa3aE4f9f19eBC3E2"]
+ ],
+ [
+ "2024-12-10T17:38:10.000Z",
+ "0x20e602e4c1899b6cb255bb9db60aebb18a0a89f0087ad8ffc50492d6e89302b7",
+ ["0x1488598b22Cc196Aa547894493BC2313a8A00C1e"]
]
],
- "$upgradeCount": 1,
+ "$upgradeCount": 2,
"DEFAULT_ADMIN_ROLE": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
},
@@ -1203,15 +1280,43 @@
"owner": "0x7C94E07bbf73518B0E25D1Be200a5b58F46F9dC7"
}
},
+ {
+ "name": "OneStepProofEntry",
+ "address": "0xD89d54007079071cBA859127318b9F34eeB78049",
+ "template": "orbitstack/OneStepProofEntry",
+ "sourceHashes": [
+ "0x96f85480073b58d0e985cd6c68956f4a52f5ed8b2ce751b18868e2e830be3678"
+ ],
+ "description": "One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.",
+ "sinceTimestamp": 1724148200,
+ "values": {
+ "$immutable": true,
+ "prover0": "0x54E0923782b701044444De5d8c3A45aC890b0881",
+ "proverHostIo": "0x33c1514Bf90e202d242C299b37C60f908aa206D4",
+ "proverMath": "0xE58a2dEb5718F9aAF2C1DdD0E366ED076D204cc4",
+ "proverMem": "0xf8E5e5562c2c12d8690786f5C9FA65F20F6bD881"
+ }
+ },
{
"name": "OneStepProverMath",
- "address": "0xe8709022B9C9D7347856c75910fe07e10C904446",
+ "address": "0xE58a2dEb5718F9aAF2C1DdD0E366ED076D204cc4",
"template": "orbitstack/OneStepProverMath",
"sourceHashes": [
- "0xb2555ede3dfe7d6df28bd96d12a0113b658c213c7ce4e34fa539df7497bc51a1"
+ "0x3de1ddc210fe283d7298c5f06879df577c6a475329a206b1928c74d10db656d5"
],
"description": "One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.",
- "sinceTimestamp": 1710434334,
+ "sinceTimestamp": 1724148184,
+ "values": { "$immutable": true }
+ },
+ {
+ "name": "OneStepProverMemory",
+ "address": "0xf8E5e5562c2c12d8690786f5C9FA65F20F6bD881",
+ "template": "orbitstack/OneStepProverMemory",
+ "sourceHashes": [
+ "0x3955092d1dbd80f0910d7782a25da1e3da45533c7890928a1c6c63cbf5def5bf"
+ ],
+ "description": "One of the modular contracts used for the last step of a fraud proof, which is simulated inside a WASM virtual machine.",
+ "sinceTimestamp": 1724148175,
"values": { "$immutable": true }
},
{
@@ -1219,7 +1324,7 @@
"address": "0xF9E08660223E2dbb1c0b28c82942aB6B5E38b8E5",
"sourceHashes": [
"0x36a2777510f3b20063560bdcb7f657da283bcfdc484a19b0a0f77d18f6a8b5e1",
- "0x317ab76b0d59c8c31385b5239fb1bdfff324c9629c5e8d74b82808349fbb169a"
+ "0x6b20ddf2a4ea9bb1615fb08c76f1f2f98b13ead97bc452a3840e59119c8abee1"
],
"proxyType": "EIP1967 proxy",
"description": "The PoolFactory allows creating and managing staking pools for V2 staking. Users can stake esXAI (and / or Sentry Keys) in pools. This contract's address is whitelisted in the esXAI token contract, which allows it to initiate arbitrary esXAI token transfers. V2 staking through this contract is currently set to true.",
@@ -1239,29 +1344,45 @@
"sinceTimestamp": 1712865940,
"values": {
"$admin": "0xD88c8E0aE21beA6adE41A41130Bb4cd43e6b1723",
- "$implementation": "0x21EEC6626f15d02A8896ebB7EDD68ff3CB61e89E",
+ "$implementation": "0x2095FE5CEDBE22Afc2174daC57cB6831954A560D",
"$pastUpgrades": [
[
"2024-04-11T20:05:40.000Z",
"0x36bec95cbfc75ccbf4d52c9bb080ebbbc2a9ecebffe7134574a4ea3bfdab8260",
["0x21EEC6626f15d02A8896ebB7EDD68ff3CB61e89E"]
+ ],
+ [
+ "2024-12-10T15:27:48.000Z",
+ "0x719feb67c546cad4f43b5e741590f7b2258e896049163656eccb2f598515adc4",
+ ["0x5bfd44421b5E0405F8cfcc17463522AF6b9e1Ab3"]
+ ],
+ [
+ "2024-12-13T00:36:48.000Z",
+ "0x869e99caece9b22a813fc83475c90e783b6ac2e37aa192780fcfb7491770e79d",
+ ["0xec287a91Ac0b72Ba7f249c08a2c64dA317eF9715"]
+ ],
+ [
+ "2024-12-13T16:24:54.000Z",
+ "0xf515093e32598c21145005613e2d1f385b8d902d4642aacb4e6caa0f799aee27",
+ ["0x2095FE5CEDBE22Afc2174daC57cB6831954A560D"]
]
],
- "$upgradeCount": 1,
+ "$upgradeCount": 4,
"bucketshareMaxValues": [100000, 950000, 850000],
"DEFAULT_ADMIN_ROLE": "0x0000000000000000000000000000000000000000000000000000000000000000",
"deployerAddress": "0x68D78D1E81379EfD9C61f8E9131D52CE571AF4fD",
"esXaiAddress": "0x4C749d097832DE2FEcc989ce18fDc5f1BD76700c",
- "getPoolsCount": 274,
+ "getPoolsCount": 278,
"nodeLicenseAddress": "0xbc14d8563b248B79689ECbc43bBa53290e0b6b66",
"refereeAddress": "0xfD41041180571C5D371BEA3D9550E55653671198",
+ "STAKE_KEYS_ADMIN_ROLE": "0x4744ee11e24f5fc5de82fa6dba03b134899d8fd3405c7e9a26e120c89c8d9c28",
"stakingEnabled": true,
"unstakeEsXaiDelayPeriod": 604800,
"unstakeGenesisKeyDelayPeriod": 5184000,
"unstakeKeysDelayPeriod": 604800,
"updateRewardBreakdownDelayPeriod": 1209600
},
- "derivedName": "PoolFactory"
+ "derivedName": "PoolFactory2"
},
{
"name": "XaiFundsReiceiverMultisig",
@@ -1292,7 +1413,7 @@
"getChainId": 42161,
"GnosisSafe_modules": [],
"multisigThreshold": "3 of 7 (43%)",
- "nonce": 58,
+ "nonce": 59,
"VERSION": "1.3.0"
},
"derivedName": "GnosisSafeL2"
@@ -1302,7 +1423,7 @@
"address": "0xfD41041180571C5D371BEA3D9550E55653671198",
"sourceHashes": [
"0x36a2777510f3b20063560bdcb7f657da283bcfdc484a19b0a0f77d18f6a8b5e1",
- "0x049618a11ae7ca2b4087908a6cb43e2102853e1798710e66a169be6fd6d4ed99"
+ "0xc8757a87d8b14b9a5c61b8130720860918aaa5843442a0b6bf6307c3a7353c32"
],
"proxyType": "EIP1967 proxy",
"description": "The referee contract manages the Xai Sentry protocol. Sentry nodes that are tasked to watch the state transitions on Xai receive esXAI rewards for their service. These watchers participate in a game with a central 'challenger' by posting their assertions to make sure they are actually watching. In case of a malicious state transition, sentries are supposed to raise an alarm offchain. The referee contract is also a whitelisted address in the esXAI token contract, which allows it to initiate arbitrary esXAI token transfers. New staking through this contract is disabled in favor of the new v2 staking. V1 Stakers can continue to get staking rewards here or withdraw/migrate their assets.",
@@ -1326,7 +1447,7 @@
"sinceTimestamp": 1701801226,
"values": {
"$admin": "0xD88c8E0aE21beA6adE41A41130Bb4cd43e6b1723",
- "$implementation": "0xfCa2657FC4456Ac256A78A31aAB1128F5e1d2D40",
+ "$implementation": "0x4F18941fE5bE7a54318989b2C42648914dCe47C4",
"$pastUpgrades": [
[
"2023-12-05T18:33:46.000Z",
@@ -1372,14 +1493,29 @@
"2024-10-29T18:27:08.000Z",
"0x526befebd96c284baeeb94980c3561d88cc1ba40fb12c1c8b8db78b29b18ce20",
["0xfCa2657FC4456Ac256A78A31aAB1128F5e1d2D40"]
+ ],
+ [
+ "2024-12-10T15:27:05.000Z",
+ "0x7de66eae5bdbc8b25d8c61bc496b8022ca928b709de3dd72e7de1951fab33ecd",
+ ["0x119B21e962B6C5e57340a3CCeCFC3a90385A70dC"]
+ ],
+ [
+ "2024-12-13T00:36:38.000Z",
+ "0x58b76b23b8bb0f3ba0bf4d2807f545b1838c527e3a71d18fe2369ee7bf6c12ca",
+ ["0x1f122B41D6740F5dE2Df93b8b00013e84227955e"]
+ ],
+ [
+ "2024-12-15T00:07:08.000Z",
+ "0xd4a4e9be6cfdbb76dec68088cfa15e609b8d3356755c15de6e411c9034963c63",
+ ["0x4F18941fE5bE7a54318989b2C42648914dCe47C4"]
]
],
- "$upgradeCount": 9,
+ "$upgradeCount": 12,
"calculateChallengeEmissionAndTier": [
"35673515981735159817351",
"625000000000000000000000000"
],
- "challengeCounter": 8642,
+ "challengeCounter": 8877,
"CHALLENGER_ROLE": "0xe752add323323eb13e36c71ee508dfd16d74e9e4c4fd78786ba97989e5e13818",
"challengerPublicKey": "0x977f9fe1d570ba7e48ea76566718023b260ed56eba368ff20dca06e99e650804126663c1a5febdb065ef139a0156a9ad",
"DEFAULT_ADMIN_ROLE": "0x0000000000000000000000000000000000000000000000000000000000000000",
@@ -1388,8 +1524,8 @@
"getKycWalletCount": 6561,
"isCheckingAssertions": true,
"KYC_ADMIN_ROLE": "0x811427a0fa4932aef534bba16bc34e9b7b2d7d2a79c475fca1765f6cc1faebea",
- "maxKeysPerPool": 1000,
- "maxStakeAmountPerLicense": "20000000000000000000000",
+ "maxKeysPerPool": 100000,
+ "maxStakeAmountPerLicense": "200000000000000000000",
"nodeLicenseAddress": "0xbc14d8563b248B79689ECbc43bBa53290e0b6b66",
"poolFactoryAddress": "0xF9E08660223E2dbb1c0b28c82942aB6B5E38b8E5",
"refereeCalculationsAddress": "0xCd62360854aecf6285Fa310D69C5EBaf4Cd5e95F",
@@ -1404,13 +1540,23 @@
"stakingEnabled": true,
"xaiAddress": "0x4Cb9a7AE498CEDcBb5EAe9f25736aE7d428C9D66"
},
- "derivedName": "Referee9"
+ "derivedName": "Referee10"
}
],
"eoas": [
- { "address": "0x0000000000000000000000000000000000000000" },
+ {
+ "address": "0x0000000000000000000000000000000000000000",
+ "directlyReceivedPermissions": [
+ {
+ "permission": "fastconfirm",
+ "target": "0xC47DacFbAa80Bd9D8112F4e8069482c2A3221336",
+ "description": "Can finalize a state root before the challenge period has passed. This allows withdrawing from the bridge based on the state root."
+ }
+ ]
+ },
{ "address": "0x08a361fE449b1371cC21b286d88F69eF6d205809" },
{ "address": "0x0c71417917D24F4A6A6A55559B98c5cCEcb33F7a" },
+ { "address": "0x13F2A44FaD26c2cc25d3e3b869364142ce5995Bb" },
{ "address": "0x1f097F3f928415cD28e1B2cC6f0F3960f4fCa6fc" },
{
"address": "0x25EA41f0bDa921a0eBf48291961B1F10b59BC6b8",
@@ -1433,6 +1579,16 @@
}
]
},
+ {
+ "address": "0x2E0A67588cfBCAD40f9e4DD76052436190A77a68",
+ "receivedPermissions": [
+ {
+ "permission": "upgrade",
+ "target": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831"
+ }
+ ]
+ },
+ { "address": "0x36e3b4db327d9e66F5aE5A0200DCdbEF0D2E240B" },
{
"address": "0x7C94E07bbf73518B0E25D1Be200a5b58F46F9dC7",
"receivedPermissions": [
@@ -1511,11 +1667,13 @@
}
]
},
+ { "address": "0xc7a599037fDa4Ff8029df9a042Af6053d061ebc9" },
{ "address": "0xd096e8dE90D34de758B0E0bA4a796eA2e1e272cF" },
{ "address": "0xd427165292B2E39cdac102eD963B14fFBACc964a" },
{ "address": "0xd4318D959B46d555143f56E03077028aB94D85d2" },
{ "address": "0xD766Abf27CEc67393FF475f7fE969902f5D0A80A" },
{ "address": "0xE529a3271f9CC84B1FE9107ab4764a8dF177782a" },
+ { "address": "0xEdC4ed529B990DD4fFB9Ed47b6c3e385A9dcdd0A" },
{ "address": "0xfc6F0d26f817Bd31AeD0e8922575d1fb8bD7A894" }
],
"abis": {
@@ -1533,7 +1691,50 @@
"function upgrade(address proxy, address implementation)",
"function upgradeAndCall(address proxy, address implementation, bytes data) payable"
],
- "0x0aE4dD666748bF0F6dB5c149Eab1D8aD27820A6A": [
+ "0x0EE7AD3Cc291343C9952fFd8844e86d294fa513F": [
+ "constructor(address _logic, address admin_, bytes _data) payable",
+ "event AdminChanged(address previousAdmin, address newAdmin)",
+ "event BeaconUpgraded(address indexed beacon)",
+ "event Upgraded(address indexed implementation)",
+ "function admin() returns (address admin_)",
+ "function changeAdmin(address newAdmin)",
+ "function implementation() returns (address implementation_)",
+ "function upgradeTo(address newImplementation)",
+ "function upgradeToAndCall(address newImplementation, bytes data) payable"
+ ],
+ "0x1488598b22Cc196Aa547894493BC2313a8A00C1e": [
+ "event Initialized(uint8 version)",
+ "event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)",
+ "event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)",
+ "event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)",
+ "function DEFAULT_ADMIN_ROLE() view returns (bytes32)",
+ "function calculateChallengeEmissionAndTier(uint256 totalSupply, uint256 maxSupply, uint256 challengeStart, uint256 challengeEnd) pure returns (uint256, uint256)",
+ "function getConfirmDataMultipleAssertions(uint64[] _assertionIds, address rollupAddress) view returns (bytes32[] confirmData, bytes32 confirmHash)",
+ "function getRoleAdmin(bytes32 role) view returns (bytes32)",
+ "function getWinningKeyCount(uint256 _keyCount, uint256 _boostFactor, address _bulkAddress, uint256 _challengeId, bytes _confirmData, bytes _challengerSignedHash) pure returns (uint256 winningKeyCount)",
+ "function grantRole(bytes32 role, address account)",
+ "function hasRole(bytes32 role, address account) view returns (bool)",
+ "function initialize()",
+ "function renounceRole(bytes32 role, address account)",
+ "function revokeRole(bytes32 role, address account)",
+ "function supportsInterface(bytes4 interfaceId) view returns (bool)",
+ "function validateAndConvertAddress(string _address) pure returns (address)"
+ ],
+ "0x18FD37A4FB9E1F06d9383958aFd236771F15A8cb": [
+ "constructor()",
+ "error AlreadyInit()",
+ "error HadZeroInit()",
+ "error NotOwner(address sender, address owner)",
+ "error RollupNotChanged()",
+ "event InboxMessageDelivered(uint256 indexed messageNum, bytes data)",
+ "event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum)",
+ "function bridge() view returns (address)",
+ "function initialize(address _bridge)",
+ "function rollup() view returns (address)",
+ "function rollupInitialized(uint256 chainId, string chainConfig)",
+ "function updateRollupAddress()"
+ ],
+ "0x1BeD37FeDFE8B2721a69A559313D2b58d16Ecd77": [
"event AdminChanged(address previousAdmin, address newAdmin)",
"event BeaconUpgraded(address indexed beacon)",
"event NodeConfirmed(uint64 indexed nodeNum, bytes32 blockHash, bytes32 sendRoot)",
@@ -1551,6 +1752,7 @@
"function _stakerMap(address) view returns (uint256 amountStaked, uint64 index, uint64 latestStakedNode, uint64 currentChallenge, bool isStaked)",
"function addToDeposit(address stakerAddress) payable",
"function amountStaked(address staker) view returns (uint256)",
+ "function anyTrustFastConfirmer() view returns (address)",
"function baseStake() view returns (uint256)",
"function bridge() view returns (address)",
"function chainId() view returns (uint256)",
@@ -1564,6 +1766,7 @@
"function currentChallenge(address staker) view returns (uint64)",
"function currentRequiredStake() view returns (uint256)",
"function extraChallengeTimeBlocks() view returns (uint64)",
+ "function fastConfirmNextNode(bytes32 blockHash, bytes32 sendRoot, bytes32 nodeHash)",
"function firstUnresolvedNode() view returns (uint64)",
"function getNode(uint64 nodeNum) view returns (tuple(bytes32 stateHash, bytes32 challengeHash, bytes32 confirmData, uint64 prevNum, uint64 deadlineBlock, uint64 noChildConfirmedBeforeBlock, uint64 stakerCount, uint64 childStakerCount, uint64 firstChildBlock, uint64 latestChildNumber, uint64 createdAtBlock, bytes32 nodeHash))",
"function getNodeCreationBlockForLogLookup(uint64 nodeNum) view returns (uint256)",
@@ -1617,31 +1820,6 @@
"function zombieCount() view returns (uint256)",
"function zombieLatestStakedNode(uint256 zombieNum) view returns (uint64)"
],
- "0x0EE7AD3Cc291343C9952fFd8844e86d294fa513F": [
- "constructor(address _logic, address admin_, bytes _data) payable",
- "event AdminChanged(address previousAdmin, address newAdmin)",
- "event BeaconUpgraded(address indexed beacon)",
- "event Upgraded(address indexed implementation)",
- "function admin() returns (address admin_)",
- "function changeAdmin(address newAdmin)",
- "function implementation() returns (address implementation_)",
- "function upgradeTo(address newImplementation)",
- "function upgradeToAndCall(address newImplementation, bytes data) payable"
- ],
- "0x18FD37A4FB9E1F06d9383958aFd236771F15A8cb": [
- "constructor()",
- "error AlreadyInit()",
- "error HadZeroInit()",
- "error NotOwner(address sender, address owner)",
- "error RollupNotChanged()",
- "event InboxMessageDelivered(uint256 indexed messageNum, bytes data)",
- "event InboxMessageDeliveredFromOrigin(uint256 indexed messageNum)",
- "function bridge() view returns (address)",
- "function initialize(address _bridge)",
- "function rollup() view returns (address)",
- "function rollupInitialized(uint256 chainId, string chainConfig)",
- "function updateRollupAddress()"
- ],
"0x1E400568AD4840dbE50FB32f306B842e9ddeF726": [
"constructor(address _logic, address admin_, bytes _data) payable",
"event AdminChanged(address previousAdmin, address newAdmin)",
@@ -1653,27 +1831,34 @@
"function upgradeTo(address newImplementation)",
"function upgradeToAndCall(address newImplementation, bytes data) payable"
],
- "0x21EEC6626f15d02A8896ebB7EDD68ff3CB61e89E": [
+ "0x2095FE5CEDBE22Afc2174daC57cB6831954A560D": [
"event ClaimFromPool(address indexed user, address indexed pool)",
"event Initialized(uint8 version)",
"event PoolCreated(uint256 indexed poolIndex, address indexed poolAddress, address indexed poolOwner, uint256 stakedKeyCount)",
+ "event PoolCreatedV2(uint256 indexed poolIndex, address indexed poolAddress, address indexed poolOwner, uint256 stakedKeyCount, address delegateAddress, uint256[] keyIds, uint32[3] shareConfig, string[3] poolMetadata, string[] poolSocials)",
"event PoolProxyDeployerUpdated(address oldDeployer, address newDeployer)",
"event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)",
"event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)",
"event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)",
"event StakeEsXai(address indexed user, address indexed pool, uint256 amount, uint256 totalUserEsXaiStaked, uint256 totalEsXaiStaked)",
"event StakeKeys(address indexed user, address indexed pool, uint256 amount, uint256 totalUserKeysStaked, uint256 totalKeysStaked)",
+ "event StakeKeysV2(address indexed user, address indexed pool, uint256 amount, uint256 totalUserKeysStaked, uint256 totalKeysStaked, uint256[] keyIds)",
"event StakingEnabled()",
"event UnstakeEsXai(address indexed user, address indexed pool, uint256 amount, uint256 totalUserEsXaiStaked, uint256 totalEsXaiStaked)",
+ "event UnstakeEsXaiV2(address indexed user, address indexed pool, uint256 amount, uint256 totalUserEsXaiStaked, uint256 totalEsXaiStaked, uint256 requestIndex)",
"event UnstakeKeys(address indexed user, address indexed pool, uint256 amount, uint256 totalUserKeysStaked, uint256 totalKeysStaked)",
+ "event UnstakeKeysV2(address indexed user, address indexed pool, uint256 amount, uint256 totalUserKeysStaked, uint256 totalKeysStaked, uint256 requestIndex, uint256[] keyIds)",
"event UnstakeRequestStarted(address indexed user, address indexed pool, uint256 indexed index, uint256 amount, bool isKey)",
"event UpdateDelayPeriods()",
"event UpdateMetadata(address indexed pool)",
+ "event UpdateMetadataV2(address indexed pool, string[3] poolMetadata, string[] poolSocials)",
"event UpdatePoolDelegate(address indexed delegate, address indexed pool)",
"event UpdateShares(address indexed pool)",
+ "event UpdateSharesV2(address indexed pool, uint32[3] shareConfig)",
"function DEFAULT_ADMIN_ROLE() view returns (bytes32)",
+ "function STAKE_KEYS_ADMIN_ROLE() view returns (bytes32)",
"function bucketshareMaxValues(uint256) view returns (uint32)",
- "function checkKeysAreStaked(uint256[] keyIds) view returns (bool[] isStaked)",
+ "function calculateUserTotalStake(address[] users)",
"function claimFromPools(address[] pools)",
"function createPool(address _delegateOwner, uint256[] _keyIds, uint32[3] _shareConfig, string[3] _poolMetadata, string[] _poolSocials, string[2][2] trackerDetails)",
"function createUnstakeEsXaiRequest(address pool, uint256 amount)",
@@ -1682,6 +1867,7 @@
"function deployerAddress() view returns (address)",
"function enableStaking()",
"function esXaiAddress() view returns (address)",
+ "function failedKyc(address) view returns (bool)",
"function getDelegatePools(address delegate) view returns (address[])",
"function getPoolAddress(uint256 poolIndex) view returns (address)",
"function getPoolAddressOfUser(address user, uint256 index) view returns (address)",
@@ -1691,10 +1877,10 @@
"function getRoleAdmin(bytes32 role) view returns (bytes32)",
"function getRoleMember(bytes32 role, uint256 index) view returns (address)",
"function getRoleMemberCount(bytes32 role) view returns (uint256)",
- "function getUnstakedKeyIdsFromUser(address user, uint16 offset, uint16 pageLimit) view returns (uint256[] unstakedKeyIds)",
+ "function getTotalesXaiStakedByUser(address user) view returns (uint256)",
"function grantRole(bytes32 role, address account)",
"function hasRole(bytes32 role, address account) view returns (bool)",
- "function initialize(address _refereeAddress, address _esXaiAddress, address _nodeLicenseAddress)",
+ "function initialize(address _stakeKeysAdmin)",
"function interactedPoolsOfUser(address, uint256) view returns (address)",
"function isDelegateOfPoolOrOwner(address delegate, address pool) view returns (bool)",
"function nodeLicenseAddress() view returns (address)",
@@ -1704,14 +1890,20 @@
"function refereeAddress() view returns (address)",
"function renounceRole(bytes32 role, address account)",
"function revokeRole(bytes32 role, address account)",
+ "function revokeStakeKeysAdminRole(address account)",
+ "function setFailedKyc(address user, bool failed)",
"function stakeEsXai(address pool, uint256 amount)",
"function stakeKeys(address pool, uint256[] keyIds)",
+ "function stakeKeys(address pool, uint256 keyAmount)",
+ "function stakeKeysAdmin(address pool, uint256 keyAmounts, address staker)",
"function stakingEnabled() view returns (bool)",
"function stakingPools(uint256) view returns (address)",
"function supportsInterface(bytes4 interfaceId) view returns (bool)",
+ "function totalEsXaiStakeCalculated(address) view returns (bool)",
"function unstakeEsXai(address pool, uint256 unstakeRequestIndex, uint256 amount)",
"function unstakeEsXaiDelayPeriod() view returns (uint256)",
"function unstakeGenesisKeyDelayPeriod() view returns (uint256)",
+ "function unstakeKeys(address pool, uint256 unstakeRequestIndex)",
"function unstakeKeys(address pool, uint256 unstakeRequestIndex, uint256[] keyIds)",
"function unstakeKeysDelayPeriod() view returns (uint256)",
"function updateDelayPeriods(uint256 _unstakeKeysDelayPeriod, uint256 _unstakeGenesisKeyDelayPeriod, uint256 _unstakeEsXaiDelayPeriod, uint256 _updateRewardBreakdownDelayPeriod)",
@@ -1720,7 +1912,8 @@
"function updatePoolProxyDeployer(address newDeployer)",
"function updateRewardBreakdownDelayPeriod() view returns (uint256)",
"function updateShares(address pool, uint32[3] _shareConfig)",
- "function userToInteractedPoolIds(address, address) view returns (uint256)"
+ "function userToInteractedPoolIds(address, address) view returns (uint256)",
+ "function validateSubmitPoolAssertion(address pool, address user) view returns (bool)"
],
"0x22CCA5Dc96a4Ac1EC32c9c7C5ad4D66254a24C35": [
"constructor(address _logic, address admin_, bytes _data) payable",
@@ -1808,6 +2001,9 @@
"function updateRollupAddress()",
"function updateSendRoot(bytes32 root, bytes32 l2BlockHash)"
],
+ "0x33c1514Bf90e202d242C299b37C60f908aa206D4": [
+ "function executeOneStep(tuple(uint256 maxInboxMessagesRead, address bridge) execCtx, tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) valueMultiStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) frameMultiStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 recoveryPc, bytes32 modulesRoot) startMach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, bytes32 extraHash, uint32 internalsOffset) startMod, tuple(uint16 opcode, uint256 argumentData) inst, bytes proof) view returns (tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) valueMultiStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) frameMultiStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 recoveryPc, bytes32 modulesRoot) mach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, bytes32 extraHash, uint32 internalsOffset) mod)"
+ ],
"0x36aDe24988E4C47602e38BD9a0Bd89031eF807a8": [
"constructor(address _logic, address admin_, bytes _data) payable",
"event AdminChanged(address previousAdmin, address newAdmin)",
@@ -1883,27 +2079,105 @@
"0x4972A8EF186Ee42A14Cdd3c47f52ec06a6dc495E": [
"constructor(address _singleton)"
],
- "0x526a6E634aD36bB0007c4422586c135F1F9B525a": [
- "function executeOneStep(tuple(uint256 maxInboxMessagesRead, address bridge), tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 modulesRoot) startMach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, uint32 internalsOffset) startMod, tuple(uint16 opcode, uint256 argumentData) inst, bytes proof) pure returns (tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 modulesRoot) mach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, uint32 internalsOffset) mod)"
- ],
- "0x5A195953555A11d2a4b654DCa3aE4f9f19eBC3E2": [
+ "0x4F18941fE5bE7a54318989b2C42648914dCe47C4": [
+ "error CallerNotAuthorized()",
+ "event Approval(address indexed owner, address indexed operator, bool approved)",
+ "event AssertionCheckingToggled(bool newState)",
+ "event AssertionSubmitted(uint256 indexed challengeId, uint256 indexed nodeLicenseId)",
+ "event BatchChallenge(uint256 indexed challengeId, uint64[] assertionIds)",
+ "event BatchRewardsClaimed(uint256 indexed challengeId, uint256 totalReward, uint256 keysLength)",
+ "event BulkRewardsClaimed(uint256 indexed challengeId, address indexed bulkAddress, uint256 totalReward, uint256 winningKeys)",
+ "event ChallengeClosed(uint256 indexed challengeNumber)",
+ "event ChallengeExpired(uint256 indexed challengeId)",
+ "event ChallengeSubmitted(uint256 indexed challengeNumber)",
+ "event ChallengerPublicKeyChanged(bytes newChallengerPublicKey)",
"event Initialized(uint8 version)",
+ "event InvalidBatchSubmission(uint256 indexed challengeId, address submissionAddress, address operator, uint256 keysLength)",
+ "event InvalidSubmission(uint256 indexed challengeId, uint256 nodeLicenseId)",
+ "event KycStatusChanged(address indexed wallet, bool isKycApproved)",
+ "event NewBulkSubmission(uint256 indexed challengeId, address indexed bulkAddress, uint256 stakedKeys, uint256 winningKeys)",
+ "event NodeLicenseAddressChanged(address newNodeLicenseAddress)",
+ "event RewardsClaimed(uint256 indexed challengeId, uint256 amount)",
"event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)",
"event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)",
"event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)",
+ "event RollupAddressChanged(address newRollupAddress)",
+ "event StakedV1(address indexed user, uint256 amount, uint256 totalStaked)",
+ "event StakingEnabled(bool enabled)",
+ "event UnstakeV1(address indexed user, uint256 amount, uint256 totalStaked)",
+ "event UpdateBulkSubmission(uint256 indexed challengeId, address indexed bulkAddress, uint256 stakedKeys, uint256 winningKeys, uint256 increase, uint256 decrease)",
+ "event UpdateMaxKeysPerPool(uint256 prevAmount, uint256 newAmount)",
+ "event UpdateMaxStakeAmount(uint256 prevAmount, uint256 newAmount)",
+ "function CHALLENGER_ROLE() view returns (bytes32)",
"function DEFAULT_ADMIN_ROLE() view returns (bytes32)",
- "function calculateChallengeEmissionAndTier(uint256 totalSupply, uint256 maxSupply, uint256 challengeStart, uint256 challengeEnd) pure returns (uint256, uint256)",
- "function getConfirmDataMultipleAssertions(uint64[] _assertionIds, address rollupAddress) view returns (bytes32[] confirmData, bytes32 confirmHash)",
+ "function KYC_ADMIN_ROLE() view returns (bytes32)",
+ "function _lifetimeClaims(address) view returns (uint256)",
+ "function addKycWallet(address wallet)",
+ "function assignedKeyToPool(uint256) view returns (address)",
+ "function assignedKeysOfUserCount(address) view returns (uint256)",
+ "function assignedKeysToPoolCount(address) view returns (uint256)",
+ "function bulkSubmissions(uint256, address) view returns (bool submitted, bool claimed, uint256 keyCount, uint256 winningKeyCount, bytes assertionStateRootOrConfirmData)",
+ "function calculateChallengeEmissionAndTier() view returns (uint256, uint256)",
+ "function challengeCounter() view returns (uint256)",
+ "function challengerPublicKey() view returns (bytes)",
+ "function challenges(uint256) view returns (bool openForSubmissions, bool expiredForRewarding, uint64 assertionId, bytes32 assertionStateRootOrConfirmData, uint64 assertionTimestamp, bytes challengerSignedHash, bytes activeChallengerPublicKey, address rollupUsed, uint256 createdTimestamp, uint256 totalSupplyOfNodesAtChallengeStart, uint256 rewardAmountForClaimers, uint256 amountForGasSubsidy, uint256 numberOfEligibleClaimers, uint256 amountClaimedByClaimers)",
+ "function claimBulkRewards(address _bulkAddress, uint256 _challengeId)",
+ "function claimMultipleRewards(uint256[] _nodeLicenseIds, uint256 _challengeId, address claimForAddressInBatch)",
+ "function claimReward(uint256 _nodeLicenseId, uint256 _challengeId)",
+ "function esXaiAddress() view returns (address)",
+ "function expireChallengeRewards(uint256 _challengeId)",
+ "function gasSubsidyRecipient() view returns (address)",
+ "function getBoostFactorForStaker(address staker) view returns (uint256)",
+ "function getChallenge(uint256 _challengeId) view returns (tuple(bool openForSubmissions, bool expiredForRewarding, uint64 assertionId, bytes32 assertionStateRootOrConfirmData, uint64 assertionTimestamp, bytes challengerSignedHash, bytes activeChallengerPublicKey, address rollupUsed, uint256 createdTimestamp, uint256 totalSupplyOfNodesAtChallengeStart, uint256 rewardAmountForClaimers, uint256 amountForGasSubsidy, uint256 numberOfEligibleClaimers, uint256 amountClaimedByClaimers))",
+ "function getCombinedTotalSupply() view returns (uint256)",
+ "function getKycWalletAtIndex(uint256 index) view returns (address)",
+ "function getKycWalletCount() view returns (uint256)",
+ "function getOperatorAtIndex(address owner, uint256 index) view returns (address)",
+ "function getOperatorCount(address owner) view returns (uint256)",
+ "function getOwnerCountForOperator(address operator) view returns (uint256)",
+ "function getOwnerForOperatorAtIndex(address operator, uint256 index) view returns (address)",
"function getRoleAdmin(bytes32 role) view returns (bytes32)",
- "function getWinningKeyCount(uint256 _keyCount, uint256 _boostFactor, address _bulkAddress, uint256 _challengeId, bytes _confirmData, bytes _challengerSignedHash) pure returns (uint256 winningKeyCount)",
+ "function getRoleMember(bytes32 role, uint256 index) view returns (address)",
+ "function getRoleMemberCount(bytes32 role) view returns (uint256)",
+ "function getSubmissionsForChallenges(uint256[] _challengeIds, uint256 _nodeLicenseId) view returns (tuple(bool submitted, bool claimed, bool eligibleForPayout, uint256 nodeLicenseId, bytes assertionStateRootOrConfirmData)[])",
"function grantRole(bytes32 role, address account)",
"function hasRole(bytes32 role, address account) view returns (bool)",
"function initialize()",
+ "function isApprovedForOperator(address owner, address operator) view returns (bool)",
+ "function isCheckingAssertions() view returns (bool)",
+ "function isKycApproved(address wallet) view returns (bool)",
+ "function maxKeysPerPool() view returns (uint256)",
+ "function maxStakeAmountPerLicense() view returns (uint256)",
+ "function nodeLicenseAddress() view returns (address)",
+ "function poolFactoryAddress() view returns (address)",
+ "function refereeCalculationsAddress() view returns (address)",
+ "function removeKycWallet(address wallet)",
"function renounceRole(bytes32 role, address account)",
"function revokeRole(bytes32 role, address account)",
- "function supportsInterface(bytes4 interfaceId) view returns (bool)"
+ "function rollupAddress() view returns (address)",
+ "function rollupAssertionTracker(bytes32) view returns (bool)",
+ "function setApprovalForOperator(address operator, bool approved)",
+ "function setStakingEnabled(bool enabled)",
+ "function stakeAmountBoostFactors(uint256) view returns (uint256)",
+ "function stakeAmountTierThresholds(uint256) view returns (uint256)",
+ "function stakeEsXai(address pool, uint256 amount)",
+ "function stakeKeys(address pool, address staker, uint256 keyAmount, bool isAdminStake)",
+ "function stakedAmounts(address) view returns (uint256)",
+ "function stakingEnabled() view returns (bool)",
+ "function submissions(uint256, uint256) view returns (bool submitted, bool claimed, bool eligibleForPayout, uint256 nodeLicenseId, bytes assertionStateRootOrConfirmData)",
+ "function submitBulkAssertion(address _bulkAddress, uint256 _challengeId, bytes _confirmData)",
+ "function submitChallenge(uint64 _assertionId, uint64 _predecessorAssertionId, bytes32 _confirmData, uint64 _assertionTimestamp, bytes _challengerSignedHash)",
+ "function supportsInterface(bytes4 interfaceId) view returns (bool)",
+ "function unstake(uint256 amount)",
+ "function unstakeEsXai(address pool, uint256 amount)",
+ "function unstakeKeys(address pool, address staker, uint256 keyAmount)",
+ "function updateBulkSubmissionOnTransfer(address from, address to)",
+ "function xaiAddress() view returns (address)"
],
- "0x5cA988F213EfbCB86ED7e2AACB0C15c91e648f8d": [
+ "0x54E0923782b701044444De5d8c3A45aC890b0881": [
+ "function executeOneStep(tuple(uint256 maxInboxMessagesRead, address bridge), tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) valueMultiStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) frameMultiStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 recoveryPc, bytes32 modulesRoot) startMach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, bytes32 extraHash, uint32 internalsOffset) startMod, tuple(uint16 opcode, uint256 argumentData) inst, bytes proof) pure returns (tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) valueMultiStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) frameMultiStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 recoveryPc, bytes32 modulesRoot) mach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, bytes32 extraHash, uint32 internalsOffset) mod)"
+ ],
+ "0x5AA806015FEC88669bF7DAd746BB4ADC1E79BcED": [
"error NotOwner(address sender, address owner)",
"event Bisected(uint64 indexed challengeIndex, bytes32 indexed challengeRoot, uint256 challengedSegmentStart, uint256 challengedSegmentLength, bytes32[] chainHashes)",
"event ChallengeEnded(uint64 indexed challengeIndex, uint8 kind)",
@@ -1918,11 +2192,13 @@
"function clearChallenge(uint64 challengeIndex)",
"function createChallenge(bytes32 wasmModuleRoot_, uint8[2] startAndEndMachineStatuses_, tuple(bytes32[2] bytes32Vals, uint64[2] u64Vals)[2] startAndEndGlobalStates_, uint64 numBlocks, address asserter_, address challenger_, uint256 asserterTimeLeft_, uint256 challengerTimeLeft_) returns (uint64)",
"function currentResponder(uint64 challengeIndex) view returns (address)",
+ "function getOsp(bytes32 wasmModuleRoot) view returns (address)",
"function initialize(address resultReceiver_, address sequencerInbox_, address bridge_, address osp_)",
"function isTimedOut(uint64 challengeIndex) view returns (bool)",
"function oneStepProveExecution(uint64 challengeIndex, tuple(uint256 oldSegmentsStart, uint256 oldSegmentsLength, bytes32[] oldSegments, uint256 challengePosition) selection, bytes proof)",
"function osp() view returns (address)",
- "function postUpgradeInit(address osp_)",
+ "function ospCond(bytes32) view returns (address)",
+ "function postUpgradeInit(address osp_, bytes32 condRoot, address condOsp)",
"function resultReceiver() view returns (address)",
"function sequencerInbox() view returns (address)",
"function timeout(uint64 challengeIndex)",
@@ -2089,8 +2365,101 @@
"function unpause()",
"function unsafeCreateRetryableTicket(address to, uint256 l2CallValue, uint256 maxSubmissionCost, address excessFeeRefundAddress, address callValueRefundAddress, uint256 gasLimit, uint256 maxFeePerGas, uint256 tokenTotalFeeAmount, bytes data) returns (uint256)"
],
- "0x800dA62bE6626127F71B34E795286C34C04D6712": [
- "function executeOneStep(tuple(uint256 maxInboxMessagesRead, address bridge), tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 modulesRoot) startMach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, uint32 internalsOffset) startMod, tuple(uint16 opcode, uint256 argumentData) inst, bytes proof) pure returns (tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 modulesRoot) mach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, uint32 internalsOffset) mod)"
+ "0x86E721b43d4ECFa71119Dd38c0f938A75Fdb57B3": [
+ "event Approval(address indexed owner, address indexed spender, uint256 value)",
+ "event AuthorizationCanceled(address indexed authorizer, bytes32 indexed nonce)",
+ "event AuthorizationUsed(address indexed authorizer, bytes32 indexed nonce)",
+ "event Blacklisted(address indexed _account)",
+ "event BlacklisterChanged(address indexed newBlacklister)",
+ "event Burn(address indexed burner, uint256 amount)",
+ "event MasterMinterChanged(address indexed newMasterMinter)",
+ "event Mint(address indexed minter, address indexed to, uint256 amount)",
+ "event MinterConfigured(address indexed minter, uint256 minterAllowedAmount)",
+ "event MinterRemoved(address indexed oldMinter)",
+ "event OwnershipTransferred(address previousOwner, address newOwner)",
+ "event Pause()",
+ "event PauserChanged(address indexed newAddress)",
+ "event RescuerChanged(address indexed newRescuer)",
+ "event Transfer(address indexed from, address indexed to, uint256 value)",
+ "event UnBlacklisted(address indexed _account)",
+ "event Unpause()",
+ "function CANCEL_AUTHORIZATION_TYPEHASH() view returns (bytes32)",
+ "function DOMAIN_SEPARATOR() view returns (bytes32)",
+ "function PERMIT_TYPEHASH() view returns (bytes32)",
+ "function RECEIVE_WITH_AUTHORIZATION_TYPEHASH() view returns (bytes32)",
+ "function TRANSFER_WITH_AUTHORIZATION_TYPEHASH() view returns (bytes32)",
+ "function allowance(address owner, address spender) view returns (uint256)",
+ "function approve(address spender, uint256 value) returns (bool)",
+ "function authorizationState(address authorizer, bytes32 nonce) view returns (bool)",
+ "function balanceOf(address account) view returns (uint256)",
+ "function blacklist(address _account)",
+ "function blacklister() view returns (address)",
+ "function burn(uint256 _amount)",
+ "function cancelAuthorization(address authorizer, bytes32 nonce, uint8 v, bytes32 r, bytes32 s)",
+ "function cancelAuthorization(address authorizer, bytes32 nonce, bytes signature)",
+ "function configureMinter(address minter, uint256 minterAllowedAmount) returns (bool)",
+ "function currency() view returns (string)",
+ "function decimals() view returns (uint8)",
+ "function decreaseAllowance(address spender, uint256 decrement) returns (bool)",
+ "function increaseAllowance(address spender, uint256 increment) returns (bool)",
+ "function initialize(string tokenName, string tokenSymbol, string tokenCurrency, uint8 tokenDecimals, address newMasterMinter, address newPauser, address newBlacklister, address newOwner)",
+ "function initializeV2(string newName)",
+ "function initializeV2_1(address lostAndFound)",
+ "function initializeV2_2(address[] accountsToBlacklist, string newSymbol)",
+ "function isBlacklisted(address _account) view returns (bool)",
+ "function isMinter(address account) view returns (bool)",
+ "function masterMinter() view returns (address)",
+ "function mint(address _to, uint256 _amount) returns (bool)",
+ "function minterAllowance(address minter) view returns (uint256)",
+ "function name() view returns (string)",
+ "function nonces(address owner) view returns (uint256)",
+ "function owner() view returns (address)",
+ "function pause()",
+ "function paused() view returns (bool)",
+ "function pauser() view returns (address)",
+ "function permit(address owner, address spender, uint256 value, uint256 deadline, bytes signature)",
+ "function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)",
+ "function receiveWithAuthorization(address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, bytes signature)",
+ "function receiveWithAuthorization(address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, uint8 v, bytes32 r, bytes32 s)",
+ "function removeMinter(address minter) returns (bool)",
+ "function rescueERC20(address tokenContract, address to, uint256 amount)",
+ "function rescuer() view returns (address)",
+ "function symbol() view returns (string)",
+ "function totalSupply() view returns (uint256)",
+ "function transfer(address to, uint256 value) returns (bool)",
+ "function transferFrom(address from, address to, uint256 value) returns (bool)",
+ "function transferOwnership(address newOwner)",
+ "function transferWithAuthorization(address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, bytes signature)",
+ "function transferWithAuthorization(address from, address to, uint256 value, uint256 validAfter, uint256 validBefore, bytes32 nonce, uint8 v, bytes32 r, bytes32 s)",
+ "function unBlacklist(address _account)",
+ "function unpause()",
+ "function updateBlacklister(address _newBlacklister)",
+ "function updateMasterMinter(address _newMasterMinter)",
+ "function updatePauser(address _newPauser)",
+ "function updateRescuer(address newRescuer)",
+ "function version() pure returns (string)"
+ ],
+ "0x8aFf09e2259cacbF4Fc4e3E53F3bf799EfEEab36": [
+ "constructor(address _minterManager)",
+ "event ControllerConfigured(address indexed _controller, address indexed _worker)",
+ "event ControllerRemoved(address indexed _controller)",
+ "event MinterAllowanceDecremented(address indexed msgSender, address indexed minter, uint256 decrement, uint256 newAllowance)",
+ "event MinterAllowanceIncremented(address indexed _msgSender, address indexed _minter, uint256 _increment, uint256 _newAllowance)",
+ "event MinterConfigured(address indexed _msgSender, address indexed _minter, uint256 _allowance)",
+ "event MinterManagerSet(address indexed _oldMinterManager, address indexed _newMinterManager)",
+ "event MinterRemoved(address indexed _msgSender, address indexed _minter)",
+ "event OwnershipTransferred(address previousOwner, address newOwner)",
+ "function configureController(address _controller, address _worker)",
+ "function configureMinter(uint256 _newAllowance) returns (bool)",
+ "function decrementMinterAllowance(uint256 _allowanceDecrement) returns (bool)",
+ "function getMinterManager() view returns (address)",
+ "function getWorker(address _controller) view returns (address)",
+ "function incrementMinterAllowance(uint256 _allowanceIncrement) returns (bool)",
+ "function owner() view returns (address)",
+ "function removeController(address _controller)",
+ "function removeMinter() returns (bool)",
+ "function setMinterManager(address _newMinterManager)",
+ "function transferOwnership(address newOwner)"
],
"0x8b73Ef238ADaB31EBC7c05423d243c345241a22f": [
"event DepositInitiated(address l1Token, address indexed _from, address indexed _to, uint256 indexed _sequenceNumber, uint256 _amount)",
@@ -2144,13 +2513,15 @@
"function upgradeTo(address newImplementation)",
"function upgradeToAndCall(address newImplementation, bytes data) payable"
],
- "0xb20107bfB36D3B5AcA534aCAfbd8857b10b402a8": [
- "constructor(address prover0_, address proverMem_, address proverMath_, address proverHostIo_)",
- "function proveOneStep(tuple(uint256 maxInboxMessagesRead, address bridge) execCtx, uint256 machineStep, bytes32 beforeHash, bytes proof) view returns (bytes32 afterHash)",
- "function prover0() view returns (address)",
- "function proverHostIo() view returns (address)",
- "function proverMath() view returns (address)",
- "function proverMem() view returns (address)"
+ "0xaf88d065e77c8cC2239327C5EDb3A432268e5831": [
+ "constructor(address implementationContract)",
+ "event AdminChanged(address previousAdmin, address newAdmin)",
+ "event Upgraded(address implementation)",
+ "function admin() view returns (address)",
+ "function changeAdmin(address newAdmin)",
+ "function implementation() view returns (address)",
+ "function upgradeTo(address newImplementation)",
+ "function upgradeToAndCall(address newImplementation, bytes data) payable"
],
"0xb591cE747CF19cF30e11d656EB94134F523A9e77": [
"constructor(address _logic, address admin_, bytes _data) payable",
@@ -2191,9 +2562,6 @@
"event UpgradedSecondary(address indexed implementation)",
"function initializeProxy(tuple(uint64 confirmPeriodBlocks, uint64 extraChallengeTimeBlocks, address stakeToken, uint256 baseStake, bytes32 wasmModuleRoot, address owner, address loserStakeEscrow, uint256 chainId, string chainConfig, uint64 genesisBlockNum, tuple(uint256 delayBlocks, uint256 futureBlocks, uint256 delaySeconds, uint256 futureSeconds) sequencerInboxMaxTimeVariation) config, tuple(address bridge, address sequencerInbox, address inbox, address outbox, address rollupEventInbox, address challengeManager, address rollupAdminLogic, address rollupUserLogic, address validatorUtils, address validatorWalletCreator) connectedContracts)"
],
- "0xc555b2F1D559Fbb854569b33640990D178F94747": [
- "function executeOneStep(tuple(uint256 maxInboxMessagesRead, address bridge) execCtx, tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 modulesRoot) startMach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, uint32 internalsOffset) startMod, tuple(uint16 opcode, uint256 argumentData) inst, bytes proof) view returns (tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 modulesRoot) mach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, uint32 internalsOffset) mod)"
- ],
"0xCd62360854aecf6285Fa310D69C5EBaf4Cd5e95F": [
"constructor(address _logic, address admin_, bytes _data) payable",
"event AdminChanged(address previousAdmin, address newAdmin)",
@@ -2244,77 +2612,17 @@
"function upgrade(address proxy, address implementation)",
"function upgradeAndCall(address proxy, address implementation, bytes data) payable"
],
- "0xE6E5356423516C9b75d4Dfb1fCa3973c5B695be8": [
- "event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)",
- "event ApprovalForAll(address indexed owner, address indexed operator, bool approved)",
- "event ClaimableChanged(address indexed admin, bool newClaimableState)",
- "event FundsReceiverChanged(address indexed admin, address newFundsReceiver)",
- "event FundsWithdrawn(address indexed admin, uint256 amount)",
- "event Initialized(uint8 version)",
- "event PricingTierSetOrAdded(uint256 index, uint256 price, uint256 quantity)",
- "event PromoCodeCreated(string promoCode, address recipient)",
- "event PromoCodeRemoved(string promoCode)",
- "event ReferralReward(address indexed buyer, address indexed referralAddress, uint256 amount)",
- "event ReferralRewardPercentagesChanged(uint256 referralDiscountPercentage, uint256 referralRewardPercentage)",
- "event RefundOccurred(address indexed refundee, uint256 amount)",
- "event RewardClaimed(address indexed claimer, uint256 amount)",
- "event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)",
- "event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)",
- "event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)",
- "event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)",
- "event WhitelistAmountRedeemed(address indexed redeemer, uint16 newAmount)",
- "event WhitelistAmountUpdatedByAdmin(address indexed redeemer, uint16 newAmount)",
- "function DEFAULT_ADMIN_ROLE() view returns (bytes32)",
- "function approve(address to, uint256 tokenId)",
- "function balanceOf(address owner) view returns (uint256)",
- "function claimReferralReward()",
- "function claimable() view returns (bool)",
- "function createPromoCode(string _promoCode, address _recipient)",
- "function fundsReceiver() view returns (address)",
- "function getApproved(uint256 tokenId) view returns (address)",
- "function getAverageCost(uint256 _tokenId) view returns (uint256)",
- "function getMintTimestamp(uint256 _tokenId) view returns (uint256)",
- "function getPricingTier(uint256 _index) view returns (tuple(uint256 price, uint256 quantity))",
- "function getPricingTiersLength() view returns (uint256)",
- "function getPromoCode(string _promoCode) view returns (tuple(address recipient, bool active, uint256 receivedLifetime))",
- "function getRoleAdmin(bytes32 role) view returns (bytes32)",
- "function grantRole(bytes32 role, address account)",
- "function hasRole(bytes32 role, address account) view returns (bool)",
- "function isApprovedForAll(address owner, address operator) view returns (bool)",
- "function maxSupply() view returns (uint256)",
- "function mint(uint256 _amount, string _promoCode) payable",
- "function name() view returns (string)",
- "function ownerOf(uint256 tokenId) view returns (address)",
- "function price(uint256 _amount, string _promoCode) view returns (uint256)",
- "function redeemFromWhitelist()",
- "function referralDiscountPercentage() view returns (uint256)",
- "function referralRewardPercentage() view returns (uint256)",
- "function refundNodeLicense(uint256 _tokenId) payable",
- "function removePromoCode(string _promoCode)",
- "function renounceRole(bytes32 role, address account)",
- "function revokeRole(bytes32 role, address account)",
- "function safeTransferFrom(address from, address to, uint256 tokenId)",
- "function safeTransferFrom(address from, address to, uint256 tokenId, bytes data)",
- "function setApprovalForAll(address operator, bool approved)",
- "function setClaimable(bool _claimable)",
- "function setFundsReceiver(address _newFundsReceiver)",
- "function setOrAddPricingTier(uint256 _index, uint256 _price, uint256 _quantity)",
- "function setReferralPercentages(uint256 _referralDiscountPercentage, uint256 _referralRewardPercentage)",
- "function supportsInterface(bytes4 interfaceId) view returns (bool)",
- "function symbol() view returns (string)",
- "function tokenByIndex(uint256 index) view returns (uint256)",
- "function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)",
- "function tokenURI(uint256 _tokenId) view returns (string)",
- "function totalSupply() view returns (uint256)",
- "function transferFrom(address from, address to, uint256 tokenId)",
- "function updateWhitelistAmounts(address[] _toWhitelist, uint16[] _amounts)",
- "function whitelistAmounts(address) view returns (uint16)",
- "function withdrawFunds()"
- ],
- "0xe8709022B9C9D7347856c75910fe07e10C904446": [
- "function executeOneStep(tuple(uint256 maxInboxMessagesRead, address bridge), tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 modulesRoot) startMach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, uint32 internalsOffset) startMod, tuple(uint16 opcode, uint256 argumentData) inst, bytes proof) pure returns (tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 modulesRoot) mach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, uint32 internalsOffset) mod)"
+ "0xD89d54007079071cBA859127318b9F34eeB78049": [
+ "constructor(address prover0_, address proverMem_, address proverMath_, address proverHostIo_)",
+ "function getEndMachineHash(uint8 status, bytes32 globalStateHash) pure returns (bytes32)",
+ "function getStartMachineHash(bytes32 globalStateHash, bytes32 wasmModuleRoot) pure returns (bytes32)",
+ "function proveOneStep(tuple(uint256 maxInboxMessagesRead, address bridge) execCtx, uint256 machineStep, bytes32 beforeHash, bytes proof) view returns (bytes32 afterHash)",
+ "function prover0() view returns (address)",
+ "function proverHostIo() view returns (address)",
+ "function proverMath() view returns (address)",
+ "function proverMem() view returns (address)"
],
- "0xEe9E5546A11Cb5b4A86e92DA05f2ef75C26E4754": [
+ "0xdD91f6e88576fEc4A38A518DA39C92e13CBB6446": [
"event AdminChanged(address previousAdmin, address newAdmin)",
"event BeaconUpgraded(address indexed beacon)",
"event NodeConfirmed(uint64 indexed nodeNum, bytes32 blockHash, bytes32 sendRoot)",
@@ -2331,6 +2639,7 @@
"event UserWithdrawableFundsUpdated(address indexed user, uint256 initialBalance, uint256 finalBalance)",
"function _stakerMap(address) view returns (uint256 amountStaked, uint64 index, uint64 latestStakedNode, uint64 currentChallenge, bool isStaked)",
"function amountStaked(address staker) view returns (uint256)",
+ "function anyTrustFastConfirmer() view returns (address)",
"function baseStake() view returns (uint256)",
"function bridge() view returns (address)",
"function chainId() view returns (uint256)",
@@ -2370,6 +2679,7 @@
"function rollupDeploymentBlock() view returns (uint256)",
"function rollupEventInbox() view returns (address)",
"function sequencerInbox() view returns (address)",
+ "function setAnyTrustFastConfirmer(address _anyTrustFastConfirmer)",
"function setBaseStake(uint256 newBaseStake)",
"function setConfirmPeriodBlocks(uint64 newConfirmPeriod)",
"function setDelayedInbox(address _inbox, bool _enabled)",
@@ -2401,117 +2711,126 @@
"function zombieCount() view returns (uint256)",
"function zombieLatestStakedNode(uint256 zombieNum) view returns (uint64)"
],
- "0xF208798482F0b12c8767Bc03cC0F145D18BeCe6A": [
+ "0xE58a2dEb5718F9aAF2C1DdD0E366ED076D204cc4": [
+ "function executeOneStep(tuple(uint256 maxInboxMessagesRead, address bridge), tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) valueMultiStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) frameMultiStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 recoveryPc, bytes32 modulesRoot) startMach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, bytes32 extraHash, uint32 internalsOffset) startMod, tuple(uint16 opcode, uint256 argumentData) inst, bytes proof) pure returns (tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) valueMultiStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) frameMultiStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 recoveryPc, bytes32 modulesRoot) mach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, bytes32 extraHash, uint32 internalsOffset) mod)"
+ ],
+ "0xe72b004FCa3A05251c6C8d1BF1482B9308876c7f": [
+ "error CannotTransferStakedKey()",
+ "error ClaimingPaused()",
+ "error ExceedsMaxSupply()",
+ "error InvalidAddress()",
+ "error InvalidAmount()",
+ "error MintingPaused()",
+ "error MissingTokenIds()",
+ "error ReentrantCall()",
+ "error ReferrerCannotBeBuyer()",
+ "error TransferFailed()",
+ "error TxIdPrevUsed()",
+ "event AdminMintTo(address indexed admin, address indexed receiver, uint256 amount)",
+ "event AdminTransferBatch(address indexed admin, address indexed receiver, bytes32 indexed transferId, uint256[] tokenIds)",
+ "event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)",
+ "event ApprovalForAll(address indexed owner, address indexed operator, bool approved)",
+ "event ClaimableChanged(address indexed admin, bool newClaimableState)",
+ "event FundsReceiverChanged(address indexed admin, address newFundsReceiver)",
"event Initialized(uint8 version)",
+ "event PricingTierSetOrAdded(uint256 index, uint256 price, uint256 quantity)",
+ "event PromoCodeCreated(string promoCode, address recipient)",
+ "event PromoCodeRemoved(string promoCode)",
+ "event ReferralReward(address indexed buyer, address indexed referralAddress, uint256 amount)",
+ "event ReferralRewardPercentagesChanged(uint256 referralDiscountPercentage, uint256 referralRewardPercentage)",
+ "event ReferralRewardV2(address indexed buyer, address indexed referralAddress, address indexed currency, string promoCode, uint256 amount)",
+ "event RewardClaimed(address indexed claimer, uint256 ethAmount, uint256 xaiAmount, uint256 esXaiAmount, uint256 usdcAmount)",
"event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)",
"event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)",
"event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)",
+ "event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)",
+ "event WhitelistAmountRedeemed(address indexed redeemer, uint16 newAmount)",
+ "event WhitelistAmountUpdatedByAdmin(address indexed redeemer, uint16 newAmount)",
+ "function ADMIN_MINT_ROLE() view returns (bytes32)",
+ "function AIRDROP_ADMIN_ROLE() view returns (bytes32)",
"function DEFAULT_ADMIN_ROLE() view returns (bytes32)",
"function TRANSFER_ROLE() view returns (bytes32)",
+ "function _averageCost(uint256) view returns (uint256)",
+ "function _mintTimestamps(uint256) view returns (uint256)",
+ "function adminMintTo(address to, uint256 amount, bytes32 mintId)",
+ "function adminTransferBatch(address to, uint256[] tokenIds, bytes32 transferId)",
+ "function approve(address to, uint256 tokenId)",
+ "function balanceOf(address owner) view returns (uint256)",
+ "function claimReferralReward()",
+ "function claimable() view returns (bool)",
+ "function createPromoCode(string _promoCode, address _recipient)",
+ "function esXaiAddress() view returns (address)",
+ "function ethToXai(uint256 _amount) view returns (uint256)",
+ "function fundsReceiver() view returns (address)",
+ "function getApproved(uint256 tokenId) view returns (address)",
+ "function getMintTimestamp(uint256 _tokenId) view returns (uint256)",
+ "function getPricingTier(uint256 _index) view returns (tuple(uint256 price, uint256 quantity))",
+ "function getPricingTiersLength() view returns (uint256)",
+ "function getPromoCode(string _promoCode) view returns (tuple(address recipient, bool active, uint256 receivedLifetime))",
"function getRoleAdmin(bytes32 role) view returns (bytes32)",
"function grantRole(bytes32 role, address account)",
"function hasRole(bytes32 role, address account) view returns (bool)",
"function initialize()",
+ "function isApprovedForAll(address owner, address operator) view returns (bool)",
+ "function maxSupply() view returns (uint256)",
+ "function mint(uint256 _amount, string _promoCode) payable",
+ "function mintTo(address _mintToAddress, uint256 _amount, string _promoCode) payable",
+ "function mintToWithUSDC(address _to, uint256 _amount, string _promoCode, uint256 _expectedCostInUSDC)",
+ "function mintWithXai(address to, uint256 _amount, string _promoCode, bool _useEsXai, uint256 _expectedCost)",
+ "function mintingPaused() view returns (bool)",
+ "function name() view returns (string)",
+ "function ownerOf(uint256 tokenId) view returns (address)",
+ "function price(uint256 _amount, string _promoCode) view returns (uint256)",
+ "function refereeAddress() view returns (address)",
+ "function refereeCalculationsAddress() view returns (address)",
+ "function referralDiscountPercentage() view returns (uint256)",
+ "function referralRewardPercentage() view returns (uint256)",
+ "function removePromoCode(string _promoCode)",
"function renounceRole(bytes32 role, address account)",
"function revokeRole(bytes32 role, address account)",
+ "function safeTransferFrom(address from, address to, uint256 tokenId)",
+ "function safeTransferFrom(address from, address to, uint256 tokenId, bytes data)",
+ "function setApprovalForAll(address operator, bool approved)",
+ "function setClaimable(bool _claimable)",
+ "function setOrAddPricingTier(uint256 _index, uint256 _price, uint256 _quantity)",
"function supportsInterface(bytes4 interfaceId) view returns (bool)",
- "function transferTokens(address token, address recipient, uint256 amount)"
- ],
- "0xF9E08660223E2dbb1c0b28c82942aB6B5E38b8E5": [
- "constructor(address _logic, address admin_, bytes _data) payable",
- "event AdminChanged(address previousAdmin, address newAdmin)",
- "event BeaconUpgraded(address indexed beacon)",
- "event Upgraded(address indexed implementation)"
+ "function symbol() view returns (string)",
+ "function tokenByIndex(uint256 index) view returns (uint256)",
+ "function tokenOfOwnerByIndex(address owner, uint256 index) view returns (uint256)",
+ "function tokenURI(uint256 _tokenId) view returns (string)",
+ "function totalSupply() view returns (uint256)",
+ "function transferFrom(address from, address to, uint256 tokenId)",
+ "function updateWhitelistAmounts(address[] _toWhitelist, uint16[] _amounts)",
+ "function usdcAddress() view returns (address)",
+ "function usedAdminMintIds(bytes32) view returns (bool)",
+ "function usedTransferIds(bytes32) view returns (bool)",
+ "function whitelistAmounts(address) view returns (uint16)",
+ "function xaiAddress() view returns (address)"
],
- "0xfCa2657FC4456Ac256A78A31aAB1128F5e1d2D40": [
- "event Approval(address indexed owner, address indexed operator, bool approved)",
- "event AssertionCheckingToggled(bool newState)",
- "event AssertionSubmitted(uint256 indexed challengeId, uint256 indexed nodeLicenseId)",
- "event BatchChallenge(uint256 indexed challengeId, uint64[] assertionIds)",
- "event BatchRewardsClaimed(uint256 indexed challengeId, uint256 totalReward, uint256 keysLength)",
- "event ChallengeClosed(uint256 indexed challengeNumber)",
- "event ChallengeExpired(uint256 indexed challengeId)",
- "event ChallengeSubmitted(uint256 indexed challengeNumber)",
- "event ChallengerPublicKeyChanged(bytes newChallengerPublicKey)",
+ "0xF208798482F0b12c8767Bc03cC0F145D18BeCe6A": [
"event Initialized(uint8 version)",
- "event InvalidBatchSubmission(uint256 indexed challengeId, address operator, uint256 keysLength)",
- "event InvalidSubmission(uint256 indexed challengeId, uint256 nodeLicenseId)",
- "event KycStatusChanged(address indexed wallet, bool isKycApproved)",
- "event NodeLicenseAddressChanged(address newNodeLicenseAddress)",
- "event RewardsClaimed(uint256 indexed challengeId, uint256 amount)",
"event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)",
"event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)",
"event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)",
- "event RollupAddressChanged(address newRollupAddress)",
- "event StakedV1(address indexed user, uint256 amount, uint256 totalStaked)",
- "event StakingEnabled()",
- "event UnstakeV1(address indexed user, uint256 amount, uint256 totalStaked)",
- "event UpdateMaxKeysPerPool(uint256 prevAmount, uint256 newAmount)",
- "event UpdateMaxStakeAmount(uint256 prevAmount, uint256 newAmount)",
- "function CHALLENGER_ROLE() view returns (bytes32)",
"function DEFAULT_ADMIN_ROLE() view returns (bytes32)",
- "function KYC_ADMIN_ROLE() view returns (bytes32)",
- "function _lifetimeClaims(address) view returns (uint256)",
- "function addKycWallet(address wallet)",
- "function assignedKeyToPool(uint256) view returns (address)",
- "function assignedKeysOfUserCount(address) view returns (uint256)",
- "function assignedKeysToPoolCount(address) view returns (uint256)",
- "function calculateChallengeEmissionAndTier() view returns (uint256, uint256)",
- "function challengeCounter() view returns (uint256)",
- "function challengerPublicKey() view returns (bytes)",
- "function challenges(uint256) view returns (bool openForSubmissions, bool expiredForRewarding, uint64 assertionId, bytes32 assertionStateRootOrConfirmData, uint64 assertionTimestamp, bytes challengerSignedHash, bytes activeChallengerPublicKey, address rollupUsed, uint256 createdTimestamp, uint256 totalSupplyOfNodesAtChallengeStart, uint256 rewardAmountForClaimers, uint256 amountForGasSubsidy, uint256 numberOfEligibleClaimers, uint256 amountClaimedByClaimers)",
- "function claimMultipleRewards(uint256[] _nodeLicenseIds, uint256 _challengeId, address claimForAddressInBatch)",
- "function claimReward(uint256 _nodeLicenseId, uint256 _challengeId)",
- "function closeCurrentChallenge()",
- "function createAssertionHashAndCheckPayout(uint256 _nodeLicenseId, uint256 _challengeId, uint256 _boostFactor, bytes _confirmData, bytes _challengerSignedHash) pure returns (bool, bytes32)",
- "function esXaiAddress() view returns (address)",
- "function expireChallengeRewards(uint256 _challengeId)",
- "function gasSubsidyRecipient() view returns (address)",
- "function getBoostFactorForStaker(address staker) view returns (uint256)",
- "function getChallenge(uint256 _challengeId) view returns (tuple(bool openForSubmissions, bool expiredForRewarding, uint64 assertionId, bytes32 assertionStateRootOrConfirmData, uint64 assertionTimestamp, bytes challengerSignedHash, bytes activeChallengerPublicKey, address rollupUsed, uint256 createdTimestamp, uint256 totalSupplyOfNodesAtChallengeStart, uint256 rewardAmountForClaimers, uint256 amountForGasSubsidy, uint256 numberOfEligibleClaimers, uint256 amountClaimedByClaimers))",
- "function getCombinedTotalSupply() view returns (uint256)",
- "function getKycWalletAtIndex(uint256 index) view returns (address)",
- "function getKycWalletCount() view returns (uint256)",
- "function getOperatorAtIndex(address owner, uint256 index) view returns (address)",
- "function getOperatorCount(address owner) view returns (uint256)",
- "function getOwnerCountForOperator(address operator) view returns (uint256)",
- "function getOwnerForOperatorAtIndex(address operator, uint256 index) view returns (address)",
+ "function TRANSFER_ROLE() view returns (bytes32)",
"function getRoleAdmin(bytes32 role) view returns (bytes32)",
- "function getRoleMember(bytes32 role, uint256 index) view returns (address)",
- "function getRoleMemberCount(bytes32 role) view returns (uint256)",
- "function getSubmissionsForChallenges(uint256[] _challengeIds, uint256 _nodeLicenseId) view returns (tuple(bool submitted, bool claimed, bool eligibleForPayout, uint256 nodeLicenseId, bytes assertionStateRootOrConfirmData)[])",
"function grantRole(bytes32 role, address account)",
"function hasRole(bytes32 role, address account) view returns (bool)",
- "function initialize(address _refereeCalculationsAddress)",
- "function isApprovedForOperator(address owner, address operator) view returns (bool)",
- "function isCheckingAssertions() view returns (bool)",
- "function isKycApproved(address wallet) view returns (bool)",
- "function maxKeysPerPool() view returns (uint256)",
- "function maxStakeAmountPerLicense() view returns (uint256)",
- "function nodeLicenseAddress() view returns (address)",
- "function poolFactoryAddress() view returns (address)",
- "function refereeCalculationsAddress() view returns (address)",
- "function removeKycWallet(address wallet)",
+ "function initialize()",
"function renounceRole(bytes32 role, address account)",
"function revokeRole(bytes32 role, address account)",
- "function rollupAddress() view returns (address)",
- "function rollupAssertionTracker(bytes32) view returns (bool)",
- "function setApprovalForOperator(address operator, bool approved)",
- "function stakeAmountBoostFactors(uint256) view returns (uint256)",
- "function stakeAmountTierThresholds(uint256) view returns (uint256)",
- "function stakeEsXai(address pool, uint256 amount)",
- "function stakeKeys(address pool, address staker, uint256[] keyIds)",
- "function stakedAmounts(address) view returns (uint256)",
- "function stakingEnabled() view returns (bool)",
- "function submissions(uint256, uint256) view returns (bool submitted, bool claimed, bool eligibleForPayout, uint256 nodeLicenseId, bytes assertionStateRootOrConfirmData)",
- "function submitAssertionToChallenge(uint256 _nodeLicenseId, uint256 _challengeId, bytes _confirmData)",
- "function submitChallenge(uint64 _assertionId, uint64 _predecessorAssertionId, bytes32 _confirmData, uint64 _assertionTimestamp, bytes _challengerSignedHash)",
- "function submitMultipleAssertions(uint256[] _nodeLicenseIds, uint256 _challengeId, bytes _confirmData)",
"function supportsInterface(bytes4 interfaceId) view returns (bool)",
- "function unstake(uint256 amount)",
- "function unstakeEsXai(address pool, uint256 amount)",
- "function unstakeKeys(address pool, address staker, uint256[] keyIds)",
- "function xaiAddress() view returns (address)"
+ "function transferTokens(address token, address recipient, uint256 amount)"
+ ],
+ "0xf8E5e5562c2c12d8690786f5C9FA65F20F6bD881": [
+ "function executeOneStep(tuple(uint256 maxInboxMessagesRead, address bridge), tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) valueMultiStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) frameMultiStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 recoveryPc, bytes32 modulesRoot) startMach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, bytes32 extraHash, uint32 internalsOffset) startMod, tuple(uint16 opcode, uint256 argumentData) inst, bytes proof) pure returns (tuple(uint8 status, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) valueStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) valueMultiStack, tuple(tuple(tuple(uint8 valueType, uint256 contents)[] inner) proved, bytes32 remainingHash) internalStack, tuple(tuple(tuple(uint8 valueType, uint256 contents) returnPc, bytes32 localsMerkleRoot, uint32 callerModule, uint32 callerModuleInternals)[] proved, bytes32 remainingHash) frameStack, tuple(bytes32 inactiveStackHash, bytes32 remainingHash) frameMultiStack, bytes32 globalStateHash, uint32 moduleIdx, uint32 functionIdx, uint32 functionPc, bytes32 recoveryPc, bytes32 modulesRoot) mach, tuple(bytes32 globalsMerkleRoot, tuple(uint64 size, uint64 maxSize, bytes32 merkleRoot) moduleMemory, bytes32 tablesMerkleRoot, bytes32 functionsMerkleRoot, bytes32 extraHash, uint32 internalsOffset) mod)"
+ ],
+ "0xF9E08660223E2dbb1c0b28c82942aB6B5E38b8E5": [
+ "constructor(address _logic, address admin_, bytes _data) payable",
+ "event AdminChanged(address previousAdmin, address newAdmin)",
+ "event BeaconUpgraded(address indexed beacon)",
+ "event Upgraded(address indexed implementation)"
],
"0xFCF7248C495d6fd3641eE43F861c48Ebe402c878": [
"constructor(address _singleton)"
@@ -2538,7 +2857,7 @@
"orbitstack/OneStepProverMemory": "0x9783e1f5d836162f6bf9df066ef7bff18da19c56314fe858f6feba71c350ced7",
"orbitstack/Outbox": "0xbe3b84a344052ad51b5b58cecda95b249b73ff1da035383bf02f29a785eb0c68",
"orbitstack/RollupEventInbox": "0x0608b35e1df8a51677a6392869e50b60a1ff7137f71f40bddf83143a5ef640c1",
- "orbitstack/RollupProxy": "0x9ffbe36f064536f2a8ffb61a54a779561f7ddde93379da6475d263ca36e3c6db",
+ "orbitstack/RollupProxy_fastConfirm": "0x2314bbfa0104764ce632ec231b12e2b142a94db57f5442ae68d4a52be7794651",
"orbitstack/SequencerInbox": "0x5cd19865dbaedc22bb0571435a45b9ec44f18388ca4c83dc971fb6c0be1bdf22",
"orbitstack/UpgradeExecutor": "0xa8c2617950ce46d982abd852226ebcc1aacaf9c8c7daeda793b53a790eced777",
"orbitstack/ValidatorUtils": "0x1345b7ce8347b1c8e9609c7b5a42e7494c8447ed73249c9494da50911d9a1e4a"
diff --git a/packages/backend/discovery/xdai/ethereum/config.jsonc b/packages/backend/discovery/xdai/ethereum/config.jsonc
index 008c537e675..b39d124d4cc 100644
--- a/packages/backend/discovery/xdai/ethereum/config.jsonc
+++ b/packages/backend/discovery/xdai/ethereum/config.jsonc
@@ -12,15 +12,15 @@
"0x4aa42145Aa6Ebf72e164C9bBC74fbD3788045016",
"0xe1579dEbdD2DF16Ebdb9db8694391fa74EeA201E",
"0xEeE4f8dB4410beBD74A76cB711D096c5E66d0473",
- "0x6943A218d58135793F1FE619414eD476C37ad65a",
"0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6"
],
"names": {
"0xEeE4f8dB4410beBD74A76cB711D096c5E66d0473": "DaiForeignBridge",
- "0x166124b75c798Cedf1B43655E9B5284eBd5203DB": "SDaiForeignBridge",
+ "0x4aa42145Aa6Ebf72e164C9bBC74fbD3788045016": "SDaiForeignBridge",
"0x6F6e4785c97885d26466945055d4Ae8931bE6f7a": "GovernorBravoDelegate",
- "0x6943A218d58135793F1FE619414eD476C37ad65a": "BridgeValidators",
- "0xBafE01ff935C7305907c33BF824352eE5979B526": "Comptroller"
+ "0xe1579dEbdD2DF16Ebdb9db8694391fa74EeA201E": "BridgeValidators",
+ "0xBafE01ff935C7305907c33BF824352eE5979B526": "Comptroller",
+ "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6": "GnosisBridgeGovernanceMultisig"
},
"overrides": {
"DaiForeignBridge": {
@@ -44,6 +44,7 @@
}
},
"SDaiForeignBridge": {
+ "proxyType": "Eternal Storage proxy",
"ignoreRelatives": [
"compToken",
"cDaiToken",
@@ -58,31 +59,13 @@
"withinLimit",
"getCurrentDay"
],
- "fields": {
- "requiredSignatures": {
- "handler": {
- "type": "call",
- "method": "requiredSignatures",
- "args": [],
- "expectRevert": true
- }
- }
- }
+ "ignoreInWatchMode": ["maxAvailablePerTx"]
},
"GovernorBravoDelegate": {
"ignoreMethods": ["getActions", "proposals"]
},
"BridgeValidators": {
- "fields": {
- "validatorList": {
- "handler": {
- "type": "call",
- "method": "validatorList",
- "args": [],
- "expectRevert": true
- }
- }
- }
+ "proxyType": "Eternal Storage proxy"
},
"Comptroller": {
"ignoreMethods": ["getBlockNumber"]
diff --git a/packages/backend/discovery/xdai/ethereum/diffHistory.md b/packages/backend/discovery/xdai/ethereum/diffHistory.md
index 661d8564660..b33d95deb57 100644
--- a/packages/backend/discovery/xdai/ethereum/diffHistory.md
+++ b/packages/backend/discovery/xdai/ethereum/diffHistory.md
@@ -1,3 +1,164 @@
+Generated with discovered.json: 0x6f91cfd9809161d39ed0afdf82df03bb7b4cbfa6
+
+# Diff at Wed, 18 Dec 2024 12:02:02 GMT:
+
+- author: sekuba (<29250140+sekuba@users.noreply.github.com>)
+- comparing to: main@a44ef6747febdd9930ef05420e60556c20899f13 block: 21387924
+- current block number: 21429285
+
+## Description
+
+Member changes in the GnosisBridgeGovernanceMultisig and config related changes due to using discovery in the xdai.ts file.
+
+## Watched changes
+
+```diff
+ contract GnosisBridgeGovernanceMultisig (0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6) {
+ +++ description: None
+ values.$members.4:
+- "0x86Da253817DC599059e3AD5A1F098F7b96aBf34c"
++ "0xA07888742c18d7e658132AE0148fF205fFF46481"
+ values.$members.3:
+- "0xAC0622953d25e1a6c4e0f32Ffc1A9C1cE350B60E"
++ "0xf59E447E97bC03c2B0C5719e2E551F0B15b724e5"
+ }
+```
+
+## Config/verification related changes
+
+Following changes come from updates made to the config file,
+or/and contracts becoming verified, not from differences found during
+discovery. Values are for block 21387924 (main branch discovery), not current.
+
+```diff
+- Status: DELETED
+ contract SDaiForeignBridge (0x166124b75c798Cedf1B43655E9B5284eBd5203DB)
+ +++ description: None
+```
+
+```diff
+ contract GnosisBridgeGovernanceMultisig (0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6) {
+ +++ description: None
+ name:
+- "GnosisSafe"
++ "GnosisBridgeGovernanceMultisig"
+ receivedPermissions:
++ [{"permission":"upgrade","target":"0x4aa42145Aa6Ebf72e164C9bBC74fbD3788045016"},{"permission":"upgrade","target":"0xe1579dEbdD2DF16Ebdb9db8694391fa74EeA201E"}]
+ }
+```
+
+```diff
+ contract SDaiForeignBridge (0x4aa42145Aa6Ebf72e164C9bBC74fbD3788045016) {
+ +++ description: None
+ name:
+- "EternalStorageProxy"
++ "SDaiForeignBridge"
+ sourceHashes.1:
++ "0xc9e17870eb8594989459b35217d292000a746beaf237f82e703d3de4b55cc4d2"
+ values.$immutable:
+- true
+ values.$admin:
++ "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6"
+ values.$implementation:
++ "0x166124b75c798Cedf1B43655E9B5284eBd5203DB"
+ values.$pastUpgrades:
++ [["2018-10-08T19:50:23.000Z","0x01d8eeea7ea146970fb4fbe8991d6118f8f41a779b06c69041d32362575f1eda",["0x710d6eC2b0948dEf1f423Ec77B51b6a55847D2C5"]],["2018-12-19T12:49:42.000Z","0x29fdf4418b3ab5b5380e7ad0259278b1bbab18e121438c9c9d69ac6091f44a00",["0x0D3726e5a9f37234D6B55216fC971D30F150a60F"]],["2019-12-25T13:53:49.000Z","0x003ae91dc06c549cc28cdf47294abeb545577e119b98f6b6e631940a744a3356",["0x75Df5AF045d91108662D8080fD1FEFAd6aA0bb59"]],["2020-03-31T11:16:05.000Z","0x9f50cee64b4e729b7bd61630ed174ea3c7e47e3db1403d9828a9736b2ad7ce79",["0xd40355B17643Bc26554c9A9BBC95b5CAbd92C2CD"]],["2020-04-16T15:59:27.000Z","0xd0c3c92c94e05bc71256055ce8c4c993e047f04e04f3283a04e4cb077b71f6c6",["0x83c2E0E3B5328E599a3cBa95d97090fA7d0FDE8b"]],["2020-05-12T14:05:38.000Z","0x0f8ee640cb733e48ef1011554cb36945492f8cd40b5111417d1f54f30633f986",["0x7E7669bdff02F2eE75b68B91FB81c2B38F9228C2"]],["2021-10-06T18:49:32.000Z","0xb4afa1efcf12ba7907458062704efcc5658af3da5d36a4b4d4035af431d9df19",["0xEeE4f8dB4410beBD74A76cB711D096c5E66d0473"]],["2023-09-20T07:33:35.000Z","0x291d48fdfd430165b2b7f62c3ae806ea28ab34b4dc8a2e4d7d01693f19b780c9",["0x166124b75c798Cedf1B43655E9B5284eBd5203DB"]]]
+ values.$upgradeCount:
++ 8
+ values.dailyLimit:
++ "10000000000000000000000000"
+ values.daiToken:
++ "0x6B175474E89094C44Da98b954EedeAC495271d0F"
+ values.decimalShift:
++ 0
+ values.deployedAtBlock:
++ 6478428
+ values.erc20token:
++ "0x6B175474E89094C44Da98b954EedeAC495271d0F"
+ values.executionDailyLimit:
++ "15000000000000000000000000"
+ values.executionMaxPerTx:
++ "10000000000000000000000000"
+ values.gasPrice:
++ 100000000000
+ values.getBridgeInterfacesVersion:
++ {"major":6,"minor":1,"patch":0}
+ values.getBridgeMode:
++ "0x18762d46"
+ values.getTrustedForwarder:
++ "0x0000000000000000000000000000000000000000"
+ values.isInitialized:
++ true
+ values.maxPerTx:
++ "9999999000000000000000000"
+ values.minPerTx:
++ 5000000000000000
+ values.owner:
++ "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6"
+ values.requiredBlockConfirmations:
++ 20
+ values.requiredSignatures:
++ 4
+ values.sDaiToken:
++ "0x83F20F44975D03b1b09e64809B757c47f942BEeA"
+ values.validatorContract:
++ "0xe1579dEbdD2DF16Ebdb9db8694391fa74EeA201E"
+ values.versionRecipient:
++ "1.0.1"
+ proxyType:
++ "Eternal Storage proxy"
+ issuedPermissions:
++ [{"permission":"upgrade","target":"0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6","via":[]}]
+ }
+```
+
+```diff
+- Status: DELETED
+ contract BridgeValidators (0x6943A218d58135793F1FE619414eD476C37ad65a)
+ +++ description: None
+```
+
+```diff
+ contract BridgeValidators (0xe1579dEbdD2DF16Ebdb9db8694391fa74EeA201E) {
+ +++ description: None
+ name:
+- "EternalStorageProxy"
++ "BridgeValidators"
+ sourceHashes.1:
++ "0x7123b263360e368977fbfb7da550817b9a4807849090a69d6415b0b1bb33b398"
+ values.$immutable:
+- true
+ values.$admin:
++ "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6"
+ values.$implementation:
++ "0x6943A218d58135793F1FE619414eD476C37ad65a"
+ values.$pastUpgrades:
++ [["2018-10-08T19:48:08.000Z","0x6dbedab00bc4840c459ba44c856c3aa1e7be5acd0c4a4602620a457979e7c4ee",["0xd760E016226836cC02E329aDDBB6821945Dd5100"]],["2019-12-25T13:53:35.000Z","0x721841ce7ca52a0a5ed23f1f4093fdd1dac4e538bcace263f0b59008885d2f34",["0x6943A218d58135793F1FE619414eD476C37ad65a"]]]
+ values.$upgradeCount:
++ 2
+ values.deployedAtBlock:
++ 6478417
+ values.F_ADDR:
++ "0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF"
+ values.getBridgeValidatorsInterfacesVersion:
++ {"major":2,"minor":3,"patch":0}
+ values.isInitialized:
++ true
+ values.owner:
++ "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6"
+ values.requiredSignatures:
++ 4
+ values.validatorCount:
++ 7
+ values.validatorList:
++ ["0x90776017057b84bc47D7e7383b65C463C80a6cdd","0xfA98B60E02A61B6590f073cAD56e68326652d094","0x97630E2aE609D4104aBdA91F3066C556403182dd","0x587C0d02B40822f15f05301d87c16f6a08AaDDde","0x1312E98995bbCc30fc63Db3cef807e20CDd33dca","0x4D1c96B9A49C4469A0b720a22b74b034EDdFe051","0xc073C8E5ED9Aa11CF6776C69b3e13b259Ba9F506"]
+ proxyType:
++ "Eternal Storage proxy"
+ issuedPermissions:
++ [{"permission":"upgrade","target":"0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6","via":[]}]
+ }
+```
+
Generated with discovered.json: 0x227de913d600b776722a499b77bc8ba64c111766
# Diff at Thu, 12 Dec 2024 17:29:54 GMT:
diff --git a/packages/backend/discovery/xdai/ethereum/discovered.json b/packages/backend/discovery/xdai/ethereum/discovered.json
index 297ff6a0d52..d2fc4efe40d 100644
--- a/packages/backend/discovery/xdai/ethereum/discovered.json
+++ b/packages/backend/discovery/xdai/ethereum/discovered.json
@@ -1,42 +1,9 @@
{
"name": "xdai",
"chain": "ethereum",
- "blockNumber": 21387924,
- "configHash": "0x33130b3297d176067d15a1d5dee2e145d661c3076c934d171df507e087c28d77",
+ "blockNumber": 21429285,
+ "configHash": "0x59ffd13a471a781fe21e38e7e993c0f120a7cb7c91414a2d694aa5b8f3b8327d",
"contracts": [
- {
- "name": "SDaiForeignBridge",
- "address": "0x166124b75c798Cedf1B43655E9B5284eBd5203DB",
- "sourceHashes": [
- "0xc9e17870eb8594989459b35217d292000a746beaf237f82e703d3de4b55cc4d2"
- ],
- "sinceTimestamp": 1694184083,
- "values": {
- "$immutable": true,
- "dailyLimit": 0,
- "daiToken": "0x6B175474E89094C44Da98b954EedeAC495271d0F",
- "decimalShift": 0,
- "deployedAtBlock": 0,
- "erc20token": "0x6B175474E89094C44Da98b954EedeAC495271d0F",
- "executionDailyLimit": 0,
- "executionMaxPerTx": 0,
- "gasPrice": 0,
- "getBridgeInterfacesVersion": { "major": 6, "minor": 1, "patch": 0 },
- "getBridgeMode": "0x18762d46",
- "getTrustedForwarder": "0x0000000000000000000000000000000000000000",
- "isInitialized": false,
- "maxAvailablePerTx": 0,
- "maxPerTx": 0,
- "minPerTx": 0,
- "owner": "0x0000000000000000000000000000000000000000",
- "requiredBlockConfirmations": 0,
- "requiredSignatures": "EXPECT_REVERT",
- "sDaiToken": "0x83F20F44975D03b1b09e64809B757c47f942BEeA",
- "validatorContract": "0x0000000000000000000000000000000000000000",
- "versionRecipient": "1.0.1"
- },
- "derivedName": "XDaiForeignBridge"
- },
{
"name": "Unitroller",
"address": "0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B",
@@ -53,7 +20,7 @@
}
},
{
- "name": "GnosisSafe",
+ "name": "GnosisBridgeGovernanceMultisig",
"address": "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6",
"template": "GnosisSafe",
"sourceHashes": [
@@ -61,6 +28,16 @@
"0xd42bbf9f7dcd3720a7fc6bdc6edfdfae8800a37d6dd4decfa0ef6ca4a2e88940"
],
"proxyType": "gnosis safe",
+ "receivedPermissions": [
+ {
+ "permission": "upgrade",
+ "target": "0x4aa42145Aa6Ebf72e164C9bBC74fbD3788045016"
+ },
+ {
+ "permission": "upgrade",
+ "target": "0xe1579dEbdD2DF16Ebdb9db8694391fa74EeA201E"
+ }
+ ],
"ignoreInWatchMode": ["nonce"],
"sinceTimestamp": 1600956399,
"values": {
@@ -70,8 +47,8 @@
"0x4b5F5231e2F08Ad49d79Ce5672A8339a63Cfbd43",
"0xb8173f558f75EE263013fd6294177bf75279a21e",
"0xDdf2d07267EAF2cE3E13ee4319bE1F34D55ed992",
- "0xAC0622953d25e1a6c4e0f32Ffc1A9C1cE350B60E",
- "0x86Da253817DC599059e3AD5A1F098F7b96aBf34c",
+ "0xf59E447E97bC03c2B0C5719e2E551F0B15b724e5",
+ "0xA07888742c18d7e658132AE0148fF205fFF46481",
"0x1685324Bf373670ad5C9c56bd88A1dc1C063b0f9",
"0x0101016044726994aFd16f4A99f0d960090D35e7",
"0x5b10cE4DDD27F57d4D432D409A5321219cbA7893",
@@ -89,24 +66,101 @@
"getChainId": 1,
"GnosisSafe_modules": [],
"multisigThreshold": "8 of 16 (50%)",
- "nonce": 83,
+ "nonce": 84,
"VERSION": "1.3.0"
- }
+ },
+ "derivedName": "GnosisSafe"
},
{
- "name": "EternalStorageProxy",
+ "name": "SDaiForeignBridge",
"address": "0x4aa42145Aa6Ebf72e164C9bBC74fbD3788045016",
"sourceHashes": [
- "0x781decea1d7b5174464b57449f32ada83d1c1b7e12bdfa47eb9d00a41a36c839"
+ "0x781decea1d7b5174464b57449f32ada83d1c1b7e12bdfa47eb9d00a41a36c839",
+ "0xc9e17870eb8594989459b35217d292000a746beaf237f82e703d3de4b55cc4d2"
],
+ "proxyType": "Eternal Storage proxy",
+ "issuedPermissions": [
+ {
+ "permission": "upgrade",
+ "target": "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6",
+ "via": []
+ }
+ ],
+ "ignoreInWatchMode": ["maxAvailablePerTx"],
"sinceTimestamp": 1539028166,
"values": {
- "$immutable": true,
+ "$admin": "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6",
+ "$implementation": "0x166124b75c798Cedf1B43655E9B5284eBd5203DB",
+ "$pastUpgrades": [
+ [
+ "2018-10-08T19:50:23.000Z",
+ "0x01d8eeea7ea146970fb4fbe8991d6118f8f41a779b06c69041d32362575f1eda",
+ ["0x710d6eC2b0948dEf1f423Ec77B51b6a55847D2C5"]
+ ],
+ [
+ "2018-12-19T12:49:42.000Z",
+ "0x29fdf4418b3ab5b5380e7ad0259278b1bbab18e121438c9c9d69ac6091f44a00",
+ ["0x0D3726e5a9f37234D6B55216fC971D30F150a60F"]
+ ],
+ [
+ "2019-12-25T13:53:49.000Z",
+ "0x003ae91dc06c549cc28cdf47294abeb545577e119b98f6b6e631940a744a3356",
+ ["0x75Df5AF045d91108662D8080fD1FEFAd6aA0bb59"]
+ ],
+ [
+ "2020-03-31T11:16:05.000Z",
+ "0x9f50cee64b4e729b7bd61630ed174ea3c7e47e3db1403d9828a9736b2ad7ce79",
+ ["0xd40355B17643Bc26554c9A9BBC95b5CAbd92C2CD"]
+ ],
+ [
+ "2020-04-16T15:59:27.000Z",
+ "0xd0c3c92c94e05bc71256055ce8c4c993e047f04e04f3283a04e4cb077b71f6c6",
+ ["0x83c2E0E3B5328E599a3cBa95d97090fA7d0FDE8b"]
+ ],
+ [
+ "2020-05-12T14:05:38.000Z",
+ "0x0f8ee640cb733e48ef1011554cb36945492f8cd40b5111417d1f54f30633f986",
+ ["0x7E7669bdff02F2eE75b68B91FB81c2B38F9228C2"]
+ ],
+ [
+ "2021-10-06T18:49:32.000Z",
+ "0xb4afa1efcf12ba7907458062704efcc5658af3da5d36a4b4d4035af431d9df19",
+ ["0xEeE4f8dB4410beBD74A76cB711D096c5E66d0473"]
+ ],
+ [
+ "2023-09-20T07:33:35.000Z",
+ "0x291d48fdfd430165b2b7f62c3ae806ea28ab34b4dc8a2e4d7d01693f19b780c9",
+ ["0x166124b75c798Cedf1B43655E9B5284eBd5203DB"]
+ ]
+ ],
+ "$upgradeCount": 8,
+ "dailyLimit": "10000000000000000000000000",
+ "daiToken": "0x6B175474E89094C44Da98b954EedeAC495271d0F",
+ "decimalShift": 0,
+ "deployedAtBlock": 6478428,
+ "erc20token": "0x6B175474E89094C44Da98b954EedeAC495271d0F",
+ "executionDailyLimit": "15000000000000000000000000",
+ "executionMaxPerTx": "10000000000000000000000000",
+ "gasPrice": 100000000000,
+ "getBridgeInterfacesVersion": { "major": 6, "minor": 1, "patch": 0 },
+ "getBridgeMode": "0x18762d46",
+ "getTrustedForwarder": "0x0000000000000000000000000000000000000000",
"implementation": "0x166124b75c798Cedf1B43655E9B5284eBd5203DB",
+ "isInitialized": true,
+ "maxAvailablePerTx": "9865603079013541013696953",
+ "maxPerTx": "9999999000000000000000000",
+ "minPerTx": 5000000000000000,
+ "owner": "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6",
"proxyOwner": "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6",
+ "requiredBlockConfirmations": 20,
+ "requiredSignatures": 4,
+ "sDaiToken": "0x83F20F44975D03b1b09e64809B757c47f942BEeA",
"upgradeabilityOwner": "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6",
- "version": 8
- }
+ "validatorContract": "0xe1579dEbdD2DF16Ebdb9db8694391fa74EeA201E",
+ "version": 8,
+ "versionRecipient": "1.0.1"
+ },
+ "derivedName": "XDaiForeignBridge"
},
{
"name": "GnosisSafe",
@@ -136,30 +190,6 @@
"VERSION": "1.3.0"
}
},
- {
- "name": "BridgeValidators",
- "address": "0x6943A218d58135793F1FE619414eD476C37ad65a",
- "sourceHashes": [
- "0x7123b263360e368977fbfb7da550817b9a4807849090a69d6415b0b1bb33b398"
- ],
- "sinceTimestamp": 1576700551,
- "values": {
- "$immutable": true,
- "deployedAtBlock": 0,
- "F_ADDR": "0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF",
- "getBridgeValidatorsInterfacesVersion": {
- "major": 2,
- "minor": 3,
- "patch": 0
- },
- "isInitialized": false,
- "owner": "0x0000000000000000000000000000000000000000",
- "requiredSignatures": 0,
- "validatorCount": 0,
- "validatorList": "EXPECT_REVERT"
- },
- "derivedName": "BridgeValidators"
- },
{
"name": "Timelock",
"address": "0x6d903f6003cca6255D85CcA4D3B5E5146dC33925",
@@ -283,19 +313,63 @@
}
},
{
- "name": "EternalStorageProxy",
+ "name": "BridgeValidators",
"address": "0xe1579dEbdD2DF16Ebdb9db8694391fa74EeA201E",
"sourceHashes": [
- "0x781decea1d7b5174464b57449f32ada83d1c1b7e12bdfa47eb9d00a41a36c839"
+ "0x781decea1d7b5174464b57449f32ada83d1c1b7e12bdfa47eb9d00a41a36c839",
+ "0x7123b263360e368977fbfb7da550817b9a4807849090a69d6415b0b1bb33b398"
+ ],
+ "proxyType": "Eternal Storage proxy",
+ "issuedPermissions": [
+ {
+ "permission": "upgrade",
+ "target": "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6",
+ "via": []
+ }
],
"sinceTimestamp": 1539028018,
"values": {
- "$immutable": true,
+ "$admin": "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6",
+ "$implementation": "0x6943A218d58135793F1FE619414eD476C37ad65a",
+ "$pastUpgrades": [
+ [
+ "2018-10-08T19:48:08.000Z",
+ "0x6dbedab00bc4840c459ba44c856c3aa1e7be5acd0c4a4602620a457979e7c4ee",
+ ["0xd760E016226836cC02E329aDDBB6821945Dd5100"]
+ ],
+ [
+ "2019-12-25T13:53:35.000Z",
+ "0x721841ce7ca52a0a5ed23f1f4093fdd1dac4e538bcace263f0b59008885d2f34",
+ ["0x6943A218d58135793F1FE619414eD476C37ad65a"]
+ ]
+ ],
+ "$upgradeCount": 2,
+ "deployedAtBlock": 6478417,
+ "F_ADDR": "0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF",
+ "getBridgeValidatorsInterfacesVersion": {
+ "major": 2,
+ "minor": 3,
+ "patch": 0
+ },
"implementation": "0x6943A218d58135793F1FE619414eD476C37ad65a",
+ "isInitialized": true,
+ "owner": "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6",
"proxyOwner": "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6",
+ "requiredSignatures": 4,
"upgradeabilityOwner": "0x42F38ec5A75acCEc50054671233dfAC9C0E7A3F6",
+ "validatorCount": 7,
+ "validatorList": [
+ "0x90776017057b84bc47D7e7383b65C463C80a6cdd",
+ "0xfA98B60E02A61B6590f073cAD56e68326652d094",
+ "0x97630E2aE609D4104aBdA91F3066C556403182dd",
+ "0x587C0d02B40822f15f05301d87c16f6a08AaDDde",
+ "0x1312E98995bbCc30fc63Db3cef807e20CDd33dca",
+ "0x4D1c96B9A49C4469A0b720a22b74b034EDdFe051",
+ "0xc073C8E5ED9Aa11CF6776C69b3e13b259Ba9F506"
+ ],
"version": 2
- }
+ },
+ "derivedName": "BridgeValidators"
},
{
"name": "DaiForeignBridge",
@@ -337,23 +411,30 @@
{ "address": "0x0000000000000000000000000000000000000000" },
{ "address": "0x0101016044726994aFd16f4A99f0d960090D35e7" },
{ "address": "0x10DD75875a2a8a284529Ae7223B1aCE410d606bd" },
+ { "address": "0x1312E98995bbCc30fc63Db3cef807e20CDd33dca" },
{ "address": "0x1685324Bf373670ad5C9c56bd88A1dc1C063b0f9" },
{ "address": "0x3b3Cd747Ab7bf2BE3b950693deeDe8a0B96C4fF0" },
{ "address": "0x4743BA328C28dbC2b8B4e083b92cB4baA047494b" },
+ { "address": "0x4D1c96B9A49C4469A0b720a22b74b034EDdFe051" },
{ "address": "0x57B11cC8F93f2cfeC4c1C5B95213f17cAD81332B" },
+ { "address": "0x587C0d02B40822f15f05301d87c16f6a08AaDDde" },
{ "address": "0x5b10cE4DDD27F57d4D432D409A5321219cbA7893" },
{ "address": "0x72Ff26D9517324eEFA89A48B75c5df41132c4f54" },
{ "address": "0x80BA18503a1Fa16Ea22F3ef1Af23e2994EaC1d97" },
{ "address": "0x839395e20bbB182fa440d08F850E6c7A8f6F0780" },
- { "address": "0x86Da253817DC599059e3AD5A1F098F7b96aBf34c" },
+ { "address": "0x90776017057b84bc47D7e7383b65C463C80a6cdd" },
+ { "address": "0x97630E2aE609D4104aBdA91F3066C556403182dd" },
+ { "address": "0xA07888742c18d7e658132AE0148fF205fFF46481" },
{ "address": "0xA8F4514E4dB0cE95E30142cC8bAa5E6c921e16a5" },
- { "address": "0xAC0622953d25e1a6c4e0f32Ffc1A9C1cE350B60E" },
{ "address": "0xb8173f558f75EE263013fd6294177bf75279a21e" },
+ { "address": "0xc073C8E5ED9Aa11CF6776C69b3e13b259Ba9F506" },
{ "address": "0xc44caeb7F0724A156806664d2361fD6f32a2d2C8" },
{ "address": "0xD1aA7F557af9cC5Ba4Daf87D923d712fdAf1D709" },
{ "address": "0xd26a3F686D43f2A62BA9eaE2ff77e9f516d945B9" },
{ "address": "0xd945325557f1FB4374fBf10Ae86D385632Df870A" },
{ "address": "0xDdf2d07267EAF2cE3E13ee4319bE1F34D55ed992" },
+ { "address": "0xf59E447E97bC03c2B0C5719e2E551F0B15b724e5" },
+ { "address": "0xfA98B60E02A61B6590f073cAD56e68326652d094" },
{ "address": "0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF" }
],
"abis": {
diff --git a/packages/config/scripts/socketcrawl/index.ts b/packages/config/scripts/socketcrawl/index.ts
index db55a6439bd..bd782e882da 100644
--- a/packages/config/scripts/socketcrawl/index.ts
+++ b/packages/config/scripts/socketcrawl/index.ts
@@ -72,6 +72,7 @@ const ownerAddressToName: Record
- The project will be classifed as "Other" due to its specific
+ The project will be classified as "Other" due to its specific
risks that set it apart from the standard classifications.
@@ -42,6 +44,10 @@ export function OtherMigrationNotice({ expiresAt, reasons }: Props) {
))}
+
+ Learn more about the recategorisation{' '}
+
+ Learn more about the recategorisation{' '}
+
- Follow us on{' '}
-